You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]会触发段错误。
修复方案
  1. 修改ReadFileIntoArray的参数为二级指针和int指针,支持回传修改结果:
// 函数声明修改为
void ReadFileIntoArray(int argc, char *argv[], int **A, int *size)
  1. 调整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); // 关闭文件
}
  1. 修改main中ReadFileIntoArray的调用方式,传入变量地址:
// 初始化size避免未定义行为
int i,control,count=0,size=0;
int *array;

// 调用修改为
ReadFileIntoArray(argc, argv, &array, &size);
  1. 修复平均耗时输出的逻辑隐患:
// 把最后平均耗时输出修改为
printf("\nThe average run time for %d runs is %d\n", control, count/control);

修复后即可正常完成排序和耗时统计,不会出现内存错误。

内容的提问来源于stack exchange,提问作者demo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 16:00:04