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

标签 c arrays malloc access-violation

我目前正在开发一个使用二维数组的项目。 我有一个函数可以生成一个二维整数数组,还有其他函数可以找到最短路径等,它们都可以完美地工作。

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

    // |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]

关于c:使用动态数组访问冲突写入位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50459275/

相关文章:

c - 保护函数声明无法编译

javascript - 如何在不丢失索引的情况下过滤数组?

c - 分配后访问结构体成员

c++ - 在函数返回后释放动态分配的结构数组。

c++ - 为什么我的代码块上没有显示输出?

c - 指针数组中出现警告 "initialization from incompatible pointer type"

c - 优化C中的这个Remove()方法

c - 抽象结构体数组

c++ - 有没有什么算法可以将简单的 Haxe 代码转换为 C/C++ 代码文件?

java - 创建功能接口(interface)的空数组