当一个空间在使用着,使用着,突然间发现,内存空间不足,这个时候,是重新更改代码呢??还是想要对原先的内存进行扩容呢??这个答案肯定是显而易见的:进行扩容!!当你面临着几千行的代码,怎可能会进行重新返回去写呢??
下面笔者就带领各位老铁,来欣赏一下: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