c-分配给堆分配的内存



我用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指向不同的动态分配数据。指针本身具有与noden1相同的范围和存储持续时间;普通的";就像他们一样。

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_heapNULL好但即使在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所指向的数据的容器。作为术语";所有者;通常应用于指针,这是关于释放指向的数据的责任,而不是关于存储布局。释放的责任是程序中数据和控制流的问题,而不是数据本身的属性。

相关内容

  • 没有找到相关文章

最新更新