我正在编写一个代码来索引游戏中用户可用的技能,构建为链表。我已经彻底测试了填充列表的函数,它似乎工作正常(所以列表的头指针不应该为空)。当我尝试遍历列表以在技能中设置值时,在列表中写入内存的任何代码执行之前,当我将列表的搜索函数中的临时指针初始化为头指针时,程序崩溃.
让我觉得这也很奇怪的是,它工作得很好(我已经相当彻底地测试过),直到我添加到一个列表中来存储可用项目的列表,并且当我填充它们时可能只是错过了两者之间的奇怪交互.
具体的错误是指针应该访问要写入的内存索引 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 个小时,但我已经失去了实际追踪这个问题的视角。