繁体   English   中英

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

[英]Why are global variables always initialized to '0', but not local variables? [duplicate]

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

看代码,

#include <stdio.h>

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

输出

0 8683508

这里'a'用'0'初始化,但'i'用'垃圾值'初始化。 为什么?

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

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

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

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

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

因此, 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,那么努力就会白费; 初始化被函数的其余部分覆盖。 C 尽可能避免隐藏成本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM