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 - Fatal编程技术网

在C语言中,如果一个变量没有赋值,为什么它会接受垃圾值?

在C语言中,如果一个变量没有赋值,为什么它会接受垃圾值?,c,variables,initialization,C,Variables,Initialization,为什么变量会接受垃圾值?它只接受变量所指向地址的内存中的任何内容。未分配变量具有所谓的不确定状态,可以以任何方式实现,通常,只要保持变量占用的内存中的数据不变即可。分配变量时,就是在分配一些内存。如果您不覆盖它,内存将包含以前存在的任何“随机”信息,这称为垃圾值。为什么它不?一个更好的问题可能是“你能解释一下为什么C#中未初始化的成员变量有一个已知的默认值吗?”我想这样做的基本原理是你的程序会更快 如果编译器自动重置变量(即:初始化为0或为浮点/双精度等设置为NaN),则需要一些时间(必须写入内

为什么变量会接受垃圾值?

它只接受变量所指向地址的内存中的任何内容。

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

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

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

我想这样做的基本原理是你的程序会更快

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


今天,这种优化是有争议的:初始化变量所带来的开销可能不值得错误地初始化变量所带来的问题,但当定义了C时,情况就不同了。

当在C中声明变量时,它只涉及为变量分配内存,而不涉及隐式赋值。因此,当您从中获取值时,它将存储在内存中的内容转换为您的变量数据类型。我们称之为垃圾值的值。它仍然是这样,因为C语言实现的内存管理不能处理这个问题。

使用malloc()从堆中分配的本地变量和内存会出现这种情况。局部变量是更典型的灾难。它们存储在函数的堆栈框架中。它只需根据局部变量所需的存储量调整堆栈指针即可创建

这些变量在函数进入时所具有的值基本上是随机的,无论之前的函数调用使用同一堆栈区域时存储在这些内存位置的是什么

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


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

除非它是一个外部程序,如果我没有弄错的话,它将自动初始化为0。@Soulseekah-全局和静态。“reset”的过去式我相信是“reset”。我不是英语母语人士:(修正了!+1提及性能成本/可靠性权衡。@Dervin Thunk:为什么任何变量都应该有“默认值”值?回答:除非有什么东西给了它默认值,否则它不会。例如,在C中,静态变量被初始化为0:有一些隐藏的代码可以做到这一点,这不是神奇的。所以——我是说,如果你想知道某人是否真的理解正在发生的事情,问他们为什么有些变量有可预测的值如果它们没有(明确地)初始化。重复的,也请参见:不仅仅是未确定的,它是未定义的行为:许多优点。重新“管理环境”(这不是一个非常以MS为中心的术语吗?),安全问题通常使其变得至关重要,但这并不意味着他们也不想帮助程序员——“理念”Java和.Net的主要功能是选择容忍或防止程序员错误,而不是CPU或空间效率。。。。