0

我正在为图形结构创建一个邻接列表。下面是我的代码片段,当我在 gdb 中运行时,它给出“程序收到信号 SIGSEGV,分段错误。std::_List_node_base::hook () 中的 0x0040340f”错误。有人可以指出代码中的错误。

struct graph{
    list<int> vertex;
}*v;

list<int>::iterator it;
cin>>num_vertices;

v = new  graph[num_vertices];

if (v == 0)
    cout << "Error: memory could not be allocated";

for(i=1;i<=num_vertices;i++)
{
    cin>>num_connected;
    for(j=1;j<=num_connected;j++)
    {
        cin>>m;
        (v+i)->vertex.push_back(m);
    }
}
for(i=1;i<=num_vertices;i++)
    for(it= (v+i)->vertex.begin();it!= (v+i)->vertex.end();it++)
        cout<<*it<<"->";
4

2 回答 2

1

C++ 数组是从零开始的,所以应该使用[0]to来索引[num_vertices-1]。如果您将循环更改为从 0 变为 num_vertices-1

for(i=0;i<num_vertices;i++)

您的代码应该可以工作。

当前的故障可能是由循环取消引用的最后一次迭代引起的,(v+num_vertices)这是数组之外的内存。写入尚未分配的内存会产生未定义的行为,因此段错误不会令人惊讶。

于 2012-11-08T14:20:24.397 回答
0

我在这里没有看到任何问题,我编译了你的程序(只是声明了你正在使用的变量)并且它工作正常

#include <iostream>
#include <list>

using namespace std;

struct graph{
        list<int> vertex;
}*v;

int main ()
{
    int num_vertices = 0;
    int num_connected = 0;

    list<int>::iterator it;
    cin>>num_vertices;

    v = new  graph[num_vertices];

    if (v == 0)
        cout << "Error: memory could not be allocated";

    for(int i=0;i<num_vertices;i++)
    {
        cin>>num_connected;
        for(int j=1;j<=num_connected;j++)
        {
            int m;

            cin>>m;
            (v+i)->vertex.push_back(m);
        }
    }
    for(int i=0;i<num_vertices;i++)
        for(it= (v+i)->vertex.begin();it!= (v+i)->vertex.end();it++)
            cout<<*it<<"->";

}
于 2012-11-08T14:06:22.367 回答