【问题标题】:Setting reference to bool equal to stack.top of a stack of booleans throws a bad access error. Can't figure out why it's happening将 bool 引用设置为 booleans 堆栈的 stack.top 会引发错误的访问错误。无法弄清楚为什么会这样
【发布时间】:2019-02-03 21:50:21
【问题描述】:

以下代码在函数中,结果是对布尔值的引用。

trueValues 和 false 值是一组字符,它们会导致真或假语句。

stack<bool> operandStack;
for (int k = 0; k < postfix.size(); k++)
{
    char ch = postfix[k];
    if (ch != '!' && ch != '&' && ch != '|')
    {
        if (trueValues.contains(ch))
        {
            operandStack.push(true);
        }
        if (falseValues.contains(ch))
        {
            operandStack.push(false);
        }
    }
    else if (ch == '!' || ch == '&' || ch == '|')
    {
        bool operand2 = operandStack.top();
        operandStack.pop();
        bool operand1 = operandStack.top();
        operandStack.pop();
        switch(ch)
        {
            case '!':
                operandStack.push(operand1 != operand2);
            case '&':
                operandStack.push(operand1 && operand2);
            case '|':
                operandStack.push(operand1 || operand2);
        }
    }
}
result = operandStack.top();

注释掉result = 行可以消除错误消息。

【问题讨论】:

  • 如果栈为空会崩溃,也有可能发生这种情况。
  • 你能显示真值和假值初始化吗?
  • 对于我现在正在处理的测试用例,我已确保堆栈不为空。
  • trueValues 和 falseValues 是双向链表。我检查字符串中的字母是否在这些集合中,然后将 true 或 false 推送到操作数堆栈。
  • @AshBal 缺少的 break; 语句是有意的,并且您真的想在传输到特定的 case 值标签后执行所有语句吗?

标签: c++ stack boolean data-management


【解决方案1】:

首先,我发现您的“if (ch == '!' || ch == '&' || ch == '|')”没有任何目的。没有别的了。

另外,如果“后缀”是一个 std::string,我很确定 size 包括一个终止空字符。所以它可能试图在那里弹出一些东西。

第三,如果整个事情都在一个函数内部,并且您按照建议返回一个引用(我没有看到实际的函数原型),那么您正试图返回一个对即将到来的本地堆栈变量的引用被销毁。

而且,正如 Spinkoo 所指出的,您的开关中也缺少中断...

【讨论】:

    【解决方案2】:

    我知道出了什么问题。此处提供的代码没有任何内容。我在格式化要放入函数的字符串时出错。对不起,谢谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-11
      • 2019-11-29
      • 2017-06-15
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多