cjson坑系列二cJSON_AddStringToObject、cJSON_AddItemToObject申请内存失败

在使用cjson的时候遇见这样一个问题(先看问题代码,如下)

void platform_set_matrix_by_udp(cJSON* para, const char* str) {char* chintstr = NULL, * intstr = NULL;cJSON* index, * val;int ch;char* matrix;int number = 0;int rows[8] = { 0 }, cols;char arr[8][8];volatile int matrix_channel = 0;char buffer[80] = { 0 };cJSON* item0 = cJSON_CreateObject();cJSON* item1 = cJSON_CreateObject();cJSON* item2 = cJSON_CreateObject();cJSON* item3 = cJSON_CreateObject();cJSON* item4 = cJSON_CreateObject();cJSON* item5 = cJSON_CreateObject();cJSON* item6 = cJSON_CreateObject();cJSON* item7 = cJSON_CreateObject();cJSON* root = cJSON_CreateObject();cJSON_AddStringToObject(root, "cookie", "0");cJSON* Arr = cJSON_CreateArray();//修改生成inArr或者outArr的情况cJSON_AddItemToObject(root, "arr", Arr);if (strcmp(str, "setMatrix") == 0) {cJSON* setMatrix = cJSON_GetObjectItem(para, "setMatrix");matrix = setMatrix->valuestring;for (int i = 0; i < 8; i++) { // 遍历每一行并输出结果for (int j = 0; j < 8; j++) {arr[i][j] = matrix[i * 8 + j] - '0';}}for (int j = 0; j < 8; j++) { // 遍历每一行并输出结果for (int i = 0; i < 8; i++) {if (arr[i][j] != 0) {matrix_channel = matrix_channel + ((int)pow(2, i));}}switch (j){case 0:chintstr = intToString(0);cJSON_AddStringToObject(item0, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item0, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item0);break;case 1:chintstr = intToString(1);cJSON_AddStringToObject(item1, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item1, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item1);break;case 2:chintstr = intToString(2);cJSON_AddStringToObject(item2, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item2, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item2);break;case 3:chintstr = intToString(3);cJSON_AddStringToObject(item3, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item3, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item3);break;case 4:chintstr = intToString(4);cJSON_AddStringToObject(item4, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item4, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item4);break;case 5:chintstr = intToString(5);cJSON_AddStringToObject(item5, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item5, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item5);break;case 6:chintstr = intToString(6);cJSON_AddStringToObject(item6, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item6, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item6);break;case 7:chintstr = intToString(7);cJSON_AddStringToObject(item7, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item7, "val", buffer);//创建val	cJSON_AddItemToArray(Arr, item7);break;default:break;}matrix_channel = 0;}}
}

最后生成数据本来应该是这样:
在这里插入图片描述

但在连续几次运行之后,发现不能将index键值对添加到arr数组中,如上图。然后debug的调试下,发现调用cJSON_AddStringToObject(实际上是调用的cJSON_AddItemToObject),在这个函数中会申请新内存,但不知道为什么内存申请失败。于是我将上面的代码改成如下所示:

