これはおそらく私が遭遇した中で最も奇妙なものの一つです。私は多くのC言語ではなく、自分が知っていることを知っていて、オンラインでさまざまなソースを調べて、変数マクロ名とマクロボディはwhileループのスコープ内でのみ定義されています。したがって、ループが実行されるたびに、私はmarcoNameとmacroBodyが新しいアドレスを取得し、まったく新しい変数になると予想しています。しかし、それは真実ではありません。whileループ内の可変スコープ
ループが再び実行されていても、両方の変数が同じアドレスを共有しているため、要素の一意性をチェックする必要があるリンクされたリストの重大な頭痛を引き起こしています。なぜこれがわからないのですか? macroNameとmacroBodyは、whileループが実行されるたびに完全に新しいアドレスを取得する必要がありますか?
私はアドレスを印刷しているので、これは問題であることは知っていて、同じです。
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;
}
両方の変数に一意のアドレスを取得することを期待している場合は、ポインタを定義してループの実行ごとにメモリを割り当てて解放してみましょう。また、質問のあなたのコメントは面白いです。この場合、スタック変数/メモリポインタであるアドレスの一意性に基づいて決定を下すことに言及します。 – Ganesh
はい、私はおそらくこのようなことをします。ありがとうございました! – ThePedestrian