我正在学习C并对结构有疑问。
我有一个
struct myStruct {
char member1[16];
char member2[10];
char member3[4];
};
这应该至少需要30个字节的内存来存储。是否可以将所有这些数据复制到变量char foo[30]
中?语法是什么?
答案 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)
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);