圆形链表意外“脱轨”

时间:2015-10-20 10:51:58

标签: c++ memory linked-list memory-address singly-linked-list

通常我会在Stack Overflow上找到解决方案来解决一些关于C / C ++编程的愚蠢问题,但这一次不是关于缺少“;”或一个简短的char数组。

这是一个简单的概念:链表。 但是以圆形形式:a-> b-> c-> d-> e-> f-> a-> b-> .... 就这么简单。

除了一些非常奇怪的事情发生。 让我解释一下。

我所做的是以位为单位翻译字符,但是“字符位”:我计算char十进制值的二进制值,然后在链表的节点中写入每个单独的1和0。 由于我需要以圆形,无边框的方式阅读此列表,因此我将其构建为环状,这意味着最后一个“ - > next”包含第一个项目的地址。 然后,通过一个非常简单的函数“forward()”(当我需要> 1跳跃时被覆盖为“forward(int)”),我只读取任意长度的组中的单个位,从半随机位置开始环。 并且 ring 没有结束,即使“跳跃”结束超出最后一个项目(或者一组位穿过它),我只是落在第一个并且一切都很好。

所以

我从戒指的第一个元素开始阅读。 我收集4位,将它们翻译成十进制值,然后通过尽可能多的项目“跳跃”。 此时我只读取3 + 3 + 2位,将它们翻译为小数,并将这些值用于其他内容。 同时,每当我通过环时,我将当前位置保存在变量中,以便下一个“读取和跳跃”将从那里开始,而不是从头开始。

经过几轮后,取决于戒指的持续时间,其中一个“ - >下一个”地址出现严重错误,并且莫名其妙地变成了像517f7f7f或92808080(是的,他们真的看起来那样,重复对)和程序崩溃。

为了理解出了什么问题,我写下了相当多的“cout”,报告程序在每个函数的哪个阶段得到,并或多或少明确地告诉我发生了什么,完成变量的当前值和一切。 非常奇怪的是,即使在冗长的[do while]循环期间也会发生错误,除了读取节点的地址之外什么都没有(它是一个cout,因此没有“== to =”可能的疏忽)。

所以,一切都好几轮,直到......“某事”发生,节点“下一个”值中的一个地址变为可疑的完美外观数字和 sbam!,Windows告诉我程序崩溃了。

如果您需要其他一些细节或一些代码块来更好地了解情况,请告诉我。

编辑2015-10-20_1645

这里有一些代码块,创建列表并与列表交互的部分,以及输出的一部分(对于意大利语而言,它不应该阻止对正在发生的事情的理解)。

HEADER

class girdleNode
{
public:
    girdleNode();
    ~girdleNode();
    void setBit(uchar bitIn){bit = bitIn;}
    uchar getBit(){return bit;}

    friend class keyGirdle;

private:
    girdleNode * next;
    uchar bit;
};


class keyGirdle
{
public:
    keyGirdle(ullong);
    ~keyGirdle();
    void setFirst(girdleNode * pFirst){this->first = pFirst; current = first;}
    void forward();
    void forward(uint);
    void atFirst(){current = first;}
    void atNode(ullong);

private:
    girdleNode * current;
    girdleNode * first;
};

CPP

keyGirdle::keyGirdle(ullong length)
{
    first = new girdleNode;
    girdleNode * pCursor = first;
    pCursor->setBit(0);

    for (ullong c = 0; c < (length - 1); c++)
    {
        pCursor->next = new girdleNode;
        pCursor = pCursor->next;
        pCursor->setBit(0);
    }

    pCursor->next = first;
    current = first;
}



uchar main_class::leaper(girdleNode * node)
{
    girdleNode * pCursor = node;

    do //this loop exposes the girdle as it is starting with the node provided in the function argument
    {
        std::cout << pCursor << "<->";
        pCursor = pCursor->next;
    }while (pCursor != node); //THIS is the point where addresses go wrong, in the middle of this loop

    pCursor = node; //I assign the starting node again after I moved the cursor

    for (int c = 0; c < 4; c++)
    {
        std::cout << "c= " << c << " << pCursor= " << pCursor << "\n"
                     "pCursor->getBit()= " << (pCursor->getBit() ? "1" : "0") << "\n"
                     "pCursor->next= " << pCursor->next << "\n";

        leapBits[c] = pCursor->getBit();
        pCursor = pCursor->next;

        std::cout << "new pCursor value= " << pCursor << "\n\n";
    }

    return bits2dec(leapBits[0], leapBits[1], leapBits[2], leapBits[3]);
}

正确输出

  

[.....]

     

>> Stage: 302

     

>> Stage: 1702

     

>> Stage: 602

     

>> Stage: 107

     

>> Stage: 2301

     

>> Stage: 2302

     

Esposizione keyGirdle prima della lettura dei leapBits:   0x732c28<->0x732cb0<->0x732cc0<->0x732cd0<->0x732ce0<->0x732cf0<->0x732d00<->0x7 32d10<->0x732d20<->0x732d30<->0x732d40<->0x732d50<->0x732e78<->0x732e88<->0x736b b8<->0x736be0<->

ERROR OUTPUT

  

[.....]

     

>> Stage: 302

     

>> Stage: 1702

     

>> Stage: 602

     

>> Stage: 107

     

>> Stage: 2301

     

>> Stage: 2302

     

Esposizione keyGirdle prima della lettura dei leapBits:   0x732c28<->0x732cb0<->0x51808080<->

在那里你看到节点列表结束于第三个地址(0x51808080)是程序中断的地方,并且Windows警告出现告诉我它停止工作。 这两个输出来自同一次运行,它们不是多次测试的结果(注意列表中的相同地址)。

0 个答案:

没有答案