释放动态分配的数组是否与释放链表相同?
Is freeing a dynamically allocated array same as freeing a linked list?
假设我有一个如下所示的结构:
typedef struct node{
char **word_ptrs;
int value;
struct node *next;
} Node;
并且我已经为链表动态分配了空间,以及这个结构中的 word_ptrs。
例如:
Node *head = malloc(sizeof(Node)); // not important, what I care is not this node.
head->word_ptrs = malloc(10 * sizeof(Node)); // I care about this.
我的问题是:我知道如何释放链表,但是当我尝试释放动态分配的数组时,我感到很困惑。当我尝试释放上面的数组时,我应该直接释放整个数组吗?或者我应该释放该数组中的每个字符 *?
谢谢。
您应该只将 malloc
返回的内容传递给 free
。
在这种情况下,您为 char *
的数组分配了一次,因此您执行了一次 free
来清理它。此外,您分配的 space 数量是 10 * sizeof(Node)
,但它应该是 10 * sizeof(char *)
。
这取决于这些指针的来源以及它们的所有者。
如果它们是动态分配的并且节点拥有它们,那么您应该在释放数组之前释放它们。
如果它们是动态分配的但在别处拥有,它们各自的所有者应该稍后释放它们。
如果它们不是动态分配的,则根本不能释放它们。
如果你同时拥有这三者,那你就有麻烦了。
您还应该使用 sizeof(char*)
或 sizeof(*head->word_ptrs)
分配它,而不是 sizeof(Node)
。
虽然,如果大小总是十,你也可以使用数组:
typedef struct node{
char *word_ptrs[10];
int value;
struct node *next;
} Node;
假设我有一个如下所示的结构:
typedef struct node{
char **word_ptrs;
int value;
struct node *next;
} Node;
并且我已经为链表动态分配了空间,以及这个结构中的 word_ptrs。
例如:
Node *head = malloc(sizeof(Node)); // not important, what I care is not this node.
head->word_ptrs = malloc(10 * sizeof(Node)); // I care about this.
我的问题是:我知道如何释放链表,但是当我尝试释放动态分配的数组时,我感到很困惑。当我尝试释放上面的数组时,我应该直接释放整个数组吗?或者我应该释放该数组中的每个字符 *?
谢谢。
您应该只将 malloc
返回的内容传递给 free
。
在这种情况下,您为 char *
的数组分配了一次,因此您执行了一次 free
来清理它。此外,您分配的 space 数量是 10 * sizeof(Node)
,但它应该是 10 * sizeof(char *)
。
这取决于这些指针的来源以及它们的所有者。
如果它们是动态分配的并且节点拥有它们,那么您应该在释放数组之前释放它们。
如果它们是动态分配的但在别处拥有,它们各自的所有者应该稍后释放它们。
如果它们不是动态分配的,则根本不能释放它们。
如果你同时拥有这三者,那你就有麻烦了。
您还应该使用 sizeof(char*)
或 sizeof(*head->word_ptrs)
分配它,而不是 sizeof(Node)
。
虽然,如果大小总是十,你也可以使用数组:
typedef struct node{
char *word_ptrs[10];
int value;
struct node *next;
} Node;