这篇博客简单介绍了一个C程序的内存布局
C程序内存布局
通常来说,一个C程序由以下部分组成
文本区
文本区包含了CPU执行的机器码初始化数据区
也被称为数据区,包含了已经初始化的变量未初始化数据区
包含了程序未初始化的变量,变量由操作系统内核进行初始化栈(Stack)
栈由两部分组成,一是自动变量(automatic variables)。二是函数调用时的上下文信息,
比如每当一个函数被调用时,需要保存函数执行完成后返回的地址,函数调用者的环境信息、
机器当时的寄存器状态等堆(Heap)
包含了动态分配的内存
典型的分布如下图所示
______________
high address| | command line argument
|______________| and environment variables
| stack |
|--------------|
| | |
| | |
| V |
| ... |
| |
| |
| |
| ... |
| |
| ^ |
| | |
| | |
|--------------|
| Heap |
|______________|
|uninitialized |
| data |
|______________|
| intialized |
| data |
|______________|
| |
| text |
low address |______________|
例子
#include <stdlib.h>
// intialized data
int maxcount = 100;
// unintialized data
char msg[100];
int sum(int a, int b)
{
// stack
int s = 0;
s = a + b;
return s;
}
int
main(int argc, char *argv[])
{
// stack
int a = 1;
// heap
int *b = malloc(sizeof(int));
*b = 2;
sum(a, *b);
}