Содержимое памяти, выделенной с помощью malloc
(а также переменных, выделенных в стеке), равно undefined , поэтому вполне может быть что угодно. Обычно вы получаете пространство, заполненное нулями (потому что ОС закрывает страницы памяти, которые использовались другими процессами) или остатки предыдущего использования этих страниц памяти (это часто имеет место, если страница памяти принадлежала вашему процессу), но это что происходит под капотом, стандарт С не дает никаких гарантий.
Итак, в общем случае нет «значения по умолчанию» и нет способа проверить, была ли изменена ваша память; однако вы можете инициировать блоки памяти, которые вы используете, с магическими значениями, которые, как вы уверены, не будут использоваться в качестве «реальных данных», но это будет просто соглашение, внутреннее для вашего приложения.
К счастью, для переменных с плавающей запятой есть несколько магических значений, таких как тихий NaN, который вы можете использовать для этой цели; в общем, вы можете использовать макрос NAN
, определенный в <math.h>
, чтобы установить float
в NaN.
Кстати, вы не должны читать неинициализированные float
s и double
s, поскольку обычный формат, в котором они хранятся (IEEE 754), содержит некоторые магические значения (например, сигнальный NaN), которые могут вызывать арифметические исключения когда они читаются, поэтому, если ваша неинициализированная память содержит такой битовый шаблон, ваше приложение, вероятно, завершится сбоем.