【问题标题】:C++ array value randomly increases by oneC++ 数组值随机加一
【发布时间】:2018-02-10 06:31:44
【问题描述】:

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

#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;
}

对于冗长的代码示例,我深表歉意。我尽可能多地剥离,但我无法进一步简化它。

【问题讨论】:

  • 使用调试器逐行执行代码时,您观察到了什么?

标签: c++ arrays stack


【解决方案1】:

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

_s = new int[size];

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

下次尝试以更谨慎的方式命名变量,这样您就不会轻易误认size_size。如果您重命名 _size -> _sizeOfAllStacks 或类似的内容,这不会是一个问题。

【讨论】:

  • 哦。谢谢你。只要 StackOverflow 允许,我就会接受你的回答。
  • @shikari-shambu - 关于命名的更多信息:对成员变量使用前导下划线至少让我感到困惑,因为我知道这些名称是为实现保留的(在全局命名空间中)。例如 VC++ 有一个 _msize 扩展名,我必须仔细阅读才能看到这不是你使用的。
猜你喜欢
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多