我们说全局变量和静态变量总是初始化为0.然后我的问题是,为什么我们在二进制文件中有单独的部分用于初始化和未初始化的数据。
我写了以下代码 -
int i;
int j=0;
static int k;
static int l=0;
int main()
{
static int m=0;
static int n;
printf("%d, %d\n",i,j);
printf("%d, %d\n",k,l);
printf("%d, %d\n",m,n);
return 0;
}
输出是 -
0, 0
0, 0
0, 0
我检查了bss部分的objdump输出,只有这部分包含变量。但根据链接 -
http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html
通常,在每个进程中,可用的虚拟内存 进程称为其地址空间。每个进程的地址空间都是 通常分为6个部分,如下所示 图片:环境部分 - 用于存储环境变量和 命令行参数;堆栈,用于存储函数的内存 参数,返回值和自动变量;堆(免费 store)用于动态分配,两个数据部分(用于初始化) 和未初始化的静态和全局变量)和文本部分 保存实际代码的地方。
所以,我只是感到困惑。如果我们有两个数据部分,为什么所有数据都放在.bss部分。而且我也想知道.data包含什么。
有人可以帮我解决这个问题吗?
答案 0 :(得分:5)
.data部分通常保留用于在编译时已知值的变量或更大的常量内存块,例如在编译时已知的字符串和静态数组块。此外,.bss部分存储未初始化或零值变量,因为在.data部分中存储零值并没有多大意义。