我目前正在开发一个使用2D数组的项目。 我有一个函数,它可以生成一个整数的二维数组,以及一些找到最短路径的函数,它们都可以完美地工作。
但是,我遇到了另一部分问题,我收到了“访问违规错误”的问题。尝试初始化这些数组时:
// |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)));
老实说,我不知道!
答案 0 :(得分:3)
您分配了int
的普通数组,但是您可以像访问int
指针的锯齿状数组一样访问它。这会导致未定义的行为,最终导致分段错误。
这个问题有两种解决方案:
fwdistance
改为int*
而不是int**
,并使用fwdistance[i*vertexCount+j]
或fwdistance[j*vertexCount+i]
访问其元素,具体取决于您选择的顺序,或< / LI>
fwdistance
成为指向数组的指针,即int (*fwdistance)[vertexCount] = malloc ...
。这种方法可以让你保持矩阵索引,即fwdistance[i][j]
。答案 1 :(得分:2)
如果你想创建一个2D数组,你必须分别分配每一行(或列)。
int fwdistance[][] = malloc(vertexCount*sizeof(int*));
for(i=0;i<vertexCount;++i) {
fwdistance[i] = malloc(vertexCount*sizeof(int));
}
...
fwdistance[i][j] = -1;
或者,您可以通过计算偏移量来模拟2d矩形阵列。
int fwdistance[] = alloc(vertexCount*vertexCount*sizeof(int));
...
fwdistance[i*vertexCount+j] = -1;