为什么以下代码中的结构体指针“p”没有使用分配给它的“temp”值进行更新?

问题描述 投票:0回答:1
#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;       
    struct node *link;  
};

int main(int argc, char *argv[]) {
    struct node *p;
    p = NULL;
 
    Append(&p , 1); // Append adds a node to the end of linked list
    Append(&p , 2);
    Append(&p , 3);
    AddatBeginning (p, 100);
    Display(p);    // Displays Elements of Linked List
    return 0;
}

// The function AddatBeginning adds a node at the beginning of linked list 'p'
void AddatBeginning (struct node *p, int num)
{
    struct node *f, *temp = NULL;
    f = p;
    temp = (struct node *)malloc (sizeof(struct node));
    temp->data = num;
    temp->link = f;
    p=temp;
}

我在 DevC++ 中运行代码,但没有得到预期的输出 - 100, 1, 2, 3。
我得到的输出是 1,2,3.

在调试代码时,我发现表达式“p=temp;”在函数“AddatBeginning”中不起作用。 P 没有指向执行语句后 temp 所指向的位置。为什么会这样?

c pointers parameter-passing dynamic-memory-allocation singly-linked-list
1个回答
2
投票

您正在按值传递指针

p

AddatBeginning (p, 100);

这意味着该函数处理原始传递指针的副本。任何类似副本的更改

 p=temp;

保持原来的指针不变。

这是一个函数参数,它是函数的局部变量,由传递的参数的值初始化,并且在函数内处理这个单独的局部变量。

您需要通过引用传递指针

p
。在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,取消引用传递的指针,您可以直接访问原始对象,而原始对象又可以是指针。

所以该函数将如下所示

int AddatBeginning (struct node **p, int num)
{
    struct *temp = malloc( sizeof( struct node ) );
    int success = temp != NULL;

    if ( success )
    {
        temp->data = num;
        temp->link = *p;
        *p = temp;
    }

    return success;
}

并且可以这样称呼

AddatBeginning( &p, 100 );

if ( !AddatBeginning( &p, 100 ) )
{
    // error message
}

顺便说一下功能

Append

Append(&p , 1);
       ^^

通过引用接受原始指针。:)

注意被调用的函数在使用前必须在程序中声明。

© www.soinside.com 2019 - 2024. All rights reserved.