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