我正在尝试使用结构在 c 中创建一个堆栈,但我的推送功能不起作用

I'm trying to create a stack in c using structures but my push function doesn't work

我正在尝试使用结构在 C 中创建堆栈,但我编写的 push() 函数运行异常。我敢肯定我缺少的东西很明显,但我就是想不通是什么。

#include <stdio.h>

#define STACK_SIZE 50

typedef struct stack
{
    int top;
    int items[STACK_SIZE];
}
STACK;

void push(STACK* st, int newitem)
{
    st->top++;
    st->items[st->top] = newitem;
    printf("%d", st->items[st->top]);
}


int main()
{
    int n = 1;
    STACK* st;

    printf("test 1\n");
    
    st->top = -1;

    push(st, n);
    
    printf("test 2\n");
    
    return 0;
}

DevCpp 只编译不执行代码。 OnlineGDB 运行它但只打印第一个测试。

这是因为您的变量 STACK* st; 从未正确初始化。

一些要点:

  • 不要将-1分配给长度(top),0会更好
  • STACK* st; 应该只是 STACK st;
  • 您的函数 void push(STACK* st, int newitem) 应使用 static 链接声明。
  • st->top++
  • 通过地址将 st 变量传递给 push() 函数
  • 不要使用裸 return 0;,而是使用头文件 stdlib.h.
  • 中定义的 return EXIT_SUCCESS;
  • 由于您的总 STACK_SIZE 只有 50,所以 int 就足够了。但是随着 STACK_SIZE 的增长,使用 size_t 作为长度 (top).
  • 使用int main(void) { },而不是int main() { }
  • 注意:如果 STACK_SIZEtop 相等意味着您的 array 已完全填充,那么进一步添加数据将导致 Undefined Behavior

最终代码

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

#define STACK_SIZE 50

typedef struct stack
{
    int top;
    int items[STACK_SIZE];
}
STACK;

static void push(STACK* st, int newitem)
{
    if(st->top == STACK_SIZE)
    {
        fprintf(stderr, "stack size reached maximum length\n");
        exit(EXIT_FAILURE);
    }
    st->items[st->top++] = newitem;
    printf("%d\n", st->items[st->top - 1]); // we added +1 to `top` in the above line
}


int main(void)
{
    int n = 1;
    STACK st;
    printf("test 1\n");
    st.top = 0;
    push(&st, n); //pass by address

    return EXIT_SUCCESS;
}