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

news2024/11/26 12:26:57

在使用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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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 1
	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:
				cJSON_AddStringToObject(item0, "index", "0");//创建val	
				//cJSON_AddStringToObject(item0, "index", chintstr);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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);//创建index
				sprintf(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.coloradmin.cn/o/773719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数仓学习---8、数仓开发之ODS层

星光下的赶路人star的个人主页 大鹏一日同风起&#xff0c;扶摇直上九万里 文章目录 一、数仓开发之ODS层1.1 日志表1.2 业务表1.2.1 活动信息表&#xff08;全量表&#xff09;1.2.2 活动规则表&#xff08;全量表&#xff09;1.2.3 一级品类表&#xff08;全量表&#xff09;…

测试开发面试你需要知道的

面试前的准备&#xff1a; 1.简历优化 选择一个比较简洁明了的模板&#xff0c;简历中突出自己的技能和项目经验&#xff0c;项目经历最好按照时间倒叙阐述&#xff0c;描述清自己在项目中承担的职责&#xff0c;在这个职责中做的一些过程改进&#xff0c;效率提升的内容&…

【ChatGLM】在电脑部署属于自己的人工智能/ChatGPT平替/可离线/可发布

【ChatGLM】在电脑部署属于自己的人工智能 1、 前言 本文能实现在自己的电脑或云服务器上部署属于自己的语言AI——ChatGLM-6B&#xff0c;可以离线使用&#xff0c;也可以生成web网页在线发给朋友尝试。 ChatGLM-6B 是一个由清华大学的团队开源的、支持中英双语问答的对话语…

Spring Batch之读数据库—JdbcPagingItemReader(四十一)

一、JdbcPagingItemReader Spring Batch框架提供了对JDBC分页读取支持的组件JdbcPagingItemReader。JdbcPaginItemReader实现ItemReader接口&#xff0c;核心作用是将数据库中记录通过分页的方式转换为Java对象。在JdbcPagingItemReader将数据库记录转换为Java对象是主要有两步…

浅谈KNX协议智能照明系统在某图书馆中的应用

安科瑞 华楠 摘要&#xff1a;文章介绍了KNX/EIB智能照明控制系统的组成&#xff0c;结合工程实例&#xff0c;介绍了应用KNX/ EIB技术&#xff0c;进行智能照明控制系统方案设计的方法和原理&#xff0c;细致深入的对这一个系统在图书馆类建筑应用的节能性与便利性。 关键词&…

Jason Arbon提问Claude 2.0,全球现在有多少测试人员/有多少条测试用例?答案出乎意料

相信在大家的心目中&#xff0c;ChatGPT无疑是AI届的扛把子&#xff0c;自打推出以来&#xff0c;一骑绝尘&#xff0c;问谁谁都说好&#xff0c;问啥啥都能干。无论是国外的Google Bard、还是国内的文心一言、通义千问等都不是他的一合之敌。但是最近Anthropic新推出的Claude …

Python:基于matplotlib与mayavi的3D可视化(点云+等值面)

文章目录 一、3D可视化常用方法二、三维图像在numpy、cv2、以及tifffile.imread中通道的区别三、项目实战 1、基于matplotlib的3D可视化&#xff08;体素体&#xff09; 2、基于mayavi的3D可视化2.0、mayavi使用指南&#xff08;鼠标&#xff09;2.1、mlab.points3d()参数详解…

瀑布流布局(multi-column多列布局)

效果展示&#xff1a; 瀑布流布局是网页设计常见的一种布局&#xff0c;一般用于图片多列展示。列宽固定&#xff0c;图片根据自身高度自适应交错排列。 特点&#xff1a; 等宽不等高&#xff0c;多列布局&#xff1b;随着页面滚动条向下滚动&#xff0c;不断加载数据块并附加…

浅谈一下企业IT运维痛点以及好用的运维软件推荐

随着IT建设的不断深入和完善&#xff0c;IT资产越来越多&#xff0c;IT运维管理越发显得重要。但不少企业不知道如何有效进行IT运维&#xff0c;不知道如何更好进行IT运维&#xff0c;今天我们就来一起浅谈一下企业IT运维痛点&#xff0c;以及给大家推荐一款好用的运维管理软件…

国内外接口文档工具哪家强?ApiManager-在线接口文档管理工具

下面是关于接口文档工具-在线接口文档管理工具 接口文档是贯穿整个开发项目流程中的规范&#xff0c;前后端开发需要在开发前期进行接口定义并形成文档&#xff0c;测试人员在功能测试和接口测试的环节也需要对这些接口文档进行测试。 然而随着开发版本迭代&#xff0c;很多接…

Hadoop——Windows系统下Hadoop单机环境搭建

为了便于开发&#xff0c;我在本地Windows系统进行Hadoop搭建。 我使用的版本&#xff1a;hadoop-2.7.0。其他版本也可&#xff0c;搭建流程基本一样&#xff0c;所以参考这个教程一般不会有错。 1、下载安装包和插件 安装包hadoop-2.7.0.tar.gz 必要插件winutils-master 2、…

JAVA15个常见面试题

下面是一些常见的Java面试题及答案&#xff1a; Java中的值传递和引用传递有什么区别&#xff1f; Java中的参数传递方式都是值传递&#xff0c;但是对于引用类型的参数&#xff0c;传递的是对象的引用副本。 什么是Java中的面向对象编程&#xff1f; 面向对象编程是一种编程范…

【产品设计】微信小程序如何做好“授权”设计?

授权登录降低了用户注册账号时的操作成本&#xff0c;减少了产品的获客门槛。在本文中&#xff0c;作者结合案例&#xff0c;盘点了微信小程序授权登录设计中需要注意的几点问题&#xff0c;并对功能设计背后的设计思路与原理进行了简要的分析 01 openID 这是微信生态圈中&…

# Linux下用mailx发送邮件,邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决

Linux下用mailx发送邮件&#xff0c;邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决 文章目录 Linux下用mailx发送邮件&#xff0c;邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决1 发送邮件范例&#xff1a;2 文件范例参考&#xff08;/root/loll…

Microsoft Outlook如何自动归类邮件

右键点击 Inbox→New Folder 填写文件夹名称 temp Move→Rules→Create Rule Select Folder 点击temp→OK

Linux 内核概念和学习详解

1、前言 本文主要讲解什么是Linux内核&#xff0c;以及通过多张图片展示Linux内核的作用与功能&#xff0c;以便于读者能快速理解什么是Linux内核&#xff0c;能看懂Linux内核。 拥有超过1300万行的代码&#xff0c;Linux内核是世界上最大的开源项目之一&#xff0c;但是内核…

css 3个元素行排列,前2个元素靠左,第三个元素靠右

上效果&#xff1a; 实现方式&#xff1a; display:flex &#xff0c; 行排列&#xff0c;默认靠左对齐&#xff0c; 然后让第三个元素自动占满剩余的空间&#xff1a;flex-grow:1&#xff0c;text-align:end // wxml <!-- 支付方式--><view class"payment_…

尚无忧多门店自助宠物洗护系统美容宠物寄养系统小程序

技术框架&#xff1a;thinkphpmysql跨平台uniapp 完全开源无需授权 支持&#xff1a; 多门店商家入驻&#xff0c;管理 门店自助设备预约 电子门锁扫码开门 会员开购买&#xff0c;会员余额充值 自助订单和宠物预约订单管理 宠物添加管理 洗护知识文章设置 <templa…

套餐管理模块开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(六)

文章目录 前言一、新增套餐1. 需求分析2. 数据模型3. 代码开发4. 功能测试 二、套餐信息分页查询1. 需求分析2. 代码开发3. 功能测试 三、删除套餐1. 需求分析2. 代码开发3. 功能测试 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#x…

推荐模型——逻辑回归

文章目录 1. 逻辑回归特点2. 基于逻辑回归的推荐流程3. 逻辑回归模型的数学形式4. 逻辑回归模型的训练方法5. 逻辑回归模型的优势5.1 数学含义上的支撑5.2 可解释性强5.3 工程化的需要 6. 逻辑回归的局限性 1. 逻辑回归特点 逻辑回归是融合多种特征的推荐模型。 相比于协同过…