c - 为什么我们在 C 中传递 Structure 参数时使用双指针?

标签 c pointers linked-list

我正在编写一些 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/

相关文章:

c++ - 在 C/C++ 中,是否有类似于 #ifndef 的指令用于 typedef?

c - 调用 strtok() 后释放内存导致错误

c - 如何使用leaks命令行工具查找内存泄漏?

c - EXC_BAD_ACCESS 与结构

java - 找到两个链表的交点?

c - 如何用C语言制作可遍历的树数据结构

c++ - 为什么 std::accumulate 对于标准数组会有这样的行为?

c++ - 函数指针寻址具有多个参数的函数

c - 打印多维数组内容时出现段错误

java - 你什么时候知道什么时候使用 TreeSet 或 LinkedList?