我正在开发一个处理图形的 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] 删除。
我来说两句