[英]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 = ¤tNode;
printf("\n¤tNode = %p", ¤tNode);
}
我知道,如果將指針傳遞給函數,則它是通過引用傳遞的,這意味着您在函數外部訪問指針時,對函數中的指針所做的任何更改都不會消失。
我的問題是,為什么我不能訪問函數外部的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
返回的指針。)
我建議您使用筆和紙來繪制main
和append
的內存,並繪制指針以查看發生了什么以及將什么存儲在何處。
如果您堅持使用雙指針,則需要在函數中傳遞一個三指針。
在您的代碼中,更改是在函數內部執行的,但是在終止后它們不會繼續存在。
但是,您實際上並不需要在main()
使用雙指針,只需使用單個指針,然后將函數保持原樣即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.