繁体   English   中英

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

[英]In C if a variable is not assigned a value then why does it take garbage value?

为什么变量采用垃圾值?

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM