c: нарушение доступа к месту записи с использованием динамического массива - PullRequest
0 голосов
/ 22 мая 2018

В настоящее время я работаю над проектом, который использует 2D-массивы.У меня есть функция, которая создает двумерный массив целых чисел, и другие, которые находят кратчайший путь и т. Д., И все они отлично работают.

Однако у меня возникают проблемы с другой частью, где я получаю 'Ошибка доступа Access 'при попытке инициализировать эти массивы:

    // |V|x|V| arrays
int** fwdistance = malloc(vertexCount*vertexCount*(sizeof(int)));
int** fwnext = malloc(vertexCount*vertexCount*(sizeof(int)));

for (int i = 0; i < vertexCount; i++) {
    for (int j = 0; j < vertexCount; j++) {
        fwdistance[i][j] = INT_MAX; // Distances = infinity
        fwnext[i][j] = -1;          // Next nodes are unknown
    }
}

Ошибка при попытке инициализировать fwdistance [0] [0].Как я уже упоминал, другие массивы инициализируются таким же образом, и они отлично работают:

// Initialises arrays for Dijkstra's Shortest Path algorithm
int *distance = malloc(vertexCount*(sizeof(int)));
int *previous = malloc(vertexCount*(sizeof(int)));

Честно говоря, понятия не имею!

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Если вы хотите создать двумерный массив, вам придется выделять каждую строку (или столбец) отдельно.

 int fwdistance[][] = malloc(vertexCount*sizeof(int*));
 for(i=0;i<vertexCount;++i) {
     fwdistance[i] = malloc(vertexCount*sizeof(int));
 }
 ...
 fwdistance[i][j] = -1;

В качестве альтернативы вы можете эмулировать 2-мерный прямоугольный массив путем вычисления смещения.

 int fwdistance[] = alloc(vertexCount*vertexCount*sizeof(int));
 ...
 fwdistance[i*vertexCount+j] = -1;
0 голосов
/ 22 мая 2018

Вы выделяете простой массив int с, но обращаетесь к нему, как если бы это был зубчатый массив int указателей.Это вызывает неопределенное поведение, которое в конечном итоге приводит к ошибке сегментации.

Существует два решения этой проблемы:

  • Сделать fwdistance int* вместо int** иполучить доступ к его элементам либо с помощью fwdistance[i*vertexCount+j] или fwdistance[j*vertexCount+i], в зависимости от выбранного вами порядка, либо с помощью
  • сделать fwdistance указателем на массив, т. е. int (*fwdistance)[vertexCount] = malloc ....Такой подход позволит вам сохранить матричную индексацию, т.е. fwdistance[i][j].
...