Инициализированы ли члены глобальной структуры в C нулями? - PullRequest
22 голосов
/ 02 ноября 2010

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

Ответы [ 5 ]

36 голосов
/ 02 ноября 2010

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

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

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

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

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

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

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

7 голосов
/ 02 ноября 2010

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

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;
}
1 голос
/ 02 ноября 2010

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

0 голосов
/ 02 ноября 2010

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

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

Bss сегмент .

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

0 голосов
/ 02 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...