在C中,如果没有为变量赋值,那为什么它会占用垃圾值?

时间:2011-01-13 11:48:17

标签: c variables initialization

为什么变量会占用垃圾值?

7 个答案:

答案 0 :(得分:7)

我想这个理由是你的程序会更快。

如果编译器自动重置(即:初始化为0或NaN为浮点数/双精度等等)你的变量,那么这需要一些时间(它必须写入内存) 。
在许多情况下,初始化变量可能是不必要的:也许你永远不会访问你的变量,或者在你第一次访问变量时会在其上写。

今天这种优化是有争议的:由于初始化变量导致的开销可能不值得由未经初始化的变量引起的问题,但是当C被定义时,事情就不同了。

答案 1 :(得分:6)

未分配的变量具有所谓的不确定状态,可以通过任何方式实现,通常只是保持变量中内存中的数据不变。

答案 2 :(得分:3)

它只需要在变量指向的地址处获取内存中的任何内容。

答案 3 :(得分:3)

分配变量时,您正在分配一些内存。如果你不覆盖它,内存将包含之前的任何“随机”信息,这被称为垃圾值。

答案 4 :(得分:3)

为什么?一个更好的问题可能是“你能解释一下C#中初始化的成员变量是否具有已知的默认值?”

答案 5 :(得分:2)

当在C中声明变量时,它只涉及将内存分配给变量而不涉及隐式赋值。因此,当您从中获取值时,它会将内存存储到您的变量数据类型中。我们称之为垃圾值的那个值。它仍然如此,因为C语言实现具有内存管理,无法处理此问题。

答案 6 :(得分:2)

使用malloc()从堆分配的局部变量和内存会发生这种情况。局部变量是更典型的事故。它们存储在函数的堆栈框架中。这是通过将堆栈指针调整为局部变量所需的存储量来创建的。

这些变量在输入函数时将具有的值基本上是随机的,无论发生在先前函数调用的那些内存位置中,这些值恰好使用相同的堆栈区域。

这是一个难以诊断错误的令人讨厌的来源。至少因为价值不是真正随机的。只要程序具有可预测的呼叫模式,初始值很可能重复。编译器通常具有调试功能,允许它在初始化所有局部变量的函数的前导码中注入代码。可能产生奇怪计算结果或受保护模式访问冲突的值。

值得注意的是托管环境自动初始化局部变量。这样做并不是为了帮助程序员陷入成功之中,这样做是因为没有初始化程序员是一种安全隐患。它允许在沙箱中运行的代码访问由特权代码写入的内存。