Я работаю над структурой стека LIFO, реализованной в виде односвязного списка:
typedef struct spile {
char ch;
struct spile *address;
} Spile, *Pile;
, и я хочу закодировать функцию push, которая добавляет элемент (char) в начало списка.
Почему что-то подобное приводит к дампу ядра:
Pile add_head (Pile P, char c) {
P->address = P;
P->ch = c;
return P ;
}
Хотя работает аналогичная функция (на этот раз удаляется элемент head)?
Pile remove_head (Pile P) {
P = P->adress;
return P;
}
Я знаю, что могу справиться с этим так:
#define MALLOC(t) ((t*)malloc(sizeof(t)))
Pile add_head (Pile P, char c) {
Pile P1 = MALLOC(Spile);
P1->address = P;
P1->ch = c;
return P1;
}
, но я бы хотел, чтобы функция модифицировала P, а не возвращала новый указатель.Более того, поскольку я нигде не освобождаю (P1), приведенная выше версия приводит к утечке памяти, если я не ошибаюсь.
edit: add_head называется так
Pile my_pile = NULL;
my_pile = add_head(my_pile, 'z');
КогдаЯ говорю, что хотел бы изменить параметр P в add_head. Я имею в виду, что функция P должна возвращаться, но с новым элементом в ней.