gpt4 book ai didi

c - 列表,C中指针和语义的命名别名

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:28 24 4
gpt4 key购买 nike

作为我的 C 编程语言项目的一部分,我一直在处理列表。仅供引用,条目和列表的结构是非常基本的数据结构并按此定义

typedef struct entry entry_t;
typedef struct list list_t;

struct entry
{
void * data;
entry_t * next;
};

struct list
{
size_t size;
entry_t * head;
entry_t * tail;
};

headtail 分别指向第一个和最后一个条目。只是没有header这样的开销条目,而是list中的所有数据条目,所以如果list中只有一个条目,headtail应该指向同一个。此外,还有这样一个片段可以删除列表中的所有条目

list_t list;
entry_t * current, * next;
for(
current=list->head,
next=current->next,
free(current);
current!=list->tail;
current=next,
next=current->next,
free(current)
);

问题是内存地址 currentlist->tail 指向的值之间的比较是在 current 指针被释放后计算的.假设 currentlist->tail 现在指向同一个内存块,然后 current 被释放,评估的结果是什么更重要的是,根据您的经验,结果(无论是什么)在所有不同的编译器中都是确定性的吗?在我的例子中,程序在 MSVC 中编译并正确运行,它表示内存地址 currentlist->tail 指向的值在 current< 之后相等 被释放。

最佳答案

此时这并不重要,但如果您要清除列表,请原谅显而易见的问题,但谁在乎尾部(或大小)是什么。反正它们都快要失效了。为什么不简单地:

// assuming list is a valid
list_t* list;

while (list->head)
{
entry_t *tmp = list->head;
list->head = list->head->next;
free(tmp);
}
list->head = list->tail = NULL;
list->size = 0;

关于c - 列表,C中指针和语义的命名别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13473278/

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