由于指针“突然”改变而无限循环

时间:2012-12-03 14:55:35

标签: c pointers while-loop conditional-statements

我理解,在编程世界中,没有任何事情只是出于蓝色,但我真的被困在这里......在我的while循环结束时,条件内的指针突然从NULL变为“某事”

我有以下功能:

tListInstr *copyList (tListInstr *sourceList)   {

    tListInstr *newList;
    listInit(&newList);
    listFirst(sourceList);

    while(sourceList->active != NULL){
        InstructionGenerate(newList, 
                        sourceList->active->Instruction.instType,
                        sourceList->active->Instruction.addr1,
                        sourceList->active->Instruction.addr2,
                        sourceList->active->Instruction.addr3);

        listNext(sourceList);
        if(sourceList->active == NULL)
            printf("wtf????\n");
    }

    return newList;
}

为了扩展代码,它是解释器的一部分,该函数以源语言复制3个被调用函数的地址代码指令列表并返回副本,sourceList是要复制的列表(它永远不会为NULL){{1很明显是新的列表。 newList分配内存并初始化新列表,listInitlistFirst的活动设置为第一项。 sourceList将活动转移到下一个项目,紧跟当前活动状态。 listNextInstructionGenerate添加新指令。

我的问题是,在循环结束时newList显然是NULL,因为我在终端上获得了无限sourceList->active,但是在它被打印并且条件为{{1}之后经过测试,它有非NULL值(我检查过),而while循环无限。

有趣的是,当我删除wtf????电话时,它运行正常。但while不会/不应该以任何方式影响InstructionGenerate指针,因为它与InstructionGenerate一起工作,如果它以某种奇怪的方式我不明白用{{sourceList做某事1}},我在调用后更改活动,并在调用之前测试条件。

我认为这不会有任何帮助,但这里是newList的代码及其调用的函数:

sourceList

最后InstructionGenerate

void InstructionGenerate(tListInstr *l, int varType,void *addr1, void *addr2,void *addr3){
    tInstr I;
    I.addr1 = addr1;
    I.addr2 = addr2;
    I.addr3 = addr3;
    I.instType = varType;
    listInstInsert(l,I);
}

void listInstInsert(tListInstr *L,tInstr I)
{
    tListItem ptr = malloc(sizeof(struct listItem));
    if(ptr == NULL)
        return;
    else
    {
        ptr->Instruction = I;
        if (L->first == NULL){
            ptr->nextItem = NULL;
            L->first = ptr;
            L->end = ptr;
        }
        else{
            ptr->nextItem = NULL;
            L->end->nextItem = ptr;
            L->end = ptr;
        }
    }
}

编译:
gcc版本4.4.5(Debian 4.4.5-8)
gcc版本4.5.4(GCC)

1 个答案:

答案 0 :(得分:1)

你的指针操作很可能在某个地方出错。我没有看到任何免费电话,所以你很可能没有悬空指针问题。您最有可能使用未初始化的指针或以某种方式滥用指针。也许它指向一帧中堆栈上的有效区域,而不是另一帧中。流水线是导致您雄辩地表达“无限wtf”的原因。当执行if中的compare指令时,该值为NULL。当在循环前置条件中再次进行比较时,某些流水线更改已生效,将其设置为非NULL值。