【问题标题】:How does an uninitiliazed variable get a garbage value?未初始化的变量如何获得垃圾值?
【发布时间】:2009-09-14 16:55:48
【问题描述】:

当我们创建一个变量并且不对其进行初始化时,就会为它分配一个称为垃圾值的(随机)数字。

  • 如何将此值分配给变量?
  • 这背后的整体概念/机制是什么?
  • 这种情况只发生在 C 语言中吗?

【问题讨论】:

  • 我会是最后一个谴责家庭作业类型的问题,但这不是有点明显吗?
  • @DrJokepu 如果这对我来说是显而易见的,我不会在这上面浪费时间。
  • @Ravi,答案当然不明显。我的意思是,这看起来像是学校作业给我的一组问题。这是因为问题的构建方式给人的印象是最初的提问者知道他或她的问题的答案。
  • @DrJokepu 哦!我误会了。不过,忽略问题的风格。我绝对不是问这个问题来测试人们的知识。我真的不知道。
  • @DrJokepu - 我得到了相反的印象“谁和怎么做?”向我尖叫一个“错误的问题”,由一个真正不知道发生了什么的人提出,因为它没有答案。

标签: c variables compiler-construction programming-languages initialization


【解决方案1】:

垃圾值没有分配,而是该值已经存在。当您分配一个变量时,您正在保留一块内存 - 直到您覆盖它,该内存将包含之前存在的任何“随机”信息。

作为一个比喻,考虑分配一个变量,比如购买一块土地 - 直到你用它做某事(比如盖房子),这块土地上只会有任何垃圾已经放在那里(比如一座摇摇欲坠的旧房子)。

某些语言会自动用零填充新分配的变量 - 这需要时间。在像 C 这样的更多“自己动手”的语言中,这种额外的行为是没有保证的(尽管在某些系统上,无论语言如何,内存都会被清除,例如作为安全措施)

【讨论】:

  • 啊!比我的好:)。伟大的! +1
  • 例如,MSVC 在调试模式下将所有内容初始化为 0xcccccccc(这有时会很有帮助)
  • 我正在考虑使用 0xf00d 填充新分配的内存的调试器(90 年代末 IIRC)的名称...有什么帮助吗?
  • @pm100 字母o 不是十六进制数字。
【解决方案2】:

内存在应用程序的不同点被使用和重用。例如,随着应用程序调用堆栈的增长和缩小,内存中的同一位置可能会被覆盖很多次。要记住的是,当一块内存被丢弃时,它不会被清零,所以如果你在再次使用它时没有为内存中的那个位置指定一个新的初始值,你将得到旧的“垃圾”值。

一些languagesstructure implementations 在使用时默认初始化内存。其他人则不这样做,因此仔细阅读您的语言的文档以了解会发生什么很重要。

【讨论】:

    【解决方案3】:

    没有人明确指定抓取值。如果创建变量,则仅确定变量的位置,而不确定其值。这就是我们初始化它的原因。垃圾值可能来自旧进程对同一内存的一些先前操作!所以它可以容纳任何东西。我认为它适用于相当多的语言。我不确定列表! :)

    【讨论】:

      【解决方案4】:

      当我们创建一个变量但不初始化它时,什么都不会发生。当您从该变量中读取值时,您会从变量现在所在的内存中获取数据。它可能看起来像垃圾/随机值只是因为变量are placed in memory with some degree of randomness.

      【讨论】:

        【解决方案5】:

        C 标准说:

        实施:详细检查实施:https://stackoverflow.com/a/36725211/895245 摘要:

        • 本地:地址永远不会被写入,所以之前的地址都会被使用
        • 全球:.bss

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 2011-05-14
          • 2015-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多