C语言中给矩阵添加新行时出现corrupted size vs. prev_size错误求助
列主序矩阵添加行时"corrupted size vs. prev_size"错误排查
问题根源分析
你的代码存在三个核心问题,共同触发了内存错误:
函数调用参数错误
main函数中调用add_row时传入的第二个参数是N+1,但该参数应为当前矩阵的行数N。add_row的设计逻辑是接收当前行数m,再扩展为m+1行,传入错误的行数会导致内存分配和索引计算全部失效。指针传递未更新外部变量
add_row中mat是按值传递的指针,realloc返回的新内存地址仅在函数内部有效,main函数中的rand_mat仍指向原内存块。若realloc移动了内存,原块会被释放,rand_mat变为野指针,直接引发内存 corruption 错误。列主序数据未迁移+索引逻辑缺失
列主序存储下,矩阵元素索引公式为行索引 + 总行数 × 列索引。当行数从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
相关产品推荐
相关产品推荐

