使用scanf时,程序会立即以segfault终止

时间:2015-06-19 06:54:57

标签: c pointers segmentation-fault scanf

当我使用gets()fgets()代替scanf()时,程序会完全执行,但最终会打印分段错误(核心转储)!我不明白为什么我在这两种情况下都会遇到段错误。这是使用堆栈将中缀转换为postfix exp的代码。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct stack{
    int top;
    int capacity;
    int *array;
}stack;

stack* createstack(char *);
void push(stack* ,int );
int isempty(stack *);
int pop(stack *st);
int peek(stack *st);
int precedence(char c);

int main(){
char exp[100];
char post[100];
int k=-1;
stack *st;
int i=0,p=0;
printf("enter string expression: ");
//gets(exp); 
//fgets(exp, sizeof(exp), stdin);
scanf("%s",exp);
printf("Infix expression : %s",exp);
st=createstack(exp);

for(i=0;i<strlen(exp);i++){
    if( (exp[i]>='a' && exp[i]<='z') || (exp[i]>='A' && exp[i]<='Z'))
        post[++k]=exp[i];
    else if(exp[i]=='(')
        push(st,exp[i]);
    else if(exp[i]==')'){
        while(!isempty(st) && peek(st)!='(')
            post[++k]=pop(st);
        pop(st);
    }
    else{
        while(precedence(exp[i]) < precedence(peek(st)))
            post[++k]=pop(st);
        push(st,exp[i]);
    }
}
while(!isempty(st))
    post[++k]=pop(st);

//post[++k]='\0';
printf("Postfix expression :\n%s\n",post);
return 0;

}

stack* createstack(char *exp){
stack* st;
st->top=-1;
st->capacity=strlen(exp);
st->array=(int*)malloc(st->capacity * sizeof(int));
printf("Stack created successfully\n");
return st;
}

void push(stack* st,int val){
st->array[++st->top]=val;
}

int isempty(stack *st){
return st->top==-1;
}

int pop(stack *st){
return st->array[st->top--];
}

int peek(stack *st){
return st->array[st->top];
}

int precedence(char c){
switch(c){
    case '(':
        return 0;
        break;
    case '+':
        return 1;
        break;
    case '-':
        return 1;
        break;
    case '*':
        return 2;
        break;
    case '/':
        return 2;
        break;

    case '^':
        return 3;
        break;
    }
}       

1 个答案:

答案 0 :(得分:3)

在您的代码中,

stack* st;
st->top=-1;

您正在使用st未初始化,而后者又会调用undefined behaviour

在使用之前,您需要将内存分配给st

尝试类似

的内容
stack* st = malloc(sizeof*st);  //also, check for malloc success

那就是说,

  1. malloc() Cmain()中的家人返回see why not to cast

  2. int main(void)的推荐签名为{{1}}。