Я хочу написать программу, которая рассчитывает умножение матриц.
Однако, похоже, что есть проблема, связанная с распределением памяти. Для 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;
}
Заранее спасибо.