Коротка відповідь:
Це не так, у вашому випадку це просто дорівнює нулю.
(Також ваш тест не показує, що дані дорівнюють нулю. Він показує лише, якщо один елемент дорівнює нулю.)
Довга відповідь:
Коли ви телефонуєте malloc()
, відбудеться одна з двох речей:
- Він переробляє пам’ять, яка була раніше виділена і звільнена від того самого процесу.
- Він вимагає нових сторінок від операційної системи.
У першому випадку пам’ять буде містити дані, що залишилися з попередніх розподілів. Тож не буде нулем. Це звичайний випадок при виконанні невеликих розподілів.
У другому випадку пам’ять буде від ОС. Це трапляється, коли у програми закінчується пам’ять - або коли ви вимагаєте дуже великого розподілу. (як у вашому прикладі)
Ось кришка: пам’ять, що надходить від ОС, буде обнулена з міркувань безпеки . *
Коли ОС надає вам пам’ять, вона могла бути звільнена від іншого процесу. Щоб пам’ять могла містити конфіденційну інформацію, таку як пароль. Отже, щоб ви не читали такі дані, ОС обнулить їх, перш ніж вони вам їх передадуть.
* Зауважу, що стандарт C про це нічого не говорить. Це суворо поведінка ОС. Отже, це занулення може бути присутнім, а може і не бути в системах, де безпека не є проблемою.
Щоб надати цьому більше результатів:
Як @R. згадується в коментарях, це обнулення є причиною, чому ви завжди повинні використовувати calloc()
замість malloc()
+memset()
. calloc()
може скористатися цим фактом, щоб уникнути окремого memset()
.
З іншого боку, це занулення іноді є вузьким місцем для продуктивності. У деяких числових програмах (наприклад, невідповідний ШПФ ) вам потрібно виділити величезну кількість подряпин пам'яті. Використовуйте його для виконання будь-якого алгоритму, а потім звільніть його.
У цих випадках занулення є непотрібним і дорівнює чистим накладним витратам.
Найекстремальніший приклад, який я бачив, - це 20-секундна нульова витрата на 70-секундну операцію з буфером подряпин 48 ГБ. (Приблизно 30% накладних витрат.)
(Звичайно: у машини бракувало пропускної здатності пам'яті.)
Очевидним рішенням є просто повторне використання пам'яті вручну. Але це часто вимагає прориву усталених інтерфейсів. (особливо якщо це частина бібліотечної процедури)