Существует несколько способов выделить память для двумерного массива на языке C. С учетом вашего кода вы можете выполнить одно из следующих действий:
Выделение памяти для каждой строки отдельно:
Начните с выделения памяти для массива указателей, по одному для каждой строки, и выделения памяти для массива целых чисел, используя каждый из этих указателей.
// Pointer array of rows
G->adj = (int **)malloc(G->V * sizeof(int *));
// Allocate memory for each row
for (int i = 0; i < G->V; i++)
G->adj[i] = (int *)malloc(G->V * sizeof(int));
Выделение памяти сразуи переориентировать:
Начните с выделения памяти для массива указателей, по одному для каждой строки, и выделите достаточно памяти для хранения полной матрицы, используя первый указатель.Затем вы переориентируете каждый из указателей в массиве так, чтобы он указывал на каждую строку этого выделенного пространства.
// Pointer array of rows
G->adj = (int **)malloc(G->V * sizeof(int *));
// Allocate enough space for a matrix
G->adj[0] = (int *)malloc(G->V * G->V *sizeof(int));
// Use each pointer to point to a block G->V distance
// from the previous pointer
for(i = 0; i < G->V; i++)
G->adj[i] = (*G->adj + G->V * i);