C语言的内存布局规律
命令行参数和环境变量 |
---|
栈(函数执行的内存区域,通常和堆共享同一片区域) |
(未使用内存空) |
堆(存放进程运行中被动态分配的内存段,大小不固定,可动态扩展或缩小) |
bss段(存放为初始化的全局变量和静态变量,运行前自动初始化为0) |
数据段(存放已经初始化的全局变量和局部静态变量) |
代码段(用来存放程序执行代码,只读) |
堆和栈的区别
-
申请方式:
- 堆由程序员手动申请
- 栈由系统自动匹配
-
释放方式:
- 堆由程序员手动释放
- 栈由程序员自动释放
-
生存周期:
-
堆的生存周期由动态申请到程序员主动释放为止,不同函数之间可自由访问
#include <stdlib.h> #include <stdio.h> int *func(void) { int *ptr =NULL; ptr =(int*)malloc(sizeof(int)); if(ptr == NULL) { exit(1); } *ptr =520; return ptr; } int main () { int *ptr=NULL; ptr = func(); printf("%d\n",*ptr); free(ptr); }
-
栈的生存周期由函数调用开始到函数返回时结束,函数之间的局部变量不能互相访问
-
-
发展方向
-
堆和其他区段一样,都是从第地址向高地址发展
-
栈则相反,由高地址向低地址发展
-
-
发展方向
-
堆和其他区段一样,都是从第地址向高地址发展
-
栈则相反,由高地址向低地址发展
-