c语言 heap stack,C语言堆(heap)与栈(stack)的区别

c语言 heap stack,C语言堆(heap)与栈(stack)的区别8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?C语言中的堆和栈,以前用过,但也就稀里糊涂的用了,理论上却是模糊的很。。。今天呢,终于彻底搞明白了,简单记录下,嘿嘿~~~简书C语言中动态区域由栈和堆两部分组成。12栈由编译器自动分配释放,存放形参、局部变量等值,底层的数据结构是LIFO(先进后出)的栈;堆由程序员分配释放,如果一不小心忘记了释放申请的内存,可能引起内存…

大家好,欢迎来到IT知识分享网。

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

C语言中的堆和栈,以前用过,但也就稀里糊涂的用了,理论上却是模糊的很。。。今天呢,终于彻底搞明白了,简单记录下,嘿嘿~~~

简书

C语言中动态区域由栈和堆两部分组成。1

2栈由编译器自动分配释放,存放形参、局部变量等值,底层的数据结构是LIFO(先进后出)的栈;

堆由程序员分配释放,如果一不小心忘记了释放申请的内存,可能引起内存泄漏

区别

申请方式1

2栈由编译器自动分配,存放形参、局部变量等;

堆由程序员调用malloc, realloc, calloc申请,并用free释放

申请效率1

2栈由系统自动分配,速度快,程序员无法控制;

堆由程序员申请、释放,容易产生碎片,效率低于栈,但灵活度高

空间大小

栈在Linux内存区域中由高地址向低地址生长,大小固定,地址是连续的;当栈的剩余空间不足时,会提示Overflow;

堆在内存区域中由低地址向高地址生长,是不连续的内存区域;堆的大小受制于系统有效的虚拟内存,如果忘记free累积达到内存上限,就会出现内存泄漏

分配方式

栈是连续的,只要栈的剩余空间大于所申请的空间,系统将为程序分配空间,否则会报Overflow;

堆收到程序申请时,操作系统有一个记录空闲内存地址的链表,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲链表中删除,并将该节点的空间分配给程序。另外,如果找到的堆节点大小不一定正好等于申请的大小,系统会自动将多余的部分重新放入空闲链表中。反复的申请/释放,势必会生成大量的内存空间碎片,使程序效率降低

存储内容

压栈:当函数调用时,第一个进栈的是主函数中下一条语句的地址;然后是函数的各个参数,参数是从右往左入栈的;然后是函数中的局部变量;静态变量不入栈。

出栈:当本次函数调用结束后,局部变量先出栈,然后是参数,最后是栈顶指针所指向的、主函数中的下一条指令,程序由该点继续执行。

往往会在堆的头部用一个字节存放堆的大小,以利于free函数的释放

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12033.html

(0)
上一篇 2024-03-18 07:15
下一篇 2024-03-18 10:33

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信