堆区与栈区
创作时间:
作者:
@小白创作中心
堆区与栈区
引用
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 等函数被执行时才会分配空间。从分配效率上讲栈内存高于堆内存。
- 存储内容不同:堆内存更适用于存储数据量较大的情况,而栈内存更适合存储临时少量的数据。如果函数之间共享一个数据结构(比如链表),那么比较好的处理是把这个数据结构存储在堆内存,栈内存掌握这个堆空间的指针即可,这样就避免了栈空间频繁的创建与回收带来的开销。
- 管理方式不同:栈内存空间是由操作系统支持管理的,堆内存需要开发者自行维护——创建与回收。如果开发者疏忽了回收就会产生垃圾内存。所以堆内存是容易产生内存碎片的,栈内存由于系统自动维护则不会产生内存碎片。
- 生长方向与空间大小不同:栈与堆的内存空间都是动态延展的,但它们是相对方向的。栈的内存空间要小于堆的内存空间,所以堆内存空间更适合存储大一些的数据量。
总结
总的来说,栈区适合存储函数的参数值、局部变量等具有临时性和局部性的数据,而堆区适合存储动态分配的数据,如对象、数组等大小不固定或生命周期较长的数据。在编程过程中,程序员需要根据数据的特点和需求选择合适的存储区域,并合理地管理内存,以确保程序的安全性和高效性。
热门推荐
什么决定了对人工智能应用和治理的态度?
ADHD儿童停药后症状反复的原因与应对策略解析
炒肉时如何正确放置辣椒以提升风味
Git版本管理原理:从快照到内容寻址
机票退改规则有变化!南航之后,东航也调了
阿富汗女性的生活有多悲惨?没有地位可言,一生生活在黑暗之中
马来西亚公立大学博士申请指南
1973年出生男性养老保险缴费年限及退休年龄详解:2025年延迟退休政策影响分析
海运出口必看:集装箱拖车提柜、做柜、还柜知识大全
贵阳市三次产业结构与工业化阶段融合分析
柔性电致变色,为五彩世界赋能
平板荷载试验和螺旋板载荷试验的区别
“谮越”和”僭越”怎么读?词汇发音对比!
陈宇:从此会上班会课——主题班会课程设计教程 | 新书首发
文明的见证:古印度最令人震撼的十大历史地点!
美国留学生如何加入军队的途径与步骤
考心理咨询师证书多少钱 培训怎么收费
韩敬东教授Trends in Genetics综述 | 转录组学研究揭示衰老奥秘
蛋糕打印:定制级艺术,让每一次庆祝都独一无二
人民法院智慧庭审应用探析——以共道科技智慧庭审为例
5类受西方文化影响的日本游戏:《最终幻想》《马里奥》上榜
话费补贴是否算作工资?员工福利的新标准?
贷款买车签合同要注意哪些细节
许多人误解了他汀的最佳服用时刻:到底是睡前、饭前还是饭后?
495胶水与502胶水区别详解:特性、使用方法及注意事项
iNKT细胞通过增强T淋巴细胞浸润,抑制肿瘤进展相关因子富集,缓解胰腺癌肝转移
更年期咋检查都检查啥呀
肠鸣音怎么听?肠鸣音异常可能提示什么?
大慈恩寺:玄奘法师与大雁塔的历史传奇
女子清理发霉衣柜后感染肺部曲霉菌,这些地方最容易藏匿霉菌