【问题标题】:Passing structure by reference in c在c中通过引用传递结构
【发布时间】:2011-06-28 20:33:49
【问题描述】:

我正在尝试使用链接列表对堆栈进行简单的动态实现。 接下来是我的代码。代码没有错误。但是,尽管我相信我通过引用传递了结构,但函数内部所做的更改并没有反映回来。 虽然我已经能够通过使用全局结构来完成这项工作,但是我在这里缺少一个非常基本的概念,所以想知道我理解错了什么以及如何在不使用的情况下将 pop 函数中所做的更改反映在 main 中全局范围。

struct stack
{
   char value;
   struct stack *next;
};

void push(char a,struct stack *s1)
{
 struct stack *s2;
 s2=(struct stack *)malloc(sizeof(struct stack));
 if(empty(s1))
 {
             s2->value=a;
             s2->next=NULL;
             s1=s2;
 }
 else
 {
     s2->value=a;
     s2->next=s1;
     s1=s2;
 }
 return;
}



int main()
{
struct stack s1;
push(c,&s1);
printf("%d",s1.value);
}

【问题讨论】:

    标签: c function structure


    【解决方案1】:

    s1=s2; 这可能不是你想要的。您正在修改堆栈的本地副本。

    试试

    void push(char a,struct stack **s1)
    {
        struct stack *s2;
        s2=(struct stack *)malloc(sizeof(struct stack));
        if(empty(*s1))
        {
             s2->value=a;
             s2->next=NULL;
             *s1=s2;
        }
        else
        {
            s2->value=a;
            s2->next=s1;
            *s1=s2;
        }
        return;
    }
    

    顺便提一下,C FAQ 中提到了它。

    正如 Richard Pennington 所提到的,您需要像这样声明 s1struct stack *s1;

    【讨论】:

    • @Richard Pennington 就在 :-)
    【解决方案2】:

    您正在按值传递指向堆栈的指针并尝试更改它。

    【讨论】:

      【解决方案3】:

      正如 cnicutar 所说,s1=s2 没有做任何有用的事情。你可能想要 *s1=*s2;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-12
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 2012-01-04
        相关资源
        最近更新 更多