-1

逆アセンブラを作成していて、リンクリストを使用してシンボルファイル(sym_file)からデータを保存しています。私は他のすべての投稿を見てきましたが、それでも機能させることができません!(セグメンテーション違反が発生し続けます)head_nodeを追跡できるように、リストの最後にノードを追加しようとしています。

void read_symbol_file(char* file_name)
{
    struct node* head_node = new struct node;
    struct node* node = new struct node;
    struct node* temp;
    ifstream sym_file(file_name, ios::out);
    char label[16];
    char the_type[6];
    char address[6];

    if(sym_file.is_open())
    {
        while (!sym_file.eof())
        {
            sym_file >> label;
            sym_file >> the_type;
            sym_file >> address;

            if(strcmp(the_type, "line") == 0)
            {
                node->type = line;
                node->label = label;
                node->address = atoi(address);
            }
            else if(strcmp(the_type, "block") == 0)
            {
                node->type = block;
                node->label = label;
                node->address = atoi(address);
            }
            else if(strcmp(the_type, "ascii") == 0)
            {
                node->type = ascii;
                node->label = label;
                node->address = atoi(address);
            }
            else if(strcmp(the_type, "word") == 0)
            {
                node->type = word;
                node->label = label;
                node->address = atoi(address);
            }
            else
            {
                cout << "invalid label" << endl;
                exit(0);
            }

            if(head_node == NULL)
            { 
                head_node = node;
                head_node->next = node;
            }
            else
            {
                temp = head;
                while(temp->next != NULL)
                    temp = temp->next;
                temp->next = NULL;
            }
        }
        sym_file.close();
    }

    else
    {
        cout << "File does not exist or could not be found." << endl;
        exit(0);
    }
    cout << head_node->label << endl;

}
4

1 に答える 1

1

次の行はコンパイラ エラーです。

          temp = head;

変数「head」の宣言がないため

2 番目の問題は、「新しいノード」の割り当てがループの外にあるため、上書きされ続ける「ノード」が 1 つしかないことです。この行は「while」ループ内に移動する必要があります。

   struct node* node = new struct node;

第 3 に、else ブロックは「ノード」へのポインターを次の変数に割り当てません。する必要があります

  temp->next = node;

このコードには、割り当てられると == NULL にならない head_node に関連する他のいくつかの問題があります。*head_node = *node; のように、構造体のアドレスをポインターに割り当てることと、ある構造体の内容を別の構造体にコピーすることの違いについて、混乱があるようです。

この場合、「new」を使用して head_node を割り当てる必要はありません。これは単なるポインターであり、NULL に初期化できます。

于 2013-03-03T04:40:30.913 に答える