可能重复:
Default values of int when not initialized in c. why do i get different outputs?
初学者所以是lil soft ..am编译下面的一个简单代码,我没有为我的变量赋值,但C程序生成一些随机值,为什么会这样?(只有第二个变量生成随机整数)
那么这些价值来自哪里?
#include<stdio.h>
main(void) {
int var1;
int var2;
printf("Var1 is %d and Var2 is %d.", var1, var2);
return 0; //Book says I should use this for getting an output but my compiler anyways compile and return me values whether I use it or not
}
//Output 1st compiled: var1 = 19125, var2 = 8983
//Output 2nd compiled: var1 = 19125, var2 = 9207
//Output 2nd compiled: var1 = 19125, var2 = 9127
答案 0 :(得分:3)
您的 C 程序被编译为某个可执行程序。请注意,如果您使用gcc -Wall
在Linux上进行编译,则会收到有关未初始化变量的警告。
使用一些堆栈槽或某些寄存器编译var1
和var2
变量。这些包含一些显然随机的数字,您的程序打印。 (这个数字不是随机的,只是不可预测的垃圾)。
C 语言不强制隐式变量初始化(与例如Java相反)。
实际上,在 C 中我强烈建议始终显式初始化局部变量(通常,编译器可能足够聪明,甚至可以避免发出无用的初始化)。
您观察到的内容称为undefined behavior。
如果您使用不同的编译器,不同的优化标志或不同的环境(可能在再次运行程序之前键入var1
)编译,您可能会观察export SOMEVAR=something
的不同输出更改var1
的输出,或使用大量程序参数运行程序等等。)。
您可以(在Linux上)使用gcc -fverbose-asm -S
进行编译并添加各种优化标记(例如-O1
或-O2
...)您的源代码yoursource.c
并查看用某个编辑器生成yoursource.s
汇编代码。
答案 1 :(得分:2)
在C中,当您声明变量时,会在堆栈上为它们保留一些空间。堆栈是C跟踪哪些参数传递给哪个函数的方式,如果在函数内静态声明变量,存储返回值,则存储变量,等等。每次调用函数时,它都会在堆栈上推送值;也就是说,它将这些值写入堆栈中的下一个可用空间,并更新堆栈指针以解决此问题。当函数返回时,它会递减堆栈指针,指向它在前一个函数调用中指向的位置。
如果您声明一个变量,但是您没有初始化它,那么您只需获得之前的任何值。如果调用了另一个函数,则可以获取传递给该函数的参数;或者你可能会得到你要返回的函数的返回地址。
如果您出现,则显示main()
函数,而不调用其他函数。但是,在加载程序的过程中,动态链接器可能在您的进程空间中调用了多个函数。因此,您所看到的价值可能会遗留下来。
但是,您无法依赖这些值。它们可以是任何东西;它们可以初始化为0,它们可以是随机数据,它们可以是任何类型的内部数据。
答案 2 :(得分:1)
var1和var2的内容未定义。因此,它们可以包含任何有效值(取决于许多外部因素)。
纯粹的运气是只有第二个var接缝是随机的。在重新启动或启动其他一些程序之后的另一天尝试它,我打赌第一个var会发生变化。
答案 3 :(得分:0)
它被称为局部变量。任何局部变量都有auto
存储说明符,它们位于C中的堆栈中。
由于你没有宣传这些变量,所以它将采用任何名为garbage value
或indeterminate value
的值(语言标准不强加任何必须具有特定价值的要求)所以你得到了任何随机值。
纯粹的说服力是,var1
获得的价值相同,但var2
的价值却相同。
但是在任何其他系统上,它可能会在某个时间后给出不同的值,甚至可能在您的系统上。
因此,使用未初始化的变量是undefined behaviour
答案 4 :(得分:0)
在C中,
如果变量声明为Global或static,则它们会自动初始化为零。但是,如果它们被声明为local,那么这些变量的值是不确定的,即取决于编译器。 (一些垃圾值)