欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言静态变量初始化问题

程序员文章站 2022-05-12 12:30:36
...

    以前在学习C语言中,看到了这么一行代码:

    static int arr[100];

  这是一行很正常的代码,但是我“细心”的发现作者在使用它的时候并没有初始化。书上的解释是,用static修饰的变量会自动初始化。
  为什么会被初始化呢?首先我们看一段话:
可执行程序和内存映像的区别在于:可执行程序位于磁盘上,内存映像位于内存中,可执行程序没有堆栈,可执行程序虽然也有未初始化的数据段,但是它并不存储在位于硬盘中的可执行文件中:

  我们用两个程序来检验一下这段话是否正确
  

// withBss.c 未初始化的程序
double a[10000];
int main(void) {
    return 0;
}
// withoutBss 已初始化的程序
double a[10000] = {1,};
int main(void) {
    return 0;
}

C语言静态变量初始化问题
  通过两个可执行文件的对比,我们发现少了大概80000(sizeof(double)×10000)个字节。那么声明的数组去哪儿了?其实static 变量只完成一次初始化,这个任务是由”链接器”完成的,在程序运行之前,它会将合适的值给变量, 如果没有初始化值, 则系统会假定认为它们的值为0,并会分配一块空间(BSS,存放程序中未初始化的全局变量的一块内存)来存放这些未初始化的变量,而这块空间也会全部被清空为0。
  
  BSS在哪儿,它是在程序的内存空间中还是系统提供的空间?

  C语言静态变量初始化问题
由图我们可以得知,BSS是在程序的内存空间中。