0

据我所知,局部变量是未初始化的,即它包含垃圾值。但以下程序给出 0(零)作为输出。

main()
{
    int i;
    printf("%d\n",i);
}

当我在上面运行程序时,它总是给出 0。我知道 0 也可以是垃圾值,但每次我得到零作为输出。任何人都可以知道它的原因吗?

4

6 回答 6

5

垃圾值意味着该内存位置中发生的任何事情。在您的情况下,该值恰好为零。在另一台机器上可能不是这样。

请注意,出于调试的目的,某些编译器会用一些魔法值填充未初始化的变量(如0xA5A5),但它通常也不为零。

于 2013-07-15T06:06:05.393 回答
3

当我在上面运行程序时,它总是给出 0。我知道 0 也可以是垃圾值,但每次我得到零作为输出。

i每次程序运行时,无论发生什么导致将 0 写入现在的位置都可能发生。像这样的计算机既好又可靠。“垃圾”并不一定意味着“随机”或“总是在变化”,它只是意味着“在我关心的任何上下文中都没有意义”。

于 2013-07-15T06:06:42.303 回答
2

我认为这只是一个意外。局部变量确实未初始化,但是您的编译器为 (int i) 变量分配的内存之前没有被当前进程使用,因此没有垃圾值。

于 2013-07-15T06:14:38.477 回答
1

运气!行为未定义,因此答案取决于您的编译器和系统。这一次,您碰巧幸运的是,该内存区域中的前四个字节为零。但是不能保证它会一直这样做,从一个系统到下一个系统,甚至从一个调用到下一个。

于 2013-07-15T06:07:27.057 回答
1

总是打印 0 的一个可能原因main是在定义明确的状态下开始;更准确地说,一个 ELF 程序从一个定义良好的堆栈(由 ELF 规范定义)和寄存器开始,因此作为 ELF 可执行起点的_start函数(from )获得一个定义良好的堆栈,并调用.crt*.omain

main尝试将您的函数命名为其他名称,并以各种状态调用它(例如,以更复杂的方式多次调用它)。尝试使用不同的程序参数和环境运行您的程序。您可能会观察到不同的值i

您的程序表现出一些未定义的行为(并且启用所有警告gcc -Wall 都会警告您)。

于 2013-07-15T06:08:19.167 回答
0

据我所知,Linux 中未初始化的变量首先在零页中“分配”——一个仅包含零的特殊页。
然后,在第一次写入单元化变量时,变量从零页移动到另一个没有写保护的页。

于 2013-07-15T09:02:45.537 回答