函数调用后指针会发生什么

时间:2013-03-21 06:27:04

标签: c pointers linked-list function-pointers

当您从一个指针结构点指向另一个已分配内存的结构时,在函数调用之后会发生什么?我之前问了一个关于结构的问题,这些结构引导我提出这个问题: 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->接下来指向的?

2 个答案:

答案 0 :(得分:1)

  

在列表末尾添加的每个newNode我们退出函数所以   当我们重新进入函数并通过链表时,就会发生这种情况   看看它在哪里结束了?

您的newnode已添加到列表的末尾。此指针是列表的一部分,不是您的函数的本地。因此,当您重新进入该功能时,之前添加的节点仍然存在。

  

它如何知道cp->接下来指向什么?

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


在动态分配时,分配的内存保持分配状态,直到明确删除为止。因此,数据的存在与指针或函数无关。

答案 1 :(得分:0)

你应该记住的一件事是指针总是通过引用传递而不是传递值。 因此,只要您没有通过指针释放内存,它们就会保持不变(请注意这一点)。因此,您可以在重新输入函数时始终引用已添加到链接列表的节点。

但是当你的程序退出或者你不需要它们时,你应该释放所有已分配的指针。