Указатель на указатель не работает во время вызова функции?

Я пытаюсь написать отдельный файл с вспомогательными функциями для операций со стеком. Я хочу передать вершину стека по ссылке в качестве аргумента для операций стека из основного файла.

Поскольку top модифицируется, я передаю указатель top по ссылке. Но даже тогда это не работает. Где я ошибаюсь?

P.S.: Я знаю, что это не лучший способ реализации стека, но я просто хотел понять, почему он не работает.

//Стек.h

void print(stacknode **P)
{

    stacknode *S;
    S=*P;

    printf("Printing stack from top to bottom...\n");
    stacknode *temp=S;
    while(temp != NULL)
    {
        printf("%d\t", temp->data);
        temp=temp->next;
    }
    printf("\n");
}


void push(stacknode **P, int n)

{

    stacknode *S;
    S=*P;
    stacknode *new=(stacknode *)malloc(sizeof(stacknode));
    new->data=n;
    new->next=S; 
    S=new;
    print(&S);

}

//main.c

main()
{
    printf("Creating new stack...\n");
    stacknode *S=NULL;

    printf("Pushing first number....\n");
    push(&S, 2);

    print(&S);/*Prints nothing*/

}

person puzzledchamp    schedule 16.07.2014    source источник
comment
S=*P; делает копию *P. Назначение S не меняет *P.   -  person chris    schedule 17.07.2014
comment
Кстати: никогда не определяйте не встроенные функции в файлах заголовков, только объявляйте их там. Они принадлежат файлам реализации (.c). Кроме того, не приводить результат malloc (и друзей). В-третьих, всегда используйте полнофункциональные прототипы: не полагайтесь на неявный возвращаемый тип int.   -  person Deduplicator    schedule 17.07.2014


Ответы (1)


Поскольку top модифицируется, я передаю указатель top по ссылке.

Но вы не используете этот факт, чтобы изменить вершину. Вот одно решение (я не компилировал и не тестировал его, поэтому оно может содержать ошибки):

Stack.h: (объявления только в заголовочных файлах, без кода)

typedef struct stacknode stacknode;
struct stacknode {
    stacknode* next;
    int data;
};

void print(stacknode* top); // no need for ptr ref
void push(stacknode** ptop);

Стек.c:

#include "Stack.h"
#include <stdio.h>

void print(stacknode* top)
{
    printf("Printing stack from top to bottom...\n");
    for (stacknode* p = top; p; p = p->next)
    {
        printf("%d\t", p->data);
    }
    printf("\n");
}

void push(stacknode** ptop, int n)
{
    stacknode* p = malloc(sizeof *p); // don't cast malloc in C
    if (!p)
        /* handle out of memory */;
    p->data = n;
    p->next = *ptop; 
    *ptop = p;
    print(p);
}

основной.с:

#include "Stack.h"
#include <stdio.h>

int main(void) // declare return type
{
    printf("Creating new stack...\n");
    stacknode* S = NULL;

    printf("Pushing first number....\n");
    push(&S, 2);

    print(S);
    return 0;
}
person Jim Balter    schedule 17.07.2014
comment
Спасибо всем за помощь, я понял! - person puzzledchamp; 16.08.2014
comment
@puzzledchamp Вы должны принять мой ответ, если он соответствует вашим потребностям. - person Jim Balter; 16.08.2014