将struct复制到char数组中

时间:2014-10-17 17:35:58

标签: c struct

我正在学习C并对结构有疑问。

我有一个

struct myStruct {
    char member1[16];
    char member2[10];
    char member3[4];
};

这应该至少需要30个字节的内存来存储。是否可以将所有这些数据复制到变量char foo[30]中?语法是什么?

6 个答案:

答案 0 :(得分:14)

你不能直接复制整个事物,因为编译器可能会随意决定如何填充/打包这个结构。您需要三次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);

答案 1 :(得分:3)

struct myStruct的大小为sizeof(struct myStruct)而没有其他内容。这将是至少30,但它可能是更大的价值。

你可以这样做:

char foo[sizeof(struct myStruct)];

struct myStruct x; /* populate */

memcpy(foo, &x, sizeof x);

答案 2 :(得分:3)

根据C标准(6.2.6类型表示)

  

4存储在任何其他对象类型的非位字段对象中的值   由n×CHAR_BIT位组成,其中n是其对象的大小   type,以字节为单位。该值可以复制到类型的对象中   unsigned char [n](例如, by 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 ) );

答案 3 :(得分:1)

是的,这是可能的。

你可以通过不同的方式来做这件事。以下是两种最简单的方法。

struct myStruct  myVar;

/* Initialize myVar */
...

memcpy (foo, &myVar, sizeof (myStruct));

或者如果你正在处理指针......

struct myStruct *  myVarPtr;

/* Initialize myVarPtr */
...

memcpy (foo, myVarPtr, sizeof (myStruct));

请注意,在将结构复制到这样的字符数组中时,必须非常小心,因为结构大小并不总是您可能首先想到的。在您的特定情况下,可能没有任何问题;但一般来说,您至少应该注意可能会改变结构大小的填充,对齐和类型大小问题。

希望这有帮助。

答案 4 :(得分:0)

如果你有一个名为st:

的myStruct变量,你可以执行以下操作
strcpy(foo, st.member1);
strcat(foo, st.member2);
strcat(foo, st.member3);

答案 5 :(得分:0)

使用memcpy非常简单。

char foo[30];
struct myStruct s;

s.member1 = //some data
s.member2 = //some data
s.member3 = //some data

memcpy(foo, &s, 30);