C中的堆栈代码崩溃并在运行后立即停止工作

时间:2018-08-13 16:09:33

标签: c pointers stack

因此,我正在使用C的push,pop等来开发标准堆栈程序。代码可以很好地编译,但是一旦我运行它,它就会崩溃并显示“停止工作”消息。我正在Windows系统上开发Dev C ++应用程序。代码如下:

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

#define MAX 10

struct stack {
    int items[MAX];
    int top;
};
typedef struct stack st;

void createemptyStack(st *s) {
    s->top = -1;
}

int isEmpty(st *s) {
    if (s->top == -1)
        return 1;
    else
        return 0;
}

int isFull(st *s) {
    if (s->top == MAX - 1)
        return 1;
    else
        return 0;
}

int push(st *s) {
    int newitem;

    printf("Enter the value you want to push");
    scanf("%d", &newitem);

    if (isFull(s)) {
        printf("Stack is full");
    } else {
        s->top++;
        s->items[s->top] = newitem;
    }
}

void pop(st *s) {
    if (isEmpty(s)) {
        printf("Stack is empty");
    } else {
        printf("Items popped %d", s->items[s->top]);
        s->top--;   
    }
}

int main() {
    int ch;
    int loop = 1;
    st *s;

    createemptyStack(s);

    do {
        printf("\n ***STACK OPERATIONS");
        printf("\n 1. PUSH");
        printf("\n 2. POP");
        printf("\n 3. EXIT");
        printf("\n ***************");
        printf("\n Enter your choice: ");
        scanf("%d", &ch);

        switch (ch) {
          case 1:
            push(s);
            break;

          case 2:
            pop(s);
            break;

          case 3:
            printf("Visit again");      
            loop = 0;
            exit(0);

          default:
            printf("Invalid choice");
        }   
    } while(loop);

    getch();
}

如果您可以在此问题上为我提供帮助,那对我真的很有帮助。我认为问题可能出在do / while循环中,但我不确定。想对此事发表一些意见。

3 个答案:

答案 0 :(得分:3)

  st *s;

您没有为*s分配内存,  将其更改为

  st *s = malloc(sizeof(*s));

  st s;
  createemptyStack(&s)

答案 1 :(得分:2)

指向.git/refs/heads/<branch>的指针s的值未初始化,因此包含垃圾数据。现在,当您将st传递到s时,它将尝试访问createemptyStack中的垃圾数据所指向的内存位置,从而导致分段错误。 首先,您需要通过定义struct对象来为结构分配空间

s

或通过动态内存分配

st obj;
st* s = &obj;

答案 2 :(得分:1)

s被定义为指向堆栈对象的指针。您需要一个实际的struct stack对象才能使s指向。将其中一个定义为局部变量:

st obj;
st *s = &obj;

或从堆中分配一个:

st *s = malloc(sizeof(*s));
if (s == NULL) {
    fprintf(stderr, "allocation failure\n");
    exit(1);
}