2012-10-24 124 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是(如果它包含指針本身,誰擁有那些?),但希望這提供了一些直覺。