为什么在声明期间存储垃圾值?

时间:2014-02-14 17:42:32

标签: c variable-declaration garbage

我多次听说如果你没有初始化变量,那么garbage value就会存储在其中 说

int i;
printf("%d",i);

上面的代码打印了任何垃圾值,但是我想知道如果未初始化那么存储垃圾值需要什么?

5 个答案:

答案 0 :(得分:8)

未初始化值的值不仅仅是未知或垃圾,而且不确定并且评估该变量可能会调用未定义的行为或实现定义的行为。

一种可能的情况(可能是您看到的情况)是,在评估变量时,该变量将返回先前存在于该内存地址中的值。因此,它不像垃圾明确到该变量。

值得注意的是,没有表现出您所看到的行为的语言(甚至是C实现)通过在允许您使用它之前向该区域显式写入零(或其他初始值)来实现。

答案 1 :(得分:7)

它不存储垃圾,它会在运行时打印该地址内存中发生的任何事情。这是以效率为名。你没有为你没有要求的东西买单。

修改

回答为什么记忆中有什么东西。所有类型的程序都运行并需要共享内存。当内存分配给您的进程时,由于性能原因,它不会被重置。由于我们观察的变量是在堆栈上声明的,它甚至可能是你的程序将值放在上一个函数调用中。

答案 2 :(得分:5)

C只做你告诉它的事情。该标准将未初始化的变量定义为未定义的行为。

这个问题阐述了:(Why) is using an uninitialized variable undefined behavior?

接受的答案有一个很好的解释。

修改

一个有趣的旁注,但如果你声明变量static,它保证按标准初始化为零。现在找不到报价,正在努力..

<强> EDIT2:

我在工作中留下了我的C参考,而CBA则下载了一个。这个答案详细阐述了变量的初始值,无论是本地/自动,全局,静态还是不确定:https://stackoverflow.com/a/1597491/700170

答案 3 :(得分:2)

其他答案(正确地)指出正在打印的内容是内存中已经分配给i内存

然而,他们并没有澄清为什么首先存在这些位置的任何值,这可能是你真正要求的。

这有两个原因:首先,在启动时,我们无法确定内存电路将如何初始化自己。所以他们可以设置为任意值。第二个(并且,通常,更可能的原因,除非你刚刚重新启动你的计算机)是在你启动你的程序之前,那个内存位置已经被另一个程序使用了,它存储了一些东西 - wasn' t 当时的垃圾,因为它是故意储存的。但是,从你的程序的角度来看,它垃圾,因为你的程序无法知道为什么那个特定值存储在那里。

编辑:正如我在另一个答案的评论中提到的那样,即使存储在某个未初始化变量下的内存中的值实际上是0,这与“没有存储值”也不一样。存储的值为0,也就是说,代表一位内存的物理硬件忠实地存储值0。只要电路处于活动状态(即打开),存储器单元就必须存储某些东西;为了解释这是为什么,请看看触发器门。 (这里有一个不错的概述,假设你已经对NAND门有一点了解:http://computer.howstuffworks.com/boolean4.htm

答案 4 :(得分:2)

仅在本地varibales的情况下才会发生。由于局部变量的内存是在堆栈上分配的,并且在分配内存时,运行时系统在将内存分配给变量之前不会清除内存,这与在堆中为全局变量和静态变量分配内存的情况不同。因此,局部变量的默认值在堆栈上的内存内容为beome,而常量和静态变量的内容为0。