2015-04-11 2 views
1

Я только начинаю узнавать о массивах malloc'd и realloc'd. Может ли кто-нибудь помочь мне объяснить, как правильно освободить свой следующий массив? Я пытался смотреть на другие должности, но у меня трудное время понимания выделения памяти в C.Освобождение массива Realloc'd в C

char ** result = NULL; 
int numSpaces = 0; 

char * p = strtok(command, " "); 

/* split string and append tokens to 'result' */ 
while (p) 
{ 
    result = realloc (result, sizeof (char*) * ++numSpaces); 

    if (result == NULL) 
     exit (-1); /* memory allocation failed */ 

    result[numSpaces-1] = p; 

    p = strtok(NULL, " "); 
} 

ответ

3

В какой-то момент после того, как вы закончите с помощью result, вам нужно позвонить free(result);.

Это может выглядеть следующим образом:

char ** result = NULL; 
int numSpaces = 0; 

char * p = strtok(command, " "); 

while (p) { 
    result = realloc (result, sizeof (char*) * ++numSpaces); 
    result[numSpaces-1] = p; 
    p = strtok(NULL, " "); 
} 

for (i=0; i<numSpaces; ++i) 
    printf("word %d: %s\n", i, result[i]); 

free(result); 
+0

Спасибо, он работает сейчас. Я смотрел на некоторые примеры, и у них был свободный() в цикле for, и другие вещи продолжались, поэтому я был немного не уверен. Ура! – Peter

4

Избавление realloc -ED память не отличается от освобождения malloc -ED памяти, в том, что все, что вам нужно, это позвонить free на result в конце концов, когда у вас не требуется больше памяти.

Ваш код, однако, имеет шаблон, который может привести к утечке памяти: вы назначаете realloc -ed блок обратно на result, не проверяя его на NULL. Если realloc не работает, предыдущее значение result становится неустранимым, поскольку оно было перезаписано NULL.

Вот как вы могли бы решить эту проблему:

char **temp = realloc(result, sizeof (char*) * ++numSpaces); 

if (temp == NULL) { 
    free(result); // Free the old memory block 
    exit (-1); /* memory allocation failed */ 
} 
result = temp; 
+0

Они проверяют этот случай. 'if (result == NULL)'. И они справляются с этим, убивая приложение. –

+1

@BillLynch Они не проверяют выделение, но уже слишком поздно: старый «результат» ушел к тому времени. – dasblinkenlight

+0

Спасибо, сейчас работает. Я смотрел на некоторые примеры, и у них был свободный() в цикле for, и другие вещи продолжались, поэтому я был немного не уверен. Ура! – Peter

Смежные вопросы