堆区与栈区
创作时间:
作者:
@小白创作中心
堆区与栈区
引用
CSDN
1.
https://blog.csdn.net/qq_50093188/article/details/145794707
在计算机编程中,堆区和栈区是内存中两个重要的存储区域。它们都是用来存储程序运行时的数据,但它们的使用方式和特点有所不同。本文将详细介绍堆区和栈区的概念、特点以及使用场景,并通过具体的代码示例帮助读者更好地理解它们的区别和适用场景。
一、栈区
栈区(Stack)是由系统自动分配和释放的内存空间,用于存储函数的参数值、局部变量的值等。栈区的数据结构是一种先进后出的数据结构,也就是说最后进栈的数据最先出栈,因此栈区具有自动管理和高效访问的特点。在函数调用时,会在栈区存储函数的参数值、返回地址以及函数的局部变量,函数执行完毕后,这些数据会被自动释放,不需要程序员手动管理。
#include <stdio.h>
#include <malloc.h>
int* fun51()
{
int a;
a = 10;
return &a;
}
int main()
{
/*栈区*/
int* p;
p = fun51();
printf("%d\n",*p);
printf("%d\n",*p);
printf("%d\n",*p);
return 0;
}
二、堆区
堆区(Heap)是由程序员分配和释放的内存空间,用于存储动态分配的数据。堆区的数据结构是一个没有固定大小的数据结构,程序员可以根据需要动态地分配和释放内存。在堆区中存储的数据可以在程序的任何地方被访问,但由于动态分配和释放内存需要程序员手动管理,因此容易出现内存泄漏或内存溢出等问题。
#include <stdio.h>
//#include <malloc.h>
#include<stdlib.h>
int* fun52()
{
int* p=malloc(sizeof(int));//需要一段内存空间
*p = 9;//存储一个整数
return p;//分享 此 空间
}
int main()
{
/*堆区*/
int* q;
q= fun52();
printf("%d\n", *q);
printf("%d\n", *q);
printf("%d\n", *q);
//手动释放 不需要的堆内存空间
free(q);
q = NULL;
return 0;
}
三、比对栈区·堆区 使用
堆区使用malloc/calloc来申请空间
#include <stdio.h>
//#include <malloc.h>
#include<stdlib.h>
int main()
{
//比对栈区·堆区 使用
//存储意图:
//栈区
int aa = 4;
int arr[] = {1,2,3,4};
//堆区
int* pa = malloc(sizeof(int));
int* parr = malloc(sizeof(int)*4);
//int* parr = calloc(4,sizeof(int));
parr[0] = 1;
parr[1] = 2;
parr[2] = 3;//*(parr+1)
parr[3] = 4;
free(pa);
free(parr);
pa = NULL;
parr = NULL;
return 0;
}
四、malloc与calloc的区别
- malloc:cd填充
- calloc:0填充
五、realloc(扩充容量)
直接扩充:在原有的后面继续扩充空间。
异地扩充: 若申请空间太大可能会,把之前的数据一起搬家重新找空间扩建
#include <stdio.h>
//#include <malloc.h>
#include<stdlib.h>
int main()
{
int* parr = malloc(sizeof(int)*4);
parr[0] = 1;
parr[1] = 2;
parr[2] = 3;//*(parr+1)
parr[3] = 4;
//扩充容量
parr=realloc(parr,sizeof(int)*8);
parr[4] = 4;
parr[5] = 4;
parr[6] = 4;
parr[7] = 4;
free(pa);
free(parr);
pa = NULL;
parr = NULL;
return 0;
}
六、栈内存与堆内存的区别
- 分配方式与分配效率不同:当函数被调用执行时,其形参与函数体内的局部变量会一起在栈区内全部被创建出来,而堆内存的空间分配是 malloc、calloc 等函数被执行时才会分配空间。从分配效率上讲栈内存高于堆内存。
- 存储内容不同:堆内存更适用于存储数据量较大的情况,而栈内存更适合存储临时少量的数据。如果函数之间共享一个数据结构(比如链表),那么比较好的处理是把这个数据结构存储在堆内存,栈内存掌握这个堆空间的指针即可,这样就避免了栈空间频繁的创建与回收带来的开销。
- 管理方式不同:栈内存空间是由操作系统支持管理的,堆内存需要开发者自行维护——创建与回收。如果开发者疏忽了回收就会产生垃圾内存。所以堆内存是容易产生内存碎片的,栈内存由于系统自动维护则不会产生内存碎片。
- 生长方向与空间大小不同:栈与堆的内存空间都是动态延展的,但它们是相对方向的。栈的内存空间要小于堆的内存空间,所以堆内存空间更适合存储大一些的数据量。
总结
总的来说,栈区适合存储函数的参数值、局部变量等具有临时性和局部性的数据,而堆区适合存储动态分配的数据,如对象、数组等大小不固定或生命周期较长的数据。在编程过程中,程序员需要根据数据的特点和需求选择合适的存储区域,并合理地管理内存,以确保程序的安全性和高效性。
热门推荐
概念定义划分:从基础理论到实践应用
AB胶与单组分胶粘剂:组成、固化机制及应用领域的全面对比
电子处方合法吗?电商卖假药属于什么犯罪?电台广播买药合法吗?
肝癌,要提前警惕,否则难以治疗。
史上最年轻的一届!先锋赛5支战队中单选手对比
爆火的《哪吒2》能为影视行业吸引多少资本?
个人知识管理体系 - 方法论篇
视频文件格式大解析:如何选择最佳格式提升播放体验
新媒体平台多样化:内容创作者的优选工具
Excel中按录取学校分类数据的五种方法
为什么有些92的车不建议加95的汽油?建议按照原厂推荐加
白色T恤发黄怎么办?5个实用小妙招帮你轻松应对
无数个干净的家:都有这7个好习惯,学会了你家也能一尘不染
客厅音箱选购指南:从20到80平空间的完美匹配方案
宋朝传统版《百家姓》,第134名,“季姓”的起源和历史,你知道吗?
清明节“AI复活”逝者成热门生意:以爱为名,售价2万
今年清明将至,有3个好消息2个坏消息,大家提前做好准备
汽车轮毂选择:重量成为油耗与加速的关键因素
诗情画意:吟“木棉花”经典古诗词六首
瓷砖背胶能用吗?了解其优势与注意事项
立柱式码垛机程序
人工智能和机器学习辅助决策在空战中的未来选择
如何分析股票市场的尾盘交易?这种交易模式对投资者有何影响?
国际婚姻资助是什么?如何申请?
地毯防火吗?家居安全防护指南
老话说“春吃芽”,具体指的吃什么?应季而食,精力旺盛进入春天
中国传统文化:修行之道明心见性
6部高分恐怖片,恐怖指数爆表!
中国短剧爆火海外,都是谁在拍,又凭何“出圈”?
女人身上蕴含佛缘的五大特征分析 如何判断女性是否具备佛缘特征