我目前正在开发一个使用二维数组的项目。 我有一个函数可以生成一个二维整数数组,还有其他函数可以找到最短路径等,它们都可以完美地工作。
但是,我在另一部分遇到了问题,在尝试初始化这些数组时遇到“访问冲突错误”:
// |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)));
老实说我不知道!
最佳答案
您分配了一个普通的int
数组,但是您可以像访问一个int
指针的交错数组一样访问它。这会导致未定义的行为,最终导致段错误。
此问题有两种解决方案:
- 将
fwdistance
设为int*
而不是int**
,并使用fwdistance[i*vertexCount+ 访问其元素j]
或fwdistance[j*vertexCount+i]
,具体取决于您选择的顺序,或者 - 使
fwdistance
成为指向数组的指针,即int (*fwdistance)[vertexCount] = malloc ...
。这种方法可以让您保留矩阵索引,即fwdistance[i][j]
。
关于c:使用动态数组访问冲突写入位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50459275/