Подтвердить что ты не робот

Переписывает ли realloc старое содержимое?

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

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

4b9b3361

Ответ 1

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

Правильный способ использования 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 */

Ответ 2

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

Ответ 3

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

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

Если вы хотите получить копию, выполните новый malloc и используйте memcpy.

Реализация, когда вы вызываете realloc для увеличения размера, может произойти одна из следующих вещей:

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

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

Ответ 4

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

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