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

C语言的5个内存段你了解吗?( 代码段/数据段/栈/堆)

前言:这些内存段在程序运行时起着不同的作用,有不同的分配方式和存储内容。对于 C 语言程序员来说,了解这些内存段的特性和用途有助于更好地理解内存管理、变量的存储位置以及程序执行过程中的内存分配情况

1. 代码段 (Code Segment)

  • 内容:代码段,也称为文本段,是包含频繁执行代码的内存区域。
  • 特点:代码段通常是只读的,以避免被缓冲区溢出等编程错误覆盖的风险。
  • 不包含:该代码段不包含局部变量(在C语言中也称为自动变量)、全局变量等程序变量。
  • 字符串字面量:基于C实现,代码段也可以包含只读字符串。例如,当你执行printf("Hello, world")时,字符串"Hello, world"会在代码/文本段中创建。你可以在Linux 中使用size命令验证这一点。
  •  进一步阅读:代码段

2. 数据段 (Data Segment)

数据段被分成以下两部分,通常位于堆区域的下方,或者在某些实现中位于栈的上方,但数据段永远不会位于堆和栈区域之间

a. 未初始化数据段 (BSS 段)
  • 内容:包含未初始化的全局变量(包括指针变量)、未初始化的常量全局变量、未初始化的局部静态变量。
  • 存储位置:任何未初始化的全局或静态局部变量都将存储在未初始化的数据段中。
  • 例子:全局变量如 int globalVar; 或静态局部变量如 static int localStatic; 会存储在未初始化数据段中。
  • 注意:如果你声明一个全局变量并将其初始化为0或NULL,那么它仍然会进入未初始化的数据段或bss。
  • 进一步阅读:了解更多关于未初始化数据段的信息:未初始化的数据段
b. 初始化数据段
  • 内容:包含初始化的全局变量(包括指针变量)、初始化的常量全局变量、初始化的局部静态变量。
  • 例子:全局变量如 int globalVar = 1; 或静态局部变量如 static int localStatic = 1; 会存储在初始化数据段中。
  • 细分:这个段可以进一步分为初始化只读区和初始化读写区,初始化全局常量变量放在初始化只读区,而可以在运行时修改值的变量放在初始化读写区。
  • 大小:这个段的大小由程序源代码中值的大小决定,并且在运行时不会改变。
  • 进一步阅读:初始化数据段

3. 栈段 (Stack Segment)

  • 内容:用于存储函数内部创建的变量,如函数的局部变量(包括指针变量)、函数参数、返回地址等。
  • 特点:函数执行结束后,存储在栈中的变量将被删除。
  • 进一步阅读:栈段

4. 堆段 (Heap Segment)

  • 内容:这个段是为了支持动态内存分配。如果程序员想动态分配一些内存,那么在C语言中,可以使用malloc,calloc或realloc方法来完成。
  • 例子:例如,当 int* ptr = malloc(sizeof(int) * 2) 时,会在堆上分配8字节内存,并将分配的内存地址返回并存储在 ptr 变量中。
  • 存储位置:取决于声明/使用方式,指针变量 ptr 可能位于栈或数据段上。

这些内存段在 C 语言中扮演着重要的角色,了解它们的特性和用途有助于程序员更好地理解内存管理和程序执行过程中的内存分配情况。

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

相关文章:

  • 智能合约检测:新一代区块链技术的安全守护
  • Flutter笔记:缩放手势
  • JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素
  • 万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层
  • 工作记录---为什么双11当天不能申请退款?(有趣~)
  • ElasticSearch在Windows上的下载与安装
  • 软件测试/测试开发/人工智能丨基于Spark的分布式造数工具:加速大规模测试数据构建
  • ClickHouse的 MaterializeMySQL引擎
  • Ubuntu 22.04安装Rust编译环境并且测试
  • 制作Go程序的Docker容器(以及容器和主机的网络问题)
  • mysql清除数据痕迹_MySQL使用痕迹清理~/.mysql_history - milantgh
  • PDF控件Spire.PDF for .NET【转换】演示:自定义宽度、高度将 PDF 转 SVG
  • 01背包 P1507 NASA的食物计划
  • 平衡二叉树c语言版
  • 初始环境配置
  • 记GitLab服务器迁移后SSH访问无法生效的问题解决过程
  • 【NGINX--2】高性能负载均衡
  • Android studio run 手机或者模拟器安装失败,但是生成了debug.apk
  • 【面试经典150 | 数学】加一
  • Rust unix domain socket
  • 初识分布式键值对存储etcd
  • docker swarm集群部署
  • MySQL进阶_9.事务基础知识
  • IDEA调用接口超时,但Postman可成功调用接口
  • TableUtilCache:针对CSV表格进行的缓存
  • java源码-工程讲解
  • K8S基础笔记
  • 十一、统一网关GateWay(搭建网关、过滤器、跨越解决)
  • C语言--每日五道选择题--Day20
  • Fourier分析导论——第6章——R^d 上的Fourier变换(E.M. Stein R. Shakarchi)