Realloc перезаписывает старое содержание?

StackOverflow https://stackoverflow.com/questions/3850749

  •  27-09-2019
  •  | 
  •  

Вопрос

Когда мы перераспределяем память через realloc(), предыдущие содержимое переоценено? Я пытаюсь сделать программу, которая перераспределяет память каждый раз, когда мы вводим в нее данные.

Пожалуйста, расскажите мне о распределении памяти через Realloc, это компилятор зависит, например?

Это было полезно?

Решение

Не беспокойтесь о старом содержании.

Правильный способ использования realloc это использовать конкретный указатель для перераспределения, проверьте этот указатель и, если все сработало хорошо, измените старый указатель

int *oldpointer = malloc(100);

/* ... */

int *newpointer = realloc(oldpointer, 1000);
if (newpointer == NULL) {
    /* problems!!!!                                 */
    /* tell the user to stop playing DOOM and retry */
    /* or free(oldpointer) and abort, or whatever   */
} else {
    /* everything ok                                                                 */
    /* `newpointer` now points to a new memory block with the contents of oldpointer */
    /* `oldpointer` points to an invalid address                                     */
    oldpointer = newpointer;
    /* oldpointer points to the correct address                                */
    /* the contents at oldpointer have been copied while realloc did its thing */
    /* if the new size is smaller than the old size, some data was lost        */
}

/* ... */

/* don't forget to `free(oldpointer);` at some time */

Другие советы

Он растет уже выделенную память без перезаписи существующего контента или (если он не может расти), он выделяет новую большую память в другом месте и копирует существующее содержимое от предыдущей памяти в новую память.

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

Новая память всегда будет содержать те же данные, которые присутствовали в старой памяти, хотя (она копируется для вас, если необходимо), но только до размера старого блока, любое дополнительное пространство, выделенное в конце, будет неинициализирована.

Если вы хотите копию, то сделайте новый Malloc и используйте MEMCPY.

Реализация - мудро, когда вы называете RealLoc увеличивать Размер, одно из этих вещей может случиться:

  • Новый блок выделяется и содержимое старой памяти скопировано, старый блок освобожден, новый указатель возвращается.
  • Если область после блока не выделяется, существующий блок может быть расширен и возвращен один и тот же указатель.

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

Трудно сказать, что вы спрашиваете, но если вы спрашиваете, можете ли вы прочитать «старое содержание» на старом адресе, переданном realloc, ответ нет. Отказ В некоторых случаях вы можете найти часть или все старое содержание там, но если realloc вернул один и тот же указатель, который вы передали ему, любое использование старого указателя неопределенное поведение.

Если вы просто задаете, будет ли старое содержание сохранено на новом адресе, возвращенном realloc, Ответ да (до минимума старого размера и нового размера).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top