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

时间:2019-02-14 11:34:13

标签: c free

假设我有一个看起来像这样的结构:

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 *?

谢谢。

2 个答案:

答案 0 :(得分:1)

您应仅将free返回的内容传递给malloc

在这种情况下,您为char *数组进行了一次分配,因此您执行了一个free来清理它。另外,您分配的空间量为10 * sizeof(Node),但应为10 * sizeof(char *)

答案 1 :(得分:1)

这取决于这些指针来自何处以及谁拥有它们。

如果它们是动态分配的,并且节点拥有它们,那么应该在释放数组之前释放它们。
如果它们是动态分配的,但在其他地方拥有,则其各自的所有者应稍后释放它们。
如果没有动态分配它们,则完全不能释放它们。
如果您将这三者结合起来,那就麻烦了。

您还应该使用sizeof(char*)sizeof(*head->word_ptrs)而不是sizeof(Node)进行分配。

尽管,如果大小始终为十,则最好使用一个数组:

typedef struct node{
    char *word_ptrs[10];
    int value;
    struct node *next;
} Node;