C语言中矩阵函数分段错误

roejwanj  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(88)

我实现了几个与数组和指针相关的矩阵函数,每次运行代码时都会出现分段错误。如果有人能修改我的代码并解释为什么会出现这种错误,那就太好了。
函数1应该创建一个动态分配的矩阵,其中包含相应的列和行。它还应该将元素初始化为0(我必须使用xmalloc,但不能使用xcalloc),并返回一个指向创建的矩阵的指针。函数2获取一个行 * 列的一维数组,并创建一个动态分配的矩阵。函数3应打印出一个矩阵。函数4应释放已创建的矩阵。
这是我的密码

struct Matrix {
    int rows; // number of rows
    int cols; // number of columns
    double** data; // a pointer to an array of n_rows pointers to rows; a row is an array of n_cols doubles 
};
typedef struct Matrix Matrix;

/**
Creates a zero-initialized matrix of rows and columns matrix.
@param[in] n_rows number of rows
@param[in] n_cols number of columns
@return a pointer to an array of n_rows pointers to rows; a row is an array of n_cols doubles 
*/
Matrix* make_matrix(int n_rows, int n_cols) {
    double **m = xmalloc(n_rows * sizeof(double));
    for(int row = 0; row < n_cols; row++){
        m[row] = xmalloc(n_cols * sizeof(double));
    }
    Matrix matrixx = {n_cols, n_rows, m};
    Matrix *pointer;
    pointer = &matrixx;
    return pointer;
}

/**
Creates a zero-initialized matrix of rows and columns matrix.
@param[in] data an array of doubles, ordered row-wise
@param[in] n_rows number of rows
@param[in] n_cols number of columns
@return a pointer to an array of n_rows pointers to rows; a row is an array of n_cols doubles 
*/
Matrix* copy_matrix(double* data, int n_rows, int n_cols) {
    Matrix *pointer = make_matrix(n_rows,n_cols);
    int k = 0;
    double **Matrix = (double **)xmalloc(sizeof(double *) * n_rows);
    for(int i = 0; i < n_rows; i++){
        Matrix[i] = (double *)xmalloc(sizeof(double ) * n_cols);
    }

    do{
        for(int i = 0; i < n_rows; i++){
            for(int j = 0; j < n_cols; j++){
                Matrix[i][j] = data[k];
                k++;
            }
        }
    }while (k < sizeof(data));
    return pointer;
}

/**
@param[in] m the matrix to print
*/
void print_matrix(Matrix* m) {
    for(int row = 0; row < m->rows; row++){
        for(int column = 0; column < m->cols; column++){
            printf("%.f ", m->data[row][column]);
        }
        println();
    }
    println();
}

//@param[in] m the matrix to free

    void free_matrix(Matrix* m) {

   for (int i = 0; i < m->cols; i++)
        free(m->data[i]);

    free(m->data);
     free(m);
    }

我尝试在函数1、2和4中使用xmalloc分配内存,但不知何故,这不起作用,我得到了一个分段故障错误

z3yyvxxp

z3yyvxxp1#

在make_matrix函数的第一行中,您可能希望只使用一个星号,因为两个星号表示指向另一个指针,而我看不到另一个指针在哪里
尝试将其从以下内容更改为:

double **m = xmalloc(n_rows * sizeof(double));

改为:

double *m = xmalloc(n_rows * sizeof(double));

如果这不起作用,那么告诉我,我将再次查看代码,并尝试发现另一个错误

相关问题