在编写实现布尔表达式的程序时出现Segmentetion fault报错,是哪个指针出问题了吗?
#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是无效指针
在使用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;
}
输出如下所示