我写了一个短程序来检查ptr1
和ptr2
的内存分配区域。我发现ptr1
和ptr2
存在于.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
是具有这样一个值的指针。