时尚新选择:PANDAER有线耳机
听音乐,是我们现代人必备的娱乐方式。无论何时何地,佩戴起耳机,与音
可能很多人心中都有一个武侠梦,记得小时候搬个小凳子,到邻家院子里蹭电视看,正值金庸先生的射雕英雄传热播,一伙人屏息静气,全神贯注,随着郭靖黄蓉出山入海,驰骋大漠。然后觉得自己比憨憨的郭大侠,还是要聪明一点点,于是找来布袋子,装上沙子,苦练武功。如今想来奇怪,怎么单练这铁掌帮的功夫呢?真是好坏不分,值得检讨。
(资料图)
此去经年,武侠梦碎。没办法华山论剑,只能论一下栈了。
什么是堆栈我们说堆栈,其实堆是堆(Heap),栈是栈(Stack)。一般我们写程序时不太关心堆栈,因为编译器会帮我们处理。但是还是有必要把它们弄清楚,不然有时候出了莫名其妙的问题,会无从下手。比如说堆栈溢出,就好比一个幽灵,非常难发现。看起来一切都挺好,程序编译运行,测试,可能都好好的,直到它突然出现,发出致命一击,导致系统崩溃。
先看一个典型的存储器示意图,编译器把RAM划分为静态存储区,堆区,栈区。静态存储区用于存放全局变量,静态变量,编译的时候它的大小也就确定了;紧挨着的是堆(Heap)区,由程序调用malloc,free等函数来分配和释放;栈区由编译器自动分配和释放,用来传递参数,存放局部变量等。栈比较特殊,正常情况下,它是后进先出的。
栈的使用是从高地址,也就是Top of Stack开始,向下增长。
那为什么要把局部变量分配在栈里呢?因为单片机访问栈用的指令,和访问全局变量区域用的指令是不一样的,访问栈的指令速度更快。再一个就是这些局部变量,只有所在函数被调用的时候才会分配,函数返回时分配的空间就被收回了,不像全局变量始终占用内存。
我们看一个程序,用到了比较多种类的变量类型。
编译后的map文件:
我们可以看到全局变量,还有静态局部变量都放到了静态存储区。非静态的局部变量在map文件是找不到的。
特别关注一下P1这个指针型变量,因为它是全局变量,所以变量本身分配在静态存储区,但是它指向的用Malloc申请的内存,是在堆区。如下图:
堆栈溢出堆栈溢出,主要是指栈溢出。因为我们在堆中,用malloc, 或new函数申请内存时,如果空间不够了,函数会返回NULL,很清楚它的空间不够了。而栈由于是函数调用时分配,占用空间大小跟调用深度有关,编译器很难确定最大需要多少空间。如果栈空间过小,直接的结果就是当栈增长超过栈底,堆中的数据,甚至是静态存储区数据被冲掉,导致不可预知后果。
那怎么避免堆栈溢出,至少知道发生了堆栈溢出呢?
一个就是在启动文件里,把堆栈的值尽量改大。编译的时候用 –info=stack可以大概看一下,各个函数占用栈的大小。
综合编译后RAM剩余空间的大大小,可以直接把栈空间放到最大。在下面的源文件中可以直接修改堆和栈的大小。对于静态存储空间,编译器会根据实际使用大小进行分配,我们不用关心。
还有一个方法,在栈底放置特殊字符,然后在程序运行过程中,监测特殊字符是否被更改,如果被更改,大概率是发生了栈溢出,此时可以采取一定的补救措施。如何操作呢?先在启动文件用EXPORT Stack_Mem导出栈底,在主程序定义同名外部函数extern void Stack_Mem(void); 然后就可以往栈底写入数据了,参见前面的程序。
这种方法的缺点就是,跑飞了的野指针,也可能篡改这一区域数据,造成误判。还有一个就是,因为做数据比较判断,要消耗CPU时间,一般只能周期性检测,在没检测出问题之前,栈溢出有可能已经造成程序出问题了。你用过更好的方法吗?欢迎一起来探讨。
关键词:
听音乐,是我们现代人必备的娱乐方式。无论何时何地,佩戴起耳机,与音
我通常评估软能力,通过了解应聘者在做决策时的决断力、考察其理解和拆
受短时局部强降雨影响,8月11日18时许,西安市长安区滦镇街道喂子坪村
8月11日,C碧兴(688671)融资买入2771 63万元,融资偿还2404 57万元,
8月11日,燕东微(688172)融资买入656 39万元,融资偿还363 43万元,
08月11日,贝达药业被深股通减持万股,最新持股量为万股,占公司A股总
8月11日,交银阿尔法核心混合A最新单位净值为3 2326元,累计净值为4 06
南阳机动车将要实现机动车检验标志电子化啦!之前给大家介绍了申请流程
截至2023年8月11日收盘,祥源文旅(600576)报收于元,下跌%,换手率%,
8月10日,在OCPChinaDay2023上,《开放加速规范AI服务器设计指南》(以
导读1、夏天天气炎热,而且湿气较重,人的胃口也不佳,所以很容易生病
记者从内蒙古自治区森林草原防灭火指挥部办公室了解到,阿龙山塔朗空火
1、这句诗反映的应是一种童趣与童真,读起诗句,仿佛回到很小很小的时
证券时报e公司讯,据深交所消息,8月7日至8月11日,本所共对44起证券异
爱东营讯消防员的爱情,最怕的是突然离别。在假期中,突发的任务来临,
我省2023年普通高校招生专科提前批已按期投档。
宋L外观正式曝光,“比亚迪最美SUV”实锤。车型定位B级旗舰猎装SUV,采
格隆汇8月11日丨永和股份(605020 SH)公布半年度报告,营业收入20 8亿元
雷军在采访中表示:“我们家正好是卖手机的,不过我也建议大家少刷手机
今天(11日)10时,中央气象台继续发布暴雨蓝色预警,未来24小时,京津
,你们好,今天0471房产来聊聊一篇椴,椴简述的文章,网友们对这件事情
第十一届茅盾文学奖揭晓《雪山大地》等五部作品获奖---
相信学费一定是大家在选择学校时非常关心的一个情况,沈阳医学院附属卫
这个夏天疯狂“买买买”的沙特联赛要开赛了!北京时间12日凌晨,
同花顺金融研究中心8月11日讯,有投资者向麦克奥迪提问,公司原先控股