在C中,全局指针是在数据段还是BSS中通过malloc()初始化的?

In C, is a global pointer initialized by malloc() in the data segment or the BSS?

据我了解,数据段是初始化的全局/静态变量,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() 分配的数据从何而来。它不定义文本段、数据段、BSS 段或任何其他段。实际上,分配的内存来自“堆”,它既不是数据段也不是 BSS 段。这些用于具有 static duration 的(非动态分配的)变量。 malloc() et al 分配的内存具有“分配的持续时间”。

在您的代码中,d(指针)具有“自动持续时间”,与 c 相同。不过,它指向的内存来自“堆”。

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

在 C 中,没有 malloc 初始化的全局指针这样的东西,因为这意味着在函数外部有一个可执行语句。例如,这个:

char *p = malloc(10);

int main()
{
    return 0;
}

将无法编译。

但是您可以在 C++ 中执行此操作。在那种情况下,这样的变量将位于 BSS 部分,因为它没有在编译时初始化。 malloc 函数将在调用 main 函数之前由内部启动函数调用。