2017-08-11 122 views
2

我正在尝试使用指针和结构实现堆栈推送和弹出操作。这段代码在第40行给出错误(s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1));),说段错误。请帮助使用指针实现堆栈

#include <stdio.h> 
    #include <string.h> 
    #include <math.h> 
    #include <stdlib.h> 
    typedef long int StackEntry ; 
    typedef int Boolean; 

typedef struct stack{ 
    int top; 
    int size; 
    StackEntry *entry; //pointer to dynamic array 
}Stack; 
Boolean StackEmpty(Stack *s) 
{ 
    return s->top<=0; 
} 
Boolean StackFull(Stack *s) 
{ 
    return s->top >= s->size; 
} 
void Error(char *msg) 
{ 
    puts(msg); 
} 
int StackSize(Stack *s) 
{ 
    return s->top ; 
} 
void StackTop(StackEntry *item,Stack *s) 
{ 
    *item=s->entry[s->top]; 
} 
void CreateStack(Stack *s,int n) 
{ 
    s->top=0; 
    s->size=n; 
    s->entry=(StackEntry *)malloc(sizeof(StackEntry)*(n+1)); 
} 
void Push(StackEntry item,Stack *s) 
{ 
    if(StackFull(s)) 
     Error("Stack is full"); 
    else s->entry[s->top++]=item; 
} 
int main() { 

    int n; 
    scanf("%d",&n); 
    Stack *s; 
    CreateStack(s,n); 
    Push(10,s); 
    //Push(15,s); 
    return 0; 
} 
+0

你检查的'N' –

+2

'创建堆栈(S,N)的值;'此使用未初始化的变量's'。 – BLUEPIXY

+1

'Stack * s = malloc(sizeof(Stack));' –

回答

2

试着改变你的main()函数是这样的:

int main() {        
    int n;    
    scanf("%d",&n); 
    Stack s;   
    CreateStack(&s,n); 
    Push(10,&s);  
    //Push(15,s);  
    return 0;   
} 

由于BLUEPIXY指出,Stack *s声明了一个指针Stack结构,当你想要的是一个新的结构本身。如果您需要main()范围以外的结构,您也可以声明堆栈指针,然后声明它的malloc内存。

0

您正在删除s,但未初始化。

替换

Stack *s; 
CreateStack(s,n); 
Push(10,s); 

Stack s; 
CreateStack(&s,n); 
Push(10,&s); 

Stack *s = malloc(sizeof(Stack)); 
CreateStack(s,n); 
Push(10,s); 
free(s);