真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語言結(jié)構(gòu)體拷貝函數(shù) c++ 結(jié)構(gòu)體復(fù)制

C語言如何深拷貝結(jié)構(gòu)體?

結(jié)構(gòu)體并非一個賦值號就能copy的,需要手動設(shè)計自己將其中的每個基礎(chǔ)類型進(jìn)行復(fù)制:

創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。10年品質(zhì),值得信賴!

struct a a1,a2;

strcpy(a1.str,"123456789"); strcpy(a2.str,a1.str); strcpy(a1.str,"111111111");

在中間那句執(zhí)行時,a1.str的內(nèi)容是"123456789",因此賦值給a2.str的也是這個字符串

賦值完成后再改變a1時,a2與此無關(guān)了,會保持最后一次操作賦值的結(jié)果。

怎么把一個結(jié)構(gòu)體中的數(shù)據(jù)復(fù)制到另一個相同類型的結(jié)構(gòu)體數(shù)組中

可以類似BACNET_ADDRESS *P_dest[50];這樣定義, 但要注意這樣聲明的是一個指針數(shù)組,即存50個BACNET_ADDRESS指針的數(shù)組,與你的需求不符。應(yīng)該是直接定義BACNET_ADDRESS P_dest[50];這樣P_dest中才能存儲結(jié)構(gòu)體。

C語言中結(jié)構(gòu)體不能直接整體賦值。

可以使用memcpy函數(shù):

void *memcpy(void *dest, const void *src, size_t n);

其中dest就是需要賦值到的地址, src就是復(fù)制源, n是需要復(fù)制的字節(jié)數(shù)。

所以是 memcpy(P_dest[i], dest, sizeof(dest));

修正:好吧,又查了下C是支持結(jié)構(gòu)體直接賦值的,但如果結(jié)構(gòu)體中有指針,將是非常不安全的,不過就你的代碼來看是沒問題的。

你代碼不能復(fù)制的原因是兩者的類型不一致,就是最開始說的P_dest實際上是一個指針數(shù)組,而賦值時要把一個結(jié)構(gòu)體賦值給指針導(dǎo)致的錯誤。只要改下P_dest的聲明就成了。

c語言如何實現(xiàn)結(jié)構(gòu)體的深度復(fù)制

使用memcpy即可, 比如你另外建立一個結(jié)構(gòu)體sortbook[1000]用來保存排序結(jié)果,將book中的第i個元素賦值到sortbook的第j個元素中

memcpy(sortbook[j], book[i], sizeof(struct book));

用這個函數(shù)需要#include string.h

函數(shù)原型

void *memcpy(void*dest, const void *src, size_t n);

功能

由src指向地址為起始地址的連續(xù)n個字節(jié)的數(shù)據(jù)復(fù)制到以destin指向地址為起始地址的空間內(nèi)。

頭文件

#includestring.h

返回值

函數(shù)返回一個指向dest的指針。

說明

1.source和destin所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向destin的指針。

2.與strcpy相比,memcpy并不是遇到'\0'就結(jié)束,而是一定會拷貝完n個字節(jié)。

memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝的數(shù)據(jù)長度;

例:

char a[100], b[50];

memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會造成b的內(nèi)存地址溢出。

strcpy就只能拷貝字符串了,它遇到'\0'就結(jié)束拷貝;例:

char a[100], b[50];

strcpy(a,b);

3.如果目標(biāo)數(shù)組destin本身已有數(shù)據(jù),執(zhí)行memcpy()后,將覆蓋原有數(shù)據(jù)(最多覆蓋n)。如果要追加數(shù)據(jù),則每次執(zhí)行memcpy后,要將目標(biāo)數(shù)組地址增加到你要追加數(shù)據(jù)的地址。

//注意,source和destin都不一定是數(shù)組,任意的可讀寫的空間均可。

C語言 結(jié)構(gòu)復(fù)制

是將a.arr[]中的每個元素復(fù)制給b.arr[]的每個元素,注意你定義的是一個結(jié)構(gòu)體,c語言里面,定義的時候就已經(jīng)分配了空間,所以b也是一個結(jié)構(gòu)體,有自己的空間,有自己的首地址,和a的地址沒有關(guān)系,也沒有重疊,當(dāng)你定義了S a={1,2,3};那么a.arr[0]=1;a.arr[1]=2;a.arr[3]=3;a.arr[4]一直到a.arr[9]都是0,這個是數(shù)組的賦值,部分賦值之后,沒有被賦值的就是0,相信你明白這個,那么b=a;之后,b的情況和a的一樣,b.arr[]中的值和a.arr[]中的值一樣的,但是是兩個不一樣的結(jié)構(gòu)體,但是如果:

S a={1,2,3},*b=a;

這個時候你定義的b是一個指向結(jié)構(gòu)體的指針,現(xiàn)在把它初始化為指向a,那么這個時候是將a的地址也就是a.arr[]的地址賦值給了b。

S y(){……}; 這樣是可以的,函數(shù)你要返回一個值,這個值是已經(jīng)定義的結(jié)果或者是系統(tǒng)里面有的就可以的,這里你的函數(shù)y返回的是一個結(jié)構(gòu)體,這個當(dāng)然是可以的了

另外,你那么的改當(dāng)然也是可以的了,結(jié)構(gòu)體是你定義的,你可以改成任何的類型,只要不出現(xiàn)語法錯誤,可以的呀~~~,你返回什么那是函數(shù)里面要實現(xiàn)的功能,看你怎么實現(xiàn)了,和定義是沒有必然的直接的聯(lián)系的~~~


本文名稱:c語言結(jié)構(gòu)體拷貝函數(shù) c++ 結(jié)構(gòu)體復(fù)制
本文網(wǎng)址:http://weahome.cn/article/ddgpgje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部