私はbison/yaccを学んでおり(そしていくつかのcも見直しています)、単純なテストプロジェクトとしてjsonパーサーを構築しようとしています。
http://www.json.org/にある用語を使用すると、文字列/値のペアを表す構造体ペアと、基本的にペアのリンク リストへのポインターを含む members フィールドを持つオブジェクトを表す構造体オブジェクトがあります。 .
新しいペアを返す単純な c 関数 (create_pair) があります。説明できない奇妙な動作に気付きました。
- 「メイン」からそのような関数を呼び出し、返された構造体のメモリアドレスを出力すると、それらのアドレスは常に異なります。
- バイソンの「アクション」内でまったく同じ関数を呼び出すと、関数が常に同じメモリアドレスに常駐するポインターを返すことがわかります。
これは意味がありますか?
詳細/コードは次のとおりです。
コードは次のとおりです(リンクには、「プロジェクト」に含まれる4つの異なるファイルを指す4つのペーストビンリンクのリストが含まれています):
次のようにコンパイルして実行できます。
lex t.l
yacc -d t.y
cc y.tab.c lex.yy.c t.c
./a.out
コードを起動し、次の入力で実行すると:
{ "firstName": "A", "lastName": "B" }
次のことがわかります。
1) 「メイン」で実行されるコード (ファイル ty をチェック) は、4 つの異なるペア オブジェクトを作成します。次に、それらのメモリ アドレスを出力すると、出力は次のようになります (異なるアドレスに注意してください)。
p 0x7fff52476be8 //(<-memory address for pair p)
print pair: P, Hellov
q 0x7fff52476bc8 //(<-memory address for pair q)
print pair: Q, Hellox
2) 上記の json サンプルを貼り付けるとすぐに、"ペア" ルールに 2 回ヒットします。1 回目は "firstName": "A"、2 回目は "lastName": "B" で、新しいペアを作成します。どちらの場合もメモリアドレスを出力し、それらは同じです:
Creating pair 0x7fff52475c88
print pair: firstName, A
Creating pair 0x7fff52475c88
print pair: lastName, B
なぜこれが起こるのですか?