void platform_set_matrix_by_udp(cJSON* para, const char* str) {char * chintstr = NULL, *intstr = NULL;cJSON *index, *val;err_t err;char* matrix;int number = 0;int rows[8] = {0};char arr[8][8]; volatile int matrix_channel = 0;char buffer[80] = {0};cJSON* item0 = cJSON_CreateObject();cJSON* item1 = cJSON_CreateObject();cJSON* item2 = cJSON_CreateObject();cJSON* item3 = cJSON_CreateObject();cJSON* item4 = cJSON_CreateObject();cJSON* item5 = cJSON_CreateObject();cJSON* item6 = cJSON_CreateObject();cJSON* item7 = cJSON_CreateObject();cJSON *root = cJSON_CreateObject();cJSON_AddStringToObject(root, "cookie", "0");cJSON *Arr = cJSON_CreateArray();if (strcmp(str, "setMatrix") == 0) {cJSON* setMatrix = cJSON_GetObjectItem(para, "setMatrix");matrix = setMatrix->valuestring;for (int i = 0; i < 8; i++) { // 遍历每一行并输出结果for (int j = 0; j < 8; j++) {arr[i][j] = matrix[i * 8 + j] - '0';}}#if 1for (int j = 0; j < 8; j++) { // 遍历每一行并输出结果for (int i = 0; i < 8; i++) {if (arr[i][j] != 0) {matrix_channel = matrix_channel + ((int)pow(2, i));}}switch (j){case 0:cJSON_AddStringToObject(item0, "index", "0");//创建val	//cJSON_AddStringToObject(item0, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item0, "val", buffer);//创建val	if(cJSON_GetObjectItem(item0, "index") == NULL) {cJSON_AddStringToObject(item0, "index", "0");//创建val	}cJSON_AddItemToArray(Arr, item0);break;case 1:cJSON_AddStringToObject(item1, "index", "1");//创建val	//cJSON_AddStringToObject(item1, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item1, "val", buffer);//创建val			if(cJSON_GetObjectItem(item1, "index") == NULL) {cJSON_AddStringToObject(item1, "index", "1");//创建val	}cJSON_AddItemToArray(Arr, item1);break;case 2:cJSON_AddStringToObject(item2, "index", "2");//创建val	//cJSON_AddStringToObject(item2, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item2, "val", buffer);//创建val	if(cJSON_GetObjectItem(item2, "index") == NULL) {cJSON_AddStringToObject(item2, "index", "2");//创建val	}cJSON_AddItemToArray(Arr, item2);break;case 3:cJSON_AddStringToObject(item3, "index", "3");//创建val	//cJSON_AddStringToObject(item3, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item3, "val", buffer);//创建val	if(cJSON_GetObjectItem(item3, "index") == NULL) {cJSON_AddStringToObject(item3, "index", "3");//创建val	}cJSON_AddItemToArray(Arr, item3);break;case 4:cJSON_AddStringToObject(item4, "index", "4");//创建val	//cJSON_AddStringToObject(item4, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item4, "val", buffer);//创建val	if(cJSON_GetObjectItem(item4, "index") == NULL) {cJSON_AddStringToObject(item4, "index", "4");//创建val	}cJSON_AddItemToArray(Arr, item4);break;case 5:cJSON_AddStringToObject(item5, "index", "5");//创建val	//cJSON_AddStringToObject(item5, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item5, "val", buffer);//创建val	if(cJSON_GetObjectItem(item5, "index") == NULL) {cJSON_AddStringToObject(item5, "index", "5");//创建val	}cJSON_AddItemToArray(Arr, item5);break;case 6:cJSON_AddStringToObject(item6, "index", "6");//创建val	//cJSON_AddStringToObject(item6, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item6, "val", buffer);//创建val	if(cJSON_GetObjectItem(item6, "index") == NULL) {cJSON_AddStringToObject(item6, "index", "6");//创建val	}cJSON_AddItemToArray(Arr, item6);break;case 7:cJSON_AddStringToObject(item7, "index", "7");//创建val	//cJSON_AddStringToObject(item7, "index", chintstr);//创建indexsprintf(buffer, "0x%X", matrix_channel);cJSON_AddStringToObject(item7, "val", buffer);//创建val	if(cJSON_GetObjectItem(item7, "index") == NULL) {cJSON_AddStringToObject(item7, "index", "7");//创建val	}cJSON_AddItemToArray(Arr, item7);break;default:break;}matrix_channel = 0;}

也就说将下面这个改成了

chintstr = intToString(7);
cJSON_AddStringToObject(item7, "index", chintstr);//创建index

如下所示的方式:

cJSON_AddStringToObject(item7, "index", "7");//创建index

这样一来居然就能够成功的将index键值对插入到arr数组中。

原因:

我猜测是因为常量字符串不用分配空间,因此在cJSON_AddItemToObject函数中就没有在为字符串申请空间,也就没有申请失败返回,所以能够正常的将index插入到arr数组中。

---------------------以上原因是我猜测的,希望有cjson的前辈能够指点真正的原因是什么-----------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27636.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis建筑密度容积率覆盖率

大多数研究会把覆盖率当作建筑密度。 用覆盖率更恰当一些。 建筑覆盖率&#xff1a; 建筑物占据面积/街区面积 [Sum_area]/ ([area]*1000000) 排序检查数据&#xff0c;最大值0.75&#xff0c;最小值0. 建筑覆盖率&#xff0c;建筑密度的范围都应该在0-1之内&#xff0c;不是…

RabbitMQ死信交换机、TTL及延迟队列

一&#xff0c;死信交换机 1&#xff0c;什么是死信交换机 了解死信交换机之前我们先来了解一下什么是死信&#xff0c;当一个队列满足下面的三种情况的时候我们一般称为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用basic.reject或 basic.nack声明消费失…

消息队列——spring和springboot整合rabbitmq

目录 spring整合rabbitmq——生产者 rabbitmq配置文件信息 倒入生产者工程的相关代码 简单工作模式 spring整合rabbitmq——消费者 spring整合rabbitmq——配置详解 SpringBoot整合RabbitMQ——生产者 SpringBoot整合RabbitMQ——消费者 spring整合rabbitmq——生产者 使…

现代化 Android 开发:Jetpack Compose 最佳实践

作者&#xff1a;古哥E下 如果一直关注 Compose 的发展的话&#xff0c;可以明显感受到 2022 年和 2023 年的 Compose 使用讨论的声音已经完全不一样了, 2022 年还多是观望&#xff0c;2023 年就有很多团队开始采纳 Compose 来进行开发了。不过也有很多同学接触了下 Compose&am…

结合ChatGPT制作PPT

今天看到圈友的一个AI分享&#xff0c;然后自己本身需要做一个分享的PPT。刚好那着帖子实战一下。先说下整体感受。 优点&#xff1a;制作成本确实会比较低&#xff0c;很熟练的话大概就是1分钟一个都有可能。整体流程是先找个第三方PPT制作网站&#xff0c;看下支不支持文本转…

这可能是最简单的Page Object库

做过web自动化测试的同学&#xff0c;对Page object设计模式应该不陌生。 Page object库应该根据以下目标开发&#xff1a; Page object应该易于使用 清晰的结构 PageObjects 对于页面对象 PageModules对于页面内容 只写测试&#xff0c;而不是基础。 在可能的情况下防止样…

使用qemu创建ubuntu-base文件系统,并安装PM相关内核模块

目录 一、配置镜像二、使用qemu模拟nvdimm&#xff08;安装PM相关内核模块&#xff09;运行记录 遇到的一些问题1、ext4文件系统损坏问题&#xff1a;系统启动时&#xff0c;遇到ext4的报错信息解决办法&#xff1a;2、内核模块未成功加载3、qemu报错4、主机终端无法正常打开5、…

【深度学习平台推荐】 Kaggle

工欲善其事&#xff0c;必先利其器。在一个优秀的平台上&#xff0c;更利于深度学习的探究。 本文目的是推荐一些深度学习相关的网站。 1 Kaggle Kaggle offers a no-setup, customizable, Jupyter Notebooks environment. Access GPUs at no cost to you and a huge repositor…

GDB调试——学习笔记

文章目录 GDB是什么GDB调试的一般步骤1. 编译生成带源代码信息的可执行文件2. 启动调试3. 进行调试&#xff1a;设置断点、查看变量、寻找BUG4. 退出调试 GDB是什么 GDB就是一个程序代码调试的工具。 GDBGCC开发环境 GDB调试的一般步骤 1. 编译生成带源代码信息的可执行文件…

6.3.5 利用Wireshark进行协议分析(五)----捕获并分析ICMP报文

6.3.5 利用Wireshark进行协议分析&#xff08;五&#xff09;----捕获并分析ICMP报文 一、捕获ICMP报文 打开Wireshark&#xff0c;选择网络接口并点击开始按钮。分组列表面板不断刷新抓渠道的数据包&#xff0c;为了过滤出我们所要分析的ICMP报文&#xff0c;我们在过滤框中输…

(学习笔记-连接断开)TCP四次挥手

TCP四次挥手过程 TCP断开连接是通过四次挥手实现的&#xff0c;双方都可以主动断开连接&#xff0c;断开连接后主机中的资源将被释放&#xff0c;四次挥手的过程如下&#xff1a; 客户端打算关闭连接时&#xff0c;会发送一个TCP首部FIN标志位为1的报文&#xff0c;也就是FIN报…

C#中的抽象类(abstract)

C#中的抽象类&#xff08;abstract&#xff09;。 1&#xff1a;抽象方法只作声明&#xff0c;而不包含实现&#xff0c;可以看成是没有实现体的虚方法 2&#xff1a;抽象类不能被实例化 3&#xff1a;抽象类可以但不是必须有抽象属性和抽象方法&#xff0c;但是一旦有了抽象方…