C ++数组值随机增加1

时间:2017-09-01 08:24:54

标签: c++ arrays stack

MultipleStack是一个支持多个堆栈的类,但是将它们的所有值存储在一个一维数组中。 push(item, k)item推送到k堆栈。为了正确执行此操作,该类存储一个数组top,用于存储每个堆栈中最顶层元素的索引。推送push后,top[k - 1]应该将item增加1,以便正确推送以下项目。但是,有时,push会将top[k - 1]增加2,我无法弄清楚原因。

#include <cassert>

class MultipleStack {
    int * _s;
    size_t * _top;
    size_t _nStacks, _size;

public:
    MultipleStack(size_t nStacks, size_t size) {
        _nStacks = nStacks;
        _size = size * nStacks;
        _s = new int[size];
        _top = new size_t[nStacks];
        //Simply sets top = {0, 10, 20, ...} no error here
        for (size_t i = 0; i < nStacks; i++) {
            _top[i] = (_size / _nStacks) * i;
        }
    }

    //This is the buggy method
    void push(int item, size_t k) {
        size_t beforeSet = _top[k - 1];
        _s[_top[k - 1]] = item;
        size_t afterSet = _top[k - 1];
        assert(beforeSet ==  afterSet); // Fails when beforeSet = 14
        _top[k - 1] = _top[k - 1] + 1;
    }

    static void testImplementation() {
        //Both, nStacks and size, must be >= 9
        int nStacks = 10;
        int size = 10;
        MultipleStack ms(nStacks, size);
        for (int i = 1; i <= nStacks; i++) {
            for (int j = 0; j < size; j++) {
                ms.push(1, i);
            }
        }
    }
};

int main(int argc, const char * argv[]) {
    MultipleStack::testImplementation();
    return 0;
}

我为冗长的代码示例道歉。我尽可能地剥离了,但我无法再进一步。

1 个答案:

答案 0 :(得分:2)

我在c-tor中看到这行中的一个错误:

size * nStacks

如果我理解正确,_s代表所有堆栈的内存块,所以它的大小应该是:_top。这可能导致在分配的内存之外写入,这会覆盖后续数据(_s数组是其中一个数据)。修复size分配,你应该做得很好。

下次尝试以更谨慎的方式命名变量,这样就不会轻易地误导_size_size。如果您重命名_sizeOfAllStacks - &gt;这不会是一个问题{{1}}或类似的东西。