【问题标题】:How is undefined value created? [duplicate]未定义的价值是如何创造的? [复制]
【发布时间】:2012-01-09 09:10:32
【问题描述】:

可能重复:
How an uninitialised variable gets a garbage value?

因此,当使用未定义(但已声明)的变量时,它每次都包含奇怪的值。它怎么会有这样的价值?是故意随机生成的吗?

【问题讨论】:

    标签: c variables


    【解决方案1】:

    不是随机产生的,只是残存的记忆。

    每次都清除所有未使用的内存是非常低效的。因此内存被释放到操作系统并可用。当您请求新内存时,您会获得一些不属于任何人的内存,但由于它刚刚被释放但未清除,因此其中仍有垃圾。

    【讨论】:

      【解决方案2】:

      当声明局部变量时,编译器会在封闭函数的堆栈帧中分配一个槽,该变量将存在于其中。在设置堆栈帧之前,内存中该特定位置的任何值(通常来自堆栈帧占用该空间的先前函数调用)都将成为该变量的初始内容。

      在某些情况下,未初始化的变量实际上是故意设置为某个值,但它很少是随机的。例如,调试malloc() 可能会将新分配的块的每个字设置为 0xbadf00d,以作为内存尚未分配的标记。因此,结构成员可能会被初始化为不同于以前的任何东西。我不知道有任何编译器对堆栈变量执行此操作,但它们可能存在。

      【讨论】:

      • 你的意思是,他们真的将内存值设置为0xbadf00d?很高兴知道像这样使用十六进制。
      • @Amumu:是的,就是这样。有一个页面here 描述了微软调试 CRT 的行为。
      【解决方案3】:

      C 没有清理它分配的内存。这些值是内存中分配位置的“剩余”。

      C 原则上不会对程序员隐藏操作。它只执行要求的操作。由于您没有要求初始化变量,因此它不会为您执行此操作,因此目标内存中“向上”/“向下”的相同位 - 不要更改。

      【讨论】:

        【解决方案4】:

        变量可以有未定义的值,以避免使用一些合理的值进行初始化的开销,所以它绝对不是随机生成的(这本身就是不平凡的操作)。最初保存的值变量正是当时恰好在变量的内存位置中的值。

        【讨论】:

          【解决方案5】:

          c 中未初始化值的值取决于存储在内存地址中的值。它不是故意随机的。

          【讨论】:

            【解决方案6】:

            当你声明一个变量时,它已经有一个内存空间来保存它的值。如果您没有明确设置任何内容,它将包含之前存储在该位置的任何值。所以它不是程序故意随机生成的,只是碰巧存在的值。

            【讨论】:

              【解决方案7】:

              变量的声明是向编译器表明存在一个这样的某某类型的变量。变量的定义为此分配内存。分配的内存可以是stackauto 变量)、heap(动态分配的内存)等任何地方。除非它是static 变量,否则它将从未初始化的数据段中分配内存。因此,您看到的随机值只不过是之前存储在该内存位置的值!因此,建议在使用变量之前(第一次)初始化变量,或者换句话说,不要使用/取消引用未初始化的变量/指针。

              有关内存中程序结构的更多信息,请参阅here

              希望对你有帮助!

              【讨论】:

              • 是的。它有助于。感谢您的链接。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-03-10
              • 1970-01-01
              • 1970-01-01
              • 2014-01-15
              • 2015-08-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多