2017-08-11 104 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);