我正在学习 bison/yacc(也正在复习一些 c)并尝试将 json 解析器构建为简单的测试项目。
使用在http://www.json.org/上找到的术语,我有一个表示字符串/值对的结构对和一个表示具有成员字段的对象的结构对象,该成员字段基本上包含指向对的链接列表的指针.
我有一个简单的 c 函数(create_pair),它返回一个新的对。我注意到一个我无法解释的奇怪行为:
- 如果我从“main”调用这样的函数并打印返回结构的内存地址,它们的地址总是不同的。
- 如果我在野牛“动作”中调用相同的函数,我会看到我的函数返回一个指针,该指针恰好总是驻留在相同的内存地址上。
这有道理吗?
详细信息/代码如下:
这是代码(链接包含指向“项目”中包含的四个不同文件的 4 个 pastebin 链接的列表):
你可以编译并运行它:
lex t.l
yacc -d t.y
cc y.tab.c lex.yy.c t.c
./a.out
如果您启动代码并使用以下输入运行它:
{“名字”:“A”,“姓氏”:“B”}
你会看到:
1)在“main”中执行的代码(检查文件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
为什么会这样?