Что printf печатает для унитизированной переменной? - PullRequest
0 голосов
/ 12 мая 2011

Что должен печатать код? 0 или какое-либо значение мусора, или это будет зависеть от компилятора?

#include <stdio.h>
int a;
int main() 
{ 
   printf("%d\n",a);
   return 0;
}

Ответы [ 5 ]

9 голосов
/ 12 мая 2011

ответ 0. Глобальные переменные инициализируются нулями.

4 голосов
/ 12 мая 2011

Я бы сказал, что ваш код может выводить что угодно или просто что угодно может произойти, потому что ваш код вызывает неопределенное поведение в соответствии с C99.

У вас нет прототипа для printf в области видимости.

J.2 Неопределенное поведение

- Для вызова функции без прототипа функции в области, где функция определена с прототипом функции, либо прототип заканчивается многоточием, либо типы аргументов после продвижения не совместимы с типами параметров ( 6.5.2.2).

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

2 голосов
/ 12 мая 2011

Я нашел по стандарту C99, раздел 6.7.8.10, Инициализация:

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

Раздел 6.2.4.3 определяет:

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

Другими словами, глобальные переменные инициализируются как 0. Автоматические переменные (т.е. не static локальные) не инициализируются автоматически.

0 голосов
/ 12 мая 2011

Глобальные переменные инициализируются как 0. Автоматические переменные (то есть нестатические локальные переменные) не инициализируются автоматически.

0 голосов
/ 12 мая 2011

без автоматической переменной [обычно то, что мы используем в функции в большинстве случаев], значение всей другой переменной присваивается 0

...