gcc是否将自动变量初始化为0?

gcc是否将自动变量初始化为0?,c,C,为什么我得到了0。I是一个自动变量,所以它应该打印一些垃圾值,对吗?我正在使用gcc编译器 #include "stdio.h" void main() { int i; printf("%d\n", i); } gcc是否将自动变量初始化为0 是和否 实际上,未初始化的自动变量获取不确定值(未指定值或陷阱表示法1) 在程序中使用这些变量调用未定义的行为——在使用不可移植或错误的程序构造或错误数据时的行为, ANSI C国际标准对其无任何要求。(C11:§3.4.3) 一旦UB被调用,您可能会

为什么我得到了0。I是一个自动变量,所以它应该打印一些垃圾值,对吗?我正在使用gcc编译器

#include "stdio.h"
void main() {
int i;
printf("%d\n", i);
}
gcc是否将自动变量初始化为0

是和否
实际上,未初始化的自动变量获取不确定值(未指定值或陷阱表示法1

在程序中使用这些变量调用未定义的行为——在使用不可移植或错误的程序构造或错误数据时的行为, ANSI C国际标准对其无任何要求。(C11:§3.4.3)

一旦UB被调用,您可能会得到预期或意外的结果。结果可能会因程序的不同运行、编译器的不同甚至是同一编译器的不同版本而有所不同,甚至取决于系统的温度


1。自动变量可以初始化为陷阱表示,而不会导致未定义的行为,但只有在其中存储正确的值后才能使用该变量的值。(C11:6.2.6类型表示法——脚注50

gcc是否将自动变量初始化为0

是和否
实际上,未初始化的自动变量获取不确定值(未指定值或陷阱表示法1

在程序中使用这些变量调用未定义的行为——在使用不可移植或错误的程序构造或错误数据时的行为, ANSI C国际标准对其无任何要求。(C11:§3.4.3)

一旦UB被调用,您可能会得到预期或意外的结果。结果可能会因程序的不同运行、编译器的不同甚至是同一编译器的不同版本而有所不同,甚至取决于系统的温度



1。自动变量可以初始化为陷阱表示,而不会导致未定义的行为,但只有在其中存储正确的值后才能使用该变量的值。(C11:6.2.6类型表示法——脚注50

函数中声明的变量未初始化。如果你把它们打印出来,你无法预测会出现什么。在您的示例中,
main
也是一个函数。因此,它恰好是零


当您将变量声明为静态变量或全局变量时,编译器会将它们初始化为零。

函数中声明的变量未初始化。如果你把它们打印出来,你无法预测会出现什么。在您的示例中,
main
也是一个函数。因此,它恰好是零


当您将变量声明为静态或全局变量时,编译器会将它们初始化为零。

否,我使用gcc(Debian 4.9.2-10)4.9.2获得随机值


不,我使用gcc(Debian 4.9.2-10)4.9.2获得随机值



新分配的内存在被操作系统移交之前被清除(通常为0),这已经成为标准的安全实践。不想移交可能包含密码或私钥的内存!因此,由于编译器也不能保证对其进行初始化,因此无法保证您将得到什么,但在现代,它通常是一个至少在特定操作系统中保持一致的值。

在操作系统移交之前,将新分配的内存清除(通常为0)已成为标准的安全实践。不想移交可能包含密码或私钥的内存!因此,由于编译器也不保证对其进行初始化,因此无法保证您将得到什么,但在现代社会,它通常是一个至少在特定操作系统中保持一致的值。

0是一个有效的垃圾值:)对于值为0的未初始化变量,没有任何规则。只是不能保证。每次编译和运行此程序时,我都会得到0。编译器或运行时库可能会在堆栈中预先填充0。或者它可能是可执行加载过程的工件。或者它可能是在
main()
之前调用的设置例程中堆栈变量的剩余值。仍然不违法。仍然不能保证。零是有效的垃圾值:)没有针对值为0的未初始化变量的规则。只是不能保证。每次编译和运行此程序时,我都会得到0。编译器或运行时库可能会在堆栈中预先填充0。或者它可能是可执行加载过程的工件。或者它可能是在
main()
之前调用的设置例程中堆栈变量的剩余值。仍然不违法。仍然不能保证。但我每次都得到0。不仅对于这个程序,对于每个程序,一个自动变量都会给出0而不是垃圾值。@AkashSinha这没关系,只是因为你每次都得到0,并不意味着你每次都会得到0。如果你不初始化一个值,它就包含垃圾,垃圾可能是也可能不是0。零或不是零,UB可以也将导致鼻恶魔。那是肯定的。但我每次都得到0分。不仅对于这个程序,对于每个程序,一个自动变量都会给出0而不是垃圾值。@AkashSinha这没关系,只是因为你每次都得到0,并不意味着你每次都会得到0。如果你不初始化一个值,它就包含垃圾,垃圾可能是也可能不是0。零或不是零,UB可以也将导致鼻恶魔。那是肯定的。我是要加上这个作为评论还是可以作为回答?你也应该解释一下为什么会这样?@haccks我希望我知道他是如何得到0:)我的意思是,我们都使用同一个编译器。@pmg实际上在拖放文件时终端会用单引号生成路径本身。@pmg Lol。这非常实用。我应该把它添加为注释还是作为答案?你还应该解释为什么会发生这种情况?@haccks我希望我知道他是如何得到0:)我的意思是,我们都使用
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