Ошибка сегментации при выводе графа - C (СИ)
Формулировка задачи:
Вечер добрый, г-да программисты! Ниже приведены фрагменты из программы, описывающей и выводящей граф.
В начале программы динамически выделяю память под две числовые матрицы и один массив указателей на структуры:Далее, необходимо перераспределить память, что я осуществил таким образом:
Функция ClearGraph призвана почистить структуру и обнулить массивы MI и MS, но дает ошибку
в 4 строке на операторе присваивания MI[i][j] = 0. Собственно, вопрос: где я дурак?
MS = (int**) malloc(sizeof(int*)*N);
MI = (int**) malloc(sizeof(int*)*e);
hole = (lnk*) malloc(sizeof(lnk)*N);
for (i=0; i<N; i++){
MS[i] = (int*) calloc(N, sizeof(int));
hole[i]=NULL;
}
for (i=0; i<e; i++)
MI[i] = (int*) calloc(N, sizeof(int));MS = (int**) realloc(MS, sizeof(int*)*N);
MI = (int**) realloc(MI, sizeof(int*)*e);
hole = (lnk*) realloc(hole, sizeof(lnk)*N);
for (i=0; i<N; i++){
MS[i] = (int*) realloc(MS[i], N*sizeof(int));
}
for (i=0; i<e; i++)
MI[i] = (int*) realloc(MI[i], N*sizeof(int));
ClearGraph(hole, MI, MS, N, e);//отрывок из функции ClearGraph
for (i=0; i<e; i++)
for (j=0; j<N; j++)
MI[i][j] = 0;Решение задачи: «Ошибка сегментации при выводе графа»
textual
Листинг программы
MI = (int**) realloc(MI, sizeof(int*)*e);
Объяснение кода листинга программы
В данном коде выполняется следующая последовательность действий:
- Переменная
MIобъявлена какint**, что означает, что она является двумерным массивом целых чисел. - Используется оператор
reallocдля изменения размера памяти, выделенной под переменнуюMI. В данном случае, размер памяти увеличивается на величину нового размера, рассчитанного какsizeof(int*)*e, гдеe- это некоторый индекс. - Результатом выполнения оператора
reallocявляется новое значение переменнойMI, которое будет указывать на новый блок памяти с увеличенным размером.