gpt4 book ai didi

c - 与 memset 链接销毁

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:45 25 4
gpt4 key购买 nike

我在我买的一本关于算法的书中找到了这个。

我想知道是否允许通过C99标准像这样销毁链表还是有任何约定说这是愚蠢的?

void list_destroy(List *list) {
void *data;
while (list_size(list) > 0) {
if (list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy != NULL) {
list->destroy(data);
}
}
memset(list, 0, sizeof(List));
return;
}

为什么会这样?我学会了用 free() 释放分配的内存?

最佳答案

我不确定是什么让您失望,所以让我们讨论一下该代码。

while (list_size(list) > 0) 

当列表中有项目时,我们重复以下 block 。我看起来并不异常。那么让我们继续吧。

if (list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy != NULL) {

好的,函数 list_rem_next 被调用。我只能猜测它做了什么,但很可能它从列表中删除了一些元素并将此删除元素的 data 存储到 data 变量中。

接下来我们检查list->destroy是否不为空。显然这是一个可以释放数据结构的函数指针。 (因此,如果列表中的项目是 malloc 的,这将指向 free)

list->destroy(data);

如果这是一个有效的指针,则执行该函数并将数据传递给销毁。

memset(list, 0, sizeof(List));

最后,list 结构被归零。有点奇怪,但为什么不呢。这只是将 0 从 list 写入第三个参数指定的字节数。

关于c - 与 memset 链接销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com