高烧拉肚子是什么原因| 石家庄以前叫什么名字| 毒瘤是什么意思| roa是什么| 一枚什么| 兔死狐悲指什么生肖| 原本是什么意思| 云翳是什么意思| 皮下是什么意思| 肛裂挂号挂什么科| 秋葵对痛风有什么好处| 灰指甲用什么药最好| 屁特别臭是什么原因| 粘纤是什么面料| them什么意思| 耳堵是什么| 孕妇脚肿是什么原因| 9月19是什么星座| 晚上9点半是什么时辰| 驴友是什么意思| 宫腔镜是什么手术| 志五行属什么| 亦什么意思| 空洞是什么意思| 五行缺金是什么命| 肛塞是什么东西| 偏安一隅是什么意思| 哦多桑是什么意思| 一例是什么意思| 什么是卵巢囊肿| moi是什么意思| pacu是什么意思| yy是什么意思| 可甜可盐什么意思| 为什么会突然长智齿| 医生为为什么建议不吃生菜| 侏儒是什么意思| claire是什么意思| 职业资格证书有什么用| 老打嗝是什么原因引起的| 冷笑是什么意思| 荼什么意思| 荷花象征什么| 胃痛吃什么药效果最好| 温州有什么特产| 干燥症是什么原因引起的| 为什么一个月来两次姨妈| 鑫字属于五行属什么| 梦见着火了是什么征兆| 吃什么补脑子增强记忆力最快| crispy是什么意思| 别致是什么意思| 令堂是什么意思| 就诊卡号是什么| 体香是什么味道| 孕妇吃花胶对胎儿有什么好处| 为什么不娶养猫的女人| 上火了吃什么水果降火最快| 新生儿干呕是什么原因| 宝刀未老的意思是什么| 下午2点半是什么时辰| 盆腔积液什么症状| 小鸟站在高压线上为什么不会触电| 乐器之王是什么乐器| 生物工程是什么专业| 洗面奶是什么意思| 吃什么利尿最快去腹水的| 玉兔是什么意思| 怕热爱出汗是什么原因| 尿蛋白弱阳性什么意思| 查肝挂什么科| 冠状沟有白色分泌物是什么原因| 来月经吃什么水果好| 风五行属什么| 手指指尖发麻是什么原因| 受精卵着床失败有什么症状| 玻璃水是干什么用的| 铉是什么意思| 烤瓷牙是什么意思| 法令纹是什么| 蒙蔽是什么意思| 一什么花瓣| 月经期间洗澡会有什么影响吗| 一直拉肚子是什么原因| 今天开什么码| 草莓是什么季节的| 什么是核心期刊| 济州岛有什么好玩的| 世界上最大的湖泊是什么湖| 右手手指头麻木是什么病的前兆| 山花对什么| 冥王星是什么星| 智齿肿痛吃什么药| 星星为什么会眨眼睛| 妈妈的爸爸叫什么| 6月28日是什么日子| 端午节都吃什么菜好| 鸡胸肉炒什么菜好吃| 特别嗜睡是什么原因| 水五行属什么| 党的性质是什么| 车厘子什么季节成熟| 绞股蓝有什么作用| 林彪为什么出逃| 胆结石吃什么排石最快| 仓鼠不能吃什么| 2024年是属什么生肖| 拔罐是什么原理| 梦见吃梨是什么意思| 得莫利是什么意思| 离宅是什么意思| 港澳通行证办理需要什么材料| 公鸡的尾巴有什么作用| 太爷爷的爸爸叫什么| 痔疮什么感觉| 中暑喝什么水| 为什么叫汉族| 鳌鱼是什么鱼| 否认是什么意思| 孩子为什么要躲百天| 太阳星座是什么意思| 牙齿疼是什么原因引起的| 切记是什么意思| 咳嗽喉咙痒吃什么药好得快| 卡马西平片治什么病| 拉伸有什么好处| 舌头肿大是什么原因引起的| 什么人不能喝豆浆| 雅号是什么意思| 肠癌有什么症状| 晚上睡觉手麻木是什么原因| 七叶子是什么意思| 小月子可以吃什么水果| 是什么日子| 气质是什么| 去草原穿什么衣服拍照好看| 半边脸疼是什么原因引起的| 吃软饭是什么意思| 倒打一耙的前一句是什么| 成人睡觉磨牙是什么原因| 鹿鞭是什么| 拉拉裤和纸尿裤有什么区别| 为什么打牌老输| 人为什么会咳嗽| 经常晕车是什么原因| 皮肤过敏用什么药膏| 为什么会胎停| 胃寒可以吃什么水果| 吃什么能降胆固醇| 南京市长是什么级别| 于无声处是什么意思| 孩子说话晚是什么原因| 身体寒湿重吃什么好| 弛张热常见于什么病| 关节发黑是什么原因| 手麻疼是什么原因引起| 怀疑心梗做什么检查| 欣赏一个人是什么意思| 什么本本| 白凉粉是什么原料做的| 头皮疼是什么原因引起的| 夏天适合种植什么蔬菜| 曹操是什么样的人| 高处不胜寒是什么意思| 长期吃二甲双胍有什么副作用| 骨转移是什么意思| 生活质量是什么意思| 甲级战犯是什么意思| 苹果什么时候成熟| 貔貅什么人不能戴| 尿黄起泡是什么原因| 极端是什么意思| 后脑勺出汗是什么原因| 百丽鞋属于什么档次| 11.1是什么星座| rpr是什么意思| 老年性脑改变是什么意思| 吃了避孕药有什么反应| 哺乳期什么东西不能吃| 宝宝拉肚子吃什么| 淋巴清扫是什么意思| 巨石强森是什么人种| 胆囊萎缩是什么原因| 糖尿病人不能吃什么水果| 头皮痛什么原因引起的| 省公安厅副厅长是什么级别| hivab是什么检测| 18k黄金是什么意思| 七月十六号是什么星座| 脸上经常长痘痘是什么原因| 前列腺肥大有什么症状| 男人喜欢什么样的女人做老婆| 什么药| 知性女性是什么意思| 高血压不能吃什么水果| 奇花异草的异什么意思| 精神衰弱吃什么能改善| 打车费计入什么科目| 成都机场叫什么名字| 窦性心动过缓伴不齐是什么意思| 外耳道湿疹用什么药| 方得始终什么意思| 肾湿热吃什么中成药| 菠菜什么时候传入中国| 杆菌一个加号什么意思| 中学为体西学为用是什么意思| 豆浆和什么搭配最好| 飞机打多了会有什么严重的后果吗| 男人吃什么补肾壮阳效果最好| 蝙蝠粪便是什么中药| 流鼻血是什么引起的| 吃什么对胃好| 南京五行属什么| rt表示什么意思| 布洛芬缓释胶囊有什么副作用| 追逐是什么意思| b型钠尿肽测定是什么检查| 日加立念什么| 吃什么帮助消化通便| 糖醋里脊是什么肉做的| 羊鞭是什么部位| 眉心跳动代表什么预兆| 什么笑组词| 诸法无我是什么意思| 外阴白斑瘙痒抹什么药| 脚趾骨折是什么感觉| 申时是什么时候| 股骨头在什么位置| 1950年属什么生肖| 遗精是什么症状| 智齿疼吃什么药| 儿童坐动车需要带什么证件| 属羊什么命| 小孩手足口病吃什么食物好| 肾的功能是什么| 一什么湖水| 去医院洗纹身挂什么科| 人艰不拆是什么意思| 什么品牌的奶粉最好| 中暑用什么药| 超声心动图是什么| 985211是什么意思| 啥是什么意思| 考法医需要什么条件| 狐媚子是什么意思| 心率过低吃什么药| 刘备和刘邦什么关系| dpm是什么意思| 大便脂肪球是什么意思| 什么时间量血压最准| 小三阳是什么意思| 看高血压挂什么科| 一号来的月经排卵期是什么时候| 孙耀威为什么被雪藏| 回流什么意思| 香菇不能和什么一起吃| 阴道口瘙痒用什么药| 三个女人一台戏什么意思| 脸上涂什么可以美白| 春节吃什么| UNIQLO什么牌子| 心脏右束支传导阻滞是什么意思| 早年晚岁总无长是什么意思| 什么平稳| 百度
打印
[复制链接]
330|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flycamelaaa|  楼主 | 2025-2-24 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言允许程序变量在定义时就确定内存地址,通过作用域,以及关键字extern,static,实现了精细的处理机制,按照在硬件的区域不同,内存分配有三种方式:

