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

C语言中给矩阵添加新行时出现corrupted size vs. prev_size错误求助

列主序矩阵添加行时"corrupted size vs. prev_size"错误排查

问题根源分析

你的代码存在三个核心问题,共同触发了内存错误:

  1. 函数调用参数错误
    main函数中调用add_row时传入的第二个参数是N+1,但该参数应为当前矩阵的行数N。add_row的设计逻辑是接收当前行数m,再扩展为m+1行,传入错误的行数会导致内存分配和索引计算全部失效。

  2. 指针传递未更新外部变量
    add_row中mat是按值传递的指针,realloc返回的新内存地址仅在函数内部有效,main函数中的rand_mat仍指向原内存块。若realloc移动了内存,原块会被释放,rand_mat变为野指针,直接引发内存 corruption 错误。

  3. 列主序数据未迁移+索引逻辑缺失
    列主序存储下,矩阵元素索引公式为行索引 + 总行数 × 列索引。当行数从m变为m+1时:

  • 原有元素的存储步长从m变为m+1,所有元素位置需要调整,你的代码未做迁移,导致数据混乱;
  • 新行元素的索引公式虽正确,但因原有数据未迁移,写入位置可能覆盖有效数据或越界。

修正后的代码

修改add_row函数(返回新指针版本)

// Add a new row of size n, "v" to the end of matrix "mat". New size of the matrix becomes (m+1) x n. "v" must be of size n. 
double* add_row(double *mat, int m, int n, double *v){
    // 重新分配内存,新大小为(m+1)*n个double
    double *new_mat = (double*)realloc(mat, (m+1) * n * sizeof(double));
    if(new_mat == NULL){
        perror("realloc failed");
        return mat; // 返回原指针避免内存泄漏
    }

    // 从后往前迁移原有元素,防止覆盖
    for(int j = n-1; j >= 0; --j){
        for(int i = m-1; i >= 0; --i){
            new_mat[i + (m+1)*j] = new_mat[i + m*j];
        }
    }

    // 写入新行元素
    for(int j=0; j<n; ++j){
        new_mat[m + (m+1)*j] = v[j];
    }

    return new_mat;
}

修改main函数调用逻辑

int main(){
   int N = 16;
   double *rand_mat = (double*) malloc(N*N*sizeof(double));
   generate_rand_matrix(rand_mat, N, N);
   
   double *new_row = (double*) malloc(N*sizeof(double));
   generate_rand_vector(new_row, N);
   
   // 接收add_row返回的新指针,更新原有指针
   double *temp_mat = add_row(rand_mat, N, N, new_row);
   if(temp_mat != NULL){
       rand_mat = temp_mat;
       // 验证结果
       print_matrix(rand_mat, N+1, N);
   }

   // 释放内存
   free(rand_mat);
   free(new_row);
   return 0;
}

额外优化:清理冗余代码

generate_rand_vector中的max和min变量未使用,可直接删除:

// Generate a random vector of size row
void generate_rand_vector(double *a, int row){
    for(int i=0; i<row; ++i){
        a[i] = (double)rand() / (double)RAND_MAX;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:34:57