1. 内存布局
- 编译源代码后的文件–(_.o文件)—可执行文件(win7:_.exe;linux:*.ELF)
* 可执行文件的结构
代码段(text segment):存放CPU执行的指令
数据段(data segment):全局初始化数据区和静态数据区
全局变量和局部静态变量
数据常量(字符串常量)
static=10,若初始化在任何函数体外,则是全局静态变量
static=10.若是初始化在某函数体内,则是局部静态变量
static修饰的函数,则该函数只可以在当前文件被调用
未初始化数据段(bbs):存放全局未初始化的全局变量和未初始化的静态变量
1.bbs区被内核初始化为0或者NULL
可执行文件的结构 |
---|
已经初始化全局变量,静态变量和常数变量(数据区) |
未初始化变量(BBS区,用零初始化) |
可执行代码区(代码区)) |
* 进程内存布局(上面的可执行程序加载后)
进程的内存布局 |
---|
栈区(向下增加) -局部数据 |
堆取(向上增加) -动态内存 |
bbs段 |
数据段 |
代码段 |
分区的优点
代码段和数据段是分开的
代码可以被多个进程共享
临时数据放入栈,生命周期短
堆可以由程序员自由分配
2.存储类型
![](/assets/屏幕快照 2016-08-04 下午1.07.58.png)
3. 堆和栈
管理方式:
栈:自动管理
堆:申请释放,由程序员控制,容易泄露
空间大小
栈:连续数据,超出时,则会溢出,空间小
堆:向高地址扩展,不是连续的区域:空闲链表的方法
空闲碎片:
分配效率:
栈:操作系统提供
堆:c库提供的算法
malloc和free
int *array;
array=(int*)malloc(10*sizeof(int));
free(array);
array=NULL;