为什么全局变量总是初始化为'0',而不是局部变量?

时间:2012-12-27 05:29:51

标签: c variables global local

  

可能重复:
  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'用'垃圾值'初始化。为什么呢?

4 个答案:

答案 0 :(得分:106)

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

  • 静态变量在编译时初始化,因为它们的地址已知且已修复。将它们初始化为0不会产生运行时成本。

  • 自动变量可以为不同的调用设置不同的地址,并且每次调用函数时都必须在运行时进行初始化,从而产生可能的运行时成本不需要。如果您确实需要初始化,请提出请求。

答案 1 :(得分:40)

globalstatic变量在初始化时存储在数据段(DS)中,并且在未初始化时以符号(BSS)为块进行阻止。

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

因此globalstatic个变量的'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函数启动之前分配和初始化全局变量,而在程序实例运行时在堆栈上生成局部变量。