免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

【筆記】cJSON的使用經驗記錄-創新互聯

拼接兩個 JSON 對象的函數
cJSON* LinkJson(cJSON* root1, cJSON* root2)
{
	if (root1 == NULL || root2 == NULL)
		return NULL;

	cJSON* res_root = cJSON_CreateObject();
	cJSON* item1 = root1->child;
	cJSON* item2 = root2->child;

	auto AddItemToObject = [&log](cJSON* root, cJSON* item)
	{
		switch (item->type)
		{
		case cJSON_Number:
			if (item->valuedouble != 0)
				cJSON_AddNumberToObject(root, item->string, item->valuedouble);
			else
				cJSON_AddNumberToObject(root, item->string, item->valueint);
			break;
		case cJSON_String:
			cJSON_AddStringToObject(root, item->string, item->valuestring);
			break;
		case cJSON_Object:
			cJSON_AddItemToObject(root, item->string, item);
			break;
		default:
			break;
		}
	};

	while (item1)
	{
		cJSON* next = item1->next;
		AddItemToObject(res_root, item1);
		item1 = next;
	}
	while (item2)
	{
		cJSON* next = item2->next;
		AddItemToObject(res_root, item2);
		item2 = next;
	}

	return res_root;
}

謹慎使用cJSON_Delete() 測試代碼
int main()
{
	string timestamp = "2022-11-28 16:10:35.767";

	cJSON* root1 = cJSON_CreateObject();
	{
		cJSON* item1 = GenerateJsonItem(root1, 500, "", timestamp, "Signalname_0", "0:0", "M0A0");
		cJSON* item2 = GenerateJsonItem(root1, 500, "", timestamp, "Signalname_1", "0:1", "M0A1");
		printf("item1: \n%s\n\n", cJSON_Print(item1));
		printf("item2: \n%s\n\n", cJSON_Print(item2));
		printf("root1: \n%s\n\n", cJSON_Print(root1));
		cJSON_Delete(item1);
		cJSON_Delete(root1);
		cJSON_Delete(item2);
	}
}

cJSON* GenerateJsonItem(cJSON* root, int value, string unit, string timestamp, string name, string address, string identifier)
{
	cJSON* Signal = cJSON_CreateObject();
	cJSON_AddNumberToObject(Signal, "Value", value);
	cJSON_AddStringToObject(Signal, "Unit", unit.c_str());
	cJSON_AddStringToObject(Signal, "Timestamp", timestamp.c_str());
	cJSON_AddStringToObject(Signal, "Name", name.c_str());
	cJSON_AddStringToObject(Signal, "Address", address.c_str());
	cJSON_AddStringToObject(Signal, "Identifier", identifier.c_str());
	if (root != nullptr)
		cJSON_AddItemToObject(root, identifier.c_str(), Signal);
	return Signal;
}

創建了兩個 cjson “對象” item1 與 item2 ,然后都插入 cjson “對象” root1 ,在調用cJSON_Delete(item1);之后調用cJSON_Delete(root1);或是cJSON_Delete(root1);都會導致程序崩潰。

創新互聯公司服務項目包括東豐網站建設、東豐網站制作、東豐網頁制作以及東豐網絡營銷策劃等。多年來,我們專注于互聯網行業,利用自身積累的技術優勢、行業經驗、深度合作伙伴關系等,向廣大中小型企業、政府機構等提供互聯網行業的解決方案,東豐網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到東豐省份的部分城市,未來相信會繼續擴大服務區域并繼續獲得客戶的支持與信任!崩潰原因

調用cJSON_Delete(item1)之后,item1 的參數全部失效,但自身的值還未置空。

在這里插入圖片描述

之后調用cJSON_Delete(root1),進入 while 循環,檢測到 root1 的 child 指針指向 item1 “對象”,第一個 if 條件觸發,進入1層嵌套,相當于再次調用了cJSON_Delete(item1)
在這里插入圖片描述
在 Debug 模式下,item1 的 child 指針的值被設為 0xfeeefeee ,非空,再次觸發第一個 if 條件,,進入2層嵌套,相當于調用cJSON_Delete(0xfeeefeee)
第二層嵌套中嘗試從 0xfeeefeee 獲取 next 指針觸發程序斷點。
在這里插入圖片描述

結論
  • 仍可以把用 cJSON 組織的 JSON 數據視為樹結構。這個樹結構中,所有兄弟節點都形成一個雙向循環鏈表。
  • cJSON_Delete()會刪除一個節點的所有兄弟結點和以它們為根的子樹。可能還存在其他節點的指針指向被刪除節點,所以應盡可能謹慎使用cJSON_Delete()
  • 盡量只對沒有兄弟結點的節點或根節點調用cJSON_Delete()

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

當前題目:【筆記】cJSON的使用經驗記錄-創新互聯
地址分享:http://m.newbst.com/article24/dcidje.html

成都網站建設公司_創新互聯,為您提供網站收錄面包屑導航微信小程序網站排名App開發手機網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都做網站