C程序内存区域分配(5个段作用)

关于text段、data段和bss段 根据APUE,程序分为下面的段:.text, data (initialized), bss, stack, heap。 data/bss/text: text段在内存中被映射为只读,但.data和.bss是可写的。 bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的 阅读详情

参考:
http://www.360doc.com/content/11/0330/21/1317564_105977930.shtml
http://hi.baidu.com/bitcore/blog/item/77c521c65f4512d7d10060eb.html
http://apps.hi.baidu.com/share/detail/22734757
http://my.oschina.net/alphajay/blog/3870

一、C语言可执行代码结构

 名称

内容

代码段

 可执行代码、字符串常量

数据段

 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据

BSS段

 未初始化全局变量,未初始化全局静态变量

栈

 局部变量、函数参数

堆

 动态内存分配


       
一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成了该可执行程序的文件。

       (1)代码段(text segment):存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。

       代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

       (2)数据段(data segment):或称全局初始化数据段/静态数据段(initializeddata segment/data segment)。该段包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据。

       (3)未初始化数据段:亦称BSS(Block Started by Symbol)。该段存入的是全局未初始化变量、静态未初始化变量。

       而当程序被加载到内存单元时,则需要另外两个域:堆域和栈域。图1-1所示为可执行代码存储态和运行态的结构对照图。一个正在运行的C程序占用的内存区域分为代码段、初始化数据段、未初始化数据段(BSS)、堆、栈5个部分。

 

图1-1  C语言可执行代码结构

     (4)栈段(stack):存放函数的参数值、局部变量的值,以及在进行任务切换时存放当前任务的上下文内容。

     (5)堆段(heap):用于动态内存分配,即使用malloc/free系列函数来管理的内存空间。

    在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。

    另外,可执行程序在运行时具有相应的程序属性。在有操作系统支持时,这些属性页由操作系统管理和维护。

 

C程序设计语言--变量在内存中的分布 堆、栈、数据段、bss段、文本段 为了弄清楚这个问题,先看看在C语言中变量的分类首先查看这篇文章。 一、linux的进程内存分布   1)主要是由从小到大的地址空间分布,从低地址到高地址依次是:文本段(text),数据段,BSS段,堆,栈。 文本段:文本段中存放的是代码,只读数据,字符串常量(我们通常说保存在文字常量中,实际就是在文本段)数据段:数据段用来存放可执行文件中已经初始化的全局变量,全局变量又可细分为全 阅读详情

相关推荐

深入C语言内存区域分配(进程的各个段)详解

C语言可执行代码结构 名称 内容 代码段  可执行代码、字符串常量 数据段  已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据 BSS段  未初始化全局变量,未初始化全局静态变量 栈  局部变量、函数参数 堆  动态内存分配 (1)代码段(text segment):存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。代码段(code segment/text segment)通常是指用来存放程序执行代

程序或-内存区域分配(五个段)--终于搞明白了

一. 在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从文件内容上存储的方式,spec上有张图是比较经典的:如上图: 其实从文件存储的格式来说,上面的两种view实际上是一样的,Segm...

@奮 鬥@的专栏 3万+

基于Arduino UNO的OLED显示器使用方法x2(Arduino系列五)

Arduino使用OLED显示模块可以实现串口数据显示,还可以与其他模块联合使用,实现实时显示开发板实时数据。

LNN0212的博客 4170

程序或-内存区域分配(五个段)---分析很好

原文地址:http://blog.youkuaiyun.com/love_gaohz/article/details/41310597   一、 在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从...

潜心钻研 521

WPS制作甘特图实操(带图超详细)

一、数据准备 图1 二、添加公式 在表格的E3处添加公式:=IF(C3>=G3,0,IF(C3+D3>=G3,G3-C3,D3)),点击该单元格的右下角。使鼠标箭头变“+”后下拉拖拽,复制该公式。F3处的公式为:=D3-E3,使用相同的拖拽方式复制公式应用,操作完毕如下图3. 图2 图3 三、插入图表 1、选中方框1内容,按住ctrl按键,继续选择2、3列的内容,点击插入全部图表中的条形图,选择2对应的图标样式,生成图6的样式。 点击图6中的3标尺,右击选择数据弹出图8,点击+号选择表格中

m0_49047167的博客 3万+

OpenEvidence DeepConsult深度分析:技术架构、临床应用与行业影响

摘要:医疗AI平台OpenEvidence通过多智能体协作系统重构临床决策流程,解决了医学信息过载难题。其DeepConsult系统严格基于同行评审文献,5-10秒内提供循证决策支持,已覆盖40%美国医生,月咨询量达850万次。该平台采用"免费工具+广告变现"模式,通过调度、检索、摘要等模块化智能体分工,实现从文献分析到临床建议的闭环处理,在USMLE测试中准确率达90%。2025年获7500万美元融资后估值突破10亿美元,成为医疗AI领域的新范式。

AllenLV的博客 2555

程序或-内存区域分配(五个段)

一. 在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从文件内容上存储的方式,spec上有张图是比较经典的:如上图:  其实从文件存储的格式来说,上面的两种view实际上是一样的,Segmen...

学之知之的博客 541

MATLAB 车牌识别系统

车牌识别系统利用计算机视觉和图像处理技术,自动识别车辆牌照上的字符信息。本系统基于 MATLAB 实现车牌识别,包括图像预处理、车牌定位、字符分割、字符识别等模块。车牌识别系统是实现智能交通和公共安全的重要手段,具有广泛的应用前景。MATLAB 提供了丰富的工具和函数,可以方便地进行算法仿真和系统开发。

