【问题标题】:CDCDCDCD pointer. Creating stack of stacks [duplicate]CDCDCD 指针。创建堆栈堆栈[重复]
【发布时间】:2017-06-06 15:45:15
【问题描述】:

我有两个函数

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() 时停止。我已经意识到传递给 zapiszGenotyp() 的指针作为 genotyp *p 始终是 CDCDCCDCD 但我不知道它是什么意思。只是在 zapiszGenotyp() 中使用 p->pNext 会使程序崩溃。谁能向我解释这个 CDCDCDCD 指针是什么,我的代码似乎有什么问题?

【问题讨论】:

  • 能否整理一下代码的格式。 BTW CDCDCCDC,.. 表示某些东西尚未初始化

标签: c++ list pointers structure


【解决方案1】:

您永远不会初始化任何指针,并且尝试取消引用未初始化的指针(或从任何未初始化的变量读取)时的行为是未定义的。当您在调试模式下编译时,许多编译器会用一些独特的模式(如 0xCDCDCDCD)填充未初始化的内存,以使此类错误更加明显。

您需要将构造函数添加到将其成员初始化为某个初始值或确保其成员以某种其他方式初始化的结构中。

【讨论】:

  • 所以,只是让它变得 osobnicy * pNext=0;基因型 * pGeny=0;会成功吗?
  • 如果您使用 C++11,这将起作用,但您应该更喜欢 nullptr 而不是 0 来初始化指针。您还应该初始化genotyp::pNext,并且可能将您传递给stworzListeOsobnikow 的指针初始化为p(您没有显示您声明该指针的位置,所以我无法告诉您它是否已初始化)。
猜你喜欢
  • 2015-11-16
  • 2013-01-20
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多