为什么main中未初始化的局部变量在c中为零(不是垃圾)?

时间:2016-03-09 09:58:53

标签: c initialization

我对这个简单的程序有些怀疑。

  void hello()
  {
      int a;
      printf("uninitialized in hello: %d\n",a);
  }

  int main()
  {
      int value;
      printf("uninitialized in main: %d\n",value);
      hello();
      return 0;
  }

如果我编译并运行此程序。

  user@toad:~$ gcc -Wall simple.c
  simple.c: In function ‘hello’:
  simple.c:6:3: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
       printf("uninitialized in hello: %d\n",a);
       ^
  simple.c: In function ‘main’:
  simple.c:12:11: warning: ‘value’ is used uninitialized in this function [-Wuninitialized]
       printf("uninitialized in main: %d\n",value);
       ^

  user@toad:~$ ./a.out 
  uninitialized in main: 0
  uninitialized in hello: 32672
  user@toad:~$ ./a.out 
  uninitialized in main: 0
  uninitialized in hello: 32679
  user@toad:~$ ./a.out 
  uninitialized in main: 0
  uninitialized in hello: 32599
  user@toad:~$ ./a.out 
  uninitialized in main: 0
  uninitialized in hello: 32560
  user@toad:~$ ./a.out 
  uninitialized in main: 0
  uninitialized in hello: 32585

为什么main()功能打印

  

主要未初始化:0

但是hello()功能打印

  

你好未初始化:[一些垃圾值。]

是不确定的行为?

1 个答案:

答案 0 :(得分:2)

对于单位化自动局部变量,值为 indeterminate 。这可以是任何,包括0。

引用C11,章节§6.7.9,初始化

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。 [...]

FWIW,任何使用该值的尝试(包括尝试打印)都会调用undefined behavior

相关的,来自附件J,关于未定义的行为

  

使用具有自动存储持续时间的对象的值   不确定的。