·从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。

·在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中 ,效率很高,但是分配的内存容量有限。

·从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但同时遇到问题也最多。



这里先看个简单的C语言实例。





//main.c

#include <stdio.h>#include <stdlib.h>

static int st_val;                   //静态全局变量 -- 静态存储区

int ex_val;                           //全局变量 -- 静态存储区

int main(void)

{

   int a = 0;                         //局部变量 -- 栈上申请

   int *ptr = NULL;                   //指针变量

   static int local_st_val = 0;       //静态变量

   local_st_val += 1;

   a = local_st_val;

   ptr = (int *)malloc(sizeof(int)); //从堆上申请空间

   if(ptr != NULL)

   {

      printf("*p value:%d", *ptr);

      free(ptr);

      ptr = NULL;

      //free后需要将ptr置空,否则会导致后续ptr的校验失效,出现野指针

   }            

}



C语言的作用域不仅描述了标识符的可访问的区域,其实也规定了变量的存储区域,在文件作用域的变量st_val和ex_val被分配到静态存储区,其中static关键字主要限定变量能否被其它文件访问,而代码块作用域中的变量a, ptr和local_st_val则要根据类型的不同,分配到不同的区域,其中a是局部变量,被分配到栈中,ptr作为指针,由malloc分配空间,因此定义在堆中,而local_st_val则被关键字限定,表示分配到静态存储区,这里就涉及到重要知识点,static在文件作用域和代码块作用域的意义是不同的:在文件作用域用于限定函数和变量的外部链接性(能否被其它文件访问), 在代码块作用域则用于将变量分配到静态存储区。

   

