【发布时间】:2020-12-15 14:36:14
【问题描述】:
它表明
调用
sbrk(),增量为0,可用于查找 程序中断的当前位置。
当sbrk(0) 用于初始化static 变量时,这是如何工作的?
说,
static void* current_heap = sbrk(0);
这种好奇心源于 C/C++ 代码的典型编译步骤在编译时确定数据段的大小。
如下图所示,
Distributed under CC BY-SA 3.0
初始化的静态变量存储在数据段中。据我所知,堆通常从 BSS 和数据段的末尾开始。
sbrk(0) 如何知道编译期间堆从哪里开始,而其他静态变量可能尚未确定?
更新:
正如@EugeneSh 所述,这是一个使用clang++ 编译的工作示例:
#include <unistd.h>
#include <iostream>
static void* current_heap = sbrk(0);
int main() {
std::cout << current_heap << '\n';
}
【问题讨论】:
-
你检查过它真的编译了吗?
-
@EugeneSh。我成功编译了包含命名空间下的变量的代码,该变量使用
sbrk(0)初始化。 -
那么请发帖minimal reproducible example。我怀疑它可以编译(至少在 C 中)
-
另一个你不应该询问 C/C++ 而是选择特定语言的原因。如您所见,这些是完全不同的野兽。
-
@EugeneSh.Right。我从帖子中删除了
c标签。