声明为"const"的全局初始化变量转到文本段,而声明为"Static"的全局初始化变量转到数据段.为什么?

hel*_*arn 6 c static elf

#include <stdio.h>

const int str[1000] = {0};

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

有以下输出:

[-exercises/adam/stack2]:size a.out
   text    data     bss     dec     hex filename
   5133     272      24    5429    1535 a.out
Run Code Online (Sandbox Code Playgroud)

鉴于:

#include <stdio.h>

static int str[1000] = {0};

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

有以下输出:

[-exercises/adam/stack2]:size a.out
   text    data     bss     dec     hex filename
   1080    4292      24    5396    1514 a.out
Run Code Online (Sandbox Code Playgroud)

当数组未初始化时 - 它再次进入"const"的文本段和"静态"的BSS.

变量是全局变量,应该可以从可执行文件中的任何地方访问(因为没有"静态"),但是如果它是变量,我不知道它为什么放在文本段而不是数据段?

R..*_*R.. 8

你很困惑.之间不存在对立conststatic; 两者是独立的.假设所有数据被初始化,无论是static const和外部(全局)const会去text和两个非const-qualified static和非const-qualified外部会去data.

至于bss,像ELF这样的现代二进制格式实际上bss对于常数和非常数零数据是分开的.该size命令的输出不显示它.


小智 7

来自Kernighan&Ritchie:

static是存储类说明符.其他存储类说明符是:auto,register,extern和typedef.静态说明符为声明的对象提供静态存储类.应用于外部变量或函数的静态声明将该对象的范围限制为正在编译的源文件的其余部分.静态对象可以是块的本地对象,也可以是所有块的外部对象,但在任何一种情况下,都可以在退出和重新进入函数和块的过程中保留它们的值.

然而,

const是一个类型限定符.另一种类型限定符是volatile.const的目的是宣布可能放在只读存储器中的对象,并且可能增加优化的机会.

我想可以推断这两个关键字都有不同的用途; 该的const变量是在text/code segment为它的目的很清楚.