簡體   English   中英

由於指針“突然”改變而導致無限循環

[英]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分配內存並初始化新列表, listFirstsourceList活動設置為其第一項。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM