首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构不保存新值

结构不保存新值
EN

Stack Overflow用户
提问于 2021-12-25 14:04:04
回答 3查看 129关注 0票数 1

我正在使用C中的struct创建一个堆栈,我在gcc调试器中运行了这个堆栈,并注意到在push()函数中,在提供'ele‘值之后,arr设置为'ele’,'top‘变成0。

但是,当我退出push()时,arr又回到了垃圾值,并变为-1。为什么会发生这种事。如何使arr保持它的价值,我提供和顶部保持0。

代码语言:javascript
运行
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-25 14:20:39

首先,在此结构定义中,数据成员ele是冗余的。

代码语言:javascript
运行
复制
typedef struct
{
    int top;
    int arr[MAX];
    int ele;

} STACK;

定义如下结构

代码语言:javascript
运行
复制
typedef struct
{
    int top;
    int arr[MAX];
} STACK;

函数push按值接受其参数。

代码语言:javascript
运行
复制
void push(STACK st)

这意味着函数处理原始参数的副本。更改副本不影响用作参数的原始对象。

您需要通过引用传递结构类型的原始对象。

在C中,通过引用传递意味着通过指向对象的指针间接传递对象。

此外,在函数中,首先需要检查堆栈在输入新值之前是否已满。

因此,应该以以下方式声明和定义该函数

代码语言:javascript
运行
复制
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");
    }
}

在函数中,您需要使用

代码语言:javascript
运行
复制
st->arr[++(st->top)] = ele;

这个函数被称为

代码语言:javascript
运行
复制
push( &st );

注意函数isFull依次应该声明为

代码语言:javascript
运行
复制
int isFull( const STACK *st );
票数 1
EN

Stack Overflow用户

发布于 2021-12-25 14:09:27

代码语言:javascript
运行
复制
void push(STACK st)

需要

代码语言:javascript
运行
复制
void push(STACK *st)

正在发生的事情是,你在修改st的副本,而不是你传递到push中的st。

票数 1
EN

Stack Overflow用户

发布于 2021-12-25 14:19:28

push()函数接收st的副本并对该副本进行更改。注意,参数STACK stpush()的本地参数。您对其值所做的任何更改在push()之外都是不可用的。

STACK中传递push()结构的地址,如下所示

代码语言:javascript
运行
复制
push(&st);

push()中做相应的修改-

更改push()参数类型的原型应该是STACK指针

代码语言:javascript
运行
复制
void push(STACK * st)

push()中的其他更改将是:

代码语言:javascript
运行
复制
void push(STACK * st) {
    ....
    scanf("%d", &(st->ele));
    ....
    ....
    st->arr[++(st->top)] = st->ele;
    ....
    ....
}

此外,您还必须对isFull()函数进行相关的更改,这是从push()调用的。修改isFull()函数以接收STACK指针类型参数是个好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70480528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档