Являются ли члены глобальных структур на C инициализированными до нуля?

Являются ли члены глобальной или статической структуры в C гарантированной автоматической инициализацией до нуля, так же, как неинициализированные глобальные или статические переменные ?

Из стандарта C99 6.7.8 / 10 «Инициализация»:

Если объект, который имеет автоматическую продолжительность хранения, не инициализируется явно, его значение является неопределенным. Если объект, который имеет статическую продолжительность хранения, не инициализируется явно, то:

– если он имеет тип указателя, он инициализируется нулевым указателем;
– если он имеет арифметический тип, он инициализируется (положительным или без знака) нулем;
– если это совокупность, каждый член инициализируется (рекурсивно) в соответствии с этими правилами;
– если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами

Поскольку глобальные и статические структуры имеют статическую продолжительность хранения, ответ да – они ноль инициализированы (указатели в структуре будут установлены на значение указателя NULL, которое обычно равно нулю, но, строго говоря, не нужно).

Стандарт C ++ 2003 имеет аналогичное требование (3.6.2 «Инициализация нелокальных объектов»):

Объекты со статическим временем хранения (3.7.1) должны быть инициализированы нулями (8.5) до начала любой другой инициализации.

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

Локальные переменные не инициализируются.

 struct foobar { int x; }; int main(void) { struct foobar qux; /* qux is uninitialized. It is a local variable */ return 0; } 

статические локальные переменные инициализируются до 0 (ноль)

 struct foobar { int x; }; int main(void) { static struct foobar qux; /* qux is initialized (to 0). It is a static local variable */ return 0; } 

Глобальные переменные инициализируются до 0 (ноль)

 struct foobar { int x; }; struct foobar qux; /* qux is initialized (to 0). It is a global variable */ int main(void) { return 0; } 

struct не отличается таким образом, как обычная статическая переменная C. Память, зарезервированная для этой struct , полностью инициализируется до 0, если она статична.

Да, все глобальные данные обнуляются, включая членов структур, classов и союзов.

Все данные в глобальной части программы установлены на ноль.

Сегмент BSS, также известный как Uninitialized data, начинается в конце сегмента данных и содержит все неинициализированные глобальные переменные и статические переменные, которые по умолчанию инициализируются нулем. Например, переменная, объявленная static int i; будет содержаться в сегменте BSS.

Bss .

Я не знаю, почему так сложно попробовать это сам кстати.