1

当您有一个从一个指针结构指向另一个已分配内存的结构的指针时,函数调用后会发生什么?我之前问过一个关于结构的问题,导致我提出这个问题: 函数中结构指针的范围

例如:

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

4

2 回答 2

1

在列表末尾添加的每个 newNode 我们退出函数,那么当我们重新进入函数并通过链表查看它在哪里结束时会发生什么?

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

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

它知道该指向的位置,因为该位置存储在您的列表中。


在动态分配中,分配的内存保持分配状态,直到它被显式删除。因此,您的数据的存在与指针或函数无关。

于 2013-03-21T06:32:36.823 回答
0

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

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

于 2013-03-21T06:37:30.700 回答