我有两个功能
int zapiszGenotyp(genotyp *p, int dlugoscGenotypu, int genDoWpisania)
{
if (!p)
{
genotyp *nowy = new genotyp;
nowy->pNext = 0;
p = nowy;
nowy->gen = genDoWpisania;
dlugoscGenotypu++;
}
else if (p->pNext == 0)
{
genotyp *nowy = new genotyp;
nowy->pNext = 0;
p->pNext = nowy;
nowy->gen = genDoWpisania;
dlugoscGenotypu++;
}
else
zapiszGenotyp(p->pNext, dlugoscGenotypu, genDoWpisania);
return dlugoscGenotypu;
}
void stworzListeOsobnikow(osobnicy *& p, ifstream & input)
{
while (input)
{
if (p==0)
{
p = new osobnicy;
string linia;
getline(input, linia);
istringstream strumien(linia);
int gen;
while (strumien >> gen)
{
p->dlugoscDNA = zapiszGenotyp(p->pGeny, 0, gen);
}
p->pNext = 0;
double(*wybraneDopasowanie)(genotyp*);
wybraneDopasowanie = dopasowanie1;
p->dopasowanie = wybraneDopasowanie(p->pGeny);
}
else if (p->pNext == 0)
{
osobnicy *nowy = new osobnicy;
string linia;
getline(input, linia);
istringstream strumien(linia);
int gen;
while (strumien >> gen)
{
nowy->dlugoscDNA=zapiszGenotyp(nowy->pGeny, 0, gen);
}
nowy->pNext = 0;
p->pNext = nowy;
double(*wybraneDopasowanie)(genotyp*);
wybraneDopasowanie = dopasowanie1;
p->dopasowanie = wybraneDopasowanie(p->pGeny);
}
else
stworzListeOsobnikow(p->pNext, input);
}
他们使用以下结构
struct genotyp
{
genotyp * pNext;
int gen;
};
struct osobnicy
{
osobnicy * pNext;
genotyp * pGeny;
int dlugoscDNA;
double dopasowanie;
};
当我尝试运行代码时,它会在stworzListeOsobnikow()运行zapiszGenotyp()时停止。我已经意识到,作为genotyp * p传递给zapiszGenotyp()的指针始终是CDCDCDCD,但我不知道它意味着什么。只是在zapiszGenotyp()中使用p-> pNext会使程序崩溃。任何人都可以向我解释这个CDCDCDCD指针是什么,以及我的代码似乎有什么问题?
答案 0 :(得分:0)
您永远不会初始化任何指针,并且尝试取消引用未初始化指针(或从任何未初始化的变量读取)时的行为未定义。当您在调试模式下编译时,许多编译器会使用一些独特的模式(如0xCDCDCDCD)填充未初始化的内存,以使这些错误更明显。
您需要在结构中添加构造函数,将其成员初始化为某个初始值,或者确保以其他方式初始化其成员。