结构不持有新值

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 stpush() 的本地参数。您对其值所做的任何更改在 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 );