0

だから、私は自分のプログラムで非常に珍しい問題に直面しています。これが私のプログラムです

    void insertItem (Song *&, Song *&, char ar [], int);
    void printList (Song *);
    void deleteList (Song *&, Song *&);
    void processList (Song *&);

    int main (int argc, char * argv[]) {    
    char * filename = argv[1]; char line [31];


int m, n, a;
------------


    /*
        Head and tail pointer to maintain a list of songs
    */
    Song *head;
    Song *tail;

    if (filename == NULL)
        exit(1);    

    fstream fio;
    fio.open (filename, ios::in);



**fio >> m; fio >> n;**
-----------------------


    // Reading the file
    while (!fio.eof()){


**fio >> a;**
-------------

        fio >> line;


**insertItem (head, tail, line, a);**
-------------------------------------

    }
    fio.close();

    printList (head);



**for (int b = 0; b < n; ++b) processList (head);**
---------------------------------------------------


    cout << "\nDeleting List";
    deleteList (head, tail);
    return 0;
    }

3 つの静的変数 (m、n、および a) を宣言し、3 つすべてを使用します。私が直面している問題は、for ループで変数bを初期化しようとするとすぐに、セグメンテーション違反が発生することです。gdb を使用してデバッグしたところ、for ループで変数bを使用しようとすると、ヘッド ポインターの値が変わります。逆に、for ループ用に新しい変数を作成する代わりに、以前に使用した m や a などの変数を使用すると、まったく問題なく実行されます。先頭ポインタのアドレスは変わりません。ここで何が起こっているのか手がかりはありますか?

4

1 に答える 1

0

コードには少なくとも 2 つのエラーがあります。and を初期化headtailていないこと (したがって、それらを使用して行うことはすべて未定義の動作です) と、入力を使用する前に入力が成功したことを確認していないことです。(最初のループはおそらく である必要があります。ただし、入力が成功したことを確認していない限り、またはどちらもwhile ( fio >> line )使用したくありません。)mn

于 2013-01-16T11:07:46.633 に答える