我写了一个小程序来检查ptr1和ptr2的内存分配区。我发现ptr1和ptr2出现在.bss(未初始化的数据段)中,因为我已经用NULL初始化了这两个数据段,我的问题是它们怎么会出现在.bss部分?根据我的理解,它们应该是.data段的一部分。
ptr1
ptr2
.bss
NULL
#include <stdio.h> char *ptr1 = NULL; int *ptr2 = NULL; int main() { return 0; }
wztqucjr1#
广泛使用的数据段“bss”和“data”包含两个初始化变量。不同之处在于,数据段“data”将加载应用程序映像 *1中的值。数据段“bss”将初始化为零。由于不需要在应用程序的映像中存储大量的零,通用系统不会这样做。因此,映像中只包含“数据”段的初始值。您可以将其视为一种原始的上下文感知压缩。如果你定义一个静态变量而没有显式初始化,C标准承诺它将被置零,这是一个隐式初始化。因此,用零值 *2显式初始化是等效的。但是,它使你的源代码更容易理解,在适用的地方。
1条答案
按热度按时间wztqucjr1#
广泛使用的数据段“bss”和“data”包含两个初始化变量。不同之处在于,数据段“data”将加载应用程序映像 *1中的值。数据段“bss”将初始化为零。
由于不需要在应用程序的映像中存储大量的零,通用系统不会这样做。因此,映像中只包含“数据”段的初始值。您可以将其视为一种原始的上下文感知压缩。
如果你定义一个静态变量而没有显式初始化,C标准承诺它将被置零,这是一个隐式初始化。因此,用零值 *2显式初始化是等效的。但是,它使你的源代码更容易理解,在适用的地方。
***1:**此类映像可以是文件系统中的可执行文件,或者在简单的嵌入式系统中,可以是闪存中的某个部分。
*2:
NULL
是具有此类值的指针。