@@ -35,7 +35,7 @@ JSON 数组存储零至多个元素,最简单就是使用 C 语言的数组。
35
35
36
36
我见过一些 JSON 库选择了链表,而这里则选择了数组。我们将会通过之前在解析字符串时实现的堆栈,来解决解析 JSON 数组时未知数组大小的问题。
37
37
38
- 决定之后,我们在 ` kept_value ` 的 ` union ` 中加入数组的结构:
38
+ 决定之后,我们在 ` lept_value ` 的 ` union ` 中加入数组的结构:
39
39
40
40
~~~ c
41
41
typedef struct lept_value lept_value;
@@ -89,7 +89,7 @@ static void test_parse_array() {
89
89
}
90
90
~~~
91
91
92
- 在之前的单元中,作者已多次重申,C 语言的数组大小应该使用 ` size_t ` 类型。因为我们要验证 ` lept_get_array_size() ` 返回值是否正确,所以再为单元测试框架添加一个宏 ` EXPECT_EQ_SIZE_T ` 。麻烦之处在于,ANSI C(C99 )并没有的 ` size_t ` 打印方法,在 C99 则加入了 ` "%zu" ` ,但 VS2015 中才有,之前的 VC 版本使用非标准的 ` "%Iu" ` 。因此,上面的代码使用条件编译去区分 VC 和其他编译器。虽然这部分不跨平台也不是 ANSI C 标准,但它只在测试程序中,不太影响程序库的跨平台性。
92
+ 在之前的单元中,作者已多次重申,C 语言的数组大小应该使用 ` size_t ` 类型。因为我们要验证 ` lept_get_array_size() ` 返回值是否正确,所以再为单元测试框架添加一个宏 ` EXPECT_EQ_SIZE_T ` 。麻烦之处在于,ANSI C(C89 )并没有的 ` size_t ` 打印方法,在 C99 则加入了 ` "%zu" ` ,但 VS2015 中才有,之前的 VC 版本使用非标准的 ` "%Iu" ` 。因此,上面的代码使用条件编译去区分 VC 和其他编译器。虽然这部分不跨平台也不是 ANSI C 标准,但它只在测试程序中,不太影响程序库的跨平台性。
93
93
94
94
## 3. 解析过程
95
95
@@ -99,7 +99,7 @@ static void test_parse_array() {
99
99
100
100
但和字符串有点不一样,如果把 JSON 当作一棵树的数据结构,JSON 字符串是叶节点,而 JSON 数组是中间节点。在叶节点的解析函数中,我们怎样使用那个堆栈也可以,只要最后还原就好了。但对于数组这样的中间节点,共用这个堆栈没问题么?
101
101
102
- 答案是:只要在解析函数结束时还原堆栈的状庇 ,就没有问题。为了直观地了解这个解析过程,我们用连环图去展示 ` ["abc",[1,2],3] ` 的解析过程。
102
+ 答案是:只要在解析函数结束时还原堆栈的状态 ,就没有问题。为了直观地了解这个解析过程,我们用连环图去展示 ` ["abc",[1,2],3] ` 的解析过程。
103
103
104
104
首先,我们遇到 ` [ ` ,进入 ` lept_parse_array() ` :
105
105
@@ -220,7 +220,7 @@ static int lept_parse_value(lept_context* c, lept_value* v) {
220
220
221
221
2 . 现时的测试结果应该是失败的,因为 ` lept_parse_array() ` 里没有处理空白字符,加进合适的 ` lept_parse_whitespace() ` 令测试通过。
222
222
223
- 3 . 使用第四单元介绍的检测内存泄漏工具 ,会发现测试中有内存泄漏。很明显在 ` lept_parse_array() ` 中使用到 ` malloc() ` 分配内存,但却没有对应的 ` free() ` 。应该在哪里释放内存?修改代码,使工具不再检测到相关的内存泄漏。
223
+ 3 . 使用 [ 第三单元解答篇 ] ( ../tutorial03_answer/tutorial03_answer.md ) 介绍的检测内存泄漏工具 ,会发现测试中有内存泄漏。很明显在 ` lept_parse_array() ` 中使用到 ` malloc() ` 分配内存,但却没有对应的 ` free() ` 。应该在哪里释放内存?修改代码,使工具不再检测到相关的内存泄漏。
224
224
225
225
4 . 开启 test.c 中两处被 ` #if 0 ... #endif ` 关闭的测试,本来 ` test_parse_array() ` 已经能处理这些测试。然而,运行时会发现 ` Assertion failed: (c.top == 0) ` 断言失败。这是由于,当错误发生时,仍然有一些临时值在堆栈里,既没有放进数组,也没有被释放。修改 ` test_parse_array() ` ,当遇到错误时,从堆栈中弹出并释放那些临时值,然后才返回错误码。
226
226
0 commit comments