【问题标题】:struct not holding new values结构不包含新值
【发布时间】:2022-01-25 12:51:41
【问题描述】:

我正在使用 C 中的 struct 创建一个堆栈,我在 gcc 调试器中运行它,并注意到在提供 'ele' 的值后的 push() 函数中,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;
}

【问题讨论】:

  • 因为push() 只改变它所传递的结构的copy,在函数退出时被丢弃。
  • @WeatherVane 我是新手,你能告诉我如何让它保持副本吗?
  • 两个选项:使参数成为结构的指针(进行适当的更改),或return 结构并分配给调用者的变量,例如st = push(st); .首选第一个,尤其是当结构很大时。

标签: c struct stack pass-by-reference pass-by-value


【解决方案1】:

对于初学者来说,数据成员 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 );

【讨论】:

    【解决方案2】:
    void push(STACK st)
    

    需要

    void push(STACK *st)
    

    发生的情况是您正在修改 st 的副本,而不是您传递给 push 的 st。

    【讨论】:

      【解决方案3】:

      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;
          ....
          ....
      }
      

      另外,您必须在isFull() 函数中进行相关更改,该函数是从push() 调用的。将isFull() 函数更改为接收STACK 指针类型参数是个好主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        相关资源
        最近更新 更多