Программа на си после компиляции выдаёт сообщение: Ошибка сегментирования (стек памяти сброшен на диск). В чём может быть проблема?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Выделение пямяти
void create_matrix(int n, int m)
{
printf("Creating matrix %dx%d\n", n, m);
int **arr;
arr = (int **)calloc(n, sizeof(*arr)); //arr теперь указывает на массив указателей на int
//выделяем память для каждой строки массива
for(int i = 0; i < n; ++i)
arr[i] = (int*)calloc(m, sizeof(*arr[i]));
}
//Заполнение матрицы
void rand_matrix(int **arr,int n,int m)
{
printf("Func rand working!\n");
for (int i = 0 ; i < n; i++)
{
for (int j = 0; j < m; j++)
{
arr[i][j] = rand()%10;
printf("%4d", arr[i][j]);
}
}
}
//Вывод матрицы
void print_matrix(int **arr, int n, int m)
{
printf("Func_print_working:\n");
for (int i=0 ; i<n; i++)
{
for (int j=0; j<m; j++)
{
printf("%4d",arr[i][j]);
}
printf("\n");
}
}
void free_matrix(int **arr, int n)
{
for(int i = 0; i < n; ++i)
free(arr);
}
int main()
{
int n, m, i ,j, **arr;
printf("Enter the hight of matrix:");
scanf("%d", &n);
printf("Enter the length of matrix:");
scanf("%d", &m);
create_matrix(n, m);
rand_matrix(arr, n, m);
print_matrix(arr, n, m);
free_matrix(arr, n);
getchar(); getchar();
return 0;
}
Ответы (2 шт):
Попробуйте в строке arr[i] = (int*)calloc(m, sizeof(*arr[i])); заменить sizeof(*arr[i]) на sizeof(int).
Вероятнее всего, это сработает. Дело в том что вы в данной строке указали sizeof(*arr[i]), т.е. вы обратились к элементу в массиве, которого еще нет, так как вы только сейчас собираетесь выделить для него память, из-за этого и вылезает ошибка сегментации.
В функции create_matrix() Вы объявляете указатель int **arr; как локальную переменную. Его область видимости - только эта функция. И еще один **arr Вы объявляете в функции main(). Он так и остается не инициализированным, а Вы пытаетесь именно в него что-то записать. И программа совершенно справедливо в данных обстоятельствах падает. Для решения проблемы, Вы могли бы вернуть (конечно же, Вы должны будете модифицировать функцию для этого) адрес созданного массива из Вашей функции, объявив ее типа:
int** create_matrix(int n, int m);
а далее в функции main():
arr = create_matrix(n, m);
Другим способом решить проблему была бы передача указателя на Ваш будущий массив как параметр в функцию, но что-то мне подсказывает, что Вам этот способ будет сложнее (и страшнее).