声明为“const”的全局初始化变量进入文本段,而声明为“静态”的全局初始化变量进入数据段。为什么?

2023-12-24

#include <stdio.h>

const int str[1000] = {0};

int main(void)
{
    printf("arr is %d\n", str[0]);
    return 0;
}

有以下输出:

[-exercises/adam/stack2]:size a.out
   text    data     bss     dec     hex filename
   5133     272      24    5429    1535 a.out

Whereas:

#include <stdio.h>

static int str[1000] = {0};

int main(void)
{
    printf("arr is %d\n", str[0]);
    return 0;
}

有以下输出:

[-exercises/adam/stack2]:size a.out
   text    data     bss     dec     hex filename
   1080    4292      24    5396    1514 a.out

当数组未初始化时,它再次转到“const”的文本段和“static”的 BSS。

该变量是全局的,应该可以从它所属的可执行文件中的任何位置访问(因为没有“静态”),但鉴于它是一个变量,我不知道为什么它被放置在文本段而不是数据段中?


你很困惑。之间不存在二分法const and static;两者是独立的。假设所有数据都已初始化,static const和外部(全球)const会进去text并且两者都非const-合格的static和非const- 合格的外部将进入data.

As for bss,像 ELF 这样的现代二进制格式实际上有单独的bss对于常数和非常量零数据。的输出size命令只是不显示它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声明为“const”的全局初始化变量进入文本段,而声明为“静态”的全局初始化变量进入数据段。为什么? 的相关文章

随机推荐