将双指针传递给函数并为其指定函数本地指针的地址

时间:2017-10-21 14:20:53

标签: c pointers

下面是一些将双指针传递给函数的代码。然后为双指针分配在函数中创建的指针的地址。当我打印出存储在双指针中的地址时,它会打印出NULL,这是我在将双指针传递给函数之前最初给出的值。

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int value;
};

void append( struct node **nodePtr );

int main()
{
    struct node **nodePtr = NULL;

    append( nodePtr );
    printf("\nnodePtr = %p", nodePtr);

    return 0;
}

void append( struct node **nodePtr )
{
    // creating new node
    struct node *currentNode = malloc(sizeof(struct node));

    // assigning the address of currentNode to the double pointer NodePtr
    nodePtr = &currentNode;

    printf("\n&currentNode = %p", &currentNode);
}

This is the result I get when I run the code

我知道如果将指针传递给函数,它将通过引用传递,这意味着当您访问函数外部的指针时,对函数中指针所做的任何更改都不会消失。

我的问题是,为什么我不能访问函数外的currentNode的地址。我把它分配给一个双指针,所以我应该可以在函数旁边访问它?正确?

以上已经回答

感谢您的答案保罗,它完美无缺。我试图扩展到代码。我想将nodePtr分配给名为 head 的结构指针。当我调用该函数时,我想将currentNode中的地址存储到头指针中。

最初,我认为更改下面显示的功能中的代码是可行的。

*nodePtr = currentNode;

但这不起作用,因为我只是在更改nodePtr中的内容而不是head中的内容。

然后我尝试将nodePtr初始化为head的地址。

struct node *nodePtr = &head;

但这不起作用,因为它不是双指针。如果我将它初始化为双指针,我就会遇到与之前相同的问题。

下面是我目前所有的代码

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int value;
};

void append( struct node **nodePtr );

int main()
{
    struct node *head = NULL;
    struct node *nodePtr = head;

    append( &nodePtr );

    printf("%p", head);
    return 0;
}

void append( struct node **nodePtr )
{
    // creating new node
    struct node *currentNode = malloc(sizeof(struct node));

    // assigning the address of currentNode to the double pointer NodePtr
    *nodePtr = currentNode;
}

2 个答案:

答案 0 :(得分:0)

你的主要应该是:

int main()
{
    struct node *nodePtr = NULL;

    append( &nodePtr );
    printf("\nnodePtr = %p", nodePtr);

    return 0;
}

所以你从main传递了nodePtr的地址

在附加中,您现在必须取消引用该指针:

    // assigning the newly allocated currentNode to the double pointer NodePtr
    *nodePtr = currentNode;

(所以不要设置局部变量currentNode的地址,因为在函数返回后该局部变量将不复存在。你分配malloc返回的指针。)

我建议您使用笔和纸来绘制mainappend的内存,并绘制指针以查看正在发生的事情以及存储在哪里。

答案 1 :(得分:0)

如果你坚持使用双指针,你需要在函数中传递一个三重指针。

在您的代码中,更改是在函数内部执行的,但它们在终止后不会持续存在。

但是,您并不需要在main()中使用双指针,只需使用单个指针,并保持该功能不变。