在C中,全局指针是在数据段或BSS中由malloc()初始化的吗?



据我所知,数据段用于初始化的全局/静态变量,而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相同。然而,它指向的内存来自"堆"。

不过,PDF是正确的。如果你有一个全局指针,int *g;(或int *g = 0;int *g = NULL;),那么这个变量可能在BSS段中(如果它没有显式地未初始化,它将在BSS段中;使用显式空指针初始化器,它可以在BSS段中,但也可以在数据段中)。在C中,您不能为调用函数的全局指针编写初始化式(但在c++中可以,但无论如何您都不应该在c++中使用malloc())。因此,指针g将在数据段或BSS段中,但稍后通过调用malloc()指向的数据将在"堆"中。

最新更新