走向CTO的路上... 701

[转]C程序内存区域分配(5个段作用)

[转]C程序内存区域分配(5个段作用) 2012-08-10 14:45:32|分类:C++基础|字号订阅 参考:http://www.360doc.com/content/11/0330/21/1317564_105977930.shtmlhttp://hi.baidu.com/bitcore/blog/item/77c521c65f4512d...

weixin_30855761的博客 203

【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会

对于很多朋友来说,找到nnunet的网络结构位置的代码可能比较困难,因为nnunet的网络结构从else:代码中没有网络结构的类名,那么使用的网络是哪个呢?打开预处理后的数据集中的nnUNetPlans.json文件,如下图,configurations里面有2d、3d_fullres等,这些表示nnunet的模型,下面的network_class_name指的就是训练使用的模型结构,一般都是PlainConvUNet。

AI爱好者的博客,分享计算机领域相关知识 8754

解锁机器人逆运动学算法:从理论到实战

机器人逆运动学,简单来说,就是已知机器人末端执行器(如机械臂的手部、工具等)期望达到的位置和姿态,求解机器人各个关节需要达到的角度或位移的过程。在机器人的实际应用场景中,逆运动学起着不可或缺的作用。以工业制造中的焊接机器人为例,为了完成复杂的焊接任务,焊接头(末端执行器)需要精准地到达工件上的各个焊接点,并保持合适的姿态以确保焊接质量。这时,逆运动学算法就根据焊接点的三维坐标以及焊接头应有的姿态(如角度等),计算出机械臂各个关节的转动角度,从而控制机械臂带动焊接头准确地运动到目标位置。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2051

程序内存区域分配(五个段)--终于搞明白了

在学习之前我们先看看ELF文件。 ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具体到每一个结构不同。下面我们就从整体上看看这3种格式从文件内容上存储的方式,spec上有张图是比较经典的:如上图: 其实从文件存储的格式来说,上面的两种view实际上是一样的,Segment实际上...

坚持 5909

2026年复旦微电数字IC笔试试卷带答案解析

摘要: 本文为复旦微电子MCU/SOC岗位笔试模拟题,涵盖单片机架构、数字电路、存储技术等核心知识点。内容包括: 单选题(30分):考察Cortex-M中断机制、时序分析(建立/保持时间)、逻辑化简、跨时钟域设计(格雷码应用)、存储器特性(NAND Flash操作单元)等; 波形分析(15分):聚焦D触发器行为、时钟分频、建立时间违例判断及跨时钟域同步; 多选题(25分):涉及亚稳态成因与处理、异步FIFO设计要点、MCU低功耗策略、NAND Flash特性及复旦微电市场地位; 简答题(20分):解析建立/

Open 342

.bss段和.data段

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码段:代码段(code segment/text seg...

qq_34888036的博客 4万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C 语言内存区域分配(进程的各个段)详解

C语言可执行代码结构 名称内容代码段 可执行代码、字符串常量数据段 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据BSS段 未初始化全局变量,未初始化全局静态变量栈 局部变量、函数参数堆 动态内存分配        一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码

张勤一 3630

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

text段、data段和bss段知识介绍

一、总体概述1、bss(可读可写)     bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的RAM区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内...

superjiangzhen的博客 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

linux 在指定区域分配内存 c语言,深入C语言内存区域分配(进程的各个段)详解

C语言可执行代码结构名称内容代码段可执行代码、字符串常量数据段已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据BSS段未初始化全局变量,未初始化全局静态变量栈局部变量、函数参数堆动态内存分配(1)代码段(text segment):存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地...

weixin_26735445的博客 296

bss段,data段、text段、堆heap和栈stack

bss段,data段、text段、堆heap和栈stackbss段data段text段堆(heap)栈(stack) bss段 bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。 bss是英文Block Started by Symbol的简称。 bss段属于静态内存分配。 data段 数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。 数据段属于静态内存分配。 text段 代码段(code segment/text segme

aron566博客 3835

C/C++程序内存布局(data段,bss段,text段)以及static关键字详解

data包含==静态初始化==的数据,所以==有初值的全局变量和static变量==在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和程序大小没有关系,但和程序使用到的全局变量,常量数量相关 ## 1.2 text段(只读) text段是程序代码段,在AT91库中是表示程序段的大小,它是由编译器在编译连接时自动计算的,当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段大小,编译连接时,该符号所代表的值会自动代入到源程序中 ## 1.3 bss段(可读可写

weixin_57154303的博客 3797

43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、realloc、_msize、free)、内存泄漏

本文详细探讨了 C 程序中的内存区域划分,包括代码区、全局/静态区、栈区和堆区,并深入解析了动态内存分配的相关内容。文章还重点介绍了 void 指针的概念、作用、特点及其类型转换的注意事项。同时,详细阐述了 malloc()、calloc()、realloc() 与 _msize 函数的使用方法和案例演示。此外,文章还强调了内存泄漏的危害以及 free() 函数的重要性和使用注意事项。最后,提出了内存分配的基本原则,并通过综合案例加深了对 C 程序内存管理的理解。

大模型全栈工程师 · Thanks_ks 1448
上一篇: 快速指数算法 和 求逆元算法
下一篇: 《面向对象编程》--c++ primer 第15章
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值