繁体   English   中英

为什么局部变量初始化为零

[英]Why local variable is initialized to zero

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

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

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

垃圾值表示该内存位置中发生的任何事情。 在您的情况下,该值恰好为零。 在另一台机器上可能并非如此。

请注意,某些编译器会为调试目的(例如0xA5A5 )填充一些不可思议的值,但通常也不为零。

当我在上面的程序上运行时,它总是给出0。我知道0也是一个垃圾值,但是每次我得到的输出都是零。

无论什么原因导致0写入到i现在所在的位置,都可能在每次程序运行时发生。 这样的计算机就很好而且可靠。 “垃圾”不一定表示“随机”或“总是在变化”,而仅表示“在我关心的任何情况下都没有意义”。

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

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

始终打印为0的可能原因是, main以良好定义的状态启动; 更确切地说,ELF程序从定义良好的堆栈(由ELF规范定义)开始并进行注册,因此它的_start函数(来自crt*.o )(是ELF可执行程序的起点)将获得定义良好的堆栈,并调用main

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM