Всегда ли глобальные переменные инициализируются нулем в языке Си? [дубликат]


На этот вопрос уже есть ответ здесь:

#include <stdio.h>
int a[100];
int main(){
    printf("%d",a[5]);
    return 0;
}

Всегда ли приведенный выше код выводит '0' или он специфичен для компилятора? Я использую компилятор gcc, и я получил вывод в виде '0'.

6 7

6 ответов:

Да, все члены a гарантированно будут инициализированы в 0.

Из раздела 3.5.7 стандарта С89

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

"глобальные переменные" определяются в области видимости файла, вне любой функции. Все переменные, определенные в области видимости файла, и все переменные, объявленные с ключевым словом static, имеют что-то под названием static storage duration. Это означает, что они будут выделяться в отдельную часть памяти и существовать на протяжении всего времени существования программы.

Это также означает, что они гарантированно будут инициализированы до нуля на любом компиляторе C.

От текущего C стандарт C11 6.7.9 / 10:

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

- если он имеет тип указателя, он инициализируется нулевым указателем;

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

Практически это означает, что если вы инициализируете свою глобальную переменную до заданного значения, она будет иметь это значение и будет выделена в сегменте памяти обычно упоминается как .data. Если вы не зададите ему значение, он будет выделен в другой сегмент, называемый .bss. Глобалы никогда не будут распределены в стеке.

Да. Любая глобальная переменная инициализируется значениемпо умолчанию этого типа. 0 является значением по умолчанию и автоматически приводится к любому типу. Если это указатель, то 0 становится NULL

Глобальные переменные получают там пространство всегменте данных , который обнуляется.

Это Не специфичный компилятор, но определенный в стандарте C.

Поэтому он всегда будет печатать 0.

Объекты области видимости файла, объявленные без явных инициализаторов, по умолчанию инициализируются 0NULL для указателей).

Нестатические объекты в области блока, объявленные без явных инициализаторов, остаются неинициализированными.

Всегда ли переменная globle инициализируется до нуля в C?

Да, и это определено в стандарте C.

Это не специфично для компилятора. Код всегда будет выводить 0.