-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”

第二个问题是“新节点”的分配在循环之外,所以你只有一个不断被覆盖的“节点”。此行应移到“while”循环内:

   struct node* node = new struct node;

第三,else 块从不将指向“节点”的指针分配给下一个变量。应该

  temp->next = node;

这段代码中还有其他几个与head_node相关的问题,一旦分配就不会== NULL了。在将结构的地址分配给指针和将一个结构的内容复制到另一个结构(如 *head_node = *node; 中)之间的区别似乎有些混淆。

在这种情况下,不需要使用'new'来分配head_node。那只是一个指针,可以初始化为NULL。

于 2013-03-03T04:40:30.913 回答