首页 > 解决方案 > 在C中创建动态二维数组

问题描述

我想编写一个计算矩阵乘法的程序。

但是,似乎内存分配存在问题。对于 m <= 2 和 n <= 2,代码工作得很好,但是在盯着它看了一个小时后,我仍然无法弄清楚为什么程序会炸毁比这更大的 vor 值(SegFault 和 free_matrix() 抱怨关于尝试释放未分配的内存)。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef double *Vector;
typedef Vector *Matrix;

//Initializes a matrix of given size
Matrix mat_alloc(int m, int n){
    Matrix mat = NULL;
    mat = (Matrix)malloc(sizeof(m * sizeof(Vector)));
    if(mat == NULL){
        printf("Error: Not Enough Memory!\n");
        return NULL;
    }
    for(int i = 0; i < m; i++){
        mat[i] = (Vector)malloc(n * sizeof(double));
        if(mat[i] == NULL){
            printf("Error: Not Enough Memory!\n");
            return NULL;
        }
    }
    return mat;
}

Matrix mat_mult(Matrix A, Matrix B, int m, int n, int k){
    Matrix C = mat_alloc(m, k);
    for(int i = 0; i < m; i++){
        for(int j = 0; j < k; j++){
            C[i][j] = 0;
            for(int l = 0; l < n; l++){
                C[i][j] += A[i][l] * B[l][j];
            }
        }
    }

    return C;
}

void print_matrix(Matrix mat, int m, int n){
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            printf("%.2lf ", mat[i][j]);
        }
        printf("\n");
    }
}

void read_matrix(Matrix mat, int m, int n){
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            printf("(%d,%d) = ", i+1, j+1);
            scanf("%lf", &mat[i][j]);
        }
    }
}

void free_matrix(Matrix mat, int m){
    for(int i = 0; i < m; i++){
        free(mat[i]);
    }
    free(mat);
}

int main(int argc, char *argv[]){

    int m = 0;
    int n = 0;
    int k = 0;

    printf("Dimensions of A (m x n):\n");
    printf("m = ");
    scanf("%d", &m);
    printf("n = ");
    scanf("%d", &n);

    printf("Dimensions of B (n = %d x k):\n", n);
    printf("k = ");
    scanf("%d", &k);

    printf("Your input: m = %d, n = %d, k = %d\n", m, n, k);

    Matrix A = NULL;
    Matrix B = NULL;
    Matrix C = NULL;

    A = mat_alloc(m, n);
    B = mat_alloc(n, k);

    printf("Enter Values for A!\n");
    read_matrix(A, m, n);

    printf("Enter Values for B!\n");
    read_matrix(B, n, k);

    printf("A = \n");
    print_matrix(A, m, n);

    printf("\nB = \n");
    print_matrix(B, n, k);

    C = mat_mult(A, B, n, m, k);
    printf("\nC = \n");
    print_matrix(C, m, k);

    free_matrix(A, m);
    free_matrix(B, n);
    free_matrix(C, m);

    return 0;
}

先感谢您。

标签: cmatrixsegmentation-faultmalloc

解决方案


这里:

mat = (Matrix)malloc(sizeof(m * sizeof(Vector)));

应该

mat = (Matrix)malloc(m * sizeof(Vector));

或者更好

mat = malloc(sizeof *mat * m);

您的 asizeof太多了,因此您没有获得所需的指针数组大小,而是获得了一个常量( a 的大小size_t)。


推荐阅读