2013-04-18 3 views
0

У меня есть небольшой вопрос об использовании функции realloc. Предполагая, что у меня есть:Использование realloc для сжатия строки внутри структуры

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 

} 

Теперь, если я перераспределить память для data-> места в другой функции. Нужно ли мне возвращать адрес данных 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

ответ

1

Нет. У вас нет. Это связано с тем, что data является указателем на структуру. Всякий раз, когда вы получаете доступ к элементу структуры через data с помощью оператора «->», вы сначала удаляете указатель.

Например,

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

Кроме того, когда вы делаете,

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

если перераспределить терпит неудачу, вы бы утечка памяти и, возможно, вызывая неопределенное поведение (если вы не указали проверки 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