在昨天的内容中,我们学习有关结构体
和联合体
在内存中存储
的相关问题,由于粗心,有一个代码重复了,感谢这位朋友的提醒:
现在已经对内容进行了修改,感谢朋友们的支持。
今天我们将学习有关动态内存
的相关问题,一节内容无法阐述,将在后续的几节中进行阐述,好了,话不多说,开整!!!
内存分区
在讲解动态内存
之前,首先我们要知道内存的分区是什么样子的,当然了我们并不是指其物理上的分区
,而是我们所编写程序时,申请的内存是如何划分的。
实际上,内存分为三个区域
,分为分栈区
、堆区
和静态区
,在三个区域中,分别存放着不同的内容,可以用以下一张图进行描述:
可以看到我们一般的变量,如局部变量、形参,都是存放在栈区
的,而今天的主要内容就和堆区有关。
动态内存的必要性
有的时候,我们向内存申请空间时,比如我暂时申请了5个整型也即20个字节的空间,但是我在使用时又想使用10个整型
,这时动态内存
就派上用场了。
动态内存的用法
在向堆区
上进行动态内存申请
时,有两种方式,两种方式各有不同,但功能基本一样,下面分别进行介绍。
malloc
首先查看该函数的使用帮助:
可见,其向堆区申请多少字节
的空间,返回一个空指针
,
如以下代码,我想申请5个整型的数据空间,那么就可以就可以如下定义,因为是整型数据,因此我们可以强制转化为整型指针
然后返回,然后对申请的空间进行赋值和打印,代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(5*sizeof(int));
int i = 0;
for(i=0;i<5;i++)
{
*(p+i) = i;
printf("%d ",*(p+i));
}
return 0;
}
编译查看结果:
可以内存开辟成功了。
calloc
下面介绍该函数的使用介绍:
可见,该函数是向堆区中申请n个元素
,每个元素的所占大小为多少字节,同样返回空指针
,同样按上述要求,则代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)calloc(5,4);
int i = 0;
for(i=0;i<5;i++)
{
*(p+i) = i;
printf("%d ",*(p+i));
}
return 0;
}
编译查看结果:
从上述结果可以看到,内存申请成功。
内存扩展
上述的内容中,我们定义了5个整型,但是现在我想使用10个整型了,那怎么办呢,此时就可以使用realloc
函数,查看使用方式如下所示:
可见其传入一个指针,然后重新申请该指针所指向的堆区的空间,大小为字节。
比如以下代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)calloc(5,4);
int i = 0;
for(i=0;i<5;i++)
{
*(p+i) = i;
printf("%d ",*(p+i));
}
printf("\n");
int* p2 = (int*)realloc(p,10*sizeof(int));
for(i=0;i<10;i++)
{
*(p2+i) = i;
printf("%d ",*(p2+i));
}
return 0;
}
查看结果:
可以重新分配空间成功。
当然了,实际上,上述时使用过程中,不够严谨,将在后续内容中进行补充。
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!