номер
Вот и все. Ничто из этого «это не может работать в некоторых архитектурах» или «это должно, основываясь на опыте». В стандарте четко указано, что адрес может меняться, поэтому полагайтесь на , что и ничего более. В любом случае, вы спросили, было ли это гарантировано - ответ, который однозначно нет (a) .
С точки зрения кодирования по стандарту: делай или не делай. Здесь нет "попробовать": -)
С c99:
Функция realloc
освобождает старый объект, на который указывает ptr
, и возвращает указатель на новый объект, размер которого указан size
. Содержимое нового объекта должно быть таким же, как и у старого объекта до освобождения, до меньшего из нового и старого размеров. Любые байты в новом объекте, превышающие размер старого объекта, имеют неопределенные значения.
Если ptr
является нулевым указателем, функция realloc
ведет себя как функция malloc
для указанного размера. В противном случае, если ptr
не совпадает с указателем, ранее возвращенным функцией calloc
, malloc
или realloc
, или если пространство было освобождено при вызове функции free
или realloc
, поведение не определено. Если память для нового объекта не может быть выделена, старый объект не освобождается и его значение не изменяется.
Функция realloc
возвращает указатель на новый объект (который может иметь то же значение, что и указатель на старый объект), или нулевой указатель, если новый объект не может быть выделен.
(a) Если вам интересно , почему вы бы просто не разбили буфер на два меньших буфера (оставив один и вернув другой в свободный список) для эффективность, есть как минимум одна возможность, которая приходит на ум.
Если у вас есть разные пулы для распределений разных размеров (например, которые могут использовать разные стратегии распределения), возможно, имеет смысл переместить данные в пул для меньших распределений. Повышение эффективности, получаемое от отдельных пулов, может перевесить выигрыш от оставления памяти на месте.
Но это всего лишь пример, я понятия не имею, делает ли это какая-либо реализация. Как уже говорилось, вы должны полагаться на то, что стандартные мандаты, а именно, что память может двигаться даже при сокращении.