分配给堆分配的内存
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
指向不同的动态分配数据。指针本身具有与 node
和 n1
相同的范围和存储持续时间,并且与它们一样“普通”。
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 是程序中数据和控制流的问题,而不是数据本身的属性
我正在用 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
指向不同的动态分配数据。指针本身具有与 node
和 n1
相同的范围和存储持续时间,并且与它们一样“普通”。
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 beNULL
as well. But even aftern1->next = NULL;
,n_heap
is still2->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 locatednode->next
, and then1->next
now set toNULL
?
是也不是。同样,n_heap
指定的对象和 node->next
指定的对象都不包含您描述为 2->3->4->NULL
的数据。相反,它们都包含包含第一个值的节点的 地址 。
Does this mean
node
wasn't initially the owner ofnode->next
data?
这取决于您所说的“所有者”是什么意思。当然,node
和 *node
都不是 node->next
指向的数据的 容器 。由于术语“所有者”通常应用于指针,它是关于释放指向数据的责任,而不是关于存储布局。 Responsible to free 是程序中数据和控制流的问题,而不是数据本身的属性