面临向 C 中的矩阵添加新行的问题。损坏的大小与 prev_size

问题描述 投票:0回答:1

我正在尝试从头开始开发一个用于各种矩阵运算的线性代数库。我在向矩阵添加新行时遇到问题。我使用列主公式存储矩阵,并使用 realloc 将新行添加到结束位置。准确地说,我们有一个 m x n 矩阵,在末尾添加新行后,我们将得到一个大小为 (m+1) xn 的矩阵。但我收到错误“大小与 prev_size 的损坏”。如果有人能帮助我解决这个问题,那就太好了。请找到下面的代码片段。谢谢。

// Generate a random matrix of size row x col
void generate_rand_matrix(double *a, int row, int col){
    for(int i=0; i<row; ++i){
        for(int j=0; j<col; ++j){
            a[i + row*j] = (double)rand() / (double)RAND_MAX;
        }
    }
}

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



// 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. 
void add_row(double *mat, int m, int n, double *v){
    mat = (double*)realloc(mat, (m+1) * n * sizeof(double));
    for(int j=0; j<n; ++j){
        mat[m + (m+1)*j] = v[j];
    }
}

// Print a matrix of size row x col
void print_matrix(double *a, int row, int col){
    for(int i=0; i<row; ++i){
        for(int j=0; j<col; ++j){
            printf("%lf\t", a[i + row*j]);
        }
        printf("\n");
    }
}

int main(){
   int N = 16;
   double *rand_mat = (double*) malloc(N*N*sizeof(double));
   generate_rand_matrix(rand_mat, N, N);
   
   // row
   double *new_row = (double*) malloc(N*sizeof(double));
   generate_rand_vector(new_row, N);
   add_row(rand_mat, N+1, N, new_row); // PROBLEM 

}

如果有人能帮助我解决这个问题,那就太好了。请找到下面的代码片段。谢谢。

arrays c dynamic heap-memory realloc
1个回答
0
投票

realloc
之后不保存指针。您需要发送一个指向您的指针的指针:

void add_row(double **mat, int m, int n, double *v) {
    double *np = realloc(*mat, (m + 1) * n * sizeof(double));
    if (np == NULL) return;
    for (int j = 0; j < n; ++j) {
        np[m + (m + 1) * j] = v[j];
    }
    *mat = np;
}

并这样称呼它:

add_row(&rand_mat, N + 1, N, new_row);
//      ^

或者重新分配后返回新指针。

© www.soinside.com 2019 - 2024. All rights reserved.