2013-03-21 126 views
0

當你有一個指針從一個指針結構指向另一個已經分配了內存的結構時,函數調用後會發生什麼?我問一個問題提早了結構,導致我問這個問題: scope of struct pointers in functions函數調用後指針會發生什麼變化

例如:

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

,然後我有數據類型結構的函數指針:

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指向什麼?

+2

代碼時,所有的警告和調試信息編譯(如:'GCC -Wall -g'在Linux上),並逐步與調試器('在Linux上gdb'),顯示相關的指針,找出。在黑板上寫下正在發生的事情。閱讀幾本很好的C編程書籍。你需要了解堆是什麼,以及'malloc'和'free'在做什麼。 – 2013-03-21 06:28:52

+0

不是很有幫助。我知道我的問題可能不是最好的措辭,但本質上我是問這個問題,因爲我不知道函數退出後指針會發生什麼,所以不能繪出它。特別是當cp-> next指向下一個節點的內存位置時,它是否在函數存在後以某種方式保存?否則,我們還有什麼可以通過鏈表? – user2122810 2013-03-21 06:32:48

回答

1

每個newNode在列表的末尾添加我們退出的功能,所以什麼 發生,當我們再次進入功能和經過鏈表來 看到它結束在哪裏?

將您的newnode添加到列表的末尾。這個指針是一個列表的一部分,不是你的函數的本地部分。所以,當你重新進入功能時,以前添加的節點仍然存在。

它怎麼知道什麼CP - > next指向?

它知道位置存儲在列表中的位置。


在動態分配上,分配的內存保持分配直到它被明確刪除。所以,你的數據的存在與指針或函數無關。

+0

Oh nvm我明白了,幾乎當我們通過鏈表時,我們將cp指針設置爲指向第一,第二,第三等節點,所以當我們位於列表中的最後一個節點時,cp-> next就像說lastnode-> next。那麼這是否意味着我們實際上是從lastnode使用指針,還是從cp指向下一個節點的下一個指針呢? – user2122810 2013-03-21 07:09:06

0

你應該記住的一件事是指針總是按引用傳遞而不是按值傳遞。 所以只要你不釋放指針的內存保持,他們仍然完好無損(小心這一點)。因此,當您重新輸入函數時,您始終可以引用已添加到鏈接列表的節點。

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

相關問題