c語言結構體復制
① c語言,請問如何將結構體中的結構體拷貝到內存
1、可以直接用=符號拷貝,但它有一個條件,這里的賦初值不別的數據類型(如
int
a;a=5;)它必須是對結構體中的每個成員以此賦值的。將一個結構體變數的值直接賦給另外一個結構體變數的時候,這兩個結構體必須是相同結構體名。
2、不同類型的話,也可以用,一般在做通信方面用的比較多。因為處理協議。發包方按照某個協議結構體填充後,發送;接收方收到時其實是一個很長的字元串。那接收方一般用這種方法:結構體
=
(結構體)&字元串,
當然接收方的結構體跟發送方的結構體不一定一樣,都是根據協議來的。
② 怎麼把結構體裡面的數據復制到一個數組裡面
可以類似BACNET_ADDRESS *P_dest[50];這樣定義, 但要注意這樣聲明的是一個指針數組,即存50個BACNET_ADDRESS指針的數組,與你的需求不符。應該是直接定義BACNET_ADDRESS P_dest[50];這樣P_dest中才能存儲結構體。
C語言中結構體不能直接整體賦值。
可以使用memcpy函數:
void *memcpy(void *dest, const void *src, size_t n);
其中dest就是需要賦值到的地址, src就是復制源, n是需要復制的位元組數。
所以是 memcpy(&P_dest[i], &dest, sizeof(dest));
修正:好吧,又查了下C是支持結構體直接賦值的,但如果結構體中有指針,將是非常不安全的,不過就你的代碼來看是沒問題的。
你代碼不能復制的原因是兩者的類型不一致,就是最開始說的P_dest實際上是一個指針數組,而賦值時要把一個結構體賦值給指針導致的錯誤。只要改下P_dest的聲明就成了。
③ 如何給結構體里的數組復制啊
可以啊!你看!
#include<iostream>
#include<stdio.h>
usingnamespacestd;
structStu
{
intscore[10];
};
intmain()
{
Stus[2];
for(inti=0;i<2;i++)
for(intj=0;j<10;j++)
scanf("%d",&s[i].score[j]);
//cin>>s[i].score[j];
for(inti=0;i<2;i++)
{
for(intj=0;j<10;j++)
cout<<s[i].score[j]<<"";
cout<<endl;
}
return0;
}
④ C語言 結構復制
同一結構體類型的變數間可以互相賦值。
~~~~定義一個結構 typedef struct SA{ int arr[10];}S;
~~~~定義兩個變數 S a={1,2,3},b=a;
以上賦值是合法的。
是將a.arr[]中的每個元素復制給b.arr[]的每個元素;
而不是將a.arr[]的首地址復制給b.arr[]的首地址。
⑤ C語言 結構復制
是將a.arr[]中的每個元素復制給b.arr[]的每個元素,注意你定義的是一個結構體,c語言裡面,定義的時候就已經分配了空間,所以b也是一個結構體,有自己的空間,有自己的首地址,和a的地址沒有關系,也沒有重疊,當你定義了S a={1,2,3};那麼a.arr[0]=1;a.arr[1]=2;a.arr[3]=3;a.arr[4]一直到a.arr[9]都是0,這個是數組的賦值,部分賦值之後,沒有被賦值的就是0,相信你明白這個,那麼b=a;之後,b的情況和a的一樣,b.arr[]中的值和a.arr[]中的值一樣的,但是是兩個不一樣的結構體,但是如果:
S a={1,2,3},*b=&a;
這個時候你定義的b是一個指向結構體的指針,現在把它初始化為指向a,那麼這個時候是將a的地址也就是a.arr[]的地址賦值給了b。
S y(){……}; 這樣是可以的,函數你要返回一個值,這個值是已經定義的結果或者是系統裡面有的就可以的,這里你的函數y返回的是一個結構體,這個當然是可以的了
另外,你那麼的改當然也是可以的了,結構體是你定義的,你可以改成任何的類型,只要不出現語法錯誤,可以的呀~~~,你返回什麼那是函數裡面要實現的功能,看你怎麼實現了,和定義是沒有必然的直接的聯系的~~~
⑥ C語言如何深拷貝結構體
結構體並非一個賦值號就能的,需要手動設計自己將其中的每個基礎類型進行復制:
struct a a1,a2;
strcpy(a1.str,"123456789"); strcpy(a2.str,a1.str); strcpy(a1.str,"111111111");
在中間那句執行時,a1.str的內容是"123456789",因此賦值給a2.str的也是這個字元串
賦值完成後再改變a1時,a2與此無關了,會保持最後一次操作賦值的結果。
⑦ c語言如何實現結構體的深度復制
使用memcpy即可, 比如你另外建立一個結構體sortbook[1000]用來保存排序結果,將book中的第i個元素賦值到sortbook的第j個元素中
memcpy(&sortbook[j], &book[i], sizeof(struct book));
用這個函數需要#include <string.h>
函數原型
void *memcpy(void*dest, const void *src, size_t n);
功能
由src指向地址為起始地址的連續n個位元組的數據復制到以destin指向地址為起始地址的空間內。
頭文件
#include<string.h>
返回值
函數返回一個指向dest的指針。
說明
1.source和destin所指內存區域不能重疊,函數返回指向destin的指針。
2.與strcpy相比,memcpy並不是遇到'\0'就結束,而是一定會拷貝完n個位元組。
memcpy用來做內存拷貝,你可以拿它拷貝任何數據類型的對象,可以指定拷貝的數據長度;
例:
char a[100], b[50];
memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會造成b的內存地址溢出。
strcpy就只能拷貝字元串了,它遇到'\0'就結束拷貝;例:
char a[100], b[50];
strcpy(a,b);
3.如果目標數組destin本身已有數據,執行memcpy()後,將覆蓋原有數據(最多覆蓋n)。如果要追加數據,則每次執行memcpy後,要將目標數組地址增加到你要追加數據的地址。
//注意,source和destin都不一定是數組,任意的可讀寫的空間均可。
⑧ c語言strcpy將一個結構體的數據復制到另一個後,出問題了
這屬於C++的范疇,雖然我C++學得也是半斤八兩,但是這段代碼我還是基本上過得去。
我假設你是有一定的C編程基礎,所以就只回答你空間描述的不懂的地方了,每句都翻譯枯燥而且也會感覺不知所雲。還有什麼不懂的,歡迎提問,我有足夠的耐性和信心讓你搞明白,呵呵^!^
C++中主要是比C多了面向對象的概念。
#include <*****> 表示的是將*****頭文件包含進來
#include "*****" 功能一樣,只是他們索引文件的方式不一樣,初學者不必深究。
*****頭文件裡面定義了常用的一些預處理,結構體,類等等,可以方便大家直接使用不再定義他們。你可以搜索*****找到它打開看看裡面的內容,不要隨意修改他們哦,否則你以後寫程序要出問題的喲,呵呵。
using namespace std;
表示要用到的一些關鍵字所在的命名空間
因為用到了cout所以必須加上這句話。
定義了一個Student類,定義類的時候除了可以定義一些變數,還可以定義一些介面,變數和介面都可以用private,public,protected來定義訪問 以及 繼承許可權的。
其實介面更直接一點就是一個函數,或者說成指向函數的指針變數也可以,主要看你怎麼理解了。
int student::jud() ::表示域限定符,用::定義了一個介面(也就是函數),表示這個函數是屬於student類的。
同時student類中還定義了一個student()函數,是構造函數,語法規定必須和類名字相同。構造函數的主要作用是類實例化的時候初始化變數,也就是在創建對象的要用到的。
loop: printf("****");
loop:表示的是一個標號,後面用goto loop 跳轉到loop:位置執行printf("****");
你完全可以把loop替換成別的東西,比如xunhuan,呵呵
cout 用來控制輸出
<<連接各個參數,
cint 用來控制輸入
>>連接各個參數。參數和printf ,scanf 是相一致的。
system("***"); 可以調用一些命令行,如cls 清屏 ,pause 暫停 還可以創建進程等等。
好像差不多沒了,其他東西基本都是C語言知識了
PS:
其實C++的類和C語言的結構體非常相似,類可以定義函數介面,但是結構體不行
其實我們在結構體中也可以變相的實現定義函數的嘛,比如定義一個函數指針變數。
唯一不同的就是C++的類多了繼承的概念,一個類可以繼承另一個類的一些屬性
而且在繼承的過程中還有private,public,protected等許可權。
當然C++除了類之外還有STL等一些比較高級的東東值得學習,巧妙的使用他們可以加快項目進度,提升項目效率,C++真的是很好很強大。
⑨ C語言怎麼將結構體的內容復制到另一個結構體中
C並不支持結構體變數的直接賦值,
一般採用memcpy(&a,&b,sizeof(a))的方式
⑩ C語言中結構體可以通過=號直接復制嗎
標準的C語言是不可以的,但是如果你的文件的擴展名是.cpp
這就沒問題了。