[英]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
指针数组进行访问。 这将导致不确定的行为,最终导致分割错误。
有两种方法可以解决此问题:
fwdistance
为int*
而不是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.