未知大小整数数组动态扩容运行时错误排查与修复求助
问题分析与修复方案
咱们来拆解你的代码里导致运行时错误的几个关键问题:
1. 运算符优先级错误引发的非法内存访问
在create1DArray函数的else分支里,这句代码是崩溃的核心原因:
*perArray[i++]=x;
C语言中数组下标运算符[]的优先级高于解引用*,所以这句实际会被解析为*(perArray[i++])——但perArray是二级指针(指向int指针的指针),perArray[i]会去访问二级指针的第i个元素,这完全不是你要操作的数组元素位置,直接触发非法内存访问,循环执行2次后就会崩溃。
正确的写法应该是先解引用拿到数组的一级指针,再用下标访问:
(*perArray)[i++] = x;
2. 错误的内存释放对象
在所有错误处理分支里,你写了:
free(perArray);
perArray是传入的二级指针本身(它是main函数里&perArray的栈上副本),而真正需要释放的是动态分配的数组内存,也就是*perArray。释放错误的指针会导致未定义行为,甚至直接崩溃。
所有错误处理里的free都应该改成:
free(*perArray);
3. 初始内存分配的冗余与潜在风险
你一开始就malloc了1个int的空间,但后续第一次输入正数时,又会realloc成1*sizeof(int)(因为++(*size)从0变成1),这属于冗余操作。更合理的做法是初始把*perArray设为NULL,因为realloc(NULL, size)的效果等同于malloc(size),这样能简化代码逻辑。
另外,补充一个好习惯:不要直接把realloc的结果赋值给*perArray,如果realloc失败返回NULL,会导致原内存地址丢失,造成内存泄漏。应该先用临时指针接收realloc的结果,验证成功后再赋值。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> void create1DArray(int** perArray, int* size); int main() { int *perArray = NULL, size = 0, i; create1DArray(&perArray, &size ); for(i = 0; i < size; i++) printf("%d ", perArray[i]); free(perArray); return 0; } void create1DArray(int** perArray, int* size) { int flag = 0, i = 0, x; *perArray = NULL; // 初始化为NULL,让第一次realloc等同于malloc while(!flag) { // 先处理scanf输入失败的情况 if(scanf("%d", &x) != 1) { printf("Invalid input!"); free(*perArray); exit(1); } // 再判断输入是否为负数 if(x < 0) { printf("Invalid input!"); free(*perArray); exit(1); } // 输入0时退出循环 if(x == 0) { if(*size == 0) { printf("The first element of the array must not be 0"); free(*perArray); exit(1); } flag = 1; } else { // 先递增数组大小,再尝试扩容 (*size)++; int* temp = realloc(*perArray, *size * sizeof(int)); if(temp == NULL) { printf("Reallocation failed!"); free(*perArray); // 释放原内存避免泄漏 exit(1); } *perArray = temp; (*perArray)[i++] = x; } } }
内容的提问来源于stack exchange,提问作者Ori
相关产品推荐
相关产品推荐

