struct 不保留新值

struct not holding new values

提问人:Anim 提问时间:12/25/2021 最后编辑:Vlad from MoscowAnim 更新时间:12/25/2021 访问量:482

问:

我在 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;
}

C 结构 堆栈 按引用传递

评论

0赞 Weather Vane 12/25/2021
因为只更改了它传递的结构的副本,该副本在函数退出时被丢弃。push()
0赞 Anim 12/25/2021
@WeatherVane我是新手,你能告诉如何让它容纳副本吗?
1赞 Weather Vane 12/25/2021
两个选项:使参数成为指向结构的指针(进行适当的更改),或者将结构体并分配给调用方的变量,例如 。首选第一种,尤其是当结构体很大时。returnst = push(st);

答:

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()stSTACK stpush()push()

将结构的地址传入 ,如下所示STACKpush()

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 );