这里的pickle_value结点就是解析的每个json数据的结点,定义如下。
注意共用体中的第二个结构体中有一个字符串指针,如果当前结点的type是PICKLE_STRING类型也就是字符串类型,那么这个指针就会指向字符串的首地址,这也是后面讲到的问题出现的地方。
下面的是我们的测试解析数组函数,解析途中框出的数组,然后获得类型判断是否正确,然后验证大小,然后获取解析的字符串的值。
之后会进入我们的数组解析函数,之后去掉前括号,就再次进入我们的主解析函数,实际上就是递归下降解析器。
这里面我们传入了一个e就是返回我们的a的解析结果的。实际上e就是中间保存数据的一个临时变量。当e返回的时候我们就用memcpy压栈。
下面问题就来了,因为e中有malloc的空间所以我就想的是把他释放掉,可是最后验证解析的值的时候怎么也获取不到a的值,经过摸查终于找到了这一步
我在使用完e之后随机释放了e的空间,释放函数如下
也就是这一步的释放掉了字符串数组的空间,但是我们前面已经把e压栈了,准备后面拿着e的值去访问字符串,但是我们又把指向字符串的指针释放掉了,所以造成了将解析的结果弹出栈然后访问数组解析元素的时候解析不到的原因。把这句注释掉,发现测试通过了。
标签:结点,释放,free,数组,字符串,时机,解析,memcpy From: https://www.cnblogs.com/poteitoutou/p/16942919.html以上仅是个人的大致猜测。