Вы объявили graph.matrix
как vernode **
.Вы выделили память для конкретного экземпляра g->matrix
, по-видимому, успешно.*g->matrix
обозначает vernode *
, появляющийся в начале этого пространства (и учитывая, что вы намереваетесь использовать пространство в качестве массива, было бы более обычным обозначать этот элемент как g->matrix[0]
, что эквивалентно). Но вы никогда не присваивали значение этому объекту .Его значение не определено, и вы вызываете неопределенное поведение, пытаясь получить к нему доступ.
В целом, похоже, что вы объединили аспекты нескольких различных подходов.Это распределение ...
g->matrix=malloc(sizeof(int*)*g->verNum*g->verNum);
... во-первых, неправильно, потому что небезопасно предполагать, что sizeof(int *)
совпадает с sizeof(vernode *)
, а последнее - то, что вам действительно нужноучитывая заявленный тип g->matrix
.Кажется, что это неправильно и потому, что вы выделяете гораздо больше места, чем я ожидал бы для подхода, основанного на двойном указателе.Обычно выделяется один указатель для каждой строки, а не один на элемент, а затем отдельно выделяется память для элементов каждой строки.После этого будет поддерживаться двойное индексирование, как если бы у вас был истинный 2D массив: g->matrix[i][j].adj = 0;
.
. Вы можете использовать только одно выделение для всех вершин,но тогда вам понадобится одиночный указатель (vernode *matrix;
), и вам нужно будет использовать различные вычисления индекса: g->matrix[i * g->verNum + j].adj = 0;
.