创建图时内存写入异常

独立方块

我正在开发一个处理图形的 C++ 程序。

我将图存储为节点的邻接列表,并且我在 .h 文件中声明了相应的结构,如下所示:

typedef struct Node {
    int val;
    struct Node * next;
} node;

typedef struct Graph {
    int v;
    node ** arr;
    node ** arr2; // reserved list for a reversed directed graph.
} graph;

我有一个初始化图形的函数,定义如下:

graph * creategraph(int v) { // v == number of vertices
    int i;
    graph * temp = (graph*)malloc(sizeof(graph));
    temp->v = v;
    for(i = 0; i < v; i++) {
        temp->arr = (node**)malloc(v*sizeof(node*));
    }
    for(i = 0; i < v; i++) {
        temp->arr[i] = NULL;
    }
    return temp;
}

我调用如下所示的函数来创建一个顶点数等于的图num_vertices

graph * g = creategraph (num_vertices);

随着num_vertices等于200000,在“访问冲突写入位置”异常是引发graph * createGraph上的第一次执行temp->arr[i] = NULL;

谁能告诉我这里有什么问题?谢谢你。

这里有一个大问题:

for(i = 0; i < v; i++) {
    temp->arr = (node**)malloc(v*sizeof(node*));
}

这为v节点分配空间,但您只有一个指向您分配的最后一个的指针。这是内存泄漏。你需要做的是:

temp->arr = (node**)malloc(v*sizeof(*temp->arr));
for(i = 0; i < v; i++) {
    temp->arr[v] = (node*)malloc(sizeof(*temp->arr[0]));
}

解释:

arr是指向 的指针Node首先我们需要为v指针分配内存然后,我们需要为分配内存Node每个这些指针。

另请注意,在 C 中强制转换 malloc 是不必要的(因此是不好的)。如果您正在编写 C++ 代码,则这是必要的,因此如果您编写“C”但使用的是 C++ 编译器,则需要强制转换结果。

边注:

编写int arr = malloc(n*sizeof(*arr))orint arr = malloc(n*sizeof(arr[0]))代替int arr = malloc(n*sizeof(int)). 原因是如果您将来决定要使用long而不是int您将不必在多个地方更改它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章