C语言realloc函数的用法(附带实例)
realloc() 是 C 语言标准库中的函数,位于
realloc() 的返回值是一个指向新地址的指针,如果出现错误,则返回NULL。
例如,改变一个分配的浮点型空间大小成为整型空间大小,代码如下:
【实例】定义一个整型指针和浮点型指针,利用 realloc() 函数重新分配内存空间。
在 C 语言中使用 realloc() 函数时,需要注意以下几点:
例如:
<stdlib.h>
头文件中,它的的原型如下:
void *realloc(void *ptr,size_t size);该函数的功能是改变 ptr 指针指向的空间大小为 size。设定的 size 大小可以是任意的,也就是说既可以比原来的数值大,也可以比原来的数值小。
realloc() 的返回值是一个指向新地址的指针,如果出现错误,则返回NULL。
例如,改变一个分配的浮点型空间大小成为整型空间大小,代码如下:
fDouble=(double*)malloc(sizeof(double)); iInt=realloc(fDouble,sizeof(int));其中,fDouble 指向分配的浮点型空间,之后使用 realloc() 函数改变 fDouble 指向的空间的大小,将其大小设置为整型大小,然后将改变后的内存空间的地址返回并赋给 iInt 整型指针。
【实例】定义一个整型指针和浮点型指针,利用 realloc() 函数重新分配内存空间。
#include<stdio.h> #include <stdlib.h> int main() { int *fDouble; /*定义整型指针*/ char* iInt; /*定义浮点型指针*/ fDouble = (int*)malloc(sizeof(int)); /*使用malloc()分配整型空间*/ printf("%d\n", sizeof(*fDouble)); /*输出空间的大小*/ iInt = realloc(fDouble, sizeof(char)); /*使用realloc()改变分配空间大小*/ printf("%d\n", sizeof(*iInt)); /*输出空间的大小*/ return 0; /*程序结束*/ }运行程序,结果为:
4
1
在 C 语言中使用 realloc() 函数时,需要注意以下几点:
- realloc() 函数用于重新分配内存,它会调整之前分配的堆空间的大小。
- 如果 realloc() 成功,它会返回一个新的指针,指向新分配的内存空间。原来的内存空间由 realloc() 函数负责释放。你只需要使用新的指针即可。
- 如果 realloc() 失败(例如内存不足),它会返回 NULL,而原来的内存空间仍然有效,不会被释放。在这种情况下,你需要检查返回值,避免内存泄漏。
- 使用 realloc() 重新分配的内存空间,最终仍然需要通过 free() 函数手动释放,以避免内存泄漏。
例如:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr = NULL; int size = 5; // 初始分配内存 ptr = (int *)malloc(size * sizeof(int)); if (ptr == NULL) { printf("内存分配失败!\n"); return 1; } printf("初始分配内存: %p\n", (void *)ptr); // 使用内存 for (int i = 0; i < size; i++) { ptr[i] = i + 1; } // 扩大内存 size *= 2; int *temp = (int *)realloc(ptr, size * sizeof(int)); // 使用临时指针 if (temp == NULL) { printf("内存重新分配失败!\n"); free(ptr); // 释放原来的内存 ptr = NULL; return 1; } ptr = temp; // 重新分配成功,更新指针 printf("重新分配内存: %p\n", (void *)ptr); // 继续使用新分配的内存 for (int i = 5; i < size; i++) { ptr[i] = i + 1; } // 打印内容 for (int i = 0; i < size; i++) { printf("%d ", ptr[i]); } printf("\n"); // 手动释放内存 free(ptr); ptr = NULL; return 0; }运行结果为:
初始分配内存: 00000000007013E0
重新分配内存: 00000000007013E0
1 2 3 4 5 6 7 8 9 10