Произошло исключение. Segmentation fault
При написании кода в си столкнулся с ошибкой "Произошло исключение.
Segmentation fault" на строчке m3[i][j] += m1[n][k] * m2[k][l];. Сначала думал это из-за того что массив m3 не инициализировал, но я попытался инициализировать его нулями, но ошибка не пропала.
Вот код:
#include <stdio.h>
#include <stdlib.h>
void mul_square_matrix(int **m1, int **m2, int **m3, int n, int m, int l)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < l; j++)
{
m3[i][j] = 0;
for(int k = 0; k < m; k++)
m3[i][j] += m1[n][k] * m2[k][l];
}
for (int i = 0; i <n; i++)
{
for (int j; j< l; j++)
{
printf("%d\t", m3[i][j]);
}
printf("\n");
}
}
int main()
{
printf("Input n: ");
int n;
scanf("%d", &n);
printf("Input m: ");
int m;
scanf("%d", &m);
printf("Input l: ");
int l;
scanf("%d", &l);
int m1[n][m], m2[m][l], m3[n][l];
int **p_m1, **p_m2, **p_m3;
p_m1 = calloc(n, sizeof(int*));
for (int i=0; i<n; i++)
{
p_m1[i] = calloc(m, sizeof(int));
}
printf("Input matrix m1: \n");
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("Input [%d][%d] element of matrix m1:", i, j);
scanf("%d", &m1[i][j]);
}
}
p_m2 = calloc(m, sizeof(int*));
for (int i=0; i<m; i++)
{
p_m2[i] = calloc(l, sizeof(int));
}
printf("Input matrix m2: \n");
for(int i = 0; i < m; i++)
{
for(int j = 0; j < l; j++)
{
printf("Input [%d][%d] element of matrix m2:", i, j);
scanf("%d", &m1[i][j]);
}
printf("\n");
}
p_m3 = calloc(n, sizeof(int*));
for (int i=0; i<n; i++)
{
p_m3[i] = calloc(l, sizeof(int));
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < l; j++)
{
m3[i][j] = 0;
}
printf("\n");
}
mul_square_matrix(p_m1, p_m2, p_m3, n, m, l);
system("pause");
return 0;
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Потому что умножать матрицы нужно правильно:
for(int i = 0; i < n; i++)
for(int j = 0; j < l; j++)
{
m3[i][j] = 0;
for(int k = 0; k < m; k++)
m3[i][j] += m1[i][k] * m2[k][j];
}
Вы мало того что множили неверно, так еще и элементы за пределами матрицы...
Автор решения: Sorry_my_code_is_dumb
→ Ссылка
Уже сам решил проблему. Вот код:
#include <stdio.h>
#include <stdlib.h>
void mul_square_matrix(int **m1, int **m2, int **m3, int n,int m, int l)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < l; j++)
{
m3[i][j] = 0;
for (int v = 0; v < m; v++)
{
m3[i][j] += m1[i][v] * m2[v][j];
}
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < l; j++)
{
printf("%d\t" , m3[i][j]);
}
printf("\n");
}
}
int main()
{
int n, m, l;
int **m1;
int **m2;
int **m3;
printf("Input n:");
scanf("%d", &n);
printf("Input m: ");
scanf("%d", &m);
printf("Input l: ");
scanf("%d", &l);
m1 =(int **)calloc(n, sizeof(int*)); // создаю одномерный массив указателей размером n
for(int i = 0; i < n; i++)
m1[i] = (int *)calloc(m, sizeof(int));// в каждую ячейку одномерного массива помещаю массив указателей размером m
m2 = (int **)calloc(m, sizeof(int*));
for(int i = 0;i < m; i++)
m2[i] = (int*)calloc(l, sizeof(int));
m3 =(int **)calloc(n, sizeof(int*)); // создаю одномерный массив указателей размером n
for(int i = 0; i < n; i++)
m3[i] = (int *)calloc(l, sizeof(int));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
m1[i][j]= rand()%200 - 100;
}
}
for(int i = 0; i < m; i++)
{
for(int j = 0; j < l; j++)
{
m2[i][j] = rand()%200 - 100;
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < l; j++)
{
m3[i][j] = 0;
}
printf("\n");
}
printf("Generated matrix of m1: \n");
printf("-----------------------\n");
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("%d \t", m1[i][j]);
}
printf("\n");
}
printf("-----------------------\n");
printf("Generated matrix of m2: \n");
printf("-----------------------\n");
for(int i = 0; i < m; i++)
{
for(int j = 0; j < l; j++)
{
printf("%d \t", m2[i][j]);
}
printf("\n");
}
printf("Result (m3) :\n");
printf("-----------------------\n");
mul_square_matrix(m1,m2,m3, n,m,l);
printf("-----------------------\n");
for(int i = 0; i < n;i++)
free(m1[i]);
free(m1);
for(int i = 0; i < m;i++)
free(m2[i]);
free(m2);
for(int i = 0; i < n;i++)
free(m3[i]);
free(m3);
system("pause");
return 0;
}