uninitiliazed变量如何获得垃圾值?

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

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

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

作为一个比喻,考虑分配一个变量,比如购买一块土地 – 直到你用它做任何事情(比如建房子),土地将只有那些已经坐在那里的垃圾(就像一个破旧的房子)。

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

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

某些语言和结构实现会在使用时默认初始化内存。 其他人则不这样做,因此仔细阅读您的语言文档以了解预期结果非常重要。

没有人明确指定一个垃圾值。 如果创建变量,则仅确定变量的位置,而不是其值。 这就是为什么我们要初始化它。 垃圾值可能来自旧进程在同一内存中的某些先前操作! 所以它可以容纳任何东西。 我认为它适用于相当多的语言。 我不确定清单! 🙂

当我们创建一个变量并且不初始化它时,没有任何反应。 当您从该变量读取值时,您将从内存中获取数据,此时变量位于该变量中。 它可能看起来像垃圾/随机值,因为变量放在内存中具有一定程度的随机性。

C标准说:

  • 局部变量的未定义行为:( 为什么)使用未初始化的变量未定义行为? (例如段错是合法的)
  • 全局变量为零: C中声明的未初始化变量会发生什么? 它有价值吗?

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

  • local:地址永远不会被写入,所以以前使用过的地方都是如此
  • global: .bss