20深入理解C指针之---程序的栈和堆
一、程序在内存中的存储分段:
程序段主要包括:code段、data段、内核段、堆段和栈段
1、code段:
1)、存储程序汇编后程序指令
2)、此段中的数据是只读的
3)、不能用于存储变量,可以存储常量
4)、有固定的大小
2、data段包括data段和bss段:
1)、data段主要存储全局变量
2)、data段主要存储静态变量
3)、data段主要存储已初始化变量
4)、data段主要存储字符串及其他变量
5)、data段可以改写,有固定大小
6)、bss段主要存储未初始化变量
7)、bss段可以改写,有固定大小
3、内核段:
1)、一般用户不能读写
2)、处在内存地址空间的最高端
3)、涉及到地址,会出现段错误
4、堆段:
1)、人工申请分配,易出现内存泄露情况
2)、堆内存空间几乎不受任何限制,只与物理内存大小有关
3)、频繁分配与释放内存,易产生内存碎片
4)、向着内存地址增加的方向增长
5)、只能动态分配,效率较低
6)、堆中的利用的内存是不连续的内存分布
5、栈段:
1)、编译器自动分配
2)、栈空间的大小有严格要求
3)、不存在内存碎片问题
4)、向着内存地址减小的方向增长
5)、底层支持,可静态或动态分配,效率较高
6)、栈中的利用的内存是连续的内存分布
6、堆段和栈段的共同点:
1)、都不能越界访问
2)、通常说的堆栈主要指栈段
3)、手工分配内存是,堆比栈的使用更加灵活
程序使用空间的总结:
1)、自动变量存储在函数的栈帧上,在编译时完成内存分配,主要有局部变量或函数参数等
2)、静态或全局变量在程序的数据段
3)、数据段处于执行代码和系统管理的其他区域上
4)、使用函数分配时使用堆空间,堆上的空间需要手动释放