cJson-》cJSON_New_Item -》 rt_malloc分配40字节空间失败问题分析结果

调用了cjson 接口进行数据解析,高概率出现解析失败,而且之前已经测过解析是没问题的。

1.怀疑是解析所在的任务栈空间不够,扩大到6K仍然不行,而且malloc按理同栈没关系。

2.怀疑是rt_malloc没走到,走了malloc,底层写死替换成rt_malloc测试仍然复现。

3.怀疑是rt_malloc的空间太大到?实际打印发现分配大小也就40字节,而且通过:

void heap_info_show(void)
{
    rt_uint32_t total,used,max_used;
    rt_memory_info(&total,&used,&max_used);        
    rt_kprintf("\r\nMem:Total---Used---Left---MaxUsed\r\nMem:%d---%d---%d---%d\r\n",total,used,(total-used),max_used);
}打印出内存信息发现空间还很大。

4.其他原因都排查,那么就剩下越界了,果然在前面的某个拷贝时存在可能性,但也看不出来,最后将memcpy拷贝的数据长度打印出来发现:25344,数据怎么这么大,这是才想起来,这里的数据长度2字节,但是大端模式,我直接使用了,要先转换成小端模式才能用。

Payload-No-Decrypt:25344-104##############

总结:对端数据包的中的size是大端模式,直接使用该字节数据进行拷贝就越界了。越界导致后面的malloc分配失败。一个小问题历时3小时,各种排查

<think>嗯,用户想了解cJSON的几个函数用法,包括cJSON_CreateObject、cJSON_AddNumberToObject和cJSON_Print。首先,我需要回忆一下cJSON库的结构和这些函数的作用。cJSON是一个轻量级的C语言JSON解析库,广泛用于嵌入式系统和需要处理JSON数据的场景。首先,cJSON_CreateObject函数应该用于创建一个新的cJSON对象,作为JSON结构的根节点或者子对象。用户可能想知道如何正确初始化这个对象,以及它的内存管理方式。需要注意的是,使用完后必须调用cJSON_Delete来释放内存,避免泄漏。 接下来是cJSON_AddNumberToObject,这个函数用于向已有的cJSON对象添加数值类型的键值对。需要解释参数的正确顺序:对象指针、键名和数值。同时,要提醒用户注意键名的字符串管理,是否需要自己释放,或者由cJSON处理。然后是cJSON_Print,这个函数将cJSON对象转换为格式化的JSON字符串。用户可能关心它与cJSON_PrintUnformatted的区别,比如输出是否有缩进和换行。此外,生成的字符串需要手动释放内存,这一点很重要,否则会导致内存泄漏。用户提供的引用中提到了cJSON_Print和cJSON_PrintUnformatted的区别,所以在回答时要提及这一点,但重点还是放在用户询问的三个函数上。可能需要提供示例代码,展示如何从创建对象到添加键值,再到输出字符串的完整流程。另外,用户之前的问题可能涉及这些函数的具体实现,但作为库函数,通常不建议用户修改内部实现,所以应该侧重于用法和应用场景。示例代码需要正确,包括头文件引用、内存释放步骤,避免常见错误。还要考虑用户可能的实际应用场景,比如在嵌入式系统中生成JSON配置,或者与服务器通信时构建数据包。需要强调这些函数在构建复杂JSON结构时的组合使用,比如创建嵌套对象或数组。 最后,生成相关问题时要围绕函数用法、内存管理、错误处理以及与其他函数的配合使用展开,帮助用户深入理解如何有效使用cJSON库。</think>### cJSON核心函数详解 #### 1. cJSON_CreateObject 功能:创建JSON对象节点,作为JSON结构的根节点或嵌套对象 ```c cJSON* root = cJSON_CreateObject(); ``` - 返回`cJSON*`指针类型 - 创建后必须调用`cJSON_Delete()`释放内存[^2] - 应用场景:创建配置对象、通信协议报文头等 #### 2. cJSON_AddNumberToObject 功能:向指定对象添加数值类型键值对 ```c cJSON_AddNumberToObject(root, "temperature", 26.5); ``` - 参数顺序:目标对象指针 → 键名字符串 → 数值 - 支持整型/浮点型自动转换 - 应用场景:添加传感器数据、状态码等数值信息 #### 3. cJSON_Print 功能:将cJSON对象转换为格式化字符串 ```c char *json_str = cJSON_Print(root); printf("%s", json_str); free(json_str); // 必须手动释放 ``` - 生成带缩进和换行的格式化JSON - 返回值需用`free()`释放[^1] - 应用场景:调试输出、网络传输数据准备 ### 完整示例代码 ```c #include "cJSON.h" void build_sensor_json() { // 创建根对象 cJSON *root = cJSON_CreateObject(); // 添加嵌套对象 cJSON *location = cJSON_CreateObject(); cJSON_AddNumberToObject(location, "x", 115.7); cJSON_AddNumberToObject(location, "y", 39.5); cJSON_AddItemToObject(root, "coordinates", location); // 添加数组 cJSON *readings = cJSON_CreateArray(); cJSON_AddItemToArray(readings, cJSON_CreateNumber(23.4)); cJSON_AddItemToArray(readings, cJSON_CreateNumber(24.1)); cJSON_AddItemToObject(root, "temperature_log", readings); // 输出JSON char *json = cJSON_Print(root); printf("Formatted JSON:\n%s\n", json); // 清理内存 cJSON_Delete(root); free(json); } ``` 输出结果: ```json { "coordinates": { "x": 115.7, "y": 39.5 }, "temperature_log": [23.4, 24.1] } ``` ### 内存管理要点 1. `cJSON_CreateObject`创建的对象必须通过`cJSON_Delete`释放 2. `cJSON_Print`生成的字符串必须用`free`释放 3. 添加子对象时建议使用`cJSON_AddItemToObject`,所有权转移给父对象 4. 循环引用会导致内存泄漏,需特别注意对象关系[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值