为什么全局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对于不同的调用可以具有不同的地址,并且每次调用函数时都必须在运行时进行初始化,从而产生可能不需要的运行时间成本。 如果你确实需要这个初始化,然后请求它。
global
variables和static
variables在初始化时被存储在数据段(DS)中,并且在未初始化时被块(BSS)初始化。
这些variables具有固定的内存位置,并且在编译时分配内存。
因此, global
和static
variables的默认值为'0'
。
auto
variables存储在堆栈中,而没有固定的内存位置。
内存在运行时分配给auto
variables,而不是在编译时。 因此, auto
variables的默认值为垃圾。
你已经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在堆栈上生成。