C : Memory layout of C program execution

标签 c

我想知道内核是如何为简单的 C 程序提供内存的。

例如:

#include<stdio.h> 
#include<malloc.h> 
int my_global = 10 ; 
main() 
{ 
char *str ; 
static int val ; 
str = ( char *) malloc ( 100 ) ; 
scanf  ( "%s" , str ) ;
printf( " val:%s\n",str ) ;
free(str) ;
return 1 ;
}

看,在这个程序中我使用了 static , global 和 malloc 来分配动态内存 那么,内存布局将如何......? 任何人给我 url ,其中将包含有关此过程的详细信息..

最佳答案

基本上,在以 ELF(可执行和可链接格式)为目标构建的 C 程序中,例如那些在 Linux 上构建的程序,会创建一个标准的内存布局。其他架构可能存在类似的布局,但我了解的还不够多,无法告诉您更多相关信息。

布局:

有一些全局数据部分在内存中的低内存地址处初始化(例如当前正在执行的代码的部分、全局数据以及使用 "..." 创建的任何字符串)在你的 C 代码中)。

在它下面有一堆可以使用的开放内存。随着调用 malloc 和 free 将所谓的“程序中断”移动到内存中更高的地址,此堆的大小会自动增加。

从内存中的高地址开始,堆栈向低地址增长。堆栈包含任何本地分配的变量的内存,例如函数顶部或范围内的变量 ({ ... })。

更多信息:

关于正在运行的 ELF 程序有很好的描述 here以及有关格式本身的更多详细信息 the Wikipedia article .如果你想要一个编译器如何将 C 代码翻译成汇编的例子,你可以看看 GCC,他们的 Internals Manual里面有一些有趣的东西;最相关的部分可能是第 17 章中的部分,尤其是 17.10、17.19 和 17.21。最后,英特尔在其 IA-32 Architectures Software Developer’s Manual 中有很多关于内存布局的信息。 .它描述了英特尔处理器如何处理内存分段和堆栈的创建等。没有关于 ELF 的详细信息,但可以看出两者匹配的地方。最有用的部分可能是第 1 卷的第 3.3 节:基本体系结构和第 3A 卷的第 3 章:系统编程指南,第 1 部分。

我希望这能帮助任何深入了解运行 C 程序内部的人,祝你好运。

关于C : Memory layout of C program execution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482255/

相关文章:

c - 在C二叉树中插入函数?

C: EOF 检测 & fgetc

C 中用于不返回任何内容的函数的 Python 模块

c - gcc: 输入错误

c - 使用 POSIX 读取文件

c - 将给定链表的反向存储到另一个链表中

c - valgrind 条件跳转或移动取决于未初始化的值

c - pThreads 段错误

c - 使用Makefile编译时出现错误 "no such file or directory"

python - 数组+标量? C