malloc 和全局变量声明在 C 中将它们的变量分配到哪里?

ret*_*n 0 0 c malloc memory-management

在一个简单的 C 程序中,如果我malloc有一个指向变量或数组的点,就内存映射而言,这部分内存分配到哪里?我对计算机编程很陌生,所以我不确定不同的变量在内存中的存储方式不同。

此外,全局变量(例如int x = 5)将存储在内存中的何处?

最后,有没有关于 C 语言如何与底层硬件交互的材料?我在网上找到的都是和C语法有关的,但是我太菜了,看不懂编译器的书。

如果这不清楚,请告诉我。

Jon*_*art 5

考虑这个例子:

int global_x = 5;
int global_y;

int main()
{
    int local_a;

    char* buf = malloc(100);
}
Run Code Online (Sandbox Code Playgroud)

虽然以下描述并不总是如此(特别是在微型嵌入式实现中),但现代平台上的典型程序将如下所示:

  • global_x是一个初始化的全局变量。它通常存储在.data可执行文件的一个部分中,当程序加载时,它与程序文本一起位于内存的读写、不可执行部分。

  • global_y是一个未初始化的全局变量。.bss程序段中保留了空间,不占用可执行文件中的空间。它在加载时位于与上面类似的部分。

  • local_a是位于main调用堆栈中的本地(或“自动”)变量。它的生命周期受限于该函数的执行持续时间。(即一旦函数返回,该变量就不再存在,并被丢弃。)

  • buf指向从heap 中提取的 100 字节动态分配的缓冲区。堆是一块内存区域,通常会根据需要扩展以适应应用程序的内存需求。当堆空间耗尽时(由malloc和支持的库函数决定),将从操作系统(例如brkmmap在 Linux 上)请求额外的内存。


在 Linux 上,您可以查看/prod/[pid]/maps进程的内存映射[pid]。例如:

int global_x = 5;
int global_y;

int main()
{
    int local_a;

    char* buf = malloc(100);
}
Run Code Online (Sandbox Code Playgroud)

我们看到有三个部分/usr/bin/cat在映射0x4000000x60b0000x60c000

通过查看输出,readelf -a /usr/bin/cat您可以确定哪些部分对应于在这些地址加载的段。这是留给读者的练习:-)