国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C語(yǔ)言結(jié)構(gòu)體成員賦值的深拷貝和淺拷貝

開(kāi)發(fā) 后端
最近在做通信協(xié)議的解析處理、傳遞分析等問(wèn)題,總是遇到通信幀中的結(jié)構(gòu)體拷貝等問(wèn)題,遇到了一些坑,也是比較基礎(chǔ)但是易錯(cuò)的C語(yǔ)言知識(shí),一起來(lái)探究一下結(jié)構(gòu)體的深拷貝和淺拷貝。

淺拷貝

C語(yǔ)言中的淺拷貝是指在拷貝過(guò)程中,對(duì)于指針型成員變量只拷貝指針本身,而不拷貝指針?biāo)赶虻哪繕?biāo),它按字節(jié)復(fù)制的。我們分幾種情況舉例子來(lái)看一下。

結(jié)構(gòu)體中不存在指針成員變量時(shí)

代碼如下:

//在win10_64位+vs2017
//來(lái)源:技術(shù)讓夢(mèng)想更偉大
//作者:李肖遙
#include <stdio.h>
typedef struct {
char name[64];
int age;
}Member;
int main(){
Member stu1 = { "LiMing", 18 };
Member stu2;
stu2 = stu1;
printf("%s,%d\n", stu2.name, stu2.age);
system("pause");
return 0;
}

運(yùn)行如下:

結(jié)構(gòu)體中存在指針成員變量時(shí)

代碼如下:

//在win10_64位+vs2017
//來(lái)源:技術(shù)讓夢(mèng)想更偉大
//作者:李肖遙
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *name;
int age;
}Member;
int main() {
Member Member1, Member2;
Member1.name = malloc(sizeof(char) * 64);
if (NULL == Member1.name)
{
printf("malloc failed\n");
}
memset(Member1.name, 0, 64);
//strcpy(Member1.name, "LiMing");
snprintf(Member1.name, 64, "LiMing");
Member1.age = 18;
Member2 = Member1;/*拷貝*/
snprintf(Member2.name, 64, "LiXiaoYao");
Member2.age = 29;
printf("%s, %d\n", Member1.name, Member1.age);
if (NULL != Member1.name) {
free(Member1.name);
Member1.name = NULL;
}
system("pause");
return 0;
}

運(yùn)行如下:

從中我們看到,改變Member2的值,Member1的值也改變了,這說(shuō)明一片空間被兩個(gè)不同的子對(duì)象共享了,改變一個(gè)對(duì)象的值另外一個(gè)也會(huì)隨之改變。

我們改變Member2寫(xiě)法,申請(qǐng)內(nèi)存的代碼如下:

//在win10_64位+vs2017
//來(lái)源:技術(shù)讓夢(mèng)想更偉大
//作者:李肖遙
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *name;
int age;
}Member;
int main() {
Member Member1;
Member1.name = malloc(sizeof(char) * 64);
if (NULL == Member1.name)
{
printf("malloc failed\n");
}
memset(Member1.name, 0, 64);
//strcpy(Member1.name, "LiMing");
snprintf(Member1.name, 64, "LiMing");
Member1.age = 18;
Member Member2;
Member2.name = malloc(sizeof(char) * 64);
if (NULL == Member2.name)
{
printf("malloc failed\n");
}
memset(Member2.name, 0, 64);
//strcpy(Member2.name, "LiMing");
snprintf(Member2.name, 64, "LiXiaoYao");
Member2.age = 29;
Member1 = Member2;
printf("%s, %d\n", Member2.name, Member2.age
if (NULL != Member1.name) {
free(Member1.name);
Member1.name = NULL;
}
if (NULL != Member2.name) {
free(Member2.name);
Member2.name = NULL;
}
system("pause");
return 0;
}

運(yùn)行如下:

從中我們看到,當(dāng)數(shù)據(jù)成員中有指針時(shí),兩個(gè)類(lèi)中的兩個(gè)指針將指向同一個(gè)地址,當(dāng)對(duì)象快結(jié)束時(shí),會(huì)調(diào)用兩次free函數(shù),此時(shí)Member2已經(jīng)是野指針(圖中有X的錯(cuò)誤標(biāo)志),這個(gè)野指針指向的內(nèi)存空間已經(jīng)被釋放掉,再次釋放會(huì)報(bào)異常錯(cuò)誤,要解決這個(gè)問(wèn)題就要涉及到深拷貝了。

深拷貝

深拷貝除了拷貝其成員本身的值之外,還拷貝成員指向的動(dòng)態(tài)內(nèi)存區(qū)域內(nèi)容,深拷貝會(huì)在堆內(nèi)存中另外申請(qǐng)空間來(lái)儲(chǔ)存數(shù)據(jù)。

解決的思路是在釋放掉被賦值指針變量的舊指向內(nèi)存時(shí),重新對(duì)其開(kāi)辟新內(nèi)存,這種情況下兩個(gè)結(jié)構(gòu)體中指針地址不同,但是指向的內(nèi)容是一致的。代碼如下:

//在win10_64位+vs2017
//來(lái)源:技術(shù)讓夢(mèng)想更偉大
//作者:李肖遙
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char *name;
int age;
}Member;
int main() {
Member Member1;
Member1.name = malloc(sizeof(char) * 64);
if (NULL == Member1.name)
{
printf("malloc failed\n");
}
memset(Member1.name, 0, 64);
//strcpy(Member1.name, "LiMing");
snprintf(Member1.name, 64, "LiMing");
Member1.age = 18;
Member Member2;
Member2.name = malloc(sizeof(char) * 64);
if (NULL == Member2.name)
{
printf("malloc failed\n");
}
memset(Member2.name, 0, 64);
//strcpy(Member2.name, "LiMing");
snprintf(Member2.name, 64, "LiXiaoYao");
Member2.age = 29;
if (Member1.name != NULL) {
free(Member1.name);
Member1.name = NULL;
}
Member1.name = malloc(strlen(Member2.name) + 1);
strcpy(Member1.name, Member2.name);
printf("%s, %d\n", Member1.name, Member1.age);
if (NULL != Member1.name) {
free(Member1.name);
Member1.name = NULL;
}
if (NULL != Member2.name) {
free(Member2.name);
Member2.name = NULL;
}
system("pause");
return 0;
}

