Всегда ли глобальные переменные инициализируются нулем в языке Си? [дубликат]
На этот вопрос уже есть ответ здесь:
#include <stdio.h>
int a[100];
int main(){
printf("%d",a[5]);
return 0;
}
Всегда ли приведенный выше код выводит '0' или он специфичен для компилятора? Я использую компилятор gcc, и я получил вывод в виде '0'.
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.