Реализация стеков с использованием указателей


Я пытаюсь реализовать операции push и pop стеков, используя указатели и структуры. Этот код выдает мне ошибку в строке 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;
}
2 2

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, когда требуется сама новая структура. Вы также можете объявить указатель стека, а затем память malloc для него, если вам нужна структура вне области main().

Выполняется разыменование 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);