сначала вы, вероятно, имеете в виду:
void **ptr = malloc(nsize*2);
, затем
ptr = realloc(ptr, nsize);
или безопасный способ:
void **ptr2 = realloc(ptr, nsize);
if (ptr2 != NULL)
{
ptr = ptr2;
} // else failure
, потому что с помощью realloc(ptr,nsize)
до установите значение ptr
- неопределенное поведение и, возможно, сбой.
Теперь система уменьшает размер памяти, как указано в Могу ли я предположить, что вызов realloc с меньшим размером освободитостаток?
Теперь ваш вопрос:
Если исходный размер size
, означает ли это, что ptr + nsize + 1
по-прежнему содержит выделенные записи?
у вас нет на это гарантии.Это неопределенное поведение от ptr + nsize
уже (спасибо Сурав).
Почему?эта область больше не принадлежит вашей программе.
Вы могли бы иметь ошибки при чтении нового массива меньшего размера, которые могли бы дать действительные результаты, если бы там были старые данные, что вероятно, правда, но:
- система может сохранить ту же область памяти, но немедленно повторно использовать этот блок для других данных
- система может переместить новые данные в другую область памяти (такая старая
ptr
будет отличаться от нового ptr
, следовательно, возвращаемое значение, которое некоторые люди игнорируют, и оно «работает» до тех пор, пока не выйдет из строя), в этом случае за полными несущественными данными стоят
Если оба вышеуказанных условия не выполняются, вполне вероятно, что данные не изменились.realloc
не будет устанавливать в 0 некоторую память, которая не должна использоваться.Некоторые отладочные фреймворки (которые я не помню) помещают шаблон при освобождении памяти, поэтому, если вы наткнетесь на этот шаблон в своей программе, это будет явным признаком того, что вы читаете нераспределенную / неинициализированную память, но у нее есть накладные расходы, поэтомуне сделано по умолчанию.Вы можете «перегрузить» функции выделения памяти, чтобы сделать это и сами.
В любом случае, убедитесь, что вы не читаете после нового массива, поскольку то, что вы найдете, не гарантировано.