【发布时间】:2009-06-17 12:18:38
【问题描述】:
当 C 程序启动并将变量分配到内存位置时,C 标准是否说明该值是否已初始化?
// global variables
int a;
int b = 0;
static int c;
在上面的代码中,'b'将被初始化为0。'a'的初始值是多少? 'c' 有什么不同,因为它对于这个模块是静态的?
【问题讨论】:
标签: c memory initialization
当 C 程序启动并将变量分配到内存位置时,C 标准是否说明该值是否已初始化?
// global variables
int a;
int b = 0;
static int c;
在上面的代码中,'b'将被初始化为0。'a'的初始值是多少? 'c' 有什么不同,因为它对于这个模块是静态的?
【问题讨论】:
标签: c memory initialization
由于您特别提到了全局变量:对于全局变量,无论是否声明为static,它们都将被初始化为0。
Local 变量将是 undefined(除非它们被声明为 static,在这种情况下它们也将被初始化为 0——感谢 Tyler McHenry )。翻译过来,这意味着你不能依赖它们包含任何特定的东西——它们只会包含该位置内存中已经存在的任何随机垃圾,这可能因运行而异。
【讨论】:
编辑: 以下内容仅适用于局部变量 - 不适用于全局变量。
变量的初始值未定义。在某些语言中,变量在内存中的位置在声明时会归零,但在 C(和 C++ 中)中,未初始化的变量将包含当时存在于该位置的任何垃圾。
因此,最好的想法是未初始化的变量很可能包含垃圾并具有未定义的行为。
【讨论】:
a 将为零,c 也将为零,前提是它们是全局的且未显式初始化。对于局部静态变量也是如此。
只有局部非静态变量没有被初始化。使用 malloc 分配的内存也未初始化。
请参阅here,了解 C 中不同对象的初始化和分配规则。
【讨论】:
今天早上我打字太慢了。当我回答时,三个人迅速出现,所以我删除了大部分帖子。我找到的链接清晰而简短,所以无论如何我都会发布:Wikipedia on "uninitialized variable" 以讨论基本问题。
【讨论】:
快速测试显示 a 和 c 为 0。
int a;
static int c;
int main() {
printf("%d %d\n", a, c);
return 0;
}
a(和c)的位置在编译时确定;也就是说,它们既没有放在堆栈上,也没有放在 malloc 返回的内存间隔中。我认为 C 标准说它们在所有情况下都被初始化为 0。
我对@987654322@ 有99.9% 的信心,对a 有98% 的信心。关键字static,在全局变量的上下文中,实际上类似于(比如)C++ 和Java 中的private:它是关于可见性,而不是存储位置。
Andrew Hare 关于未初始化变量的说法对于存储在堆栈或 malloc 内存中的数据是正确的。对于静态存储的变量,情况并非如此。
【讨论】: