据我所知,数据段用于初始化的全局/静态变量,而BSS段用于未初始化的数据段。例如:
int a = 10; // data segment
int b; // BSS
int main(){
int c = 10; // stack
int* d = malloc() // heap
return 0;
}
然而,在我为我的一个类找到的pdf中,它说初始化为malloc()
返回的地址的全局指针在BSS中。它不应该在数据段,因为指针实际上被初始化为什么?
在C语言中,没有由malloc
初始化的全局指针这样的东西,因为这意味着在函数之外有一个可执行语句。例如:
char *p = malloc(10);
int main()
{
return 0;
}
将编译失败。
你可以在c++中这样做。在这种情况下,这样的变量将位于BSS节中,因为它在编译时没有初始化。malloc
函数将在main
函数调用之前由内部启动函数调用。
C标准没有定义malloc()
分配的数据来自哪里。它不定义文本段、数据段、BSS段或任何其他段。实际上,分配的内存来自"堆",它既不是数据段,也不是BSS段。这些用于具有静态持续时间的(非动态分配的)变量。malloc()
等分配的内存具有"已分配的持续时间"。
在您的代码中,d
(指针)具有"自动持续时间",与c
相同。然而,它指向的内存来自"堆"。
int *g;
(或int *g = 0;
或int *g = NULL;
),那么这个变量可能在BSS段中(如果它没有显式地未初始化,它将在BSS段中;使用显式空指针初始化器,它可以在BSS段中,但也可以在数据段中)。在C中,您不能为调用函数的全局指针编写初始化式(但在c++中可以,但无论如何您都不应该在c++中使用malloc()
)。因此,指针g
将在数据段或BSS段中,但稍后通过调用malloc()
指向的数据将在"堆"中。