Передача структуры по ссылке в c - PullRequest
0 голосов
/ 29 июня 2011

Я пытаюсь сделать простую динамическую реализацию стека, используя список ссылок. Далее мой код. Код не имеет ошибок. Но изменения, сделанные внутри функции, не отражаются обратно, хотя я полагаю, что передаю структуру по ссылке. Хотя я смог сделать эту работу, используя глобальную структуру, но здесь я упускаю очень простую концепцию, поэтому хотел знать, что я неправильно понимаю, и как я могу отразить изменения, сделанные в функции 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);
}

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

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 .

Как РичардПеннингтон упоминает, что вам нужно объявить s1 примерно так: struct stack *s1;.

0 голосов
/ 29 июня 2011

Как сказал cnicutar, s1 = s2 не делает ничего полезного. Вы, вероятно, хотите * s1 = * s2;

0 голосов
/ 29 июня 2011

Вы передаете указатель в стек по значению и пытаетесь его изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...