STM32工程中使用cjson库解析数据失败的原因
欢迎使用Markdown编辑器
最近项目用到cjson的库去解析数据,当解析的的数据比较长时,会解析失败,但是短的数据则没有问题,后面排查是因为cjson解析需要用到的内存比较大,溢出导致解析失败。
在默认stm32的keil工程中,可以在启动文件看到堆和栈的大小
Stack_Size EQU 0x00000400
Heap_Size EQU 0x00000200
最后贴一段网上抄来的STM32堆栈的说明。
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似
于数据结构中的栈。
(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。
另外程序最后一定要cJSON_Delete 删除对象,
还有cJSON_Print会一直不停申请内存,所有调用完之后一定要free释放,否则多次调用后一样会内存溢出。导致后面的cJSON_Print会申请不到内存
————————————————
参考代码
char *out =NULL;
out=cJSON_Print(json); //提取json 数据 包括键值对
json_data = cJSON_GetObjectItem(json,"temp"); // 获取键值 里面没有malloc 不需要释放
char *data = cJSON_Print(json_data); //提取键对应的值 里面有malloc,需要free释放
master.temp = atof(data);
printf("temp:%.2f\r\n",master.temp);
free(out);
free(data);
cJSON_Delete(json); //只需要释放根节点就可以
参考链接:https://blog.csdn.net/cc9917/article/details/120894716