在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
函数之前由内部启动函数调用。
据我了解,数据段是初始化的全局/静态变量,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
函数之前由内部启动函数调用。