【问题标题】:How to fix this "segmentation fault 11" for this switch function?如何解决此开关功能的“分段故障 11”?
【发布时间】:2020-01-01 00:37:43
【问题描述】:

我是 c 新手,正在编写一个 switch 函数,只要传入的字符串是 )、}、],当弹出的表达式不是匹配的左括号时,它就会返回 false。 (是的,这是平衡括号的问题......)

我可以肯定,分段错误只来自这个 switch 语句,没有它,代码也能正常工作。

我的代码是:


switch (expr[i]) 
        { 
        case ')': if (pop(&Stack) == '{' || pop(&Stack) =='[') { 
                  return 0;}
            break; 

        case '}': if (pop(&Stack) == '(' || pop(&Stack) =='[') {
                  return 0; }
            break; 

        case ']': if (pop(&Stack) == '{' || pop(&Stack) =='(') {
                  return 0; }
            break; 
        } 

它给了我“分段错误:11”。

【问题讨论】:

  • 什么是expripopStack
  • ^ 和调试器可能会指出段错误的原因。
  • 发布的代码为每个 switch 案例调用了两次“pop()”。强烈建议不要修改“堆栈”。

标签: c segmentation-fault switch-statement text-segmentation


【解决方案1】:

我怀疑是 switch 导致了段错误。更有可能是使用pop()

pop 会改变堆栈吗?如果是这样,pop 将被两次评估:

 case ')':
    if (pop(&Stack) == '{'  ||  pop(&Stack) =='[')

当字符为)且弹出的匹配值为(时。

要修复,请像这样重组这个代码区域(取决于 pop 的交互方式):

/*
 *  Have a peek at the top of stack without disrupting content
 */
char top_of_stack = pop (&Stack);
push (&Stack, top_of_stack); // put it back

switch (expr[i]) 
{ 
case ')':
     if (top_of_stack == '{' || top_of_stack == '[')
            return 0;
     break; 

case '}':
     if (top_of_stack == '(' || top_of_stack == '[')
            return 0;
     break; 

case ']':
     if (top_of_stack == '{' || top_of_stack == '(')
            return 0;
      break; 
}

【讨论】:

  • 是的,是的,是的,谢谢!!!!这完全解决了我的问题希望你有一个美好的一天谢谢你让我的一天变得轻松
  • @Barmar:添加了示例解决方案,但它假定 pop() 和 push() 语义(因此它可能无法直接工作)。
  • 如果顶部是正确的平衡支架,它可能应该弹出堆栈。
  • @Barmar:是的,可能。需要查看更多代码才能确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多