2012-10-24 91 views
0

我有这需要一个结构作为参数,像一个函数:局部结构和指针

add_new_structure(structure s); 

然后将其存储内部 structure structure_list[200];

问题:

1.当我想要使用结构,我有一个功能,如

structure *getStructure(int id) 
{ 
return &structure_list[id]; 
} 

是要去工作,如果我加一个结构是这样的:

void init() 
{ 
    structure test; 
    memset(&test,0,sizeof(structure)); 
    add_new_structure(test); 
} 

,然后从另一个函数调用getStructure?像这样:

void anotherFunction() 
{ 
    structure *got_test = getStructure(0); 
} 

因为我记得我不能有局部变量,然后从另一个函数调用它吗?

2.是否更好地存储它像这样?

更改add_new_structure() parameter to structure *s;

然后通过调用add_new_structure(& test)将其存储在 structure *structure_list[200];中;

3.哪一个更好?或者什么是正确的做法?

+0

'structure_list'是否有静态存储时间?你可能想要发布'add_new_structure()'和'struct'的定义。如果'struct'有任何指针,那么仅仅复制它们可能是危险的。 – hmjd

+0

是的,它有一长串的结构成员,包含字符指针,所以如何安全地将它们存储在数组中?什么是静态存储时间? – steave

+0

静态存储持续时间意味着该程序的生命周期持续(请参阅http://stackoverflow.com/questions/95890/what-is-a-variables-linkage-and-storage-specifier)。 – hmjd

回答

0

第一种方法,即直接作为参数传递实例。因为在调用函数时复制整个实例。而你存储的是原始结构实例的副本。

但是,您不能传递并存储指向局部变量的指针。上面提到的问题将发生在这种情况下。

恕我直言,上述两种方法都不是正确的。将参数传递给函数时,第一种方法会引入太多开销。而第二个不能达到你想要的。 你最好动态分配内存malloc/calloc并将指针存储在数组中。在内存泄漏的情况下,不要忘记在使用结束时释放对象。像这样:

void init() 
{ 
    structure *test = NULL; 
    test = (structure *) calloc(1, sizeof(structure)); 
    add_new_structure(test); 
} 

void add_new_structure(structure *s); 
0

我认为你指出的选项2不起作用。这比说明局部变量的指针不能在函数外部使用更微妙一点;这就是说,它们只在功能仍然“活跃”时才有效,可以这么说。在选项2中,当您拨打add_new_structure时,指向structure test的指针将存储在structure *structure_list[200]的内部。此时,某个函数正在调用init,它正在调用add_new_structure。当您从init返回时,您输入structure_list的内存地址不再由原始拥有者拥有,而且这很危险。如果这太解释了,你应该看看堆栈是如何工作的,看看为什么。

不使用malloc和它的朋友,可以引入大量的复杂性,我会倾向于保持存储在structure_list存储器中,轻微的修改,您可以通过引用而不是按值传递structure test。这可能是两种风格之间的合理妥协。

void init() { 
    structure test; 
    memset(&test,0,sizeof(structure)); 
    add_new_structure(&test); 
} 

void add_new_structure(structure *s) { 
    if (structure_count < 200) { 
     structure_list[structure_count++] = *s; 
    } 
} 

很多这要看是什么structure是(如果它包含指针本身,谁拥有那些?),但希望这提供了一些直觉。