C语言使用realloc()调整arr[]定义数组大小失效问题解答
核心结论
- 以
arr[]形式直接定义的栈上数组绝对不能直接调用realloc()调整大小,这是未定义行为,会导致程序崩溃、内存错乱等不可预期的问题。 realloc()仅能处理通过malloc()、calloc()、realloc()在堆上分配的动态内存指针,传入空指针时等价于malloc(),其余非动态分配的指针都不能作为realloc()的入参。
你的代码存在的问题
- 内存类型不匹配:你代码里的
int arr[] = {1, 2, 3}是编译器分配在栈上的固定长度数组,内存生命周期和管理逻辑完全独立于堆内存管理器,根本不属于realloc()可操作的内存范围。 - 长度计算逻辑错误:
int newSize = size++;用了后置自增,newSize实际拿到的是自增前的原数组长度,并没有实现扩容的大小计算。 - 缺少必要的安全判断:动态内存分配可能失败,直接使用返回值会有空指针风险;直接把
realloc返回值赋值给原指针,一旦分配失败会丢失原内存地址,造成内存泄漏。
正确实现示例
如果需要运行期调整数组长度,必须从一开始就将数组定义在堆上,参考代码如下:
#include <stdio.h> #include <stdlib.h> void printArray (int *arr, int size) { printf("{"); for (int i=0; i<size; i++) { if (i == size-1) { printf("%d", arr[i]); } else { printf("%d, ", arr[i]); } } printf("}\n"); } int main () { // 初始在堆上分配3个int长度的数组空间 int* arr = malloc(3 * sizeof(int)); if (arr == NULL) return 1; // 分配失败直接退出 // 初始化数组元素 for(int i = 0; i < 3; i++) { arr[i] = i + 1; } int size = 3; printArray(arr, size); // 扩容到4个元素长度 int newSize = size + 1; int* temp = realloc(arr, newSize * sizeof(int)); if (temp == NULL) { free(arr); // 分配失败释放原内存,避免泄漏 return 1; } arr = temp; arr[newSize - 1] = 4; // 给新扩容的位置赋值 printArray(arr, newSize); free(arr); // 用完堆内存必须手动释放 return 0; }
补充注意事项
- 栈上数组的长度在编译阶段就已经固定,运行过程中无法修改长度,所有可变长度的数组需求都要通过堆动态分配实现。
- 调用
realloc时建议先用临时指针接收返回值,判断分配成功后再赋值给原数组指针,避免内存泄漏。 - 所有通过
malloc/calloc/realloc分配的堆内存,使用完必须调用free释放。
内容的提问来源于stack exchange,提问作者altair00
相关产品推荐
相关产品推荐

