当前位置: 首页 > article >正文

每日一C(1)C语言的内存分布

目录

代码区

常量区

全局/静态区

初始化数据段(.data)

未初始化数据段(.bss)

堆区

栈区

总结


        今天我们学习的是C语言的内存分布,以及这些分区所存储的内容和其特点。今天的思维导图如下。

        C语言作为一款直接处理硬件底层的编程语言,现实中很多嵌入式设备都通过C语言来编写程序。因为C语言核心特点就是对内存的操作,所以使程序运行在内存非常小的硬件上,大大降低了产品的生产成本。

        C语言将内存划分为分为5个区,分别为 代码区、常量区、全局/静态区、堆区、栈区 五个分区。

代码区

        代码区负责存储计算机能够执行的二进制代码文件。为了防止在程序运行时出现问题,代码区的内容是只读的,无法修改;此外,代码在程序运行前就已经确定了大小。

常量区

        存放例如字符串、数字等常量。这部分内容在程序运行时同样不可修改。

全局/静态区

        这块内存用于存储全局和静态变量,在程序整个生命周期中存在,由系统在启动时分配,结束时释放。全局/静态区分为初始化和未初始化数据段两部分。

初始化数据段(.data)

存储显式初始化的全局变量和静态变量。

未初始化数据段(.bss)

存储未初始化的全局变量和静态变量,默认值为0。

堆区

        由程序员动态分配的内存(如 malloc()calloc() 申请的空间)就落在这部分。堆区内存地址由低到高增长,这部分内存由程序员自行判断并实现 分配、释放 等操作。

        需要注意的是,堆区虽然空间大但分配不连续,访问速度较慢。

        遵循先进先出(FIFO)原则。

栈区

        栈区用于存放局部变量和函数上下文(返回地址、参数等),由系统自行实现内存分配和释放。

栈区的地址由高向低地址增长,其最大大小在编译时确定,速度快,内存分配连续,但大小有限。

        由于栈区存储的内容只在函数范围内存在,当函数执行完成,这些内容就会被销毁。

        栈区遵循先进后出(LIFO)原则,即先进入的数据最后释放。比如在函数中先定义一个局部变量,在函数执行完成后,确保函数内部没有东西调用它再进行释放。

        对栈的操作叫做通过压栈(Push)和弹栈(Pop)。

总结

        代码区存放代码;

        常量区存放字符串和数字等;

        全局/静态区分为初始化(.data)和未初始化(.bss) 来存储 全局和静态变量;

        堆区为动态分配的内存空间,先进先出(FIFO);

        栈区存储局部变量和函数上下文,先进后出(LIFO)。

        堆区和栈区并不相邻,中间有一段内存,防止二者数据发生覆盖。

        栈区只需要将栈顶指针移动即可,操作效率高;堆区需要寻找合适的内存块,效率低。

http://www.lryc.cn/news/2400763.html

相关文章:

  • Photoshop使用钢笔绘制图形
  • 应用层协议:HTTP
  • 复习——C++
  • SPI通信协议(软件SPI读取W25Q64)
  • PostgreSQL-基于PgSQL17和11版本导出所有的超表建表语句
  • JavaWeb:前后端分离开发-部门管理
  • ArcGIS计算多个栅格数据的平均栅格
  • 字节开源FlowGram:AI时代可视化工作流新利器
  • 如何选择合适的分库分表策略
  • (LeetCode 每日一题)3403. 从盒子中找出字典序最大的字符串 I (贪心+枚举)
  • GPIO的内部结构与功能解析
  • Python训练打卡Day42
  • 深度学习中的负采样
  • php7+mysql5.6单用户中医处方管理系统V1.0
  • Java 大视界 — Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制
  • 智慧物流园区整体解决方案
  • 审批流程管理系统开发记录:layui前端交互的实践
  • 【会员专享数据】1960—2023年我国省市县三级逐年降水量数据(Shp/Excel格式)
  • 2025年精通MVCC
  • 硬路由与软路由
  • OpenCV C++ 心形雨动画
  • Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结
  • 安卓Compose实现鱼骨加载中效果
  • 使用qt 定义全局钩子 捕获系统的键盘事件
  • FreeType 字体信息检查工具 - 现代C++实现
  • el-table 树形数据,子行数据可以异步加载
  • 【使用JAVA调用deepseek】实现自能回复
  • 【Linux系列】rsync命令详解与实践
  • Windows系统工具:WinToolsPlus 之 SQL Server Suspect/质疑/置疑/可疑/单用户等 修复
  • C++——智能指针 unique_ptr