c:使用动态数组访问冲突写入位置

时间:2018-05-22 03:18:51

标签: c arrays malloc access-violation

我目前正在开发一个使用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)));

老实说,我不知道!

2 个答案:

答案 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;