假设我有一个看起来像这样的结构:
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 *?
谢谢。
答案 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;