printf为未初始化的变量打印什么?

时间:2011-05-12 03:23:49

标签: c global

代码应该打印什么? 0或任何垃圾值还是取决于编译器?

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

5 个答案:

答案 0 :(得分:9)

答案是0.全局变量初始化为零。

答案 1 :(得分:4)

我会说你的代码可能输出任何内容,或者只是发生任何事情,因为你的代码根据C99调用未定义的行为。

您在范围内没有printf的原型。

  

J.2未定义的行为

     

- 对于在函数原型定义函数的范围内调用没有函数原型的函数,原型以省略号结束,或者促销后的参数类型与参数类型不兼容( 6.5.2.2)。

如果问题是关于全局变量的初始化,则a将初始化为0,因为它具有静态存储持续时间。

答案 2 :(得分:2)

我在C99标准上找到了第6.7.8.10节,初始化:

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。如果未明确初始化具有静态存储持续时间的对象,   然后:    - 如果它有指针类型,则将其初始化为空指针;    - 如果它有算术类型,则初始化为(正或无符号)零;    - 如果是聚合,则根据这些规则初始化(递归)每个成员;    - 如果它是一个联合,则根据这些初始化(递归)第一个命名成员   规则。

第6.2.4.3节定义:

  

一个对象,其标识符使用外部或内部链接声明,或者使用   storage-class specifier static具有静态存储持续时间。它的一生就是整个   程序执行程序及其存储的值仅在程序之前初始化一次   启动。

换句话说,全局变量被初始化为0.自动变量(即非static本地人)不会自动初始化。

答案 3 :(得分:0)

没有自动变量[通常我们在大多数情况下在函数中使用]所有其他变量的值都被赋值为0

答案 4 :(得分:0)

全局变量初始化为0.自动变量(即非静态局部变量)不会自动初始化。