gcc 什么是内存布局的C程序为空初始化全局指针变量?

6tqwzwtp  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(134)

我写了一个小程序来检查ptr1ptr2的内存分配区。我发现ptr1ptr2出现在.bss(未初始化的数据段)中,因为我已经用NULL初始化了这两个数据段,我的问题是它们怎么会出现在.bss部分?
根据我的理解,它们应该是.data段的一部分。

#include <stdio.h>

char *ptr1 = NULL;
int *ptr2 = NULL;

int main()
{
    return 0;
}
wztqucjr

wztqucjr1#

广泛使用的数据段“bss”和“data”包含两个初始化变量。不同之处在于,数据段“data”将加载应用程序映像 *1中的值。数据段“bss”将初始化为零。
由于不需要在应用程序的映像中存储大量的零,通用系统不会这样做。因此,映像中只包含“数据”段的初始值。您可以将其视为一种原始的上下文感知压缩。
如果你定义一个静态变量而没有显式初始化,C标准承诺它将被置零,这是一个隐式初始化。因此,用零值 *2显式初始化是等效的。但是,它使你的源代码更容易理解,在适用的地方。

  • 注意:另一个常见段是“rodata”,它包含所有只读静态变量。*
    ***1:**此类映像可以是文件系统中的可执行文件,或者在简单的嵌入式系统中,可以是闪存中的某个部分。
    *2:NULL是具有此类值的指针。

相关问题