//***** 堆栈 *****
void test1()
{
int a = 100; // a存放在栈中
int *p = (int *)malloc(sizeof(int)); //p指向申请的堆的首地址
// 栈
/*
栈 栈是一块连续的内存区域,这块区域的大小是固定的,是一个编译时就确定的常数,假如申请的内存空间超过栈的剩余空间,将会栈溢出
栈的内存是连续的,不会产生内存碎片,因此栈中的数据执行速度很快
*/
// 堆
/*
堆 堆是不连续的内存区域,各块区域由链表将它们串联起来,堆空间是由系统的虚拟内存申请而来,堆的空间比较大,堆由程序员自己申请空间
由于堆的内存是不连续的,容易产生碎片,因此堆中的数据执行速度比较慢
*/
}
//***** 申请堆空间 *****
void test2()
{
int *p = (int *)malloc(sizeof(int)); // 申请int类型大小的堆空间
if(p == NULL)
{
printf("申请堆空间失败!"); // 由于是由虚拟内存空间申请而来,可能申请失败,所以判断下是否为空
}
else
{
*p = 100;
printf("*p:%d\n",*p);
free(p); // 使用完堆空间后,一定要释放该指针指向的堆空间,要不然会出现内存泄露
p = NULL; // 释放掉该指针指向的堆空间后,一定要把该指针设置为空指针,要不然该指针就是迷途指针,也叫野指针
}
/*
C语言使用malloc申请堆空间,使用相对应的free()释放申请的堆空间
申请的堆空间只能使用指针操作,假如指向该堆空间的指针丢失了,那这块内存就像丢失了一样,这样的情况一直持续到程序运行结束,这种情况就叫内存泄露。
注意:free()不能释放多次,要和malloc对应出现,不能说怕内存释放不彻底多释放几次,这样会造成程序崩溃
*/
}
C语言_堆和栈
最新推荐文章于 2023-02-01 19:13:35 发布