1

使用以下代码创建了一个源文件 test1.c:

#include<stdio.h>
#include<stdlib.h>

int x = 15;
int d = 15;
int m = 18;
int k = 0;
int c = 0;
int l;

int main()
{
    int y = 5;
    int ma = 10;
    int am = 10;
    printf("Hello World\n");
    return 0;
}

使用命令编译以下代码:

gcc -c test1.c

使用 size 命令检查各个内存段的大小:

size test1.o

我获得的输出:

   text    data     bss     dec     hex  filename
   114       12       8     134      86   test1.o

而且我发现,每当我在 bss 段上方添加一个全局未初始化变量(如int l )时,它都保持不变。bss 段仅显示那些初始化为 0 的变量。但根据定义,bss 段应包含未初始化的变量。

每当我添加一个初始化的全局指针时,比如:

int *p = &x

它将数据段的大小增加了 12 而不是 8(这是我机器上整数指针的大小)。

我的解释有什么问题?

4

1 回答 1

0

而且我发现,每当我在 bss 段上方添加一个全局未初始化变量(如 int l)时,它都保持不变。

这是预期的行为。引用维基百科文章,(强调哑剧

[...] 由于 BSS 段只保存还没有任何值的变量,因此它实际上不需要存储这些变量的图像。BSS 在运行时需要的大小记录在目标文件中,但 BSS(与数据段不同)不占用目标文件中的任何实际空间。

因此,bss在使用静态存储更改未初始化变量的数量时,其大小不太可能发生变化。您可以参考这个较早的答案,以获取有关原因部分的更多详细信息。

于 2017-03-01T18:27:23.870 回答