簡體   English   中英

將結構復制到char數組中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM