我对这个简单的程序有些怀疑。
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()
功能打印
你好未初始化:[一些垃圾值。]
是不确定的行为?
答案 0 :(得分:2)
对于单位化自动局部变量,值为 indeterminate 。这可以是任何,包括0。
引用C11
,章节§6.7.9,初始化
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。 [...]
FWIW,任何使用该值的尝试(包括尝试打印)都会调用undefined behavior。
相关的,来自附件J,关于未定义的行为
使用具有自动存储持续时间的对象的值 不确定的。