C语言 未初始化变量-堆栈检查



假设我在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;
}

这个随机值是什么?

一般来说,它是之前某个函数调用在该内存位置中碰巧留下的值。

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

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

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

最新更新