分配给堆分配的内存

Assignment to Heap Allocated Memory

我正在用 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 相同的 dynamically-allocated 数据。它不比 node 更“普通”。

  ListNode* n_heap = malloc(sizeof(ListNode)); // A heap allocated pointer

(On success) n_heap 指向不同的动态分配数据。指针本身具有与 noden1 相同的范围和存储持续时间,并且与它们一样“普通”。

  n_heap = node->next; // 2->3->4->NULL

现在 n_heap 先前指向的内存已泄漏,因为没有指针指向它。 n_heap 指向与 node->next 相同的内存。这与 n1->next 的内存相同。

  n1->next = NULL;

现在 pointer 对象的值被设置为 NULL。这对指针对象先前指向的 数据 和仍然指向相关数据的变量 n_heap 没有影响。

}

Now from the above example, I had assumed that n_heap to be NULL as well. But even after n1->next = NULL;, n_heap is still 2->3->4->NULL.

您无法区分指针对象和它们的值所指向的对象。将 NULL 赋值给 n1->next 设置一个指针对象的值。它对旧指针值指向的对象没有任何作用。它对指向同一对象的其他不同指针没有任何作用。另一方面,n_heap 不是 2->3->4->NULL,它是一个不同于所有那些节点的指针,其值 指向包含 2.

的节点

So is the node->next copied to n_heap?

是的,这就是作业的作用,但不是我认为您的意思。同样,分配 n_heap = node->next 会将存储在 node->next 中的指针值复制到 n_heap。这两个不同的指针对象然后都包含指向相同数据的值。

or is it that n_heap now points to the original heap located node->next, and the n1->next now set to NULL?

是也不是。同样,n_heap 指定的对象和 node->next 指定的对象都不包含您描述为 2->3->4->NULL 的数据。相反,它们都包含包含第一个值的节点的 地址

Does this mean node wasn't initially the owner of node->next data?

这取决于您所说的“所有者”是什么意思。当然,node*node 都不是 node->next 指向的数据的 容器 。由于术语“所有者”通常应用于指针,它是关于释放指向数据的责任,而不是关于存储布局。 Responsible to free 是程序中数据和控制流的问题,而不是数据本身的属性