为什么总是初始化为“0”的全局变量,而不是局部变量? [重复](Why are global v

2019-07-17 14:48发布

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

看到代码,

#include <stdio.h>

int a;
int main(void)
{
    int i;
    printf("%d %d\n", a, i);
}

产量

0 8683508

下面是一个'被初始化为“0”,而是“我”与“垃圾值”初始化。 为什么?

Answer 1:

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

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

  • 自动变量可以有不同的调用不同的地址,就必须在运行时每个函数被调用时初始化,招致可能不被需要运行成本。 如果你需要一个初始化,然后要求它。



Answer 2:

globalstatic变量由符号(BSS)存储在初始化时的数据段(DS)和嵌段开始`时初始化。

这些变量有一个固定的内存位置,记忆是在编译时分配。

因此, globalstatic变量具有'0'作为其默认值。

auto变量都存储在堆栈上,而他们没有一个固定的内存位置。

内存分配给auto变量在运行时,而不是在编译时。 因此, auto变量的缺省值是垃圾。



Answer 3:

您已选择简单的变量,但考虑:

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,努力将被浪费; 初始化由函数的其余部分覆盖。 ç避免隐性成本只要有可能。



Answer 4:

全局变量的分配和初始化之前main函数开始,而局部变量是在栈上的程序的实例运行生成。



文章来源: Why are global variables always initialized to '0', but not local variables? [duplicate]