我理解,在编程世界中,没有任何事情只是出于蓝色,但我真的被困在这里......在我的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
分配内存并初始化新列表,listInit
将listFirst
的活动设置为第一项。 sourceList
将活动转移到下一个项目,紧跟当前活动状态。 listNext
向InstructionGenerate
添加新指令。
我的问题是,在循环结束时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)
答案 0 :(得分:1)
你的指针操作很可能在某个地方出错。我没有看到任何免费电话,所以你很可能没有悬空指针问题。您最有可能使用未初始化的指针或以某种方式滥用指针。也许它指向一帧中堆栈上的有效区域,而不是另一帧中。流水线是导致您雄辩地表达“无限wtf”的原因。当执行if中的compare指令时,该值为NULL。当在循环前置条件中再次进行比较时,某些流水线更改已生效,将其设置为非NULL值。