为什么我得到0.我是一个自动变量,所以它应该打印一些垃圾值,对吧?我正在使用gcc编译器。
#include "stdio.h"
void main() {
int i;
printf("%d\n", i);
}
答案 0 :(得分:5)
gcc是否将自动变量初始化为0?
是和否!
实际上未初始化的自动变量获得不确定值(未指定值或陷阱表示 1 )。
在程序中使用此类变量会在使用不可移植或错误的程序构造或错误数据时调用未定义的行为 - 行为, ANSI C国际标准没有要求。(C11:§3.4.3)
调用UB后,您可能会得到预期或意外的结果。对于该程序的运行,编译器到编译器甚至版本到同一编译器的版本,结果可能会有所不同,即使在系统温度下也是如此!
1 。可以将自动变量初始化为陷阱表示而不会导致未定义的行为,但在将正确的值存储在其中之前,不能使用该变量的值。 ( C11:6.2.6类型的表示 - 脚注50 )
答案 1 :(得分:1)
不,我用gcc得到随机值(Debian 4.9.2-10)4.9.2。
ofd@ofd-pc:~$ gcc '/home/ofd/Destkop/test.c'
ofd@ofd-pc:~$ '/home/ofd/Desktop/a.out'
-1218415715
ofd@ofd-pc:~$ '/home/ofd/Desktop/a.out'
-1218653283
ofd@ofd-pc:~$ '/home/ofd/Desktop/a.out'
-1218845795
答案 2 :(得分:0)
函数内声明的变量未初始化。如果你将它们打印出来,就无法预测会出现什么。在您的示例main
中也是一个函数。因此它恰好是零。
当你将变量声明为静态或全局时,编译器会将它们初始化为零。
答案 3 :(得分:0)
在被OS移交之前,新分配的内存被清除(通常为0)已成为标准的安全做法。不想交出可能包含密码或私钥的内存!因此,由于编译器不保证对其进行初始化,因此无法保证您会得到什么,但在现代,它通常是至少在特定操作系统中保持一致的值。