Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在静态数组的情况下,bss的大小以意外字节递增_C_Memory - Fatal编程技术网

C 在静态数组的情况下,bss的大小以意外字节递增

C 在静态数组的情况下,bss的大小以意外字节递增,c,memory,C,Memory,考虑以下代码: #include<stdio.h> int main() { static int arr[20] = {0}; return 0; } 程序中无任何变量的结果为: text data bss dec hex filename 1033 276 4 1313 521 ./a.out 所以,我的问题是:为什么会增加108字节而不是80字节。 我在这个网站上读到了一些答案,这

考虑以下代码:

#include<stdio.h>

int main()
{
    static int arr[20] = {0};
    return 0;
}
程序中无任何变量的结果为:

text       data     bss     dec     hex filename
1033        276       4    1313     521 ./a.out
所以,我的问题是:为什么会增加108字节而不是80字节。 我在这个网站上读到了一些答案,这是因为bss需要对齐到32位,但是84(4-早期的+80(由于阵列))已经是32位对齐的

编辑:

我尝试运行以下命令:

objdump -sSx a.out | grep bss
我得到的结果是:

 24 .bss          00000070  0804a020  0804a020  0000101c  2**5
0804a020 l    d  .bss   00000000              .bss
0804a020 l     O .bss   00000001              completed.6590
0804a040 l     O .bss   00000050              arr.1825
0804a090 g       .bss   00000000              _end
0804a01c g       .bss   00000000              __bss_start
第一行中的值2**5表示与32位对齐,如本文所述:


但是,我真的不知道如何利用输出。请帮忙

你可以用以下两种方法自己回答这个问题:

  • 从可执行文件生成内存转储:
  • objdump-x--syms可执行文件>输出文件.dmp

  • 在链接步骤中生成地图文件:
  • gcc-Wl,-Map=Map-file.Map…


    在这两个文件中,您可以找到有关节内容、对齐、放置等的所有信息。

    是的,我已经这样做了,但我并不真正了解.bss中增加108字节的原因。请指出在上述关于我的问题的命令的输出中,哪些字段是重要的。@tapanand-通过在.dmp文件中搜索字符串“.bss”,您可以在描述放置在该部分中的对象的行中找到它。第一个十六进制数是地址,第二个十六进制数是大小,最后一个字符串是符号的名称(通常是变量/常量/函数/…,但可能会损坏)。您还可以使用文本比较(如diff)来比较.dmp文件(无论是否更改)。有1个字节用于跟踪初始化(已完成),31个字节用于对齐,80个字节用于数组。1 + 31 + 80 = 112@HansPassant:请您解释一下,如果BSS中只存在一个int变量,那么完成的位是什么?为什么不存在?数组只在函数第一次运行时初始化一次。因此,“完成”变量。只要看一下生成的机器代码,你就会看到它在测试这个变量。@HansPassant为什么32字节对齐,这似乎很多。@Matt-AVX不是免费提供的。字节是很便宜的,然而,这31个字节今天花费了四分之一的十亿分之一便士。
     24 .bss          00000070  0804a020  0804a020  0000101c  2**5
    0804a020 l    d  .bss   00000000              .bss
    0804a020 l     O .bss   00000001              completed.6590
    0804a040 l     O .bss   00000050              arr.1825
    0804a090 g       .bss   00000000              _end
    0804a01c g       .bss   00000000              __bss_start