簡體   English   中英

將雙指針傳遞給函數並為其分配函數本地指針的地址

[英]passing a double pointer into a function and assigning it an address of a pointer local to a function

下面是一些將雙指針傳遞給函數的代碼。 然后,為雙指針分配在函數中創建的指針的地址。 當我打印出存儲在雙指針中的地址時,它會打印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);
}

這是我運行代碼時得到的結果

我知道,如果將指針傳遞給函數,則它是通過引用傳遞的,這意味着您在函數外部訪問指針時,對函數中的指針所做的任何更改都不會消失。

我的問題是,為什么我不能訪問函數外部的currentNode地址。 我將其分配給一個雙指針,所以我應該能夠在功能之外訪問它? 對?

上面已經回答了

感謝您的回答paul,它運作良好。 我試圖擴展到代碼上。 我想將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;
}

您的主要對象應該是:

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的內存,並繪制指針以查看發生了什么以及將什么存儲在何處。

如果您堅持使用雙指針,則需要在函數中傳遞一個三指針。

在您的代碼中,更改是在函數內部執行的,但是在終止后它們不會繼續存在。

但是,您實際上並不需要在main()使用雙指針,只需使用單個指針,然后將函數保持原樣即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM