Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中生成变量的垃圾值?_C_Variables_Initialization_Undefined Behavior - Fatal编程技术网

如何在C中生成变量的垃圾值?

如何在C中生成变量的垃圾值?,c,variables,initialization,undefined-behavior,C,Variables,Initialization,Undefined Behavior,我的意思是问它是否遵循某种特定的算法,实际上不是垃圾 换句话说,“垃圾”值究竟是如何呈现的?考虑到不调用UB,如果读取了垃圾值,该值的来源是什么?标准没有提到术语“垃圾”,而是提到“不确定/不确定值”。值可以是任何值。请注意 从用户的角度来看,如果我们无法确定某个值(对于任何变量),那么“期望”在任何时候都不匹配,而我们得到的值(如果)也没有任何用处,因此将它们称为“垃圾”是常见的 最相关和最常见的观察/实现是,对于未初始化的自动变量,只分配存储,不涉及存储的内容。因此,它可能仍然包含放置在那里

我的意思是问它是否遵循某种特定的算法,实际上不是垃圾


换句话说,“垃圾”值究竟是如何呈现的?考虑到不调用UB,如果读取了垃圾值,该值的来源是什么?

标准没有提到术语“垃圾”,而是提到“不确定/不确定值”。值可以是任何值。请注意

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

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

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


注:

相关引用自第§6.7.9章
C11

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


§§附加内容:

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

在这种情况下,存在一个变量,它包含不确定的值和

  • 数据类型可以有陷阱表示
  • 变量的地址不被接受

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

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

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

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

垃圾就是垃圾。如果有一个算法,它将不是gargbage,它将是“特定生成的愚蠢值,具有一些已知的可定义且可能可复制的模式”。它只是事先存在的,因此将其设置为指定值不会产生任何开销。没有算法。在这个网站上有没有一个明确的捕获所有我们可以用来标记关于未定义行为的问题为重复的?你要问的可能是为什么一些变量没有得到预定义的值,如果你没有故意初始化它们,你会在那里发现垃圾。这主要是因为,在其他变量过去使用相同的内存位置并将其最后一个值保留在那里之后,可能会使用相同的内存位置。通电后,未初始化的内存也将包含一些垃圾。所以只需初始化我们的数据。这个问题可能是有效的,可能措辞不正确。不幸的是,没有足够的谷歌材料给没有经验的人。我并不是说这是一个非常有用的问题,但我也不想回答。还有,一些C变量只存在于处理器寄存器中,它们的“垃圾”值是先前存储在该寄存器中的数据。“任何”结果都比大多数人想象的更令人惊讶。如果未初始化的变量在堆栈上,它可以包含该数据类型的超出范围的值(或者如果处理器有陷阱值,即使该数据类型没有,也可以包含陷阱值)。