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):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值