近日开发任务中有用到cjson组件,在调用json文本输出函数 cJSON_Print 时,发现该函数返回NULL,且如果此时去删除构建该json文本的json对象时,还会出现段错误:
几经排查,虽然没有弄明白出现段错误的原因,但是发现了调用cjson插入/删除数组成员函数时需要注意的一个点。
我在代码中使用的json增加数组元素的函数为 cJSON_AddItemToArray ,删除数组元素的函数为 cJSON_DetachItemViaPointer & cJSON_Delete。由此出现一个问题,当向一个数组添加元素后,再去删除该数组的第一个元素,此时如果调用 cJSON_Print 就会失败,并出现文章开头描述的问题。
json数组的实现实际是一个双向链表,经过跟踪发现,调用cJSON_AddItemToArray 函数后改变了 json数组第一个元素的前向指针,此时若删除第一个元素,就会引起错误。所以解决方法是,在调用 cJSON_AddItemToArray 之后,将数组第一个元素的前向指针还原为NULL:
以上为经验之谈,欢迎补充指正。
关于cJSON_Print返回null
最新推荐文章于 2023-02-02 22:17:41 发布