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 ++配列はゼロベースであるため、toを使用[0]してインデックスを作成する必要があります[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 に答える