Из стандарта C99 6.7.8 / 10 «Инициализация»:
Если объект, который имеет автоматический
срок хранения не инициализирован
явно его значение
неопределенный. Если объект, который имеет
статическая продолжительность хранения не
инициализируется явно, затем:
- если он имеет тип указателя, он
инициализируется нулевым указателем;
- если
имеет арифметический тип, это
инициализировано (положительно или без знака)
ноль;
- если это совокупность, каждый
элемент инициализирован (рекурсивно)
согласно этим правилам;
- если это
союз, первый названный член
инициализируется (рекурсивно) в соответствии с
эти правила
Поскольку глобальные и статические структуры имеют статическую длительность хранения, ответ - да - они инициализируются нулями (указателям в структуре будет присвоено значение указателя NULL, которое обычно равно нулю, но, строго говоря, не нужно быть).
Стандарт C ++ 2003 имеет аналогичное требование (3.6.2 «Инициализация нелокальных объектов»):
Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулями (8.5) перед любой другой инициализацией.
Через некоторое время после инициализации нуля вызываются конструкторы (если у объекта есть конструктор) по несколько более сложным правилам, определяющим время и порядок этих вызовов.