提问人:Anim 提问时间:12/25/2021 最后编辑:Vlad from MoscowAnim 更新时间:12/25/2021 访问量:482
struct 不保留新值
struct not holding new values
问:
我在 C 中使用结构制作一个堆栈,我在 gcc 调试器中运行了它,并注意到在 push() 函数中,在提供“ele”的值后,arr[0] 设置为“ele”,而“top”变为 0。
但是一旦我退出 push(),arr[0] 就会再次返回垃圾值,top 变为 -1。为什么会这样。如何使 arr[0] 保持我提供的值并保持 0。
#include <stdio.h>
#define MAX 10
typedef struct
{
int top;
int arr[MAX];
int ele;
} STACK;
void push(STACK st)
{
printf("Enter element ");
scanf("%d", &st.ele);
if (!isFull(st))
{
st.arr[++(st.top)] = st.ele;
}
else
{
printf("****Stack is full****\n");
}
}
int main()
{
STACK st;
st.top = -1;
int choice;
for (;;)
{
printf("Stack elements : \n");
printf("Enter choice \n");
printf("1.Push\n2.Pop\n3.Display\n4.Peek Top element\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
push(st);
break;
}
}
return 0;
}
答:
1赞
shrewmouse
12/25/2021
#1
void push(STACK st)
需要
void push(STACK *st)
发生的事情是,您正在修改 st 的副本,而不是您传递到 push 中的 st。
1赞
H.S.
12/25/2021
#2
该函数正在接收该副本的副本并对其进行更改。请注意,参数是 的本地参数。您对其值所做的任何更改都将在 之外不可用。push()
st
STACK st
push()
push()
将结构的地址传入 ,如下所示STACK
push()
push(&st);
在push()
-
更改 [参数类型应为指针] 的原型:push()
STACK
void push(STACK * st)
其他变化将是:push()
void push(STACK * st) {
....
scanf("%d", &(st->ele));
....
....
st->arr[++(st->top)] = st->ele;
....
....
}
此外,您必须对函数进行相关更改,该函数从 调用。最好使更改函数接收指针类型参数。isFull()
push()
isFull()
STACK
1赞
Vlad from Moscow
12/25/2021
#3
对于初学者来说,数据成员在此结构定义中是多余的ele
typedef struct
{
int top;
int arr[MAX];
int ele;
} STACK;
定义结构,如
typedef struct
{
int top;
int arr[MAX];
} STACK;
函数 push 按值接受其参数
void push(STACK st)
这意味着该函数处理原始参数的副本。更改副本不会影响用作参数的原始对象。
您需要通过引用传递结构类型的原始对象。
在 C 语言中,通过引用传递意味着通过指向对象的指针间接传递对象。
此外,在函数中,您需要在输入新值之前首先检查堆栈是否已满。
因此,函数应按以下方式声明和定义
void push( STACK *st )
{
if (!isFull( st))
{
printf("Enter element ");
int ele;
if ( scanf("%d", &ele ) == 1 )
{
st->arr[++(st->top)] = ele;
}
else
{
puts( "****i/o error occured****" );
}
}
else
{
printf("****Stack is full****\n");
}
}
在函数中,您需要 wirte
st->arr[++(st->top)] = ele;
该函数的调用方式如下
push( &st );
注意函数 isFull 依次声明如下
int isFull( const STACK *st );
评论
push()
return
st = push(st);