天河高端网站建设在线课堂网站开发

web/2025/10/1 22:11:16/文章来源:
天河高端网站建设,在线课堂网站开发,网站的登录界面怎么做,怀柔网站建设推广文章目录 前言add_item_to_object函数是干什么的add_item_to_object代码解析函数实现函数原理解析开头的代码constant_key参数的作用最后的if判断 add_item_to_array函数 总结 前言 在我们的日常编程中#xff0c;JSON已经成为了一种非常常见的数据交换格式。在C语言中#… 文章目录 前言add_item_to_object函数是干什么的add_item_to_object代码解析函数实现函数原理解析开头的代码constant_key参数的作用最后的if判断 add_item_to_array函数 总结 前言 在我们的日常编程中JSON已经成为了一种非常常见的数据交换格式。在C语言中我们通常使用cJSON库来处理JSON数据。cJSON库提供了一系列的函数来创建、解析和操作JSON数据。其中add_item_to_object函数是一个关键的函数它允许我们将一个新的项目添加到一个已存在的JSON对象中。在这篇文章中我们将深入探讨add_item_to_object函数的内部实现。 add_item_to_object函数是干什么的 这个函数用于把一个item添加到一个对象里面 他是cJSON_AddItemToObject和cJSON_AddItemToObjectCS函数的实现 add_item_to_object代码解析 函数实现 static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key) {char *new_key NULL;int new_type cJSON_Invalid;if ((object NULL) || (string NULL) || (item NULL) || (object item)){return false;}if (constant_key){new_key (char*)cast_away_const(string);new_type item-type | cJSON_StringIsConst;}else{new_key (char*)cJSON_strdup((const unsigned char*)string, hooks);if (new_key NULL){return false;}new_type item-type ~cJSON_StringIsConst;}if (!(item-type cJSON_StringIsConst) (item-string ! NULL)){hooks-deallocate(item-string);}item-string new_key;item-type new_type;return add_item_to_array(object, item); }函数原理解析 开头的代码 首先他声明了两个变量用于存储key值和该键值对的类型的 char *new_key NULL; int new_type cJSON_Invalid;紧接着他去判断参数的合法性为了内存的异常安全‘ if ((object NULL) || (string NULL) || (item NULL) || (object item)) {return false; }constant_key参数的作用 在cJSON库中constant_key参数是一个布尔值它决定了键key是进行深拷贝还是浅拷贝。 如果constant_key为true那么在添加新项目到JSON对象时键key将会进行浅拷贝也就是直接复制指针。这意味着如果原始的键字符串在以后被修改或释放那么存储在JSON对象中的键也会受到影响。 如果constant_key为false那么键key将会进行深拷贝也就是复制整个字符串的内容到新的内存位置。这样即使原始的键字符串在以后被修改或释放也不会影响到存储在JSON对象中的键。 可以看到他的浅拷贝和深拷贝是完全不同的 if (constant_key) {new_key (char*)cast_away_const(string);new_type item-type | cJSON_StringIsConst; } else {new_key (char*)cJSON_strdup((const unsigned char*)string, hooks);if (new_key NULL){return false;}new_type item-type ~cJSON_StringIsConst; }在浅拷贝直接把参数的key复制到new_key里面然后把new_type赋值成对应的类型 那么他为何要| cJSON_StringIsConst 这行代码中的|操作符是C语言中的位运算符表示按位或操作。cJSON_StringIsConst是一个常量它的值通常为0x200在二进制中表示为10 0000 0000。 当我们执行item-type | cJSON_StringIsConst时实际上是将item-type的值和cJSON_StringIsConst的值进行按位或操作。这样做的目的是为了将item-type的第10位设置为1而不改变其他位的值。 这里cJSON_StringIsConst的作用是标记字符串是否为常量。如果一个字符串被标记为常量那么在cJSON对象被删除时这个字符串就不会被释放。这对于那些指向静态或全局变量的字符串非常有用因为这些字符串不能被释放。 所以new_type item-type | cJSON_StringIsConst;这行代码的作用就是将item-type的值更新为新的类型同时保留了原来的类型信息并标记字符串为常量。 在深拷贝中使用了cJSON_strdup函数复制字符串我们上篇文章已经介绍过 new_type item-type ~cJSON_StringIsConst;类比上面这段代码也就是把这个字符串标记为不是常量在删除的时候可以直接删除 最后的if判断 这段代码的目的是在添加新的键值对到JSON对象时安全地处理旧的键字符串。 if (!(item-type cJSON_StringIsConst) (item-string ! NULL)) {hooks-deallocate(item-string); }!(item-type cJSON_StringIsConst)这段的含义如下 这部分是检查item-type是否被标记为cJSON_StringIsConst。如果被标记为cJSON_StringIsConst那么这个字符串就是一个常量字符串我们不能释放它。所以我们使用!操作符来检查item-type是否没有被标记为cJSON_StringIsConst。 (item-string ! NULL)这部分是检查item-string是否为NULL。如果item-string为NULL那么我们就没有必要也不能释放它。 最后就把参数item复制上我们的状态就行了 item-string new_key; item-type new_type;我们会发现这个函数仅仅是把键和type安装到参数type上面但是还没有进行item安装到object上面所以这里又出现一个函数他专门用于链表的操作的add_item_to_array add_item_to_array函数 add_item_to_array函数代码如下 static cJSON_bool add_item_to_array(cJSON *array, cJSON *item) {cJSON *child NULL;if ((item NULL) || (array NULL) || (array item)){return false;}child array-child;/** To find the last item in array quickly, we use prev in array*/if (child NULL){/* list is empty, start new one */array-child item;item-prev item;item-next NULL;}else{/* append to the end */if (child-prev){suffix_object(child-prev, item);array-child-prev item;}}return true; }他的主要代码如下 if (child NULL) {/* list is empty, start new one */array-child item;item-prev item;item-next NULL; } else {/* append to the end */if (child-prev){suffix_object(child-prev, item);array-child-prev item;} }他的图例 如果链表为空 (child NULL)那么新的item就会成为链表的第一个也是唯一的元素。这个情况可以用下面的字符画来表示 array|vitem -- NULL^|item在这个图中array-child指向itemitem-prev指向item自身item-next指向NULL。 如果链表不为空那么新的item就会被添加到链表的末尾。这个情况可以用下面的字符画来表示 array|vchild1 -- child2 -- ... -- childN -- item -- NULL^ ^| |child1 item在这个图中array-child指向链表的第一个元素child1childN-next指向新的itemitem-prev指向childNitem-next指向NULL。 这样就成功的把我们的item连接到object里面了 总结 通过深入研究add_item_to_object函数的源码我们可以更好地理解cJSON库是如何处理JSON对象的。这个函数的实现虽然简单但却非常关键它使得我们可以方便地向JSON对象中添加新的项目。希望这篇文章能帮助你更好地理解cJSON库的内部工作原理以及如何在你自己的项目中使用它。

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

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

