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

Неинициализированные структуры в C

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

4b9b3361

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

сегмент Bss.

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