0

假设我正在用C. 如果我有一个未初始化的变量number,我不知道它的值是什么。但...

那个随机值是什么?我在内存转储中有什么?是不是因为试图读取一个地址却什么也没有出来?

我试图调试我的程序,但我还是个新手,所以很容易迷路。此外,如果我添加一个zerowillcome变量(参见代码 2),我的number值将不再是随机的:它将是0. 我不明白为什么会发生这种情况,但我认为这与将顺序变量推入堆栈有关。我对吗?有人可以一步一步地想象我到底发生了什么吗?

PS:那些其他变量在那里,因为这是其他代码的片段,所以我不知道删除它们是否可以改变应用程序行为:我的注意力被添加zerowillcome变量引起的奇怪行为所吸引。

代码 1:

int main (int argc, char *argv[])
{
    int number, var1, var2, tmp, tmp2;
        printf("number: %d", number); // <- insert random number here
        return 0;
}
    

代码 2:

int main (int argc, char *argv[])
{
    int number, var1, var2, tmp, tmp2, zerowillcome;
        printf("number: %d", number); // <- 0 !!!
        return 0;
}
4

2 回答 2

1

那个随机值是什么?

通常,它是某个先前的函数调用恰好留在该内存位置的任何值。

当您调用一个函数时,首先发生的事情之一是堆栈指针递增以保留该函数的返回地址、返回值和局部变量所需的空间。当函数退出时,堆栈指针减少相同的量。在这两者之间,该内存被函数用来存储数据。在函数返回并调用其他函数后,会发生同样的事情,并且可能会使用相同的内存。如果该函数没有将其变量初始化为某个已知值,则变量将恰好具有前一个函数留在堆栈中的任何内容。

但是,您不应该关心这个,当然也不应该依赖它。初始化变量的值是未定义的,所以它可以是任何东西。例如,编译器可以插入指令来清除函数在函数调用之前或之后使用的所有堆栈内存。或者它可以将内存设置为字符串“不要使用未初始化的变量!” 或其他任何东西。唯一合理的方法是确保在读取变量之前将一些值写入变量(即初始化它们)。

于 2014-03-21T18:29:54.357 回答
0

这是未定义的行为,您的变量在声明时未初始化。

于 2014-03-21T18:12:26.260 回答