当我用
gcc -O0
, 编译以下 C 代码时
#include <stdlib.h>
#include <stdio.h>
char bytes[1000*1000*1000];
int main(void) {
for (int i = 0; i < 1000*1000; i++)
bytes[i] = (char) i;
printf("%c\n", bytes[56789]);
return EXIT_SUCCESS;
}
二进制文件只有 16kB。 我分配的1GB去哪儿了?它不在堆上,因为我不调用 malloc,也不在堆栈上,因为它太多了。
由于该区域是用零初始化的,因此在某些系统上不需要位于二进制文件中。加载程序将简单地告诉操作系统内存空间的某些部分将被标记为已分配,并且操作系统将提供必要的清零页面。