【问题标题】:How are garbage values for variables generated in C?在 C 中如何生成变量的垃圾值?
【发布时间】:2017-05-10 04:44:57
【问题描述】:

我的意思是问它是否遵循一些特定的算法并且实际上不是垃圾。

换句话说,“垃圾”值究竟是如何存在的?考虑不调用UB,如果读取了一个垃圾值,那这个值的来源是什么?

【问题讨论】:

  • 垃圾就是垃圾。如果有一种算法,它不会是垃圾,它会是“特定生成的愚蠢值,具有一些已知的可定义且可能可重现的模式”
  • 这只是事先存在的内容,因此将其设置为指定值不会产生任何开销。没有算法。
  • 我们是否可以在本网站上使用明确的包罗万象将有关未定义行为的问题标记为重复?
  • 您要问的可能是为什么某些变量没有获得预定义的值,如果您不故意初始化它们,您会在那里发现垃圾。这主要是因为在其他变量过去使用它并将其最后一个值留在那里之后,可能会使用相同的内存位置。上电后未初始化的内存也会包含一些垃圾。所以....只需初始化我们的数据。
  • 这个问题可能是一个有效的问题,可能措辞不正确。遗憾的是,对于没有经验的人来说,没有足够的谷歌搜索材料,恕我直言。我并不是说这是一个非常有用的问题,但我也不会 DV 它。只是我的两分钱。

标签: c variables initialization undefined-behavior


【解决方案1】:

该标准没有提到“垃圾”一词,而是提到了“不确定/不确定的值”。该值可以是任何东西注意

从用户的角度来看,如果我们无法得到某个值的修正(对于任何变量),那么“期望”在任何时候都不会匹配,我们得到的值(如果)没有任何用处,因此将它们称为“垃圾”是很常见的。

最相关和最常见的观察/实现是,对于未初始化的自动变量,仅分配存储空间,不触及该存储空间的内容。所以,它可能仍然包含放在那里的最后存储的值。现在,在当前情况下,该值可能在其他(先前)场景中是有效的,但没有任何意义,因此在当前场景中它是“垃圾”。

TL;DR“垃圾”值不是生成的,在大多数情况下,它只是该内存位置中最后存储的值。


注意:

来自C11,第 6.7.9 章的相关引用

如果具有自动存储持续时间的对象未显式初始化,其值为 不确定。 [....]


§§ 附加阅读:

这与主题密切相关,因此将其添加为脚注。

如果存在一个变量,它具有不确定的值和

  • 数据类型可以有陷阱表示
  • 变量的地址没有取到

然后,尝试读取该值实际上会导致undefined behavior。请注意。

【讨论】:

  • "anything" 结果比大多数人想象的更令人惊讶。如果未初始化的变量在堆栈上,它可以包含该数据类型的超出范围的值(或者如果处理器有一个陷阱值,即使该数据类型没有)。
【解决方案2】:

当 C 在堆栈和堆上分配内存时,它不会修改存储在内存地址的内容,它只是为变量指定空间。在声明变量之前,未初始化的变量将包含该位置内存中的任何内容。有时这些值将是您程序中使用和清除的先前内存,有时它们将是来自操作系统、堆栈金丝雀等的值。无法预测会出现什么。

【讨论】:

  • 另外,一些 C 变量只存在于处理器寄存器中,它们的“垃圾”值是该寄存器中先前存储的数据。
【解决方案3】:

如果未初始化,堆栈上的变量(也称为自动变量)存在垃圾值。它们被推送、弹出、使用位于堆栈中地址上的先前变量、先前的函数调用等进行初始化。

【讨论】:

    【解决方案4】:

    每个特定的内存地址(堆栈或堆)都会有一些数据。在将该内存分配给您的变量之前,它可能被另一个变量(可能被操作系统或其他程序)使用。因此,它可能包含由那些最后分配的变量分配的最后一个值。而这些价值观现在对我们毫无用处。这就是为什么它们对我们来说是垃圾

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 1970-01-01
      • 2017-12-01
      • 2016-01-26
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      相关资源
      最近更新 更多