Инициализация статических переменных в C
У меня есть вопрос об инициализации статических переменных в C. Я знаю, если мы объявим глобальную статическую переменную, которая по умолчанию равна 0
. Например:
static int a; //although we do not initialize it, the value of a is 0
но как насчет следующей структуры данных:
typedef struct
{
int a;
int b;
int c;
} Hello;
static Hello hello[3];
- все члены в каждой структуре hello[0]
, hello[1]
, hello[2]
инициализированы как 0
?
Ответы
Ответ 1
Да, все элементы инициализируются для объектов со статическим хранилищем. См. 6.7.8/10 в C99 Standard (PDF-документ)
Если объект с автоматической продолжительностью хранения не инициализируется явно, его значение неопределенно. Если объект с длительностью статического хранения не инициализируется явно, тогда:
- если он имеет тип указателя, он инициализируется нулевым указателем; - если он имеет арифметический тип, он инициализируется (положительным или беззнаковым) нолем; - если он является агрегатом, каждый член инициализируется (рекурсивно) в соответствии с этими правилами.
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правила.
Чтобы инициализировать все в объекте, будь то static
или нет, до 0, мне нравится использовать универсальный нулевой инициализатор
sometype identifier0 = {0};
someothertype identifier1[SOMESIZE] = {0};
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0};
Ответ 2
Да, статические переменные файловой области инициализируются нулем, включая все элементы структур, массивы и т.д.
См. этот вопрос для справки (я проголосую, чтобы закрыть это как дубликат).
Изменить: этот вопрос получает гораздо лучшие ответы, поэтому я голосую, чтобы закрыть этот вопрос как дубликат этого.
Для справки, вот ссылка Ссылка на часто задаваемые вопросы из принятого ответа на вопрос, хотя, конечно, связанные с C99 и C11 стандарты являются каноническими.
Ответ 3
Да, они, как долго, имеют статическую или длительность хранения потоков.
C11 (n1570), § 6.7.9 Инициализация # 10
Если объект, который имеет статическую или длительность хранения потоков, не инициализируется явно, тогда:
[...]
- если он имеет арифметический тип, он инициализируется нулем (положительным или без знака);
- если он является агрегатом, каждый член инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
[...]
Ответ 4
Я бы добавил, что статические переменные (или массивы) классифицируются на два типа.
Инициализировано - это те, которые присваиваются значения из кода во время компиляции. Они обычно хранятся в DS, хотя это специфично для компилятора.
Другой тип - это неинициализированная статика, которые инициализируются во время выполнения и сохраняются в сегменте BSS, но опять же это компилятор.
BSS