修改并返回指向结构的指针

时间:2018-10-21 22:22:04

标签: c pointers

我正在研究LIFO堆栈结构,该结构以单链列表的形式实现:

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

我想编写一个将元素(char)添加到列表开头的push函数。

为什么这样会导致核心转储:

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应该由函数返回,但其中应包含新元素。

1 个答案:

答案 0 :(得分:0)

  

我希望(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编写的第二个函数是必需的。