首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >固定分割故障

固定分割故障
EN

Stack Overflow用户
提问于 2022-01-23 03:56:37
回答 1查看 66关注 0票数 0

我正在尝试使用两个堆栈来制作后缀以插入程序。基本的想法是-

ptr1 -> ptr2 --> ptr3 --> ptr4 --> NULL

(4*5)

每个操作数是一个单独的堆栈,ptr堆栈用于每个操作数的第一个元素的内存地址。但是我得到了一个分割错误。我认为这是由于pop函数中的(*ptr) = (*ptr)->next1;语句造成的。有人能解释/修复这一点,使pop函数返回顶部的操作数堆栈的地址,同时弹出ptr堆栈吗?完整的代码-

代码语言:javascript
运行
复制
struct bracket {
  char c;
  struct bracket* next;
};

struct outer {
    struct bracket *down;
    struct outer *next1;
};
struct outer* push_ptr (struct bracket *ptr,struct outer * out){
    struct outer *temp = NULL;
    temp = (struct outer*)malloc(sizeof(struct outer));
    temp->down = ptr;
    temp->next1 = out;
    return temp;
}

struct bracket* push_ch(char ch,struct bracket *head){

  struct bracket *temp = NULL;
  temp = (struct bracket*)malloc(sizeof(struct bracket));
  temp->c = ch;
  temp->next = head;
  return temp;
}

struct bracket* pop(struct outer **ptr){
  struct bracket *top = (struct bracket*)malloc(sizeof(struct bracket));
  top = (*ptr)->down;
  (*ptr) = (*ptr)->next1;
  return top;
}

int main(){

    char c[] = "25,9,6,/,-,3,/";
    struct outer * address = NULL;
    struct bracket * num;
    for (int i=0;i<strlen(c);i=i+1){
        
        if(c[i]==',') continue;
        
        else if (c[i]=='*' || c[i]=='-' || c[i]=='+' || c[i]=='/'){
            struct bracket *top1 = pop(&address);
            struct bracket *top2 = pop(&address);
            
        } 
        
        else {
               num = NULL;
               while(c[i]!=','){
                   num = push_ch(c[i],num);
                   i = i+1;
               }               
               address = push_ptr(num,address);
               
        }

    }
    return 0;

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-23 09:52:13

你的问题肯定是函数pop().

代码语言:javascript
运行
复制
struct bracket* pop(struct outer **ptr){
  struct bracket *top = (struct bracket*)malloc(sizeof(struct bracket));
  top = (*ptr)->down;
  (*ptr) = (*ptr)->next1;
  return top;
}

你每次都会从外部ptr弹出,最终,在某一时刻,它仍然是空的。让我们了解当它是空的时候会发生什么。因此,您传递一个指向NULL的引用结构外部**ptr。因此它将无法在这一行上检索(*ptr)->down ..。

代码语言:javascript
运行
复制
top = (*ptr)->down;

你就会有一个分割错误。您应该在pop函数中处理空情况(一般来说,空保护每个函数是好的)。pop函数的另一种实现可能是.

代码语言:javascript
运行
复制
struct bracket* pop(struct outer **ptr){
  struct bracket *top = (struct bracket*)malloc(sizeof(struct bracket));
  if (*ptr)
  {
      top = (*ptr)->down;
      (*ptr) = (*ptr)->next1;
  }
  else
      top = NULL;
  return top;
}

这将修复分段错误。如果外部结构不包含任何元素,它将返回NULL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70819015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档