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 是否不会被释放。 (我相信这会发生。)
另一方面,我不确定当您分配给 NULL
a 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;
}
我不确定以何种方式释放我的 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 是否不会被释放。 (我相信这会发生。)
另一方面,我不确定当您分配给 NULL
a myItem
.
这两个程序都有未定义的行为,因为您在 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;
}