これはおそらく、私が今まで遭遇した中で最も奇妙なものの 1 つです。私は C でプログラミングすることはあまりありませんが、オンラインでさまざまな情報源を調べた結果、変数macroNameとmacroBodyは while ループのスコープでのみ定義されています。したがって、ループが実行されるたびに、marcoNameとmacroBodyが新しいアドレスを取得し、完全に新しい変数になることを期待しています。しかし、そうではありません。
私が見つけたのは、ループが再び実行されていても、両方の変数が同じアドレスを共有しているため、要素の一意性をチェックする必要があるリンクリストで深刻な頭痛の種になっていることです。これがなぜなのかわかりません。while ループが実行されるたびに、 macroNameとmacroBodyが完全に新しいアドレスを取得するべきではありませんか?
アドレスを印刷していて同じなので、これが問題であることはわかっています。
while(fgets(line, sizeof(line), fp) != NULL) // Get new line
{
char macroName[MAXLINE];
char macroBody[MAXLINE];
// ... more code
switch (command_type)
{
case hake_macro_definition:
// ... more code
printf("**********%p | %p\n", ¯oName, ¯oBody);
break;
// .... more cases
}
}
リンク リスト コードの一部であるコード。
struct macro {
struct macro *next;
struct macro *previous;
char *name;
char *body;
};
リンクリスト内に要素がすでに存在するかどうかをチェックする関数。しかし、*name は同じアドレスを持っているため、常に if 条件内に収まります。
static struct macro *macro_lookup(char *name)
{
struct macro *temp = macro_list_head;
while (temp != NULL)
{
if (are_strings_equal(name, temp->name))
{
break;
}
temp = temp->next;
}
return temp;
}