У вас нет «указателя, выделенного для хранения 4096 байт», у вас есть указатель на выделенный блок из 4096 байт.
Если ваш блок был выделен с malloc()
, realloc()
позволит вам уменьшить или увеличить размер блока. Начальный адрес блока не обязательно останется прежним.
Вы не можете изменить начальный адрес блока памяти malloc
, который действительно задает ваш второй сценарий. Также нет способа разделить блок malloc
.
Это ограничение API malloc
/ calloc
/ realloc
/ free
- и реализации могут полагаться на эти ограничения (например, хранение бухгалтерской информации о распределении непосредственно перед начальным адресом что затруднит перемещение начального адреса.)
Теперь, malloc
не единственный распределитель - ваша платформа или библиотеки могут предоставить другие, или вы можете написать свой собственный (который получает память из системы через malloc
, mmap
, VirtualAlloc
или каким-либо другим механизмом), а затем передает его в вашу программу любым удобным для вас способом.
Для C ++, если вы выделяете память с помощью std::malloc
, применяется приведенная выше информация. Если вы используете new
и delete
, вы выделяете хранилище и создаете объекты, поэтому изменение размера выделенного блока не имеет смысла - объекты в C ++ имеют фиксированный размер.