プログラミングの世界では何も起こらないことは理解していますが、私は本当にここで立ち往生しています... 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
ありません/すべきではありません. .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)