可能重复:
全局和静态变量为什么被初始化为默认值吗?
看到代码,
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %d\n", a, i);
}
产量
0 8683508
下面是一个'被初始化为“0”,而是“我”与“垃圾值”初始化。 为什么?
可能重复:
全局和静态变量为什么被初始化为默认值吗?
看到代码,
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %d\n", a, i);
}
产量
0 8683508
下面是一个'被初始化为“0”,而是“我”与“垃圾值”初始化。 为什么?
因为这事情是这样的,根据C标准 。 其原因就是效率:
静态变量在编译时初始化,因为它们的地址是已知的和固定的。 它们初始化为0
时,不会产生运行成本。
自动变量可以有不同的调用不同的地址,就必须在运行时每个函数被调用时初始化,招致可能不被需要运行成本。 如果你需要一个初始化,然后要求它。
global
和static
变量由符号(BSS)存储在初始化时的数据段(DS)和嵌段开始`时初始化。
这些变量有一个固定的内存位置,记忆是在编译时分配。
因此, global
和static
变量具有'0'
作为其默认值。
而auto
变量都存储在堆栈上,而他们没有一个固定的内存位置。
内存分配给auto
变量在运行时,而不是在编译时。 因此, auto
变量的缺省值是垃圾。
您已选择简单的变量,但考虑:
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,努力将被浪费; 初始化由函数的其余部分覆盖。 ç避免隐性成本只要有可能。
全局变量的分配和初始化之前main
函数开始,而局部变量是在栈上的程序的实例运行生成。