Создание динамического c двумерного массива в C - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу написать программу, которая рассчитывает умножение матриц.

Однако, похоже, что есть проблема, связанная с распределением памяти. Для m <= 2 и n <= 2 код работает просто отлично, но, посмотрев на него в течение часа, я все еще не могу понять, почему программа взрывает значения vor, превышающие это (SegFault и free_matrix () жалуются о попытке освободить нераспределенную память). </p>

Вот мой код:

#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;
}

Заранее спасибо.

1 Ответ

4 голосов
/ 04 февраля 2020

Это здесь:

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

Должно быть

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

Или еще лучше

mat = malloc(sizeof *mat * m);

У вас слишком много sizeof, поэтому вместо Получив нужный размер массива указателей, вы получите константу (размер size_t).

...