【问题标题】:c: Access violation writing location using dynamic arrayc:使用动态数组访问冲突写入位置
【发布时间】:2018-05-22 03:18:51
【问题描述】:

我目前正在做一个使用二维数组的项目。 我有一个函数可以制作一个二维整数数组,还有其他可以找到最短路径等的函数,它们都可以正常工作。

但是,我遇到了另一部分的问题,在尝试初始化这些数组时出现“访问冲突错误”:

    // |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)));

我真的不知道!

【问题讨论】:

  • 你不应该使用fwdistance[i*vertexCount+j]你分配的数组仍然是1d
  • 你不能用一个 malloc 调用来分配一个二维数组。而且您分配中的类型对于一维分配也是错误的。

标签: c arrays malloc access-violation


【解决方案1】:

您分配了一个由ints 组成的普通数组,但您访问它时就好像它是一个由int 指针组成的锯齿状数组一样。这会导致未定义的行为,最终导致分段错误。

这个问题有两种解决方案:

  • fwdistance 设为int* 而不是int**,并使用fwdistance[i*vertexCount+j]fwdistance[j*vertexCount+i] 访问其元素,具体取决于您选择的顺序,或者
  • 使fwdistance 成为指向数组的指针,即int (*fwdistance)[vertexCount] = malloc ...。这种方法可以让您保持矩阵索引,即fwdistance[i][j]

【讨论】:

    【解决方案2】:

    如果你想创建一个二维数组,你必须分别分配每一行(或每一列)。

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

    或者,您可以通过计算偏移量来模拟二维矩形数组。

     int fwdistance[] = alloc(vertexCount*vertexCount*sizeof(int));
     ...
     fwdistance[i*vertexCount+j] = -1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多