静态数据:代码段、数据段
动态数据:堆栈
- 栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
- 堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。
- 全局区(静态区static):数据段,程序结束后由系统释放。
- 已初始化全局区(data),用来存放保存全局的和静态的已初始化变量
- 未初始化全局区(bss),用来保存全局的和静态的未初始化变量。
- 常量区(文字常量区):数据段,存放常量字符串,程序结束后有系统释放。
- 代码区:存放函数体(类成员函数和全局区)的二进制代码,这个段在内存中一般被标记为只读,任何对该区的写操作都会导致段错误(Segmentation Fault)。
假设一个程序的函数调用顺序为:主函数main
调用函数func1
,函数func1
调用函数func2
。当这个程序被操作系统调入内存运行时,其对应的进程在内存中的映射结果如下图所示
进程的栈是由多个栈帧构成的,其中每个栈帧都对应一个函数调用。当调用函数时,新的栈帧被压入栈;当函数返回时,相应的栈帧从栈中弹出。由于需要将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来了极大的隐患