Для ошибок памяти, подобных этой, хорошей идеей является использование инструмента проверки памяти (вы можете попробовать valgrind memcheck). Теперь посмотрим, что не так с вашим кодом :)
Массив
Вы должны принять во внимание, что int[m][n]
- это не то же самое, что int**
. Используя компилятор gcc, вы получите предупреждение об этом. (Конечно, вы можете изменить свой код, чтобы использовать int**
)
Для цикла
Точно так же, как VoteyDisciple сказал, что вы должны использовать
for (int j=0;j<m;j++)
вместо
for(int j=0;i<m;j++)
Неинициализированные значения
Создание массива и его не инициализация могут привести к ошибкам памяти в дальнейшем (при условии, что мы говорим о C - некоторые языки инициализируют массивы с 0). Здесь вы создаете матрицы x,y,z
, но в итоге вы используете ту часть, которой вы присваиваете значения. Остальные остаются неинициализированными, и вы можете столкнуться с ошибками, если попытаетесь получить к ним доступ позже.
исключение scanf
Действительно, вы получаете исключение из-за вышеизложенного, так как вы получаете ошибки при попытке доступа к адресу памяти в &matriz1[i][j]
Исправление всего этого
Вот как я бы написал ваш код, чтобы он работал:
#include <stdio.h>
#include <stdlib.h>
#define num 10
void ler_matriz(int **matriz1, int n, int m);
void mostrar_matriz(int** matriz1, int n, int m);
//int num_min_matriz(int matriz1[][], int n, int m);
//void teste_simetria(int matriz1[][], int n, int m);
//void transposta_matriz(int matriz1[][], int n, int m);
//void soma_matriz(int matriz1[][], int matriz2[][], int matriz3[][], int n, int m);
int main()
{
//int x[num][num], y[num][num], z[num][num], numL, numC;
int i,j,**x,**y,**z,numL,numC; //Proper declarations
x=malloc(num*sizeof(int*));
y=malloc(num*sizeof(int*));
z=malloc(num*sizeof(int*));
for(i=0;i<num;i++) {
x[i]=malloc(num*sizeof(int));
y[i]=malloc(num*sizeof(int));
z[i]=malloc(num*sizeof(int));
}
//Initialization
for(i=0;i<num;i++) {
for(j=0;j<num;j++) {
x[i][j]=y[i][j]=z[i][j]=0;
}
}
printf("Introduza o número de linhas e colunas para a matriz:\n");
scanf(" %d%d", &numL, &numC);
printf("\n\nIntroduza os valores para a matriz 1: ");
ler_matriz(x, numL, numC);
mostrar_matriz(x, numL, numC);
for(i=0;i<num;i++) {
free(x[i]);
free(y[i]);
free(z[i]);
}
free(x);
free(y);
free(z);
return 0;
}
void ler_matriz(int **matriz1, int n, int m)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("\nx[%d][%d]: ", i + 1, j + 1);
scanf(" %d", &matriz1[i][j]);
}
}
}
void mostrar_matriz(int **matriz1, int n, int m)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%d ", matriz1[i][j]);
}
putchar('\n');
}
}