C - 循环疑惑的链表

C - linked-lists for loop doubts

我不确定以何种方式释放我的 list of Item。每个 list 都有第一个和最后一个项目,每个 item 都链接到一个 nextItem 直到它为空。

for(myItem=list.firstItem; myItem!=list.lastItem; myItem=myItem->nextItem)
    dealloc(myItem);

for(myItem=list.firstItem; myItem!=NULL; myItem=myItem->nextItem)
    dealloc(myItem);

myItem->nextItem = NULL 如果 myItem=list.lastItem.

我不确定使用 for 的第一个声明是否会释放所有 myItem 或 lastItem 是否不会被释放。 (我相信这会发生。) 另一方面,我不确定当您分配给 NULLa myItem.

时,第二个声明是否会使所有 crash/not 正常工作

这两个程序都有未定义的行为,因为您在 myItem 指针被释放后取消引用它。这是不允许的,可能会使您的程序崩溃。

释放链表的正确方法是使用 while 循环,当您首先获得 next 指针时,然后才释放节点:

ItemNode *myItem = list.firstItem;
while (myItem != NULL) {
    ItemNode *tmp = myItem;
    myItem = myItem->nextNode;
    dealloc(tmp);
}

请注意,这两种方式都不正确。由于 for 循环的实现方式,您在 myItem 被释放后引用它。你需要这样写:

for(myItem=list.firstItem; myItem!=NULL; ) {
    nextItem = myItem->nextItem
    dealloc(myItem);
    myItem = nextItem;
}