[英]Copy struct into char array
我正在學習C,並且對結構有疑問。
我有一個
struct myStruct {
char member1[16];
char member2[10];
char member3[4];
};
這至少需要占用30個字節的內存來存儲。 是否可以將所有這些數據復制到變量char foo[30]
? 語法是什么?
您不能直接復制整個內容,因為編譯器可以隨意決定如何填充/打包此結構。 您將需要三個memcpy
調用:
struct myStruct s;
// initialize s
memcpy(foo, s.member1, sizeof s.member1);
memcpy(foo + sizeof s.member1, s.member2, sizeof s.member2);
memcpy(foo + sizeof s.member1 + sizeof s.member2, s.member3, sizeof s.member3);
struct myStruct
的大小為sizeof(struct myStruct)
,僅此而已。 至少為30,但可以更大。
你可以這樣做:
char foo[sizeof(struct myStruct)];
struct myStruct x; /* populate */
memcpy(foo, &x, sizeof x);
根據C標准(6.2.6類型表示)
4存儲在任何其他對象類型的非位字段對象中的值由n×CHAR_BIT位組成,其中n是該類型對象的大小(以字節為單位)。 可以將值復制到unsigned char [n]類型的對象中(例如, 通過memcpy ); 結果得到的字節集稱為值的對象表示。
所以你可以簡單地寫
unsigned char foo[sizeof( struct myStruct )];
struct myStruct s = { /*...*/ };
memcpy( foo, &s, sizeof( struct myStruct ) );
考慮到可以將數據成員分別復制到一個陣列中。 例如
unsigned char foo[30];
struct myStruct s = { /*...*/ };
unsigned char *p = foo;
memcpy( p, s.member1, sizeof( s.member1 ) );
memcpy( p += sizeof( s.member1 ), s.member2, sizeof( s.member2 ) );
memcpy( p += sizeof( s.member2 ), s.member3, sizeof( s.member3 ) );
對的,這是可能的。
您可以通過不同的方式進行此操作。 以下是兩種最簡單的方法。
struct myStruct myVar;
/* Initialize myVar */
...
memcpy (foo, &myVar, sizeof (myStruct));
或者如果您正在處理指針...
struct myStruct * myVarPtr;
/* Initialize myVarPtr */
...
memcpy (foo, myVarPtr, sizeof (myStruct));
請注意,在像這樣的字符數組中復制結構或從其中復制結構時,您必須非常小心,因為結構大小並不總是您首先想到的。 在您的特定情況下,可能沒有任何問題。 但通常,您至少應該了解可能會改變結構尺寸的潛在填充,對齊和字體大小問題。
希望這可以幫助。
如果您有一個名為st的myStruct變量,則可以執行以下操作:
strcpy(foo, st.member1);
strcat(foo, st.member2);
strcat(foo, st.member3);
使用memcpy非常簡單。
char foo[30];
struct myStruct s;
s.member1 = //some data
s.member2 = //some data
s.member3 = //some data
memcpy(foo, &s, 30);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.