一、为什么要创建动态内存数组
动态内存,顾名思义就是说在内存中非固定的申请数组
在学习该项方法前我们申请内存的方法无非就两种:直接创建变量/通过创建数组的方式来申请空间。
那么直接创建变量/通过创建数组的方式来申请空间的缺点就是一旦创建成功,则空间不能改变。
而动态则不同,它让程序员⾃⼰可以申请和释放空间,就⽐较灵活了。
二、malloc和free
首先来说一下malloc函数,使用方法:void* malloc (size_t size);
参数是你要创建的空间数,单位为字节。
我们来看以下代码:
int main()
{
int* p = (int*)malloc(sizeof(int) * 5);
return 0;
}
此时我们创建的malloc函数存在两种可能,首先第一种是创建成功了,第二种就是创建失败了。
我们先来看创建成功后应该怎么做:
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(sizeof(int) * 5);
for (int i = 0; i < 5; i++)
{
*(p+i) = i;
}
for (int i = 0; i < 5; i++)
{
printf("%d ", p[i]);
}
free(p);
return 0;
}
以上就是创建成功我们可以做的事,而当malloc函数创建失败时,它会返回NULL,而NULL指针的使用会导致野指针
所以我们要在后面添加一个判断:
int main()
{
int* p = (int*)malloc(sizeof(int) * 5);
if (p == NULL)
return 1;
for (int i = 0; i < 5; i++)
{
*(p + i) = i;
}
for (int i = 0; i < 5; i++)
{
printf("%d ", p[i]);
}
free(p);
return 0;
}
这样就OK了,这就是malloc函数的完整用法
三、calloc的创建和使用
calloc的作用和malloc的作用相同,都是用来创建动态数组的。
他们之间的不同之处在于calloc在创建完成后会自动将数组内容初始化为0。
我们来看以下代码:
int main()
{
int* p = (int*)calloc(10 ,sizeof(int));
if (NULL != p)
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
free(p);
p = NULL;
return 0;
}
可以看到,在使用完calloc函数后,所有元素都被初始化为0了。
四、realloc函数的创建和使用
realloc函数使得malloc和calloc函数(动态内存管理)更加灵活。
realloc(void*ptr,size_t size);
两个参数:ptr指向要修改的数组地址,size则是修改后的大小,单位为字节。
它的作用就是调整已经创建的动态数组大小,我们来看以下代码:
int main()
{
int* p = (int*)calloc(10, sizeof(int));
if (NULL != p)
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
int * ptr = realloc(p, 80);
if (ptr != NULL)
{
p = ptr;
}
free(p);
p = NULL;
return 0;
}