C为int变量生成随机值

时间:2012-11-19 06:22:53

标签: c

  

可能重复:
  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

5 个答案:

答案 0 :(得分:3)

您的 C 程序被编译为某个可执行程序。请注意,如果您使用gcc -Wall在Linux上进行编译,则会收到有关未初始化变量的警告。

使用一些堆栈槽或某些寄存器编译var1var2变量。这些包含一些显然随机的数字,您的程序打印。 (这个数字不是随机的,只是不可预测的垃圾)。

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 valueindeterminate value的值(语言标准不强加任何必须具有特定价值的要求)所以你得到了任何随机值。

纯粹的说服力是,var1获得的价值相同,但var2的价值却相同。 但是在任何其他系统上,它可能会在某个时间后给出不同的值,甚至可能在您的系统上。 因此,使用未初始化的变量是undefined behaviour

答案 4 :(得分:0)

在C中,

如果变量声明为Global或static,则它们会自动初始化为零。但是,如果它们被声明为local,那么这些变量的值是不确定的,即取决于编译器。 (一些垃圾值)