在编写实现布尔表达式的程序时出现Segmentetionfault报错

在编写实现布尔表达式的程序时出现Segmentetion fault报错,是哪个指针出问题了吗?

img


这是题目

img


img

#include 
#include 
#include 
struct op{
    char ch[1000];
    int top;
};
struct data{
    char data[1000];
    int top;
};
void add(op *p,data *q){
    char a,b,c;
    c=p->ch[p->top];
    p->top--;
    if(c!='!'){
        a=q->data[q->top];
        q->top--;
        b=q->data[q->top];
        q->top--;
        if(c=='&'){
            if(a=='V'&&b=='V'){
                q->top++;
                q->data[q->top]='V';
            }
            else{
                q->top++;
                q->data[q->top]='F';
            }
        }
        else if(c=='|'){
            if(a=='F'&&b=='F'){
                q->top++;
                q->data[q->top]='F';
            }
            else{
                q->top++;
                q->data[q->top]='V';
            }
        }
    }
    else if(c=='!'){
        a=q->data[q->top];
        q->top--;
        if(a=='V'){
            q->top++;
            q->data[q->top]='F';
        }
        else if(a=='F'){
            q->top++;
            q->data[q->top]='V';
        }
    }
}
int main(){
    op *p=(op*)malloc(sizeof(op));
    p->top=-1;
    data *q=(data*)malloc(sizeof(data));
    q->top=-1;
    char s[1005];
    int len;
    while(gets(s)){
        len=strlen(s);
        for(int i=0;iif(s[i]=='V'||s[i]=='F'){
                q->top++;
                q->data[q->top]=s[i];
            }
            else if(s[i]=='('||s[i]=='!'||p->top==-1){
                p->top++;
                p->ch[p->top]=s[i];
            }
            else if(s[i]=='&'){
                if(p->ch[p->top]=='('||p->ch[p->top]=='|'){
                    p->top++;
                    p->ch[p->top]=s[i];
                }
                else{
                    while(p->ch[p->top]!='('&&p->ch[p->top]!='|'){
                        add(p,q);
                        if(p->top==-1) break;
                    }
                    p->top++;
                    p->ch[p->top]=s[i];
                }
            }
            else if(s[i]=='|'){
                if(p->ch[p->top]=='('){
                    p->top++;
                    p->ch[p->top]=s[i];
                }
                else{
                    while(p->ch[p->top]!='('){
                        add(p,q);
                        if(p->top==-1) break;
                    }
                    p->top++;
                    p->ch[p->top]=s[i];
                }
            }
            else if(s[i]==')'){
                while(p->ch[p->top]!='('){
                    add(p,q);
                }
                p->top--;
            }
        }
        while(p->top!=1){
            add(p,q);
        }
        printf("%c\n",q->data[q->top]);
    }
    return 0;
}

指针的问题,或者数组越界,或者q->data是无效指针

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7807039
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:解决Segmention fault的思路和方法
  • 除此之外, 这篇博客: 段错误(Segmentation fault)中的 背景 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在使用MPI并行化矩阵乘向量的实验中,发现如果矩阵的规模规模较大时,就会导致段错误。
    将错误代码进行简化,如下所示

    /*
    File name: seg_error.c
    How to compile: gcc -g -Wall -o seg_error seg_error.c
    */
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(){
        int m, n;
        double *a;
        printf("Please input m and n: ");
        scanf("%d%d", &m, &n);
        a = malloc(m * n * sizeof(double));
        memset(a, 0, sizeof(double) * m * n);
    
        free(a);
        return 0;
    }
    

    输出如下所示
    请添加图片描述