成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言結構體成員賦值的深拷貝和淺拷貝

開發 后端
最近在做通信協議的解析處理、傳遞分析等問題,總是遇到通信幀中的結構體拷貝等問題,遇到了一些坑,也是比較基礎但是易錯的C語言知識,一起來探究一下結構體的深拷貝和淺拷貝。

淺拷貝

C語言中的淺拷貝是指在拷貝過程中,對于指針型成員變量只拷貝指針本身,而不拷貝指針所指向的目標,它按字節復制的。我們分幾種情況舉例子來看一下。

結構體中不存在指針成員變量時

代碼如下:

//在win10_64位+vs2017
//來源:技術讓夢想更偉大
//作者:李肖遙
#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;
}

運行如下:

結構體中存在指針成員變量時

代碼如下:

//在win10_64位+vs2017
//來源:技術讓夢想更偉大
//作者:李肖遙
#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;
}

運行如下:

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

我們改變Member2寫法,申請內存的代碼如下:

//在win10_64位+vs2017
//來源:技術讓夢想更偉大
//作者:李肖遙
#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;
}

運行如下:

從中我們看到,當數據成員中有指針時,兩個類中的兩個指針將指向同一個地址,當對象快結束時,會調用兩次free函數,此時Member2已經是野指針(圖中有X的錯誤標志),這個野指針指向的內存空間已經被釋放掉,再次釋放會報異常錯誤,要解決這個問題就要涉及到深拷貝了。

深拷貝

深拷貝除了拷貝其成員本身的值之外,還拷貝成員指向的動態內存區域內容,深拷貝會在堆內存中另外申請空間來儲存數據。

解決的思路是在釋放掉被賦值指針變量的舊指向內存時,重新對其開辟新內存,這種情況下兩個結構體中指針地址不同,但是指向的內容是一致的。代碼如下:

//在win10_64位+vs2017
//來源:技術讓夢想更偉大
//作者:李肖遙
#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;
}

運行如下:

結論

使用C語言來說,深拷貝淺拷貝的概念我們不需要深究,在進行結構體拷貝的時候,結構體成員是非指針的話,那么直接賦值是沒有任何問題的,建議使用這種方式,避免淺拷貝這類不易發現的錯誤產生。

如果成員有指針類型,我們就需要重寫拷貝函數,自己定義拷貝行為了,這一點我們需要尤為注意。

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2021-07-16 12:33:24

Javascript深拷貝淺拷貝

2017-08-16 13:30:05

Java深拷貝淺拷貝

2021-10-18 09:01:01

前端賦值淺拷貝

2021-09-27 11:07:11

深拷貝淺拷貝內存

2022-07-26 08:07:03

Python淺拷貝深拷貝

2018-09-26 14:37:17

JavaScript前端編程語言

2021-06-28 07:12:28

賦值淺拷貝深拷貝

2009-05-19 17:28:44

深拷貝淺拷貝clone()

2020-08-03 08:24:26

原型模式拷貝

2021-01-08 06:15:09

深拷貝淺拷貝寫時拷貝

2020-10-12 08:35:22

JavaScript

2023-05-17 08:42:46

深拷貝Golang

2024-02-05 22:56:16

C++拷貝開發

2018-05-10 14:20:18

前端JavaScript深拷貝

2024-03-15 15:03:23

2024-04-17 09:01:08

Python深拷貝淺拷貝

2020-06-23 08:41:47

JavaScript開發技術

2023-05-17 07:36:00

淺拷貝深拷貝對象

2023-09-22 12:21:33

Python深拷貝淺拷貝

2019-02-25 08:58:16

Python深拷貝淺拷貝
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区免费在线观看 | 欧美性受 | 一区二区三区视频免费看 | 91视频导航| 资源首页二三区 | 亚洲午夜电影 | 亚洲精品一区国产精品 | 亚洲 欧美 日韩 在线 | 亚洲毛片在线 | www.伊人.com | 韩国久久精品 | 91丨国产| 久久精品99 | 午夜精品久久久久久久星辰影院 | 久久精品免费观看 | 国产午夜精品一区二区三区在线观看 | 日韩精品中文字幕一区二区三区 | 久久国产一区 | 欧美日韩中文字幕 | 国产97视频在线观看 | 欧美在线视频一区 | 亚洲一区二区在线视频 | 欧美一区二区综合 | 亚洲一二三区在线观看 | japan25hdxxxx日本 做a的各种视频 | 久久久久久国产精品 | 久久一区二区三区四区 | 伦理二区 | 亚洲精品国产电影 | 在线精品亚洲欧美日韩国产 | 国产精品久久午夜夜伦鲁鲁 | 亚州精品天堂中文字幕 | 一区二区三区不卡视频 | 国产成人免费 | 午夜视频在线免费观看 | 亚洲国产成人久久久 | 97超碰免费 | 请别相信他免费喜剧电影在线观看 | 久久综合九色综合欧美狠狠 | 免费在线观看毛片 | 久久国产精品无码网站 |