我正在尝试使用结构在 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_SIZE
和 top
相等意味着您的 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;
}
我正在尝试使用结构在 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
. 中定义的 - 由于您的总
STACK_SIZE
只有50
,所以int
就足够了。但是随着STACK_SIZE
的增长,使用size_t
作为长度 (top
). - 使用
int main(void) { }
,而不是int main() { }
- 注意:如果
STACK_SIZE
和top
相等意味着您的array
已完全填充,那么进一步添加数据将导致 Undefined Behavior。
return EXIT_SUCCESS;
最终代码
#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;
}