操作系统,C和进程内存分配

Sam*_*aid 2 c operating-system process

我们说全局变量和静态变量总是初始化为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;
}
Run Code Online (Sandbox Code Playgroud)

输出是 -

0, 0
0, 0
0, 0
Run Code Online (Sandbox Code Playgroud)

我检查了bss部分的objdump输出,只有这部分包含变量.但根据链接 -

http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html

通常,在每个进程中,该进程可用的虚拟内存称为其地址空间.每个进程的地址空间通常分为6个部分,如下图所示:环境部分 - 用于存储环境变量和命令行参数; 堆栈,用于存储函数参数的内存,返回值和自动变量; 用于动态分配的堆(免费存储),两个数据部分(用于初始化和未初始化的静态和全局变量)和保存实际代码的文本部分.

所以,我只是困惑.如果我们有两个数据部分,为什么所有数据都放在.bss部分.而且我也想知道.data包含什么.

有人可以帮我这个吗?

Jes*_*mos 5

.data部分通常保留用于在编译时已知值的变量或更大的常量内存块,例如在编译时已知的字符串和静态数组块.此外,.bss部分存储未初始化或零值变量,因为在.data部分中存储零值并没有多大意义.