Являются ли члены глобальной или статической структуры в C гарантированной автоматической инициализацией до нуля, так же, как неинициализированные глобальные или статические переменные?
Неинициализированные структуры в C
Ответ 1
Из стандарта C99 6.7.8/10 "Инициализация":
Если объект, который имеет автоматический длительность хранения не инициализируется явно, его значение неопределенный. Если объект, который имеет статическая продолжительность хранения не является инициализируется явно, тогда:
- если у него есть тип указателя, это инициализируется нулевым указателем,
- если он имеет арифметический тип, это инициализируется (положительным или без знака) ноль;
- если это совокупность, каждая член инициализируется (рекурсивно) согласно этим правилам,
- если это объединение, первый именованный член инициализируется (рекурсивно) в соответствии с эти правила
Поскольку глобальные и статические структуры имеют статическую длительность хранения, ответ да - они ноль инициализированы (указатели в структуре будут установлены на значение указателя NULL, которое обычно равно нулю, но, строго говоря, не нужно быть).
Стандарт С++ 2003 имеет аналогичное требование (3.6.2 "Инициализация нелокальных объектов" ):
Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулями (8.5), прежде чем произойдет любая другая инициализация.
Когда-то после нулевой инициализации вызываются конструкторы (если объект имеет конструктор) в несколько более сложных правилах, которые определяют синхронизацию и упорядочение этих вызовов.
Ответ 2
Локальные переменные не инициализируются.
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;
}
Ответ 3
A struct
не отличается таким образом, как обычная статическая переменная C. Память, зарезервированная для этого struct
, полностью инициализируется 0, если она статична.
Ответ 4
Да, все глобальные данные обнуляются, включая элементы структур, классов и союзов.
Ответ 5
Все данные в глобальной части программы установлены на ноль.
Сегмент BSS также известен как Неинициализированные данные начинаются в конце сегмента данных и содержит все неинициализированные глобальные переменные и статические переменные, которые инициализируются к нулю по умолчанию. Например, переменная объявленная статическая int i; бы содержаться в сегменте BSS.
Я не знаю, почему так сложно попробовать это самостоятельно.