C - 循环疑问的链接列表

时间:2015-04-13 01:47:03

标签: c list dealloc

我不确定以哪种方式取消list 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 if myItem

我不确定使用for的第一个声明是否会释放所有NULL或者如果lastItem不是dealloc。 (我相信这将会发生。) 另一方面,当您分配给myItem一个{{1}}时,我不确定第二个声明是否会使一切崩溃/无法正常工作。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

请注意,两种方式都不正确。由于for循环的实现方式,您在解除分配后引用myItem。你需要写一些类似的东西:

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