C语言调用realloc()函数时程序直接终止问题求助
问题根因
代码运行崩溃的核心原因是realloc()函数的参数顺序传反,直接触发非法内存访问异常。realloc的标准函数原型如下:
void *realloc(void *ptr, size_t new_size);
第一个参数必须是之前malloc/calloc/realloc返回的合法堆内存指针,第二个参数才是调整后的新内存总字节数。你写的代码中把数值类型的arrSize作为第一个参数传入,相当于让系统去一个完全非法的内存地址上做内存调整操作,程序会直接触发段错误终止。
其他需要修复的代码隐患
- 内存分配失败的处理逻辑不完整:
calloc、realloc返回NULL时仅打印错误提示就继续执行后续逻辑,后续访问空指针同样会导致崩溃,分配失败后应该直接终止程序,不要继续走后续数组访问逻辑。 - 新增元素数量未做合法性校验:如果用户输入负数,
arrSize += modSize会因为arrSize是无符号size_t类型,得到一个远大于预期的错误值,后续内存分配、数组访问都会出现越界问题。 - 直接把
realloc返回值赋值给原数组指针存在内存泄漏风险:如果realloc分配失败返回NULL,原指针arr指向的合法内存地址会被覆盖丢失,这部分内存就无法被正常释放。正确写法是先用临时指针接收realloc的返回值,确认分配成功后再赋值给原数组指针。
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> int* arr; size_t arrSize = 10; int main(){ int modSize; printf("The Program is making a dynamic array\n"); arr = calloc(arrSize, sizeof(int)); if(arr == NULL){ printf("error from calloc\n"); return 1; } printf("Enter Values for the Array: \n"); for(int i=0; i<arrSize; ++i){ scanf("%d", &arr[i]); } printf("Would you like to add more values? If yes type the amount : "); scanf("%d", &modSize); // 校验新增元素数量合法性 if(modSize < 0){ printf("invalid add count\n"); free(arr); return 1; } size_t newSize = arrSize + modSize; // 临时指针接收返回值,避免原指针被覆盖导致内存泄漏 int* tempArr = realloc(arr, newSize * sizeof(int)); if(tempArr == NULL){ printf("error from realloc\n"); free(arr); return 1; } arr = tempArr; arrSize = newSize; for(int i = 10; i<arrSize; ++i){ scanf("%d", &arr[i]); } for(int i = 0; i<arrSize; ++i){ printf("%d\t", arr[i]); } free(arr); return 0; }
内容的提问来源于stack exchange,提问作者roverrr
相关产品推荐
相关产品推荐

