Подтвердить что ты не робот

Инициализация статических переменных в 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?

4b9b3361

Ответ 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