[英]Infinite loop because of 'sudden' change of pointer
我了解,在編程世界中,什么也沒發生,但我真的被困在這里...在while循環結束時,條件內的指針突然從NULL變為“ something”
我有以下功能:
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) newList
是顯而易見的新列表。 listInit
分配內存並初始化新列表, listFirst
將sourceList
活動設置為其第一項。 listNext
將活動移到下一個項目,緊隨當前活動之后。 InstructionGenerate
將新指令追加到newList
。
好吧,我的問題是,在循環結束時sourceList->active
顯然為NULL,因為我得到了無限的wtf????
在終端上,但是在打印並測試了while
得到的條件之后,它具有非NULL值(我檢查過),而while無限循環。
有趣的是,當我刪除InstructionGenerate
調用時,它可以正常運行。 但是InstructionGenerate
不會/不應該以任何方式影響sourceList
指針,因為它正在與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;
}
}
}
最后是struct
的
typedef struct tInstr
{
int instType;
void *addr1;
void *addr2;
void *addr3;
} tInstr;
typedef struct listItem
{
tInstr Instruction;
struct listItem *nextItem;
} *tListItem;
typedef struct tListInstr
{
struct listItem *first;
struct listItem *end;
struct listItem *active;
} tListInstr;
編譯者:
gcc版本4.4.5(Debian 4.4.5-8)
gcc版本4.5.4(GCC)
您很可能在某處的指針操作中出錯。 我看不到有任何免費電話,因此您很可能沒有懸空指針問題。 您最有可能使用未初始化的指針,或者以某種方式濫用了指針。 也許它在一幀中指向堆棧上的有效區域,而不是另一幀。 流水線是導致您雄辯地說“無限wtf”的原因。 當執行if中的比較指令時,該值為NULL。 在循環前提條件中再次對其進行比較時,某些流水線更改已生效,將其設置為非NULL值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.