作为 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;
};
head
并tail
分别指向第一个和最后一个条目。只是没有像标题这样的开销条目,而是列表中的所有数据条目,因此如果列表中只有一个条目,head
并且tail
应该指向相同的条目。此外,还有这样一个片段可以删除列表中的所有条目
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)
);
问题是内存地址current
和list->tail
指向的值之间的比较是在current
释放指针后评估的。假设current
并且list->tail
现在指向同一个内存块然后current
被释放,评估的结果是什么,更重要的是,根据您的经验,结果(无论是什么)在所有不同的编译器中都是确定性的吗?就我而言,该程序在 MSVC 中编译并正确运行,这表明内存地址current
和list->tail
指向的值在current
释放后相等。