动态内存管理:realloc扩容(缩容)函数详解
当一个空间在使用着,使用着,突然间发现,内存空间不足,这个时候,是重新更改代码呢??还是想要对原先的内存进行扩容呢??这个答案肯定是显而易见的:进行扩容!!当你面临着几千行的代码,怎可能会进行重新返回去写呢??
下面笔者就带领各位老铁,来欣赏一下:realloc函数的使用:
void* realloc (void* ptr, size_t size)
将ptr指向的那段空间,设置为:size个字节的大小!!
列如:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(40);
//扩容(增加空间)
int* ptr = (int*)realloc(p, 80);
if (ptr != NULL)
{
p = ptr;
ptr = NULL;
}
//当realloc开辟失败的时候,返回NULL
//释放
free(p);
p = NULL;
}
上述代码中:重新定义了 ptr(int* ptr = (int*)realloc(p, 80) ) :原因为:原本p指向40个字节的起始位置,但是当realloc开辟失败的时候,返回NULL,则p指向那40个空间也会出现错误,则需要通过ptr来进行判断一下!!
对于realloc函数在使用的情况中,我们必须要知道的为:
1.realloc函数的出现让动态内存管理更加灵活!!
2.有时候我们发现申请的空间太小了,有时候我们又会觉得申请的空间过大了!那么为了合理的使用内存,我们一定会对内存大小做灵活的调整,那么realloc函数就可以做到对动态内存大小的调整!!
函数的原型为:
void* realloc (void* ptr, size_t size)
3.ptr是要调整内存的地址
4.size是调整之后的大小,单位为字节
5.返回值为:调整之后的起始位置!
6.这个函数,在调整原内存空间的基础上,还会将原来内存中的数据移动到新的空间!
7.realloc在调整内存空间是存在2中情况!!
情况1.原有空间之后有在足够大的空间:
在这个情况的时候,要扩容内存,就直接在原有内存之后,追加空间,原来的数据不会发生改变!!
情况2:原有空间之后,没有足够大的空间!
在这个情况的时候,原有空间之后没有足够多的空间时,扩展的方法为:在堆空间上另找一共合适大小的连续空间来使用!这样的话,函数的返回值就是一个新的内存地址!!
由于上述的两种情况,realloc函数的使用,就需要注意一下了!!
简单写一个realloc函数的使用列子,供大家参考一下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(40);
if (p == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
//使用
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
//增加空间
int* ptr = (int*)realloc(p, 80);
//当realloc开辟失败的时候,会返回NULL
if (ptr != NULL)
{
p = ptr;
ptr = NULL;
}
for (i = 10; i < 20; i++)
{
*(p + i) = i;
}
for (i = 10; i < 20; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
代码的运行结果为:
另外:在realloc函数在使用的时候,:realloc(NULL,40)相当于:malloc(40)
本文就大致到此结束,笔者想要表达的内容已经概述完毕,有疑惑的各位lao't
- 点赞
- 收藏
- 关注作者
评论(0)