C++ 初始化静态变量时,sbrk(0)指向什么?

C++ 初始化静态变量时,sbrk(0)指向什么?,c++,unix,memory,C++,Unix,Memory,在 它说 可以使用增量为0调用sbrk()来查找 程序中断的当前位置 当使用sbrk(0)初始化静态变量时,这是如何工作的 说 static void*current_heap=sbrk(0); 这种好奇源于C/C++代码的典型编译步骤,这些步骤决定了编译时数据段的大小 如下图所示 初始化的静态变量存储在数据段中。据我所知,堆通常从BSS和数据段的末尾开始 sbrk(0)如何知道编译期间堆从何处开始,而其他静态变量可能尚未确定 更新: 正如@EugeneSh所指出的,这里有一个使用clan

它说

可以使用增量为0调用
sbrk()
来查找 程序中断的当前位置

当使用
sbrk(0)
初始化
静态
变量时,这是如何工作的

static void*current_heap=sbrk(0);
这种好奇源于C/C++代码的典型编译步骤,这些步骤决定了编译时数据段的大小

如下图所示

初始化的静态变量存储在数据段中。据我所知,堆通常从BSS和数据段的末尾开始

sbrk(0)
如何知道编译期间堆从何处开始,而其他静态变量可能尚未确定

更新:

正如@EugeneSh所指出的,这里有一个使用
clang++
编译的工作示例:

#include <unistd.h>
#include <iostream>

static void* current_heap = sbrk(0);

int main() {
  std::cout << current_heap << '\n';
}
#包括
#包括
静态无效*当前_堆=sbrk(0);
int main(){

std::cout在C中,此代码无效:

static void* current_heap = sbrk(0);
因为具有静态存储持续时间的对象的初始值设定项必须是编译时常量,而事实并非如此。因此,此代码将无法在C中编译

对于C++,函数在调用<代码>主< <代码>之前的某个点调用。 因此没有对
sbrk
的编译时调用


至于这个变量将位于哪个部分,它很可能位于.bss中,因为它在编译时没有初始化。事实上,如果我用g++编译代码,该变量将位于.bss中。

根据C标准,6.7.9:

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字

因此,这在C中不是有效的初始化


在C++中,它将是一个运行时初始化。< /P>你检查它是否编译?@ EuGeNESW.我成功地编译了一个包含在<代码> SRBRK(0)< /代码>下初始化的命名空间下的变量的代码。请稍后发布。我怀疑它可以编译(至少在C)中。另一个原因是你不应该询问C/C++,而应该选择一种特定的语言。正如你所看到的,这些语言完全不同。@EugeneSh.Right。我从帖子中删除了
C
标记。好的,我明白了。因此,在初始化时,所有
静态
变量都已确定。因此,
sbrk(0)的行为
是预期的?(在C++中)@PHD静态变量带有常量初始值设定项。未初始化或非常量初始化的静态变量进入.bss时,数据进入。执行程序时,
sbrk
运行。