可能重复:
Why are global and static variables initialized to their default values?
参见代码
#include <stdio.h>
int a;
int main(void)
{
int i;
printf("%d %d\n", a, i);
}
输出
0 8683508
这里'a'用'0'初始化,但'i'用'垃圾值'初始化。为什么呢?
答案 0 :(得分:106)
因为它是这样的,根据 C标准。原因是效率:
静态变量在编译时初始化,因为它们的地址已知且已修复。将它们初始化为0
不会产生运行时成本。
自动变量可以为不同的调用设置不同的地址,并且每次调用函数时都必须在运行时进行初始化,从而产生可能的运行时成本不需要。如果您确实需要初始化,请提出请求。
答案 1 :(得分:40)
global
和static
变量在初始化时存储在数据段(DS)中,并且在未初始化时以符号(BSS)为块进行阻止。
这些变量具有固定的内存位置,并且在编译时分配内存。
因此global
和static
个变量的'0'
为默认值。
尽管auto
变量存储在堆栈中,但它们没有固定的内存位置。
内存在运行时分配给auto
变量,但不是
编译时间。因此auto
变量的默认值为垃圾。
答案 2 :(得分:15)
您选择了简单变量,但请考虑:
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尽可能避免隐藏成本。
答案 3 :(得分:7)
在main
函数启动之前分配和初始化全局变量,而在程序实例运行时在堆栈上生成局部变量。