Программа на си после компиляции выдаёт сообщение: Ошибка сегментирования (стек памяти сброшен на диск). В чём может быть проблема?

#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 шт):

Автор решения: ksharlen

Попробуйте в строке arr[i] = (int*)calloc(m, sizeof(*arr[i])); заменить sizeof(*arr[i]) на sizeof(int). Вероятнее всего, это сработает. Дело в том что вы в данной строке указали sizeof(*arr[i]), т.е. вы обратились к элементу в массиве, которого еще нет, так как вы только сейчас собираетесь выделить для него память, из-за этого и вылезает ошибка сегментации.

→ Ссылка
Автор решения: Vladimir

В функции create_matrix() Вы объявляете указатель int **arr; как локальную переменную. Его область видимости - только эта функция. И еще один **arr Вы объявляете в функции main(). Он так и остается не инициализированным, а Вы пытаетесь именно в него что-то записать. И программа совершенно справедливо в данных обстоятельствах падает. Для решения проблемы, Вы могли бы вернуть (конечно же, Вы должны будете модифицировать функцию для этого) адрес созданного массива из Вашей функции, объявив ее типа:

int** create_matrix(int n, int m);

а далее в функции main():

arr = create_matrix(n, m);

Другим способом решить проблему была бы передача указателя на Ваш будущий массив как параметр в функцию, но что-то мне подсказывает, что Вам этот способ будет сложнее (и страшнее).

→ Ссылка