cjson和malloc
来源:互联网 发布:永恒矩阵 编辑:程序博客网 时间:2024/04/28 04:37
由于项目需要,我要在STM32里面加入cjson的部分,方便生成json数据,回传到手机。
首先就记录一下最重要的一个问题—–cjson和malloc
- 把cjson移植到整个工程里面去了之后,我打算用cjson的样例先试试,于是在cjson配套的readme文件里面,找到了这样的几行代码。
cJSON *root,*fmt; root=cJSON_CreateObject(); cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble")); cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject()); cJSON_AddStringToObject(fmt,"type", "rect"); cJSON_AddNumberToObject(fmt,"width", 1920); cJSON_AddNumberToObject(fmt,"height", 1080); cJSON_AddFalseToObject (fmt,"interlace"); cJSON_AddNumberToObject(fmt,"frame rate", 24); out =cJSON_Print(root); printf("%s\n",out); cJSON_Delete(root); free(out);
但最后打印出来的是一个 ?,而不是期望的json格式的数据。 后来在网上找了下,换了一下。
char * out ; cJSON *root; //about cjsonroot=cJSON_CreateObject(); cJSON_AddStringToObject(root,"name","zhangsan");cJSON_AddNumberToObject(root,"age",25);out =cJSON_Print(root);printf("%s\n",out); cJSON_Delete(root);free(out);
串口打印出来的数据就是这样的:
{ "name": "zhangsan", "age": 25}
后来以为cjson的移植就已经成功了,但是当我再多加几个json数据之后,又发生了之前同样的问题,串口打印一个 ?
接下来当然就是艰辛的找原因了,过程就省略,最后找到了一个函数
在cjson.c文件里面的
out=(char*)cJSON_malloc(len);
所有异常都是执行这个函数之后发生的,奇怪的是,这个函数会在生成一个json数据的过程中执行很多次,前面的几次都是正常的返回地址,但是后面的就不行了,返回值异常。
最后在找到了原因:malloc可分配的内存太小,以至于多次使用之后,就没有内存供它分配了。
解决的办法就是设置malloc的内存空间。
////////////////////////////////
1.需要查看KEIL编译器的帮助文件,使用MALLOC关键词,可以在第二项中找到关于MALLOC函数的使用方法。
2.一般情况下采用第一种堆(HEAP)方式,只需要在启动文件中将HEAP定义为自己想定义的大小。设置为4K。应该够用了
3.包含头文件
在头文件中
默认为
Heap_Size EQU 0x00000200 //十进制512
我们改为
Heap_Size EQU 0x00001000 //改变malloc大小 4096
/////////////////////////
在代码中搜索 Heap_Size ,可以找到在CORE\startup_stm32f10x_hd.s这个文件里面有上面的这行代码,然后修改大小,这样就可以正常的生成json数据了。
malloc的简介:
基本简介
Malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
函数简介
- 原型:extern void *malloc(unsigned int num_bytes);
- 头文件:在TC2.0中可以用malloc.h或 alloc.h (注意:alloc.h 与 malloc.h
的内容是完全一致的),而在Visual C++6.0中可以用malloc.h或者stdlib.h。 - 功能:分配长度为num_bytes字节的内存块。
- 返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
- 名称解释:malloc的全称是 memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
函数声明
void *malloc(size_t size);
- cjson和malloc
- cJSON
- cJSON
- cJSON
- cjson
- cJSON
- cJSON
- cJSON
- Lua CJSON安装和使用
- cJSON的构造和解析
- Lua CJSON安装和使用
- Lua CJSON安装和使用
- cJSON的构造和解析
- JSON格式介绍和使用cJSON解析
- CJSON数据的解析和合成示例
- 安转luajit 和 cjson模块
- malloc以及malloc和new
- JSON格式解析和libjson使用简介(cJSON)
- Codeforces Round #273 (Div. 2) C Table Decorations
- 让 Terminal 使用 Solarized 配色
- 在同一个电脑上同时启动多个tomcat
- Daikon Forge GUI (一)-- 生成Atlas
- EditPlus 3.7激活码
- cjson和malloc
- Android import和export使用说明 及 export报错:Problems were encountered during export解决
- Android开发使用WebView实战技巧
- android EditText 输入过滤表情
- 深入Objective-C的动态特性
- Unity3D获取APK包信息实现
- win7 64位系统下matlab中mex文件编译
- Tomcat学习笔记-jconsole监控
- 利用onUserLeaveHint发送后台运行通知