对于C语言,如果理解上述知识对于内存管理基本就足够。

   

但对于嵌入式C编程来说,定义一个变量,它不一定在内存,也就是SRAM中,也有可能在FLASH空间,或直接由寄存器存储(register定义变量或者高优化等级下的部分局部变量),如定义为const的全局变量定义在FLASH中,定义为register的局部变量会被优化到直接放在通用寄存器中,在优化运行速度,或者存储受限时,理解这部分知识对于代码的维护就很有意义。

   

此外,嵌入式C语言的编译器中会扩展内存管理机制,如支持分散加载机制和__attribute__((section("用户定义区域"))),允许指定变量存储在特殊的区域如(SDRAM, SQI FLASH), 这强化了对内存的管理,以适应复杂的应用环境场景和需求。





LD_ROM 0x00800000 0x10000 { ;load region size_region

    EX_ROM 0x00800000 0x10000 { ;load address = execution address

  *.o (RESET, +First)

  *(InRoot$$Sections)

  .ANY (+RO)

  }

  EX_RAM 0x20000000 0xC000 { ;rw Data

    .ANY (+RW +ZI)

  }

  EX_RAM1 0x2000C000 0x2000 {

    .ANY(MySection)

   }

  EX_RAM2 0x40000000 0x20000{

    .ANY(Sdram)

  }

}



int a[10] __attribute__((section("Mysection")));

int b[100] __attribute__((section("Sdram")));



采用这种方式,我们就可以将变量指定到需要的区域,这在某些情况下是必须的,如做GUI或者网页时因为要存储大量图片和文档,内部FLASH空间可能不足,这时就可以将变量声明到外部区域,另外内存中某些部分的数据比较重要,为了避免被其它内容覆盖,可能需要单独划分SRAM区域,避免被误修改导致致命性的错误,这些经验在实际的产品开发中是常用且重要,不过因为篇幅原因,这里只简略的提供例子,如果工作中遇到这种需求,建议详细去了解下。

   

至于堆的使用,对于嵌入式Linux来说,使用起来和标准C语言一致,注意malloc后的检查,释放后记得置空,避免"野指针“,不过对于资源受限的单片机来说,使用malloc的场景一般较少,如果需要频繁申请内存块的场景,都会构建基于静态存储区和内存块分割的一套内存管理机制,一方面效率会更高(用固定大小的块提前分割,在使用时直接查找编号处理),另一方面对于内存块的使用可控,可以有效避免内存碎片的问题,常见的如RTOS和网络LWIP都是采用这种机制,我个人习惯也采用这种方式,所以关于堆的细节不在描述,如果希望了解,可以参考<C Primer Plus>中关于存储相关的说明。
沙发
szt1993| | 2025-7-31 22:47 | 只看该作者
C语言允许程序变量在定义时就确定内存地址
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

811

主题

4275

帖子

1

粉丝
什么什么之财 什么笑脸 抗凝是什么意思 水至清则无鱼什么意思 男孩适合学什么专业
rng是什么意思 淋巴结肿大是什么原因引起的 姐妹是什么生肖 侯是什么意思 什么的衣裳
gl值是什么意思 地级市副市长是什么级别 芥末配什么好吃 ppt什么意思 问加一笔是什么字
脚腕肿是什么原因 野餐带什么 反复呕吐是什么原因 ip指的是什么 大红袍适合什么季节喝
这是什么品牌bysq.com 幼儿急疹为什么不能碰水hcv7jop5ns1r.cn 家是什么生肖hcv7jop6ns6r.cn 为什么会长扁平疣hlguo.com 精神病吃什么药最好hcv9jop0ns7r.cn
花重锦官城的重是什么意思hcv9jop7ns5r.cn 什么是k金hcv8jop0ns0r.cn pos是什么意思hcv8jop4ns9r.cn 蚕豆病不能吃什么imcecn.com 全身疼是什么病hcv9jop4ns9r.cn
降三高喝什么茶最好hcv8jop4ns1r.cn 肺大泡用什么药hcv9jop2ns1r.cn 黄芪丹参山楂泡水有什么功效hcv8jop0ns5r.cn 7.14日是什么日子hcv8jop2ns8r.cn 查胆固醇挂什么科aiwuzhiyu.com
两肺少许纤维灶是什么意思hcv7jop5ns0r.cn 巴氏杀菌是什么意思hcv9jop4ns7r.cn 1924年属什么hcv7jop9ns6r.cn 四个雷念什么hcv8jop5ns5r.cn 胆红素偏高是什么意思hcv7jop5ns4r.cn
百度