Обнуляет ли realloc после calloc байты?


person Julius    schedule 15.04.2020    source источник
comment
memset(mem + 100, 0, 20); // is this even necessary? --› Да.   -  person David C. Rankin    schedule 15.04.2020
comment
Пожалуйста, обратите внимание, что mem = realloc(mem, 120); — не очень хорошая идея. См., например. stackoverflow.com/questions/38213123/   -  person Bob__    schedule 15.04.2020
comment
Ваш тест ничего не доказывает. Данные по-прежнему были нулями из calloc().   -  person user207421    schedule 16.04.2020


Ответы (1)


Нет, realloc не обнуляет новые байты. Об этом говорится в руководстве по realloc:

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

К этому комментарию:

Я проверил его, и он, кажется, обнулен

Это не окончательный тест. Как указано, realloc не предназначен для инициализации этих байтов каким-либо конкретным значением. Таким образом, нет никакой гарантии, что байты будут равны нулю (или любому другому значению), и на них никогда нельзя полагаться.

person kaylum    schedule 15.04.2020
comment
Хороший ответ; УФ. Второстепенный: realloc не касается этих байтов. больше похоже на спецификацию C. Любые байты в новом объекте, превышающие размер старого объекта, имеют неопределенные значения. Реализация может касаться новых байтов, а может и нет, может обнулить их и т. д. Важно то, что они информировать. Тонкость здесь в том, что realloc() не требуется их не трогать. Я мог видеть функцию безопасности, которая стирает память. - person chux - Reinstate Monica; 16.04.2020
comment
@chux-ReinstateMonica Очень хороший момент. Я обновил то, что вы указали. - person kaylum; 16.04.2020