相关文章

怎么注册网站可视化网站制作软件

一、引言 随着前端技术的飞速发展,企业对于官网的需求也从简单的展示型网站向功能丰富、交互体验良好的方向转变。在这样的背景下,图鸟模板-官网以其基于Vue 3的纯前端开发特性,以及支持微信小程序、支付宝小程序、APP和H5的跨平台能力&…

福田园岭网站建设专业网站建设网页

CSS注释 CSS修改页面中的所有标签,必须借助选择器选中。选择器中,可以写多对CSS属性,用{}包裹;每个属性名与属性值之间用:分隔,多对属性之间,必须用;来分隔选择器{ 属性1:属性值1; 属性2:属性值2; 【选择器…

明星网站怎么设计做网站简单还是做app简单

1、情况简述 在使用VS时,会发现与QCreator存在一些差异。最主要的就是要设置很多东西,如果不配置的话,就会遇到一些问题。下面我分享下我调试过程中遇到的一个问题。使用Qdesigner的UI提升类时,找不到头文件的情况: …

网站名称在哪里注册订阅 wordpress

上节回顾 1 搜索功能-前端:搜索框,搜索结果页面-后端:一种类型课程-APIResponse(actual_courseres.data.get(results),free_course[],light_course[])-搜索,如果数据量很大,直接使用mysql,效率非常低--》E…

中文域名.网站如何制作一个静态网站源码

Hive3.1.3编译 1.编译原因1.1Guava依赖冲突1.2开启MetaStore后运行有StatsTask报错1.3Spark版本过低 2.环境部署2.1jdk安装2.2maven部署2.3安装图形化桌面2.4安装Git2.5安装IDEA 3.拉取Hive源码4.Hive源码编译4.1环境测试1.测试方法——编译2.问题及解决方案💥问题1…

网站做优化需要多少钱特殊信息收费的网站有哪些

本文主要介绍微信小程序如何获取openid及用户信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。1. 获取openid1.1 获取code调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid…

松滋网站开发摄影师作品网站有哪些

随着全球产业技术的不断发展,包装机行业也出现了产业结构调整的动向,因为全新的全自动阀口袋包装机和全新的包装产品技术问世,那些制作粗糙,能源消耗大,技术相对比较落后的阀口袋包装机也将会被市场一步步淘汰掉&#…

各大网站收录想学网站建设选计算机应用技术还是计算机网络技术哪个专业啊

摘 要 随着我国微型电子技术和嵌入式系统的发展,目前行业内相对比较传统的机械臂无法满足客户的需求。为了改进传统机械臂在控制上得短板问题,在本次毕业设计中,将使用相对先进、快捷、智能的控制机制。该系统的控制大脑为核心控制器32系列嵌…

建设网站需要两种服务支持网站建设公司的岗位职责

目录 今日良言:有志者自有千计万计,无志者只感千难万难 一、简介 二、Redis的安装 三、Redis的简单使用 四、Redis相关知识点 1.缓存分类 2.五大基本数据类型使用 3.持久化 4.常见面试题 今日良言:有志者自有千计万计,无…

建设银行信用卡申请官方网站佛山新网站建设哪家好

所有Team站点都带有专用文件库,用于存储所有工作组的内容。 您现在可以从桌面或云存储站点将Visio文件上载到此库,例如,您所在Team的资产都集中在一个位置,供具有权限的任何人进行访问。与其他存储文件一样,您可以直接…

专业的网站建设电话国贸行业 网站建设

文章目录 泛型单例类泛型单例类&#xff08;不带组件版&#xff09;对象池管理器数据管理器场景管理器 泛型单例类 using System.Collections; using System.Collections.Generic;public abstract class ManagersSingle<T> where T : new() {private static T instance;…

外贸soho建网站小网站如何做

Vue 3是Vue框架的最新版本&#xff0c;它引入了Composition API&#xff0c;这是一个全新的API&#xff0c;与Vue 2的Options API有很大的不同。下面是Vue 3和Composition API的一些重要变化和使用要点&#xff1a; 1. **Setup函数** - 在Vue 3中&#xff0c;每个页面的入口…

网天下信息技术有限公司网站成都网站seo收费标准

一、背景 当我们使用Joplin时&#xff0c;上传图片时会自动上传到Joplin服务器并替换链接 但是Joplin的编辑器不好用&#xff0c;我更习惯用Typora来编辑&#xff0c; 然而Typora中上传的图片只能在本地&#xff0c;无法上传到Joplin服务器&#xff0c;在其他客户端也看不到图片…

视频网站架构白银市城乡建设局网站

1、无限循环&#xff1a;又称为死循环&#xff1b; 两种情况&#xff1a; 1&#xff09;、代码逻辑有问题&#xff0c;从而出现死循环&#xff1b;该情况下出现的死循环占用大量的内存资源&#xff0c;我们需要杜绝其出现&#xff1b; 2&#xff09;、根据需求需要人为主动定…

广西网站建设公司电话吉林省吉林市为什么名字一样

一、什么是数据库&#xff1f; 数据库是一个结构化的数据集合&#xff0c;用于存储、管理和组织数据。它是一个电子化的文件柜&#xff0c;可以存储大量的数据&#xff0c;并提供了一种高效地检索、更新和管理数据的方法。数据库可以用于存储各种类型的数据&#xff0c;例如文…

百度知道网页版地址重庆公司seo

2019-07-22关键字&#xff1a;/system/bin/sh: xxx: No such file or directory虽然说 Android 也是基于 Linux 的&#xff0c;但总归来说它们的编译链还是很有可能不一样的&#xff0c;这就导致编译出来的程序有可能不能通用&#xff0c;即使它们都是基于 Linux 的。而有些不能…

企业网站建设尚未实现宣传功能游戏推广公司好做吗

[闽南网]DNF分享红包分享快乐时间从2019年的1月3日开始到1月21日前结束&#xff0c;活动期间玩家每天登录游戏可以得到一个新年红包&#xff0c;使用后可以为同一个频道的玩家送去祝福&#xff0c;根据送出红包的数量得到不同的奖励。(dnf幸运饺子铺活动)(DNF95版新副本攻略)本…

查logo的网站江西网络推广外包

文章目录一、HTTP简介二、请求报文三、请求方式四、媒体类型五、响应报文一、HTTP简介 HTTP&#xff1a;Hyper Text Transfer Protocol 超文本传输协议。HTTP最大的作用就是确定了请求和响应数据的格式。浏览器发送给服务器的数据&#xff1a;请求报文&#xff1b;服务器返回给…

浙江天奥建设集团网站中山模板建站软件

1.概念 如果同时发给局域网中的所有主机&#xff0c;称为广播 我们可以使用命令查看我们Linux下当前的广播地址&#xff1a;ifconfig 2.广播地址 以192.168.1.0 (255.255.255.0) 网段为例&#xff0c;最大的主机地址192.168.1.255代表该网段的广播地址&#xff08;具体以ifcon…

深圳建设银行官方网站赤峰市网站建设

加载libcomposite.ko 失败 问题描述 如图&#xff0c;在做USB OTG 设备模式的时候需要用到libcomposite.ko驱动&#xff0c;加载失败了。 原因&解决方法 有一个依赖叫configfs.ko的驱动没有安装。可以从内核代码的fs/configfs/configfs.ko中找到这个驱动。先加载confi…