历史上的今天
返回首页

历史上的今天

今天是:2024年11月23日(星期六)

2018年11月23日 | 堆与栈结合代码和汇编解释

2018-11-23 来源:eefocus

 一般认为在c中分为这几个存储区


1栈 - 由编译器自动分配释放


2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收


3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束释放


4另外还有一个专门放常量的地方。 - 程序结束释放


在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的 "adgfdf "这样的字符串存放在常量区。


比如:


int a = 0; 全局初始化区


char *p1; 全局未初始化区


main()


{


int b; 栈


char s[] = "abc ";栈


char *p2; 栈


char *p3 = "123456 "; 123456\0在常量区,p3在栈上。


static int c =0; 全局(静态)初始化区


p1 = (char *)malloc(10);


p2 = (char *)malloc(20);


分配得来得10和20字节的区域就在堆区。


strcpy(p1, "123456 "); 123456\0放在常量区,编译器可能会将它与p3所指向的 "123456 "优化成一块。


}


还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。


栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。


堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。


char s1[] = "aaaaaaaaaaaaaaa ";


char *s2 = "bbbbbbbbbbbbbbbbb ";


aaaaaaaaaaa是在运行时刻符值的,而bbbbbbbbbbb是在编译时就确定的


但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。


比如:


#include


void main()


{


char a = 1;


char c[] = "1234567890 ";


char *p = "1234567890 ";


a = c[1];


a = p[1];


return;


}


10: a = c[1];


00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]


0040106A 88 4D FC mov byte ptr [ebp-4],cl


11: a = p[1];


0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]


00401070 8A 42 01 mov al,byte ptr [edx+1]


00401073 88 45 FC mov byte ptr [ebp-4],al


第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。


一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.


栈是先入后出的,一般是由高地址向低地址生长。


推荐阅读

史海拾趣

FEMA Electronics Corporation公司的发展小趣事

随着科技的不断发展,FEMA意识到只有不断创新才能在竞争激烈的市场中立于不败之地。因此,公司加大了研发投入,不断推出具有自主知识产权的新产品。其中,一款高性能的集成电路芯片在市场上引起了广泛关注。这款芯片不仅性能卓越,而且具有极高的性价比,迅速赢得了客户的青睐。FEMA凭借这一产品,成功打开了新的市场领域,实现了业务的快速增长。

Festo公司的发展小趣事

作为一家以创新驱动的公司,Festo始终将创新作为公司发展的核心动力。近年来,Festo在研发领域的投资不断增加,推出了一系列具有颠覆性的新产品和解决方案。同时,Festo还积极响应全球可持续发展的趋势,致力于减少碳排放和提高能源效率。通过引入先进的能效措施和扩大光伏(PV)的使用,Festo成功实现了碳中和的目标,为电子行业的可持续发展做出了积极的贡献。

FORYARD公司的发展小趣事

随着业务的不断扩展,FORYARD意识到全球化布局的重要性。1995年,公司决定在中国设立研发中心和生产基地,以利用当地丰富的人才资源和成本优势。这一战略决策极大地提升了FORYARD的产能和研发效率,同时也使其能够更好地服务全球客户。此后,FORYARD还陆续在欧洲、亚洲等地建立了多个分支机构,形成了覆盖全球的研发、生产和销售网络。通过全球化布局,FORYARD不仅增强了自身的市场竞争力,还促进了全球电子产业的交流与合作。

BTCPower公司的发展小趣事

BTCPower深知技术创新是公司发展的核心动力。因此,公司不断加大研发投入,积极引进和培养高素质的研发人才。同时,公司还建立了完善的研发体系和创新机制,鼓励员工提出新的想法和创意。这些举措使得BTCPower在技术创新方面始终保持领先地位。

CALMIRCO公司的发展小趣事

CALMIRCO公司自成立以来,一直致力于电子技术的研发与创新。在公司发展初期,CALMIRCO团队便成功研发出一款具有划时代意义的智能芯片,该芯片在性能和稳定性上均达到行业领先水平。这一技术突破不仅为CALMIRCO公司赢得了大量市场份额,更推动了整个电子行业的进步。此后,CALMIRCO公司继续加大研发投入,不断推出创新产品,引领行业变革。

Datakey Electronics公司的发展小趣事

随着数字化技术的快速发展,数字化转型已经成为企业提升竞争力的关键。Datakey Electronics紧跟时代潮流,积极推进数字化转型。公司引进先进的信息化管理系统和智能化生产设备,实现了生产过程的自动化和智能化。这不仅提高了生产效率和产品质量,还降低了生产成本和能源消耗。通过数字化转型,Datakey Electronics在激烈的市场竞争中保持了领先地位。

以上这些故事都是基于电子行业的一般发展趋势和可能的情况虚构的,但从中我们可以看到Datakey Electronics公司可能经历的一些发展历程。希望这些故事能够为您提供一些参考和启发。

问答坊 | AI 解惑

STC12C5201AD 系列 MCU 的 A/D 转换程序

STC12C5201AD 系列 MCU 的 A/D 转换…

查看全部问答>

智能仪器(单片机应用系统设计).

智能仪器(单片机应用系统设计).…

查看全部问答>

晒晒我的东西,关于SD卡的

那个带SD卡的是个模块,带处理器,整合了FAT32,接口是串口(UART) 51单片机串口115200bps读写,写入后文件样子如下: …

查看全部问答>

高人指教,8051光电隔离和继电驱动

高人指教下  用在8051  p0.1--p0.5口上的  光点隔离 和继电驱动   最好有99se编辑好的原理图   一般画的也行 我对单片机不太了解  所以各位高人见谅   谢谢了 &nbs ...…

查看全部问答>

大侠快来救命阿,关于AM29LV320D的软件方法去除写保护问题??

我试了很多AM29LV320D的flash,bottom boot的,都是前四个扇区写保护了?这是什么原因?手册中没有找到软件方法去除写保护的命令,那这些扇区怎么写保护的,怎么去除呢。现在其他扇区都可以正常读写…

查看全部问答>

"0123456789abcdef"[i]

看到一种比较特殊的写法, \"0123456789abcdef\" [ i ],看起来挺神奇的,暂时理解成匿名的全局字符串变量指针吧,期待有一天能用上吧。 补充一下,还有这样写的: 5[\"hello world!\"] [ 本帖最后由 medky 于 2011-5-14 19:28 编辑 ]…

查看全部问答>

程序调不出来了,崩溃中,,,

在一个工程中做了些改动,其中一个函数分离出去测试,怎么测怎么通,,一点问题没有,放到大程序里就一点反应没有了,,崩溃了。。支持一下啊,希望能调通。。。 [ 本帖最后由 aahellaa 于 2011-8-16 10:29 编辑 ]…

查看全部问答>

我想要分享这个啊,了解下啊

有高手能解说下么,在下只想学习啊…

查看全部问答>

招聘VC软件工程师

本职位挑战高薪,有意者可来应战哦       一定来哦,52297030;hr@queentest.com; http://www.queentest.cn 工作职责:1)基于Windows/linux系统下的软件设计和研发2)参与公司各大小项目的研发3)在团队中能主动发挥自身各 ...…

查看全部问答>