C编程。结构永远不会设置为NULL,为什么?

时间:2014-09-28 18:08:30

标签: c

我无法弄清楚为什么作为结构的迭代器对象没有设置为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。虽然它按预期设定值。我很迷惑。谢谢你的帮助

1 个答案:

答案 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
    }
}