運(yùn)行如下:

結(jié)論

使用C語(yǔ)言來(lái)說(shuō),深拷貝淺拷貝的概念我們不需要深究,在進(jìn)行結(jié)構(gòu)體拷貝的時(shí)候,結(jié)構(gòu)體成員是非指針的話,那么直接賦值是沒(méi)有任何問(wèn)題的,建議使用這種方式,避免淺拷貝這類(lèi)不易發(fā)現(xiàn)的錯(cuò)誤產(chǎn)生。

如果成員有指針類(lèi)型,我們就需要重寫(xiě)拷貝函數(shù),自己定義拷貝行為了,這一點(diǎn)我們需要尤為注意。

責(zé)任編輯:龐桂玉 來(lái)源: C語(yǔ)言與C++編程
相關(guān)推薦

2017-08-16 13:30:05

Java深拷貝淺拷貝

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2021-10-18 09:01:01

前端賦值淺拷貝

2022-07-26 08:07:03

Python淺拷貝深拷貝

2021-09-27 11:07:11

深拷貝淺拷貝內(nèi)存

2018-09-26 14:37:17

JavaScript前端編程語(yǔ)言

2021-06-28 07:12:28

賦值淺拷貝深拷貝

2020-08-03 08:24:26

原型模式拷貝

2021-01-08 06:15:09

深拷貝淺拷貝寫(xiě)時(shí)拷貝

2020-10-12 08:35:22

JavaScript

2009-05-19 17:28:44

深拷貝淺拷貝clone()

2023-05-17 08:42:46

深拷貝Golang

2018-05-10 14:20:18

前端JavaScript深拷貝

2024-02-05 22:56:16

C++拷貝開(kāi)發(fā)

2024-03-15 15:03:23

2024-04-17 09:01:08

Python深拷貝淺拷貝

2023-05-17 07:36:00

淺拷貝深拷貝對(duì)象

2020-06-23 08:41:47

JavaScript開(kāi)發(fā)技術(shù)

2023-09-22 12:21:33

Python深拷貝淺拷貝

2022-11-07 11:37:27

