当您从一个指针结构点指向另一个已分配内存的结构时,在函数调用之后会发生什么?我之前问了一个关于结构的问题,这些结构引导我提出这个问题: 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->接下来指向的?
答案 0 :(得分:1)
在列表末尾添加的每个newNode我们退出函数所以 当我们重新进入函数并通过链表时,就会发生这种情况 看看它在哪里结束了?
您的newnode
已添加到列表的末尾。此指针是列表的一部分,不是您的函数的本地。因此,当您重新进入该功能时,之前添加的节点仍然存在。
它如何知道cp->接下来指向什么?
它知道位置存储在列表中的位置。
在动态分配时,分配的内存保持分配状态,直到明确删除为止。因此,数据的存在与指针或函数无关。
答案 1 :(得分:0)
你应该记住的一件事是指针总是通过引用传递而不是传递值。 因此,只要您没有通过指针释放内存,它们就会保持不变(请注意这一点)。因此,您可以在重新输入函数时始终引用已添加到链接列表的节点。
但是当你的程序退出或者你不需要它们时,你应该释放所有已分配的指针。