【问题标题】:C++ array of linkedlist segmentation fault链表分段错误的 C++ 数组
【发布时间】:2014-01-31 20:35:11
【问题描述】:

我正在尝试修复一个方法,该方法采用一个函数,该函数采用链表的根和图中的顶点数,并根据边结构的第一个顶点将链表组织成链表数组,例如,在节点 Edge 的 firVertex = 1、sndVertex = 2 和 weight = 2 的结构中,它将被排序到数组的第一个元素中。另一个具有另一个 firVertex = 1 的节点 Edge 将附加到前一个节点上,等等。我已经修复了很多次,但它在运行时仍然出现分段错误。

感谢您的提示,非常感谢。不幸的是,我不能留下代码,因为它是学校作业。

【问题讨论】:

  • 您是否在调试器中单步执行了您的代码?

标签: c++ arrays pointers linked-list segmentation-fault


【解决方案1】:
Edge* arrayList [numberVertices]

在堆栈而不是堆上分配,并在函数结束时超出范围。

【讨论】:

    【解决方案2】:

    变量arrayList 如果声明为本地数组。因此 is 在函数结束时被销毁,不应返回。你应该用一个新的动态分配它:

    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;
    

    【讨论】:

      【解决方案3】:

      那你为什么不试试 StdLib 呢?我个人建议避免使用指针。 您可以改用引用 (&)。

      如果遇到分段错误,是否可以调试直到找到失败的行?

      你基本上会遇到分段错误,因为你调用Edge构造函数时以NULL为根,然后尝试引用root->next,但root为null...

      【讨论】:

      • 这两种情况都失败,你需要从构造函数的args中删除NULL
      • 在这种情况下,我如何将节点链接到数组中的先前元素。你能给我一些建议吗?谢谢
      • 看,问题只在于字符串“root->next=this”如果你向构造函数发送NULL,root将指向空,0,这是访问冲突。我看到在“else”的情况下你做“last->next = ..”而不是你可以将“last”作为arg传递给构造函数,它会设置“last->next”而在“then”的情况下我真的没有应该是“root”的想法,我不确定我是否清楚地了解您正在尝试做的事情。我在这里只是作为编译器倡导者说的;)然后毕竟正如所说的那样,您的指针数组列表将在您从函数返回后消失,因为它的范围仅适用于该函数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2013-10-21
      • 2012-06-12
      相关资源
      最近更新 更多