深拷貝淺拷貝底層
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美1级日本1级| 国产真实久久| 色噜噜狠狠一区二区三区果冻| 日本不卡一二三区| 一区二区三区在线资源| 欧美影视一区二区三区| 亚洲熟妇无码另类久久久| 亚洲欧洲一区| 国产综合福利在线| 都市激情亚洲| 在线观看亚洲区| 超碰公开在线| 欧洲视频一区二区| h精品动漫在线观看| 99精品视频在线播放观看| 日本公妇乱淫免费视频一区三区| 精品产国自在拍| 欧美日韩成人免费| 性欧美18一19sex性欧美| 欧美一区二区三区系列电影| 在线免费91| 亚洲精品美国一| 亚洲人辣妹窥探嘘嘘| 国产成人综合亚洲网站| 蜜桃视频在线观看91| 国产精品av久久久久久麻豆网| 国产成人精品av| 琪琪久久久久日韩精品| 欧美成人精品在线观看| 电影亚洲精品噜噜在线观看| 日韩欧美一区二区久久婷婷| 日韩av成人| 粉嫩av一区二区三区免费野| 最近中文字幕mv2018在线高清| 欧美韩日一区二区三区四区| 2022中文字幕| 激情综合网av| 日韩欧美视频一区二区三区四区| 伊人成人在线视频| 1区1区3区4区产品乱码芒果精品| 亚瑟一区二区三区四区| 97精品一区二区三区| 黄色网一区二区| 日本久久久久久| 国产一区二区三区四区五区传媒| 日韩av免费网站| 91亚洲国产高清| 95av在线视频| 欧美三级小说| 久久艳妇乳肉豪妇荡乳av| 久久激情久久| 在线观看日本一区| 久久理论电影| 亚洲综合中文字幕68页| 中文在线免费一区三区高中清不卡| 精品日本美女福利在线观看| bt天堂新版中文在线地址| 91在线视频18| 欧美夫妻性生活视频| 激情综合五月| 欧美精品久久久久久久久| 91蝌蚪精品视频| 国产精品wwww| 一区福利视频| 男人天堂成人网| 久久毛片高清国产| 午夜3点看的视频| 欧美日韩免费不卡视频一区二区三区 | 久久精品中文字幕免费mv| 成人午夜毛片| 26uuu日韩精品一区二区| 欧美午夜精彩| 久久精品人人做人人爽电影| 久久精品国产精品亚洲综合| 亚洲熟妇无码一区二区三区| 亚洲视频一二三区| 国产福利在线| 精品香蕉一区二区三区| 一区二区亚洲视频| 亚洲尤物视频网| 玖玖国产精品视频| 激情五月婷婷久久| 色就色 综合激情| 91久久久久久白丝白浆欲热蜜臀| 午夜精品理论片| 亚洲网址在线| 日本免费不卡一区二区| 欧美视频在线免费| 日韩精品一区二区三区| 国产精品高清网站| 精品一二三四区| 久艹在线视频| 国产小视频国产精品| 成人羞羞动漫| 美女扒开大腿让男人桶| 欧美日韩国产一中文字不卡 | 精品在线视频一区二区| 成人毛片视频在线观看| 中文字幕日产av一二三区| 亚洲的天堂在线中文字幕| 国产精品2023| 视频一区不卡| 亚洲精品你懂的| 午夜影院在线观看国产主播| 国产成人97精品免费看片| 韩国亚洲精品| 欧美综合视频| 毛片一级免费一级| 久久xxx视频| 国产欧美日韩丝袜精品一区| 日韩国产欧美在线视频| 色婷婷亚洲十月十月色天| 制服丝袜中文字幕亚洲| 136国产福利精品导航网址应用| 成人欧美在线观看| 99久久综合精品| 99在线播放| 国产精品成av人在线视午夜片| 麻豆国产91在线播放| 一色桃子在线| 欧美激情2020午夜免费观看| 视频一区二区中文字幕| 国产对白在线正在播放| 久久精品人人做人人爽| 快she精品国产999| 色网视频在线| 国内精品久久影院| 国产成人av在线影院| 免费a在线看| 国产日韩欧美在线看| 久久久一区二区| 亚洲天堂av影院| 日本亚洲欧洲精品| 狠狠色香婷婷久久亚洲精品| 欧美1区2区3| 国产曰肥老太婆无遮挡| 日韩欧美一卡二卡| 亚洲人成在线影院| 国产有码在线| 国产精品网红福利| 亚洲视频狠狠干| 日韩在线成人| 日韩欧美不卡在线| 亚洲成人精品在线| 香蕉久久国产| eeuss影院在线观看| 91网站免费观看| 亚洲国产日韩精品| 国产探花在线精品| 性综艺节目av在线播放| 日本成人在线视频网址| 国产精品国产馆在线真实露脸| 麻豆视频久久| 国内自拍视频网| 久久久久久午夜| 国产精品视频yy9299一区| 精品一区二区三区免费看| 青青草国产精品视频| 色哟哟入口国产精品| 成人18精品视频| 欧美国产中文高清| 九色porny自拍| 欧美又大又粗又长| 亚洲欧美一区二区久久| 美女毛片一区二区三区四区最新中文字幕亚洲 | 黄色成人在线免费| 欧美精选视频在线观看| 国产福利电影网| 国产精品久久久久91| 一区二区三区日韩精品视频| 中国av一区| 中文视频在线| 国产精品成人观看视频免费| 色综合久久综合| 最新亚洲激情| 性欧美videoshd高清| 在线综合视频网站| 日韩中文字幕网址| 国产精品电影一区二区| 欧美日韩在线网站| 成年人视频在线看| 亚洲在线不卡| 久久网福利资源网站| 亚洲免费视频中文字幕| 最新精品国产| 最新黄网在线观看| www.夜夜爱| 91po在线观看91精品国产性色| 精品国产1区2区| 久久亚洲图片| 日本亚州欧洲精品不卡| 色琪琪免费视频网站| 国产一区二区中文字幕免费看| 日韩欧美国产电影| 91丨国产丨九色丨pron| 红桃视频在线观看一区二区| bbbbbbbbbbb在线视频| 999久久欧美人妻一区二区| 97精品一区二区视频在线观看| 欧美性高跟鞋xxxxhd|