如何在C语言中调整动态分配数组大小?无需额外数组或重分配删原数组
C语言中调整动态数组大小的高效方法
C语言里没有像C++ std::vector那样封装好的动态数组,但标准库提供的realloc()函数就是你要找的“更巧妙”的解决方案——它可以直接调整动态分配数组的大小,大多数情况下不需要手动复制数据或额外数组。
核心用法与机制
realloc()定义在<stdlib.h>头文件中,原型为:
void *realloc(void *ptr, size_t new_size);
- 第一个参数是你之前用
malloc()或calloc()分配的动态内存指针;第二个参数是调整后的内存总大小(单位:字节)。 - 它的工作逻辑:
- 如果原内存块后面有足够的连续空闲空间,直接扩展原内存块,返回原指针,完全不需要复制数据,这是最优的情况。
- 如果原内存块后面空间不足,它会自动在内存中找到新的足够大的连续块,把原数据复制过去,然后释放原内存块,返回新指针——这一步复制是库自动完成的,不用你手动写循环复制。
- 如果是缩容(
new_size小于原大小),它会直接截断内存块,保留前new_size字节的数据,超出部分的内存会被回收(数据会丢失)。
实际代码示例
#include <stdlib.h> #include <stdio.h> int main() { // 初始分配5个int的动态数组 int *arr = malloc(5 * sizeof(int)); if (arr == NULL) { fprintf(stderr, "内存分配失败\n"); return 1; } // 填充初始数据 for (int i = 0; i < 5; i++) { arr[i] = i + 1; } // 扩容到10个int的空间 int *temp_arr = realloc(arr, 10 * sizeof(int)); if (temp_arr == NULL) { fprintf(stderr, "扩容失败,原数组保留\n"); // 扩容失败时,原arr仍有效,需要后续手动释放 } else { arr = temp_arr; // 给新增的空间赋值(可选,因为realloc不会初始化新增空间) for (int i = 5; i < 10; i++) { arr[i] = i + 1; } } // 缩容到3个int的空间 temp_arr = realloc(arr, 3 * sizeof(int)); if (temp_arr != NULL) { arr = temp_arr; } // 打印结果 for (int i = 0; i < 3; i++) { printf("%d ", arr[i]); } printf("\n"); // 释放最终的内存 free(arr); return 0; }
关键注意事项
- 只能用
realloc()处理动态分配的内存(malloc()/calloc()/realloc()返回的指针),不能用在栈上的数组或静态数组上,否则会触发未定义行为。 - 必须检查
realloc()的返回值:如果返回NULL,说明内存分配失败,原内存块不会被释放,你需要手动处理原指针的释放。 realloc()不会初始化新增的内存空间(扩容时),如果需要初始值,要自己用memset()或循环赋值;缩容时,超出新大小的部分数据会被丢弃。
对比你之前手动复制再删除原数组的方法,realloc()利用了内存管理器的内部信息,能尽可能避免不必要的数据复制,代码更简洁,效率也更高。
内容的提问来源于stack exchange,提问作者Đức Lâm
相关产品推荐
相关产品推荐

