我正在编写一些 C 代码来实现基本的堆栈数据结构操作,如推送、弹出等。 我正在使用堆栈的链表实现。 在这个实现中,每次我将一个值插入卡住时,我都会创建一个新节点,并将其设置为我的链表的头节点。所以这涉及到改变头节点的引用。
void push(stack **t, int ele)
{
stack *new, *temp;
temp=*t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=*t;
*t=new;
}
如果我使用单指针编写类似的代码,那么它会是这样
void push(stack *t, int ele)
{
stack *new, *temp;
temp=t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=t;
t=new;
}
在函数中,头节点(**t)出现在赋值的所有步骤的RHS上,但这个
*t=new;
基本上第一段代码将'new'赋值给**t的指针,即*t,第二段代码将'new'赋值给*t的指针,即t。 两者似乎都只需要将指向头节点的单个指针分配为"new",但只有第一个代码有效,第二个代码实际上并不修改头节点值。
发生这种情况的原因是什么?为什么第二个代码的工作方式与第一个不同?
最佳答案
因为C中的一切都是按值传递的。因此,如果您需要为函数的参数分配一个新值,则必须添加一个间接级别。如果不这样做,您只会收到一个本地副本,因此分配给该副本的任何值都只会在函数本身内可见。
附带说明一下,不要在 C 中转换 malloc
的返回值。这是不必要的,会使您的代码困惑,并且可以隐藏允许默认 int 的编译器的错误。
在 .. 另一个边注上,而不是写这样的东西:
new_stack = malloc(sizeof(stack));
改用这个:
new_stack = malloc(sizeof(*new_stack));
现在,即使 new_stack
的类型发生变化,您也不会遇到任何问题。
关于c - 为什么我们在 C 中传递 Structure 参数时使用双指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15667028/