C语言读取文件到数组报munmap_chunk无效指针错误排查
错误原因
- 参数值传递导致修改未回传:C语言默认参数为值传递,你当前
ReadFileIntoArray的形参int A[](本质是int*)和int size都是局部变量,函数内对A执行malloc赋值、对size的累加操作都只作用于函数内部的副本,不会修改main函数里的array和size变量。main中后续操作的array是未初始化的野指针,free野指针直接触发munmap_chunk(): invalid pointer错误。 - size初始值未初始化:
main中定义的size没有赋初始值,ReadFileIntoArray中直接基于传入的size执行累加,得到的行数本身就是错误值。 - 文件资源未释放:
ReadFileIntoArray中打开的文件指针fp没有执行fclose,存在资源泄漏。 - 输出逻辑隐患:如果没有传入第二个参数(运行次数),
argv[2]为NULL,最终平均耗时输出时直接用%s打印argv[2]会触发段错误。
修复方案
- 修改
ReadFileIntoArray的参数为二级指针和int指针,支持回传修改结果:
// 函数声明修改为 void ReadFileIntoArray(int argc, char *argv[], int **A, int *size)
- 调整
ReadFileIntoArray内部逻辑,size从0开始计数,操作数组时解引用二级指针:
void ReadFileIntoArray(int argc, char *argv[], int **A, int *size) { char line[200]; int j=0; *size = 0; // 初始化size为0,不依赖外部传入值 if(argv[1]==NULL) { printf("File must be provided on command line...exiting\n"); exit(0); } FILE *fp = fopen(argv[1],"r"); if(fp==NULL) { printf("Exiting: no such file in directory\n"); exit(0); } while(fgets(line,200,fp)!=NULL) { (*size)++; } fseek(fp,0,SEEK_SET); // 推荐用标准宏SEEK_SET代替魔术数0 *A = malloc(sizeof(int)*(*size)); while(j<*size && fgets(line,200,fp)!=NULL ) { (*A)[j] = atoi(line); printf("%d\n",(*A)[j]); j++; } printf("%d",*size); PrintArray(*A,*size); fclose(fp); // 关闭文件 }
- 修改
main中ReadFileIntoArray的调用方式,传入变量地址:
// 初始化size避免未定义行为 int i,control,count=0,size=0; int *array; // 调用修改为 ReadFileIntoArray(argc, argv, &array, &size);
- 修复平均耗时输出的逻辑隐患:
// 把最后平均耗时输出修改为 printf("\nThe average run time for %d runs is %d\n", control, count/control);
修复后即可正常完成排序和耗时统计,不会出现内存错误。
内容的提问来源于stack exchange,提问作者demo
相关产品推荐
相关产品推荐

