我用C编写了一个单链表,无法理解下面的代码。
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
int main() {
/*Say I allocate this list to say 1->2->3->4->NULL*/
ListNode* node = malloc(sizeof(ListNode));
ListNode* n1 = node; // An ordinary pointer
ListNode* n_heap = malloc(sizeof(ListNode)); // A heap allocated pointer
n_heap = node->next; // 2->3->4->NULL
n1->next = NULL;
}
现在从上面的例子中,我假设n_heap
也是NULL
。但即使在n1->next = NULL;
之后,n_heap
仍然是2->3->4->NULL
。那么node->next
是否复制到n_heap
?还是n_heap
现在指向位于node->next
的原始堆,而n1->next
现在设置为NULL
?这是否意味着node
最初不是node->next
数据的所有者?
int main() { /*Say I allocate this list to say 1->2->3->4->NULL*/ ListNode* node = malloc(sizeof(ListNode));
node
是指向动态分配数据的指针。在具有堆栈/堆区别的C实现中,它将在堆上。
ListNode* n1 = node; // An ordinary pointer
n1
现在指向与node
相同的动态分配数据。它或多或少是";普通的";而CCD_ 17是
ListNode* n_heap = malloc(sizeof(ListNode)); // A heap allocated pointer
(成功时(n_heap
指向不同的动态分配数据。指针本身具有与node
和n1
相同的范围和存储持续时间;普通的";就像他们一样。
n_heap = node->next; // 2->3->4->NULL
现在n_heap
之前指向的内存泄漏,因为没有指向它的指针。CCD_ 22指向与CCD_ 23相同的存储器。与n1->next
的内存相同。
n1->next = NULL;
现在,可作为n1->next
(以及node->next
(访问的指针对象的值设置为NULL。这对指针对象先前指向的数据没有影响,也对仍然指向有问题数据的变量n_heap
没有影响。
}
现在从上面的例子中,我假设
n_heap
是NULL
好但即使在n1->next = NULL;
之后,n_heap
仍然是2->3->4->NULL
。
您无法区分指针对象和它们的值所指向的对象。将NULL
分配给n1->next
将设置一个指针对象的值。它对旧指针值所指向的对象没有任何作用。它对指向同一对象的其他不同指针没有任何作用。另一方面,n_heap
不是2->3->4->NULL
,它是一个不同于所有节点的指针,的值指向包含2
的节点。
节点也是如此->下一次复制到n_heap?
是的,这就是作业的作用,但不是我认为你的意思。同样,分配n_heap = node->next
将存储在node->next
中的指针值复制到n_heap
。然后,这两个不同的指针对象都包含指向相同数据的值。
还是
n_heap
现在指向到位于node->next
的原始堆,并且n1->next
现在设置为NULL
?
是和否。同样,n_heap
指定的对象和node->next
指定的对象都不包含您描述为2->3->4->NULL
的数据。相反,它们都包含包含第一个值的节点的地址。
这是否意味着
node
最初不是node->next
的所有者数据
这取决于你所说的";所有者";。当然,node
和*node
都不是node->next
所指向的数据的容器。作为术语";所有者;通常应用于指针,这是关于释放指向的数据的责任,而不是关于存储布局。释放的责任是程序中数据和控制流的问题,而不是数据本身的属性。