我正在使用C中的struct创建一个堆栈,我在gcc调试器中运行了这个堆栈,并注意到在push()函数中,在提供'ele‘值之后,arr设置为'ele’,'top‘变成0。
但是,当我退出push()时,arr又回到了垃圾值,并变为-1。为什么会发生这种事。如何使arr保持它的价值,我提供和顶部保持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;
}
发布于 2021-12-25 06:20:39
首先,在此结构定义中,数据成员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");
}
}
在函数中,您需要使用
st->arr[++(st->top)] = ele;
这个函数被称为
push( &st );
注意函数isFull依次应该声明为
int isFull( const STACK *st );
发布于 2021-12-25 06:09:27
void push(STACK st)
需要
void push(STACK *st)
正在发生的事情是,你在修改st的副本,而不是你传递到push中的st。
发布于 2021-12-25 06:19:28
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
指针类型参数是个好主意。
https://stackoverflow.com/questions/70480528
复制