我正在尝试修复一个方法,该方法采用一个函数,该函数采用链表的根和图中的顶点数,并根据边结构的第一个顶点将链表组织成链表的数组例如,在节点Edge具有firVertex = 1,sndVertex = 2和weight = 2的结构中,它将被排序到数组的第一个元素中。另一个节点具有另一个firVertex = 1的节点将被附加到前一个节点等等。我已经修复了很多次但它在运行时仍然会出现分段错误。
感谢您的提示,非常感谢。不幸的是,我不能保留代码,因为它的学校作业。
答案 0 :(得分:1)
Edge* arrayList [numberVertices]
在堆栈上分配,而不是堆,并且在函数末尾超出范围。
答案 1 :(得分:0)
变量arrayList
如果声明为本地数组。因此在函数结束时被销毁,不应该返回。您应该使用new:
Edge** arrayList = new Edge *[numberVertices];
顺便说一句,你的编译器(如果配置正确)应警告你。以下是g++ -Wall
的作用:
bli.cpp: In function ‘Edge** _()’:
bli.cpp:5:9: warning: address of local variable ‘arrayList’ returned [-Wreturn-local-addr]
Edge* arrayList[500];
这对我来说也很可疑:
for (int i=0; i<numberVertices; i++) { //initializes the array to NULL
arrayList[numberVertices]=NULL;
}
你可能意味着:
arrayList[i]=NULL;
答案 2 :(得分:0)
那你为什么不尝试StdLib?我个人建议避免使用指针。 你可以使用引用(&amp;)代替。
如果您遇到分段错误,您是否能够调试,直到找到失败的行?
并且您基本上会出现分段错误,因为您调用Edge构造函数为NULL作为根,然后尝试引用root-&gt; next,但root为null ...