据我所知,局部变量是未初始化的,即它包含垃圾值。 但是下面的程序给出了0(零)作为输出。
main()
{
int i;
printf("%d\n",i);
}
当我在程序之上运行时,它总是给0。 我知道0也可以是垃圾值,但每次我输出为零。 任何人都可以知道它的原因吗?
答案 0 :(得分:5)
垃圾值表示发生在该内存位置的任何内容。在您的情况下,值恰好为零。在另一台机器上可能不是这种情况。
请注意,为了进行调试,某些编译器会将未初始化的变量用一些魔术值填充(如0xA5A5
),但它通常也不为零。
答案 1 :(得分:3)
当我在程序之上运行它总是给出0.我知道0也是 可以是垃圾值,但每次我输出为零。
无论发生什么导致0都被写入i
的位置,现在每次程序运行时都可能发生这种情况。电脑很好,很可靠。 “垃圾”并不一定意味着“随机”或“总是在变化”,它只是意味着“在我关心的任何环境中都没有意义。”
答案 2 :(得分:2)
我认为这只是一次意外。本地变量确实未初始化,但是您的编译器为(int i)变量分配的内存以前没有被当前进程使用,因此没有垃圾值。
答案 3 :(得分:1)
运气!行为未定义,因此答案取决于您的编译器和系统。这一次,你碰巧幸运的是,该内存区域的前四个字节为零。但是不能保证它会一直这样做,从一个系统到另一个系统,甚至从一个系统到下一个系统。
答案 4 :(得分:1)
打印始终为0的可能原因是main
以明确定义的状态启动;更准确地说,ELF程序从一个定义良好的堆栈(由ELF规范定义)和寄存器开始,因此它的_start
函数(来自crt*.o
)是ELF可执行文件的起始点得到了很好的定义堆叠,并调用main
。
尝试将您的函数设置为其他名称,并在各种状态下调用它(例如,以main
以更复杂的方式多次调用它)。尝试使用不同的程序参数和环境运行程序。您可能会观察到i
您的计划展示了一些undefined behavior(启用了所有警告gcc -Wall
警告您)。
答案 5 :(得分:0)
据我所知,Linux中未初始化的变量首先在零页面中“分配” - 一个仅包含零的特殊页面。
然后,在第一次写入unitialized变量时,变量从零页面移动到另一个未写保护的页面。