2

プログラミングの世界では何も起こらないことは理解していますが、私は本当にここで立ち往生しています... 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 ではありません)newListは、明らかに新しいリストです。listInitメモリを割り当て、新しいリストを初期化し、listFirstアクティビティをsourceList最初の項目に設定します。listNextアクティビティを現​​在のアクティブのすぐ後ろの次のアイテムにシフトします。InstructionGenerateに新しい命令を追加しnewListます。

さて、私の問題は、ループの最後に明らかに NULL があることです。これは、端末でsourceList->active 無限を取得するためですが、出力され て get の条件がテストされた後、非 NULL 値 (チェック済み) と while ループ無限に。wtf????while

InstructionGenerate おもしろいのは、通話を削除すると問題なく動作することです。しかし、 ポインターが動作しているため、ポインターに影響を与えることはInstructionGenerate ありません/すべきではありません. .sourceListnewListsourceList

これは何の助けにもならないと思いますが、これが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)

4

1 に答える 1

1

ポインター操作のどこかにエラーがある可能性があります。free の呼び出しは見られないので、ダングリング ポインターの問題はおそらくないでしょう。初期化されていないポインターを使用しているか、何らかの方法でポインターを誤用している可能性があります。おそらく、あるフレームではスタック上の有効な領域を指していて、別のフレームでは指していない可能性があります。パイプラインは、雄弁に述べた「無限のwtf」の原因です。if 内の比較命令を実行すると、値は NULL になります。ループの前提条件で再度比較されると、パイプライン化された変更が有効になり、非 NULL 値に設定されます。

于 2013-03-09T06:33:46.883 に答える