0

我正在编写一个代码来索引游戏中用户可用的技能,构建为链表。我已经彻底测试了填充列表的函数,它似乎工作正常(所以列表的头指针不应该为空)。当我尝试遍历列表以在技能中设置值时,在列表中写入内存的任何代码执行之前,当我将列表的搜索函数中的临时指针初始化为头指针时,程序崩溃.

让我觉得这也很奇怪的是,它工作得很好(我已经相当彻底地测试过),直到我添加到一个列表中来存储可用项目的列表,并且当我填充它们时可能只是错过了两者之间的奇怪交互.

具体的错误是指针应该访问要写入的内存索引 0x000000c,但我看不到此时的代码是如何处理空指针的(因为在程序运行 10 次后,操作系统不应该每次都将该内存块分配给临时指针,其他任何内容都不应为空。

在这一点上我可能只是漫不经心,所以这里是代码:

根据调试器导致错误的函数:

void Mechanics::setSkillValue(int index, int value)
   {
    Skill *temp = FirstSkill; // << The error is happening on this line //

    while((temp != NULL)&&(temp->index != index))
    {
    temp = temp->next;
    }

    if (temp == NULL)
    {
        cout << "%";
    }
    else temp->setValue(value);

 // cout << temp->returnValue(); //This was a test check, not needed for anything
}

应该填充技能和项目列表的函数。

 void Mechanics::Populate()
 { 
 ifstream skillstream("Skills.txt");
 if(skillstream.is_open())
 {
    while(skillstream.good())
    {
        Skill *newskill;
        int indexval;
        string skillindex;
        string skillname;
        string skilldescription;

        cout << "TP4" << endl; //TEST POINT
        getline(skillstream, skillindex);
        cout << skillindex;
        getline(skillstream, skillname);
        cout << skillname;
        getline(skillstream, skilldescription);
        cout << skilldescription; cout << endl;

        indexval = atoi(skillindex.c_str());

        newskill = new Skill(skillname, skilldescription,indexval);
    //cout << "TP5" << endl; //TEST POINT
    if(newskill == NULL) cout << "NULL!!!";
    addSkill(newskill);
    }
}

ifstream itemstream("Items.txt");
if(itemstream.is_open())
{
    while(itemstream.good())
    {
        Item *newitem;
        int indexval;
        string skillindex;
        string skillname;
        string skilldescription;
        string abilitydescription;
        string valueSTR;
        string typeSTR;
        int value;
        int type;
        int numeric[5];
//          cout << "TP4" << endl; //TEST POINT
        getline(itemstream, skillindex);
//          cout << skillindex;
        getline(itemstream, skillname);
//      cout << skillname;
        getline(itemstream, skilldescription);
//      cout << skilldescription;
        getline(itemstream, abilitydescription);
        getline(itemstream, valueSTR);
        value = atoi(valueSTR.c_str());
        getline(itemstream,typeSTR);
        type = atoi(typeSTR.c_str());

        for (int i=0; i < 5; i++)
        {
            string numericSTR;
            getline(itemstream,numericSTR);
            numeric[i]=atoi(numericSTR.c_str());
        }


        indexval = atoi(skillindex.c_str());

        newitem = new Item(indexval, skilldescription, skillname, abilitydescription, value, type, numeric);
    //cout << "TP5" << endl; //TEST POINT
//  if(newskill == NULL) cout << "NULL!!!";
    addItem(newitem);
    }
}

应该将技能实际添加到技能列表的功能:

void Mechanics::addSkill(Skill *nskill)
{
 Skill *temp = FirstSkill;

 if(FirstSkill == NULL)
 {
     FirstSkill = nskill;
     //cout << "TP1" << endl; //TEST POINT
       //FirstSkill->printname();
 }

 else
 {
    while((temp->next != NULL))
    {
    temp = temp-> next;
    //cout << "TP2" << endl; //TEST POINT
    //temp->printname(); cout << endl;
    }
     if (FirstSkill != NULL)
     {
         temp->next = nskill;
         nskill->next = NULL;
     }
 }
}

我的代码有点广泛,所以我只包含可能与引发错误的函数交互的块。

提前感谢您阅读本文以及您能够提供的任何帮助,我已经为此努力了大约 6 个小时,但我已经失去了实际追踪这个问题的视角。

4

0 回答 0