ret*_*n 0 0 c malloc memory-management
在一个简单的 C 程序中,如果我malloc有一个指向变量或数组的点,就内存映射而言,这部分内存分配到哪里?我对计算机编程很陌生,所以我不确定不同的变量在内存中的存储方式不同。
此外,全局变量(例如int x = 5)将存储在内存中的何处?
最后,有没有关于 C 语言如何与底层硬件交互的材料?我在网上找到的都是和C语法有关的,但是我太菜了,看不懂编译器的书。
如果这不清楚,请告诉我。
考虑这个例子:
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和支持的库函数决定),将从操作系统(例如brk或mmap在 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在映射0x400000,0x60b000和0x60c000。
通过查看输出,readelf -a /usr/bin/cat您可以确定哪些部分对应于在这些地址加载的段。这是留给读者的练习:-)