- 前言
- 一、认识了解realloc函数
- 二、使用realloc函数
- 解析
前言
一、认识了解realloc函数有时我们觉得我们用malloc,calloc函数申请的动态内存空间太大了,有时觉得申请的空间太小了,为了合理使用内存,我们要对内存的大小做灵活的调整,那么realloc函数就可以做到控制动态内存开辟的大小。
1.realloc函数的原型:
void* realloc(void* memblock, size_t size)
头文件:stdlib.h
realloc函数返回的是void*类型的指针,指向在堆区重新开辟的内存块的起始地址,memblock是先前开辟的内存块的指针(也就是malloc或calloc之前申请的那块内存空间,即需要调整大小的内存空间),size_t size指的是New size in bytes,新的字节数,注意不是增加的字节数,而是新开辟的那块内存空间的字节数,返回值为调整之后的内存的起始地址。
#include解析#include #include #include int main() { int* p=(int*)malloc(20); int i; if (p == NULL) { printf("%sn", strerror(errno)); } else { for (i = 0; i < 5; i++) { *(p + i) = i; } for (i = 0; i < 5; i++) { printf("%d ", *(p + i)); } } //假设这里20个字节的空间已经不能满足我们使用了 //我们需要40个字节的空间 //这里就可以使用realloc调整动态开辟的内存 int* ptr = realloc(p, 40); //开辟成功 if (ptr != NULL) { p = ptr; for (i = 5; i < 10; i++) { *(p + i) = i; } for (i = 5; i < 10; i++) { printf("%d ", *(p + i)); } } //考虑开辟失败的情况 //若调整开辟40个字节失败,我们不能让原有的20个字节的空间的数据丢失 //所以我们至少要返回原动态内存的起始地址,打印0 12 3 4 //注意用完之后把动态内存释放 free(p); p = NULL; }
1.如果p指向的空间之后有足够的空间可以追加,则直接追加,返回的是p原来的起始地址。
2.如果p指向的空间之后没有足够的空间可以追加,则realloc函数会重新找一个新的内存区域,重新开辟一块40个字节的动态内存空间,并且把原来内存空间的数据拷贝回来,释放旧的内存空间还给操作系统,最后返回新开辟的内存空间的起始地址。
3.我们需要用一个新的指针变量来接收realloc的返回值。
4.同时我们要考虑调整内存大小失败的情况,如果开辟失败,我们至少不能让原内存数据失效,我们也要释放原内存数据,并把指针置为空。
5.开辟成功,也不用担心原来的内存有没有浪费,因为realloc函数会把原来的内存空间拷贝回来,再将其内存释放。注意如果ptr!=NULL p=ptr;这个p指针已经被赋为ptr了(就不用考虑原内存空间的指针有没有被置为空指针),所以新空间不再使用时,也要释放内存,并把指针置为空。
6.realloc函数也可以具有与malloc函数相同的功能
int* p = (int*)realloc(NULL, 20);



