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

#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

鉴于:

#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”的文本段和“静态”的BSS.

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

最佳答案
你很困惑. const和static之间没有二分法;两者是独立的.假设所有数据都已初始化,静态const和外部(全局)const都将以文本形式出现,非const限定的静态和非const限定的外部都将进入数据.

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

转载注明原文:声明为“const”的全局初始化变量转到文本段,而声明为“Static”的全局初始化变量转到数据段.为什么? - 代码日志