为什么全局variables总是初始化为“0”,而不是局部variables?

可能重复:
为什么全局variables和静态variables初始化为默认值?

看代码,

#include <stdio.h> int a; int main(void) { int i; printf("%d %d\n", a, i); } 

产量

 0 8683508 

这里'a'用'0'初始化,但'i'用'垃圾值'初始化。 为什么?

因为就是这样,根据C标准 。 其原因是效率:

  • 静态variables在编译时被初始化,因为它们的地址是已知的并且是固定的。 将它们初始化为0不会产生运行时成本。

  • 自动variables对于不同的调用可以具有不同的地址,并且每次调用函数都必须在运行时进行初始化,从而产生可能不需要的运行时间成本。 如果你确实需要这个初始化,然后请求它。

globalvariables和staticvariables在初始化时被存储在数据段(DS)中,并且在未初始化时被块(BSS)初始化。

这些variables具有固定的内存位置,并且在编译时分配内存。

因此, globalstaticvariables的默认值为'0'

autovariables存储在堆栈中,而没有固定的内存位置。

内存在运行时分配给autovariables,而不是在编译时。 因此, autovariables的默认值为垃圾。

你已经select了简单的variables,但是要考虑:

 void matrix_manipulation(void) { int matrix1[100][100]; int matrix2[100][100]; int matrix3[100][100]; /* code to read values for matrix1 from a file */ /* code to read values for matrix2 from a file */ /* code to multiply matrix1 by matrix2 storing the result in matrix3 */ /* code to use matrix3 somehow */ } 

如果系统将数组初始化为0,则努力将被浪费; 初始化由函数的其余部分覆盖。 C尽可能避免隐藏成本。

全局variables在main函数启动之前被分配和初始化,而当程序运行时,局部variables在堆栈上生成。