跳到主要内容

C 语言realloc函数

在C语言中,动态内存管理是一个非常重要的概念。realloc函数是C标准库中用于调整已分配内存块大小的函数。它允许我们在程序运行时动态地增加或减少内存块的大小,从而更灵活地管理内存。

什么是realloc函数?

realloc函数的原型如下:

c
void* realloc(void* ptr, size_t size);
  • ptr:指向之前通过malloccallocrealloc分配的内存块的指针。
  • size:新的内存块大小(以字节为单位)。

realloc函数的作用是调整ptr指向的内存块的大小。如果size大于原来的大小,realloc会尝试扩展内存块;如果size小于原来的大小,realloc会尝试缩小内存块。如果ptrNULLrealloc的行为与malloc相同。

备注

realloc可能会返回一个新的内存地址,因此在调用realloc后,应该始终使用返回值来更新指针。

realloc函数的使用

基本用法

以下是一个简单的示例,展示了如何使用realloc来调整内存块的大小:

c
#include <stdio.h>
#include <stdlib.h>

int main() {
// 初始分配10个整数的内存
int *arr = (int*)malloc(10 * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}

// 使用内存
for (int i = 0; i < 10; i++) {
arr[i] = i;
}

// 调整内存大小为20个整数
int *new_arr = (int*)realloc(arr, 20 * sizeof(int));
if (new_arr == NULL) {
printf("内存重新分配失败\n");
free(arr); // 释放原始内存
return 1;
}

// 使用新的内存
for (int i = 10; i < 20; i++) {
new_arr[i] = i;
}

// 打印结果
for (int i = 0; i < 20; i++) {
printf("%d ", new_arr[i]);
}
printf("\n");

// 释放内存
free(new_arr);

return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

在这个示例中,我们首先使用malloc分配了10个整数的内存,然后使用realloc将内存块的大小调整为20个整数。最后,我们释放了内存。

处理realloc失败的情况

realloc可能会失败,返回NULL。在这种情况下,原始内存块仍然有效,因此我们需要小心处理这种情况:

c
int *new_arr = (int*)realloc(arr, 20 * sizeof(int));
if (new_arr == NULL) {
printf("内存重新分配失败\n");
free(arr); // 释放原始内存
return 1;
}
警告

如果realloc失败,原始内存块不会被释放,因此需要手动释放以避免内存泄漏。

实际应用场景

动态数组

realloc常用于实现动态数组。例如,在处理用户输入或读取文件时,我们可能不知道需要多少内存,因此可以使用realloc来动态调整数组的大小。

c
#include <stdio.h>
#include <stdlib.h>

int main() {
int *arr = NULL;
int size = 0;
int capacity = 1;

arr = (int*)malloc(capacity * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}

int num;
while (scanf("%d", &num) == 1) {
if (size >= capacity) {
capacity *= 2;
int *new_arr = (int*)realloc(arr, capacity * sizeof(int));
if (new_arr == NULL) {
printf("内存重新分配失败\n");
free(arr);
return 1;
}
arr = new_arr;
}
arr[size++] = num;
}

// 打印数组
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");

free(arr);

return 0;
}

在这个示例中,我们使用realloc来动态扩展数组的大小,以容纳用户输入的整数。

总结

realloc是C语言中一个非常有用的函数,它允许我们在运行时动态调整内存块的大小。通过合理使用realloc,我们可以更灵活地管理内存,避免内存浪费或不足的问题。

提示

在使用realloc时,始终检查返回值是否为NULL,并在失败时正确处理原始内存块。

附加资源与练习

  • 练习1:编写一个程序,使用realloc实现一个动态字符串数组,用户可以不断输入字符串,直到输入“exit”为止。
  • 练习2:修改上面的动态数组示例,使其在数组大小超过一定阈值时,将数组大小减半。

通过练习,你将更深入地理解realloc的使用场景和注意事项。