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

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;