Перераспределение массива (C99) - PullRequest
2 голосов
/ 21 июля 2010

Стандарт указывает , что содержимое перераспределенного пространства не определено, если новый размер, если он больше.

Если важно сохранение содержимого ранее выделенного пространства, это лучший способперераспределить данные следующим образом: скопировать их в стек, освободить их из кучи, выделить в куче больше места и скопировать обратно в кучу?Есть ли другой безопасный способ сделать это?

Будет ли лучший способ реализовать структуру данных, например, динамически растущий массив, который только растет в виде связанного списка?

Ответы [ 4 ]

5 голосов
/ 21 июля 2010

Содержимое «вновь выделенной части объекта не определено». Ваш контент все еще будет в начале возвращенной области памяти.

Скажи, что я делаю:

char *p = malloc(6);
if(p == NULL) { ... }
memcpy(p, "Hello", 6);
char *temp = realloc(p, 12);
if(temp == NULL) { ... }
p = temp;

Первые 6 символов в p гарантированно будут 'H', 'e', ​​'l', 'l', 'o', '\ 0', независимо от того, является ли новый p одинаковым как старый p. Остальные 6 «новых» символов - это все, что не определено.

4 голосов
/ 21 июля 2010

"Стандарт определяет, что содержимое перераспределенного пространства не определено, если новый размер больше."

Нет, это не так. Там написано:

«Содержимое объекта должно оставаться неизменным вплоть до меньшего из новых и старых размеров». «Если новый размер больше, содержимое вновь выделенной части объекта не определено».

Только содержимое новой части не указано. Ничего не потеряно после перераспределения.

3 голосов
/ 21 июля 2010

Вы неправильно читаете страницу.В нем говорится: «Содержимое объекта должно оставаться неизменным вплоть до меньшего из новых и старых размеров».

Нет необходимости в взломе, просто realloc ().

2 голосов
/ 21 июля 2010

Только новая часть памяти не определена.Например, если у вас есть массив из 10 элементов, и вы перераспределите его достаточно большим для 20 элементов, последние 10 элементов будут неопределенными.

...