【问题标题】:Why local variable is initialized to zero为什么局部变量初始化为零
【发布时间】:2013-07-15 06:02:29
【问题描述】:

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

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

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

【问题讨论】:

  • 源文件的扩展名是什么?
  • 尽量避免未初始化的变量。没必要这样做
  • 这基本上是偶然的......并且误导了人们。不要依赖它;在其他机器类型上,它不一定是零。
  • @Jonathan:这家伙知道它是未定义的,不可靠的,你有什么......他在问为什么他总是得到零,或者看起来如此。

标签: c linux local-variables


【解决方案1】:

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

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

【讨论】:

  • 好的,这也很有帮助 +1 :)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 编译器生成一个初始化为零的数据区怎么样?
    • @Tarik 我认为这是可能的。
    【解决方案4】:

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

    【讨论】:

    【解决方案5】:

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

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

    您的程序显示了一些undefined behavior(并且启用了所有警告gcc -Wall 正在警告您)。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多