一、为什么存在动态内存分配?
当我们使用数组开辟内存使用时,我们可以发现,数组开辟的大小固定,内存浪费比较严重,而且当我们使用的空间较大,超过数组大小时,不能够实现扩容这种,所以我们就需要试试动态内存开辟了。
二、动态内存函数的介绍
1.malloc和free
void* malloc(size_t size);
malloc的参数是需要开辟内存的大小,单位是字节。
这个函数可以向内存申请一块连续可用的空间,并返回这块空间的指针。
需要注意的是:
1.开辟可能会失败,在使用之后要进行判断检查。
2.返回值的类型是void*,所以使用时需要自己决定返回类型。
3.如果参数size为0,malloc的行为是未定义的,取决于编译器。
int* a;
a = (int*)malloc(sizeof(int)*10);
for (int i = 0; i < 10; i++)
{
a[i] = i;
printf("%d ", a[i]);
}
这里就是开辟了10个int类型大小的空间,但要注意,这里空间的大小并没有初始化,所以打印出了的值不是0。
void free(void* p);
有开辟那么就要释放,free函数是用来释放动态开辟的空间的,如果忘记释放的话,可能会导致内存泄漏。
同时,如果释放的空间不是动态开辟的,那么free的行为是错误的。如果释放的是空指针,则无事发生。
2.calloc
void* calloc(size_t num,size_t size);
num是需要开辟的数量,size是开辟类型的大小。
这个函数和malloc类似,区别在于calloc函数会将开辟的空间初始化为0。
int* arr;
arr = (int*)calloc(10, sizeof(int));
for (int i = 00; i < 10; i++)
{
printf("%d ", arr[i]);
}
这个代码的运行就会打印出0。
2.realloc
void* realloc(void* ptr,size_t size);
realloc是用来调整动态开辟内存的空间大小,可以变大也可以变小。
ptr是需要调整的内存地址 ,size是调整之后的大小。
int* arr;
arr = (int*)calloc(10, sizeof(int));
if (arr == NULL)
{
return;
}
int* p = (int*)realloc(arr, 20);
总结
学会了动态内存分配后,我们就可以解决很多的内存不足问题,在一些项目中,这样就更加方便和节约内存。