2013-04-18 60 views
0

中的字符串我有一個關於使用realloc函數的小問題。假設我有:使用realloc縮小struct

typedef struct 
{ 
    char* location; 
    int temp; 
    int numberOfRec; 
}TEMP; 

然後我聲明指針到這個結構中的主要和分配存儲器:

int main() 
{ 
    TEMP* data = xCalloc (1, sizeof(TEMP)); //wrapper function 
    data->location = xCalloc (20, sizeof(char)); //wrapper function 

} 

現在,如果我重新分配存儲器中的用於在另一個函數數據 - >位置。我需要返回TEMP *數據的地址嗎?

int main() 
{ 

someFunction(data); // Use this function or... 
//data = someFunction(data); 
... 
} 
void someFunction(TEMP* data) 
{ 
    ... 
    data->location = xRealloc (data->location, 10 * sizeof(char)); 
} 
+0

不,你沒有必要返回TEMP數據的地址,因爲你通過引用傳遞它。 – umang2203 2013-04-18 03:57:16

回答

1

不,你沒有。這是因爲data是一個指向結構的指針。無論何時通過使用' - >'運算符訪問data結構的元素,都首先取消引用該指針。

例如,

data->location ==>(*data).location

此外,當你這樣做,

data->location = xRealloc (data->location, 10 * sizeof(char));

如果realloc的失敗,你會泄漏內存,並可能調用未定義的行爲(如果您不包括NULL指針檢查),因爲data->location尚未free d,它將被分配給NULL因爲realloc在失敗時返回NULL。

我建議你做下面的事情。

void *temp = NULL; 
temp = xRealloc (data->location, 10 * sizeof(char)); 
if(temp == NULL) 
{ 
    // realloc failed. 
    free(data->location); 
    data->location = NULL; 
} 
else 
{ 
    // Continue 
    data->location = temp; 
} 

我爲你編了一個minimal example

+0

謝謝你的回答。是的,我知道需要檢查這些功能。我實際上已經在wrapper.c中完成了它們,所以我不需要在主源文件中進行重新檢查。不管怎麼說,還是要謝謝你! – KurodaTsubasa 2013-04-18 05:03:11