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;
}
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;
}
創(chuàng)建了兩個(gè) cjson “對(duì)象” item1 與 item2 ,然后都插入 cjson “對(duì)象” root1 ,在調(diào)用cJSON_Delete(item1);
之后調(diào)用cJSON_Delete(root1);
或是cJSON_Delete(root1);
都會(huì)導(dǎo)致程序崩潰。
調(diào)用cJSON_Delete(item1)
之后,item1 的參數(shù)全部失效,但自身的值還未置空。
之后調(diào)用cJSON_Delete(root1)
,進(jìn)入 while 循環(huán),檢測(cè)到 root1 的 child 指針指向 item1 “對(duì)象”,第一個(gè) if 條件觸發(fā),進(jìn)入1層嵌套,相當(dāng)于再次調(diào)用了cJSON_Delete(item1)
。
在 Debug 模式下,item1 的 child 指針的值被設(shè)為 0xfeeefeee ,非空,再次觸發(fā)第一個(gè) if 條件,,進(jìn)入2層嵌套,相當(dāng)于調(diào)用cJSON_Delete(0xfeeefeee)
。
第二層嵌套中嘗試從 0xfeeefeee 獲取 next 指針觸發(fā)程序斷點(diǎn)。
cJSON_Delete()
會(huì)刪除一個(gè)節(jié)點(diǎn)的所有兄弟結(jié)點(diǎn)和以它們?yōu)楦淖訕?shù)??赡苓€存在其他節(jié)點(diǎn)的指針指向被刪除節(jié)點(diǎn),所以應(yīng)盡可能謹(jǐn)慎使用cJSON_Delete()
。cJSON_Delete()
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:【筆記】cJSON的使用經(jīng)驗(yàn)記錄-創(chuàng)新互聯(lián)
地址分享:http://www.rwnh.cn/article24/dcidje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、面包屑導(dǎo)航、微信小程序、網(wǎng)站排名、App開(kāi)發(fā)、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容