我无法弄清楚为什么作为结构的迭代器对象没有设置为NULL。 这是一段代码:
void * NextItem(SLIteratorPtr iter)
{
DestroyFunction destroy = iter -> list -> destroy;
if(iter -> currentNode -> next == NULL){
iter -> currentNode -> ptrCounter--;
if (iter -> currentNode -> ptrCounter < 1){
destroy(iter -> currentNode -> value);
NodePtr temp = iter -> currentNode;
free(temp);
}
iter = NULL; // <--- HERE IT MUST BE SET TO NULL
return NULL;
}
... some other code here
}
主要打印功能:
void listPrintIter(SLIteratorPtr iterator){
int i;
while (iterator != NULL){ // <- NEVER NULL HERE, INFINITE LOOP
i = *((int *)(SLGetItem(iterator)));
SLNextItem(iterator); //<-- HERE MY ITERATOR MUST BE SET TO NULL IN THE END, BUT IT IS NOT
}
}
所以当迭代器在最后一个条目上停止并且永远不会被设置为NULL时,我遇到了错误。所以它再次进入SLNextItem并尝试做自由(临时);已被删除..因此我遇到了错误。但是iter = NULL的实际问题并没有在main中将我的迭代器设置为NULL。虽然它按预期设定值。我很迷惑。谢谢你的帮助
答案 0 :(得分:3)
为了更改调用者指针的值,您需要额外的间接级别。这是因为C本身没有“引用”。
void * NextItem(SLIteratorPtr *iter)
{
DestroyFunction destroy = (*iter) -> list -> destroy;
if((*iter) -> currentNode -> next == NULL){
(*iter) -> currentNode -> ptrCounter--;
if ((*iter) -> currentNode -> ptrCounter < 1){
destroy((*iter) -> currentNode -> value);
NodePtr temp = (*iter) -> currentNode;
free(temp);
}
*iter = NULL; // <--- HERE caller's ptr MUST BE SET TO NULL
return NULL;
}
... some other code here
}
用地址打电话。
void listPrintIter(SLIteratorPtr iterator){
int i;
while (iterator != NULL){ // <- NEVER NULL HERE, INFINITE LOOP
i = *((int *)(SLGetItem(iterator)));
SLNextItem(&iterator); //<-- HERE MY ITERATOR MUST BE SET TO NULL IN THE END, BUT IT IS NOT
}
}