STM32 使用Cjson遇到的坑

     在使用Cjson 这个开源的C库时,一切进行的很顺利,但在打包输出一个json 格式的字符串时碰到了坑:用函数cJSON_AddItemToObject 只添加一个键值对完全没问题,添加第二个键值对也没问题。但是这两个键值对添加的时候使用的都是常量即cJSON_AddItemToObject(SubJson, "alert", "123") 这种形式,当使用

cJSON_AddItemToObject(SubJson, "alert", cJSON_CreateString(buf))这种形式的时候,只添加一个键值对也没问题,添加了第二个键值对就挂了,cJSON_Print返回NULL。跟踪调试发现 cJSON大量调用malloc来申请内存,怪不得cjson例子里用完之后要delete对象。原来是要释放内存。STM32里面malloc是在heap也就是堆里面申请内存,因此heapsize太小了会导致malloc返回失败,从而导致cJSON_Print返回NULL。改大heapsize果然问题解决了。

另外程序最后一定要cJSON_Delete 删除对象,

还有cJSON_Print会一直不停申请内存,所有调用完之后一定要free释放,否则多次调用后一样会内存溢出。导致后面的cJSON_Print会申请不到内存。

最后贴一段网上抄来的STM32堆栈的说明。

(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似

于数据结构中的栈。

(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配

方式类似于数据结构中的链表。

你可能感兴趣的:(底层软件类)