垃圾价值的起源是什么?

时间:2017-05-16 16:10:40

标签: c

当我们定义一个变量并且不初始化它时,分配给变量的内存块仍然包含来自先前程序的值,称为垃圾值。但是假设,在一个假设的情况下,系统中存在一块未使用的内存,当我声明并定义一个变量时,该内存块被分配给该变量。如果我没有初始化变量,并尝试打印变量的值,则系统不会打印任何垃圾值。结果会是什么?该系统将做什么?

4 个答案:

答案 0 :(得分:1)

  

当我们定义一个变量并且不初始化它时,分配给变量的内存块仍然包含来自先前程序的值,称为垃圾值。

     

如果我没有初始化变量并尝试打印它,那么它就没有任何垃圾值可供打印。

C未指定这些行为。没有指定的垃圾值

如果代码尝试打印(或使用)未初始化对象的值,则结果为未定义行为(UB)。可能发生任何事情:发生陷阱错误,值为42,代码死亡,任何

如果未初始化的对象是unsigned char,则会有一种特殊情况,其中值将是不确定的值,只有[0...UCHAR_MAX]范围内的值,但没有UB。这是最接近垃圾值 C指定的。

答案 1 :(得分:0)

首先,C标准没有定义实现在未初始化读取时的实现行为。仅仅是价值没有定义。系统可以使用它希望选择值的任何方法。或者它甚至可能是陷阱表示并且会使我相信的程序崩溃。

然而,在大多数真实的现代操作系统上。实际上数据是新页面,它们被映射到程序地址空间。出于安全原因,大多数内核实际上明确地确保将这些内核清零以避免软件监视来自先前运行并留在内存中的程序的数据。

然而,正如你所说的一些操作系统只会保留这些数据,这意味着页面要么是新鲜的,通常都是清零的,要么包含以前程序中的任意数据(甚至可能是由内存启动方式定义的任意数据,但至少使用DRAM,通常处于归零状态。)

答案 2 :(得分:0)

我认为您需要更多的硬件视角。

什么是记忆?存储器的一个例子:由晶体管和电容器组成。晶体管和电容器构成存储器位。比特值为0或1,不存在该比特值不存在的假设场景;)因为它必须保持0或1而不是其他。如果你认为没有什么"在位值中,这意味着您想象的硬件(晶体管/电容器)不起作用。

一串位产生一个字或字节。一堆字节包含整数/浮点数或您定义的任何变量。因此,即使没有初始化变量,它也在每个存储器单元中包含0和1。当你访问它时 - 它被称为垃圾。

答案 3 :(得分:-1)

  

但是假设,在一个假设的情况下,系统中存在一块未使用的内存,当我声明并定义一个变量时,该内存块被分配给该变量。如果我没有初始化变量,并尝试打印它,它没有任何垃圾值打印。它会做什么?

任何给定的内存位置都有某些值,无论它如何到达。 “垃圾”值不必来自之前在该空间中运行的程序,它可能只是系统启动时内存位置的初始状态。它是“垃圾”的原因是你不知道它是什么 - 你没有把它放在那里,你不知道它是如何到达那里的,你并不在乎。