Проблема с переносом элементов в стек в c - PullRequest
0 голосов
/ 12 февраля 2020

Я реализовал стек в C следующим образом. И программа работает нормально для трех нажатий, но когда я пытаюсь набрать sh более 3-х элементов, программа выполняется, и результат распечатывается, но затем появляется сообщение об ошибке, сообщающее, что программа перестала работать
Мой код выглядит следующим образом:

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

#define MAX 50

//typedef char stackEntryType;
typedef enum{FALSE,TRUE} Boolean;

typedef struct stack{
int top;
int entry[MAX];
}stack;

void createStack(stack *s){
s->top=-1;
}

Boolean IsStackEmpty(const stack *s){
return(s->top==-1);
}

Boolean IsStackFull(const stack *s){
return(s->top==MAX-1);
}

void push(stack *s,int item){
    if(IsStackFull(s)){
        printf("Stack is full\n");
        exit(1);
    }else{
        s->entry[++s->top]=item;
        printf("%d pushed to stack\n",item);
    }
}

void pop(stack *s)
{
    int item;
    if(IsStackEmpty(s))
    {
        printf("Stack is empty\n");
        exit(1);
    }
    else{
        item=s->entry[s->top--];
        printf("%d popped from the stack",item);
    }
}

void main()
{
    stack *s;
    createStack(&s);
    push(&s,1);
    push(&s,2);
    push(&s,3);
    push(&s,4);
    pop(&s);
}

Может кто-нибудь решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Любопытно, что вы разбили стек своей машины своим текущим кодом, при компиляции я получил:

1 pushed to stack
2 pushed to stack
3 pushed to stack
4 pushed to stack
*** stack smashing detected ***: <unknown> terminated

Правильный ответ 4386427, особенно точка с предупреждениями компилятора . В качестве альтернативы вы можете построить свой стек в куче машины (динамическая c память) с помощью malloc():

struct stack *s = malloc (sizeof (struct stack))

выделения памяти в стеке и куче

Если вы мале c памяти в куче вы должны изменить в main() все &s на s:

void main()
{

    struct stack *s = malloc(sizeof(struct stack));
    createStack(s);
    push(s,1);
    push(s,2);
    push(s,3);
    push(s,4);
    pop(s);
    free(s);  // release allocated memory
}
2 голосов
/ 12 февраля 2020

Не выделено stack. Это

void main()
{
    stack *s;

дает только указатель стека.

Измените его на

void main()
{
    stack s;

, чтобы получить объект стека.

Примечание : Создание стека как локальной переменной в main хорошо, если MAX относительно невелик. Если вы измените MAX на большое значение (например, #define MAX 5000000), лучше выделить память, используя malloc. Смотрите ответ от @ ralfhtp.

BTW: Включить предупреждения компилятора. Вы передаете stack** чему-то ожидающему stack* Компилятор предупредил бы вас, и вы могли бы найти ошибку сразу.

...