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)、使用函数分配时使用堆空间,堆上的空间需要手动释放
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具