对于初始化为null的全局指针变量,C程序的内存布局是什么



我写了一个短程序来检查ptr1ptr2的内存分配区域。我发现ptr1ptr2存在于.bss(未初始化的数据段(中,因为我已经用NULL初始化了这两个数据段,我的问题是它们怎么会进入.bss部分?

根据我的理解,它们应该是.data段的一部分。

#include <stdio.h>
char *ptr1 = NULL;
int *ptr2 = NULL;
int main()
{
return 0;
}

广泛使用的分段"bss";以及";数据";包含两个初始化的变量。不同之处在于;数据";将加载来自应用程序的图像*1的值。段";bss";将用零初始化。

由于不需要在应用程序的映像中存储大量的零,所以普通系统不需要这样做;数据";片段被包括在图像中。您可能会将其视为一种原始的上下文感知压缩。

如果定义一个静态变量而不进行显式初始化,则C标准承诺它将为零,这是一种隐式初始化。因此,具有零值*2的显式初始化是等价的。但是,在适用的情况下,它使源代码更易于理解。

注意:另一个常见的片段是";rodata";,它包含所有只读静态变量

*1:这样的映像可以是文件系统中的可执行文件,或者在简单嵌入式系统的情况下是flash中的某个部分。

*2:NULL是具有这样一个值的指针。

最新更新