结构不持有新值
struct not holding new values
我在 C 中使用 struct 创建堆栈,我在 gcc 调试器中 运行 this 并注意到在 push() 函数中提供 'ele' 的值后 arr[0]设置为 'ele' 并且 'top' 变为 0.
但是,一旦我退出 push(),arr[0] 就会再次回到垃圾值,并且 top 会变成 -1。为什么会这样。如何使 arr[0] 保持我提供的值并使 top 保持为 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;
}
void push(STACK st)
需要
void push(STACK *st)
发生的事情是您正在修改 st 的副本,而不是您传递给 push 的 st。
push()
函数正在接收 st
的副本并在该副本中进行更改。请注意,参数 STACK st
是 push()
的本地参数。您对其值所做的任何更改在 push()
.
之外将不可用
在push()
中传递STACK
结构体的地址,像这样
push(&st);
在push()
-
中进行相关修改
更改push()
的原型[参数类型应为STACK
指针]:
void push(STACK * st)
push()
中的其他变化是:
void push(STACK * st) {
....
scanf("%d", &(st->ele));
....
....
st->arr[++(st->top)] = st->ele;
....
....
}
此外,您还必须对从push()
调用的isFull()
函数进行相关更改。最好更改 isFull()
函数以接收 STACK
指针类型参数。
对于初学者来说,数据成员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 );
我在 C 中使用 struct 创建堆栈,我在 gcc 调试器中 运行 this 并注意到在 push() 函数中提供 'ele' 的值后 arr[0]设置为 'ele' 并且 'top' 变为 0.
但是,一旦我退出 push(),arr[0] 就会再次回到垃圾值,并且 top 会变成 -1。为什么会这样。如何使 arr[0] 保持我提供的值并使 top 保持为 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;
}
void push(STACK st)
需要
void push(STACK *st)
发生的事情是您正在修改 st 的副本,而不是您传递给 push 的 st。
push()
函数正在接收 st
的副本并在该副本中进行更改。请注意,参数 STACK st
是 push()
的本地参数。您对其值所做的任何更改在 push()
.
在push()
中传递STACK
结构体的地址,像这样
push(&st);
在push()
-
更改push()
的原型[参数类型应为STACK
指针]:
void push(STACK * st)
push()
中的其他变化是:
void push(STACK * st) {
....
scanf("%d", &(st->ele));
....
....
st->arr[++(st->top)] = st->ele;
....
....
}
此外,您还必须对从push()
调用的isFull()
函数进行相关更改。最好更改 isFull()
函数以接收 STACK
指针类型参数。
对于初学者来说,数据成员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 );