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);

2 0
原创粉丝点击