簡體   English   中英

函數調用后指針會發生什么

[英]What happens to pointers after function call

當一個指針從一個指針結構點指向另一個分配了內存的結構時,函數調用后會發生什么? 之前我問了一個有關結構的問題,這導致我提出這個問題: 函數中結構指針的范圍

例如:

struct example{
//variables and pointers
struct clip *next;
}*Head

然后我在函數中有一個數據類型為struct的指針:

struct example *newNode=malloc(sizeof(struct example));

在同一函數中,我將第一個節點(頭)鏈接到第二個節點(新節點):

Head->next=newNode;

功能退出后,鏈接/指向是否仍然有效? 我不確定這是否有意義,但是當您在鏈表的末尾添加一個新節點時,您必須首先檢查鏈表以了解它的結尾(下一個指針= NULL)。

例如:

void insert_at_end(){
//We have a pointer cp that goes through the linked list, initially cp->next points to `null so we create a newnode right away`
//struct example cp and newnode gets malloc'd here

if(Head != NULL){
cp=Head;
while(cp->next !=NULL){
cp=cp->next;
}
cp->next=newNode;
else{

//We link the head to the newNode `because we don't want to change the head for each new node added.`
head=newNode;
}
}

但是在列表末尾添加每個newNode之后,我們退出該函數,那么當我們重新進入該函數並瀏覽鏈表以查看其結束位置時會發生什么? 它怎么知道cp-> next指向什么?

在列表末尾添加的每個newNode都會退出該函數,那么當我們重新進入該函數並瀏覽鏈表以查看其結束時會發生什么呢?

您的新newnode將添加到列表的末尾。 該指針是列表的一部分,而不是函數的局部指針。 因此,當您重新輸入該功能時,先前添加的節點仍然存在。

它怎么知道cp-> next指向什么?

它知道在列表中存儲該位置時所指向的位置。


動態分配時,分配的內存將保持分配狀態,直到將其顯式刪除為止。 因此,數據的存在與指針或函數無關。

您應該記住的一件事是,指針總是按引用傳遞,而不是按值傳遞。 因此,只要您不釋放指針所占用的內存,它們就將保持完整(請注意這一點)。 因此,當您重新輸入該功能時,您始終可以參考已添加到鏈表中的節點。

但是,當程序退出或不需要它們時,應釋放所有分配的指針。

暫無
暫無

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

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