当C程序启动并且变量被分配到内存位置时,C标准是否说明该值是否已初始化?
// global variables
int a;
int b = 0;
static int c;
在上面的代码中,'b'将被初始化为0.'a'的初始值是多少? 'c'是否有任何不同,因为它对这个模块是静态的?
答案 0 :(得分:11)
由于您特别提到全局变量:对于全局变量,无论它们是否被声明为static
,它们都将初始化为0.
本地变量将未定义(除非它们被声明为static
,在这种情况下,它们也将被初始化为0 - 谢谢泰勒麦克亨利)。翻译,这意味着你不能依赖它们包含任何特定的东西 - 它们只会包含该位置内存中已经存在的任何随机垃圾,这可能与运行不同。
答案 1 :(得分:5)
编辑: 以下内容仅适用于局部变量 - 不是全局变量。
变量的初始值未定义。在某些语言中,变量在内存中的位置在声明时为零,但在C(和C ++中)中,未初始化的变量将包含当时居住在该位置的任何垃圾。
因此,考虑它的最佳方式是未初始化的变量很可能包含垃圾并且具有未定义的行为。
答案 2 :(得分:4)
a
将为零,如果它们是全局的并且未显式初始化,则为c
。对于局部静态变量也是如此。
仅初始化本地非静态变量。此外,使用malloc分配的内存也未初始化。
有关不同对象的初始化和C分配规则,请参阅here
。
答案 3 :(得分:1)
我今天早上输入的速度太慢了。当我回答时,有三个人迅速赶来,所以我删除了大部分帖子。我发现的链接很简洁,所以我无论如何都要张贴:Wikipedia on "uninitialized variable"来讨论基本问题。
答案 4 :(得分:0)
快速测试显示a和c为0。
int a;
static int c;
int main() {
printf("%d %d\n", a, c);
return 0;
}
a(和c)的位置在编译时确定;也就是说,它们既不会放在堆栈上,也不会放在malloc返回的内存间隔中。我认为C标准说他们在所有情况下都被初始化为0。
我对c
有99.9%的自信,对a
有98%的信心。在全局变量的上下文中,关键字static
实际上类似于(比如)C ++和Java中的private
:它是关于可见性,而不是存储位置。
Andrew Hare所说的关于未初始化变量的内容对于存储在堆栈或malloc内存中的数据是正确的。对于静态存储的变量不是这样。