繁体   English   中英

释放动态分配的数组是否与释放链表相同?

[英]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.

我的问题是:我知道如何释放链表,但是当我尝试释放动态分配的数组时,我感到困惑。 当我尝试释放上面的数组时,是否应该直接释放整个数组? 还是我应该释放该数组中的每个单个char *?

谢谢。

您应该只free malloc返回的内容。

在这种情况下,您为char *数组进行了一次分配,因此您可以一次free地清理它。 另外,您分配的空间量为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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM