【问题标题】:Program crash on array index assignment数组索引分配程序崩溃
【发布时间】:2012-02-23 14:03:23
【问题描述】:

我在这里遇到了一个小问题。 每次我运行下面的代码时,我的程序都会崩溃。

void Wingcod::push(byte b)
{
    stack[stackp] = b;
    stackp++;
    if(stackp >= stacks)
    {
        stacks += 16;
        try
        {
            realloc(stack,stacks);
        }catch(bad_alloc*)
        {
            cerr << "STACK OVERFLOW";
            exit(1);
        }
    }
}

而stack、stackp和stacks是这样定义的:

stacks = 8;
stackp = 0;
stack = new byte[stacks];

而字节只是一个unsigned char

【问题讨论】:

  • 你声明的是什么类型的stackp?
  • 您是否尝试过使用断点进行调试,看看会发生什么?
  • 为什么不改用 C++?您可以使用方便的 std::vector&lt;byte&gt; 来满足您的需求。
  • 当我进入推送功能时,调试器中的所有变量字段都变为空白。很奇怪。
  • @Kerrek SB 这听起来可能有点奇怪,但我需要比向量更底层的东西。

标签: c++ arrays pointers indexing stack


【解决方案1】:

您不能在使用new 分配的指针上使用realloc()

也许试试下面的方法而不是realloc()

        byte* tmp = new byte[stacks];
        delete [] stack;
        stack = tmp;

【讨论】:

    【解决方案2】:

    realloc 不会抛出异常,因为它与 new 无关,而是与 C 的 malloc 相关。它也没有设置指针。

    stacks = 8;
    stackp = 0;
    stack = static_cast<byte*>(malloc(stacks * sizeof(byte)));
    
    void Wingcod::push(byte b)
    {
        stack[stackp] = b;
        stackp++;
        if(stackp >= stacks)
        {
            stacks += 16;
            if(!(stack = static_cast<byte*>(realloc(stack,stacks * sizeof(byte))))) {
                cerr << "STACK OVERFLOW";
                exit(1);
            }
        }
    }
    

    【讨论】:

    • “不改变指针”似乎是崩溃的重要部分。
    • 是的,这是一个解决方案,但不是针对我当前的问题。您会看到崩溃发生在函数的第一行,即我第一次运行它时。
    • @TheBreadCat 如果您认为问题出在其他地方,您可以使用更多代码发布另一个问题。我在想调用对象(这个指针)可能是无效的。
    • wc->push()代码和this.push()一样,只是静态引用。
    • @TheBreadCat 为什么wc 是一个指针?你 100% 确定它不是 NULL 吗?
    【解决方案3】:

    您不能将分配给new T[n] 的指针用作realloc() 的参数。使用realloc() 的指针必须来自malloc() 系列函数(malloc()calloc()realloc())。就个人而言,我不会使用任何这些,而是​​使用std::vector&lt;T&gt;

    【讨论】:

      【解决方案4】:

      here 开始,Realloc 仅适用于指向先前由 alloc 分配的内存的指针。尝试使用 malloc

      【讨论】:

        猜你喜欢
        • 2021-01-19
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        相关资源
        最近更新 更多