繁体   English   中英

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

[英]c: Access violation writing location using dynamic array

我目前正在研究一个使用2D数组的项目。 我有一个函数,它可以使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)));

老实说,我不知道!

您分配了一个int的普通数组,但是您将其视为一个交错的int指针数组进行访问。 这将导致不确定的行为,最终导致分割错误。

有两种方法可以解决此问题:

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

如果要创建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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM