使用vector初始化链表时c ++分段错误

时间:2014-02-03 06:36:40

标签: c++ segmentation-fault

我打算使用向量

初始化链表

这是代码:

#include <vector>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

int main() {
    int n = 10;
    vector<ListNode> vecListNode;
    for (int i = 0; i != n; ++ i) {
        vecListNode.push_back(ListNode(i));
        if (i) {
            vecListNode[i-1].next = &vecListNode[i];
        }
    }
    ListNode *root = &vecListNode[0];
    while (root) {
        cout << root->val << endl;
        root = root->next;
    }
    return 0;
}

但是,当我运行此代码时,我得到:

0

1

分段错误:11

我正在使用macintosh,默认g ++,非常感谢

4 个答案:

答案 0 :(得分:5)

存储矢量元素的地址是不安全的。当您改变容器时(例如,通过插入元素),向量元素的引用和迭代器将无效。

(你可能在你开始之前通过在向量上调用reserve()来使代码工作,但它在概念上仍然是错误的。据推测,向量应存储指针动态分配列表节点对象,或者可能是其他形式的间接(例如对向量和索引的引用)。)

答案 1 :(得分:3)

如果尚未分配足够的内存,则向量会自动调整插入大小。此操作使指向元素的指针无效,因为这些指针被复制/移动到另一个内存位置。

在使用向量的reserve()方法插入之前,可以通过保留一些空格来避免这种情况。

无论如何,你应该想办法初始化你的清单。

答案 2 :(得分:0)

虽然我误解了你想要实现的目标,因为你可以使用STL列表。您可以通过存储ListNode指针而不是实例来修复代码。 以下代码将使用您执行的相同的alogrothm正确打印您的列表:

#include <vector>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

int main() {
int n = 10;
vector<ListNode*> vecListNode;
for (int i = 0; i != n; ++ i) {
    ListNode* pNode = new ListNode(i);
    vecListNode.push_back(pNode);
    if (i) {
        vecListNode[i-1]->next = vecListNode[i];
    }
}
ListNode *root = vecListNode[0];
while (root) {
    cout << root->val << endl;
    root = root->next;
}
return 0;
}

然后指针不会失效,因为它们本身存储在向量中。 请注意,上述程序泄漏。如果考虑使用它,则需要释放ListNode使用的内存。

输出是: [root @ isl1 vectorList]#。/ a.out

0

1

2

3

4

5

6

7

8

9

享受!!!

答案 3 :(得分:-1)

获取核心转储并使用您选择的调试器进行分析。您可以使用ulimit -c unlimited获取核心转储,并使用gdb进行分析。