首页 > 解决方案 > 修改并返回指向结构的指针

问题描述

我正在研究一个 LIFO 堆栈结构,实现为单链表:

typedef struct spile {
    char ch;
    struct spile *address;
} Spile, *Pile;

我想编写一个推送函数,它将一个元素(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),如果我没记错的话,上面的版本会导致内存泄漏。

编辑: add_head 是这样调用的

Pile my_pile = NULL;
my_pile = add_head(my_pile, 'z');

当我说我想修改 add_head 中的参数 P 时,我的意思是 P 应该由函数返回,但其中包含新元素。

标签: cpointers

解决方案


我希望 ( add_head) 函数修改 P 而不是返回新指针。

如果要向结构中添加新元素,则需要为这个新元素分配内存。

如果这个新元素应该被添加到列表的头部,那么头部指针将改变到新的位置。

Old List with A,B,C
 ___       ___       ___       ______ 
| A | --> | B | --> | C | --> | NULL |
|___|     |___|     |___|     |______|
 Head

New List after adding element D
 ___       ___       ___       ___       ______ 
| D | --> | A | --> | B | --> | C | --> | NULL |
|___|     |___|     |___|     |___|     |______|
 Head

您编写的第二个函数(带有malloc)是必要的。


推荐阅读