我正在學習bison/yacc(並查看一些c),並嘗試構建一個json解析器作爲簡單的測試項目。指針,野牛和yacc
使用在http://www.json.org/上找到的術語我有一個結構對,它表示一個字符串/值對和一個結構對象,該結構對象具有一個基本上包含指向鏈接對的鏈表的成員字段。
我有一個簡單的c函數(create_pair),返回一個新的對。我注意到一個奇怪的行爲,我無法解釋:
- 如果我從「main」調用這樣的函數並打印返回結構的內存地址,它們的地址總是不同的。
- 如果我在野牛「動作」中調用了非常相同的函數,我發現我的函數返回的是一個總是駐留在同一個內存地址上的指針。
這是否有意義?
詳細信息/代碼如下:
這裏的代碼(該鏈接,包含列入「工程」的指向四個不同的文件4個引擎收錄鏈接列表):
你可以編譯和運行它:
lex t.l
yacc -d t.y
cc y.tab.c lex.yy.c t.c
./a.out
如果啓動代碼,並與下面的輸入運行:
{ 「名字」: 「A」, 「姓氏」: 「B」 }
你會發現:
1)中的「主」(檢查文件TY)執行的代碼,創建四個不同的一對對象,那麼我打印他們的存儲器地址,並且輸出是類似的信息(通知不同的地址):
p 0x7fff52476be8 //(<-memory address for pair p)
print pair: P, Hellov
q 0x7fff52476bc8 //(<-memory address for pair q)
print pair: Q, Hellox
2)只要粘貼上面的json樣本,我們兩次擊中「pair」規則,第一次爲「firstName」:「A」,第二次爲「lastName」:「B」,我創建了一個新對在這兩種情況下都打印出內存地址,它們是一樣的:
Creating pair 0x7fff52475c88
print pair: firstName, A
Creating pair 0x7fff52475c88
print pair: lastName, B
爲什麼會發生這種情況?
好的,這是清楚的,絕對是我的問題的正確答案:謝謝!但讓我重新啓動一下:當「成員」規則被擊中時(成員:成員COMMA對),我怎麼可能檢查$ 1和$ 3的值(其中$ 1是從成員:對返回的值)我看到1美元和3美元是指向同一對?希望這是明確的。 – user1417009
@ user1417009:在生產'pair:string COLON value'中,您分配'$$ =&p;'。據我們所知,'&p'是棧上自動對象的地址。只要此規則的代碼退出其塊(緊接在此賦值之後),對象生存期結束,並且該堆棧被重新用於其他事情。所以你與這個'pair'關聯的地址是無效的。當執行達到'members'的規則時,它會嘗試使用這個地址,這恰好指向了'members'的對象。 [續...] –
您不應該在'yylval'對象中保留自動對象的地址。您必須複製對象或使用指針指向您動態分配的地址(以及後來的空閒地址)。 –