<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C語言中的淺拷貝是指在拷貝過程中,對於指標型成員變數只拷貝指標本身,而不拷貝指標所指向的目標,它按位元組複製的。我們分幾種情況舉例子來看一下。
程式碼如下:
#include <stdio.h> typedef struct { char name[64]; int age; }Member; int main(){ Member stu1 = { "LiMing", 18 }; Member stu2; stu2 = stu1; printf("%s,%dn", stu2.name, stu2.age); system("pause"); return 0; }
執行如下:
程式碼如下:
#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 failedn"); } 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, %dn", Member1.name, Member1.age); if (NULL != Member1.name) { free(Member1.name); Member1.name = NULL; } system("pause"); return 0; }
執行如下:
從中我們看到,改變Member2的值,Member1的值也改變了,這說明一片空間被兩個不同的子物件共用了,改變一個物件的值另外一個也會隨之改變。
我們改變Member2寫法,申請記憶體的程式碼如下:
#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 failedn"); } 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 failedn"); } memset(Member2.name, 0, 64); //strcpy(Member2.name, "LiMing"); snprintf(Member2.name, 64, "LiXiaoYao"); Member2.age = 29; Member1 = Member2; printf("%s, %dn", 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的錯誤標誌),這個野指標指向的記憶體空間已經被釋放掉,再次釋放會報異常錯誤,要解決這個問題就要涉及到深拷貝了。
深拷貝除了拷貝其成員本身的值之外,還拷貝成員指向的動態記憶體區域內容,深拷貝會在堆記憶體中另外申請空間來儲存資料。
解決的思路是在釋放掉被賦值指標變數的舊指向記憶體時,重新對其開闢新記憶體,這種情況下兩個結構體中指標地址不同,但是指向的內容是一致的。程式碼如下:
#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 failedn"); } 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 failedn"); } 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, %dn", 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語言深拷貝 淺拷貝內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45