将结构复制到char数组中
我正在学习C语言,有一个关于结构的问题 我有一个将结构复制到char数组中,c,struct,C,Struct,我正在学习C语言,有一个关于结构的问题 我有一个 struct myStruct { char member1[16]; char member2[10]; char member3[4]; }; 这至少需要30字节的内存来存储。是否可以将所有这些数据复制到变量char foo[30]?语法是什么?如果您有一个名为st的myStruct变量,则可以执行以下操作: strcpy(foo, st.member1); strcat(foo, st.member2); strc
struct myStruct {
char member1[16];
char member2[10];
char member3[4];
};
这至少需要30字节的内存来存储。是否可以将所有这些数据复制到变量
char foo[30]
?语法是什么?如果您有一个名为st的myStruct变量,则可以执行以下操作:
strcpy(foo, st.member1);
strcat(foo, st.member2);
strcat(foo, st.member3);
struct-myStruct
的大小是sizeof(struct-myStruct)
而不是别的。它至少是30,但它可以是任何更大的值
您可以这样做:
char foo[sizeof(struct myStruct)];
struct myStruct x; /* populate */
memcpy(foo, &x, sizeof x);
您不能直接复制整个内容,因为编译器可能会任意决定如何填充/打包此结构。您需要三个
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);
根据C标准(6.2.6类型表示) 4存储在任何其他对象类型的非位字段对象中的值 由n×CHAR_位组成,其中n是该对象的大小 键入,以字节为单位。可以将值复制到类型为的对象中 无符号字符[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 ) );
memcpy非常简单
char foo[30];
struct myStruct s;
s.member1 = //some data
s.member2 = //some data
s.member3 = //some data
memcpy(foo, &s, 30);
是的,这是可能的
你可以用不同的方法来做这件事。下面是两种最简单的方法
struct myStruct myVar;
/* Initialize myVar */
...
memcpy (foo, &myVar, sizeof (myStruct));
或者,如果您正在处理指针
struct myStruct * myVarPtr;
/* Initialize myVarPtr */
...
memcpy (foo, myVarPtr, sizeof (myStruct));
请注意,在向这样的字符数组复制结构或从中复制结构时,必须非常小心,因为结构大小并不总是您首先想到的。在您的特殊情况下,可能没有任何问题;但一般来说,您至少应该注意可能会改变结构大小的潜在填充、对齐和类型大小问题
希望这有帮助。不是肯定的,但您可以尝试memcpy(*dest,*src,sizeof(src));如果你发现自己在说“显然”之类的话,你应该立即发出多个危险信号。@KerrekSB哦,这不是需要30个字节吗?我知道,对于更复杂的话题,我应该wary@YiweiG当前位置问题是,你不能自信地肯定。所以,没有什么是“明显的”,除非你能真正支持它。橡胶鸭子它,与标准参考在手边,然后我们可以谈论“明显”。@KerrekSB足够公平。我已经编辑了澄清的帖子问题是printf(“%s”,foo)将只显示第一个字符数组,假设它们是以null结尾的字符串。您可以使用offsetof()获取不在第一个位置的字符串。如果结构的成员不是char,而是一堆int或int与char的混合,则此操作仍然有效吗?如果数组不是以null结尾的,或者数组比描述的短,则此操作将不起作用。是的,这与假设它们是字符串的情况一致。另外,永远不要使用strcpy.:P始终使用strncpy.来消除您假设以null结尾的字符串的歧义(仅适用于此答案)。(我知道OP没有指定)如果
char
数组的语义是原始字节,则这是正确的。如果它们是NUL终止字符串,则需要另一种解决方案(如)。从这个问题上不清楚它是什么。这种技术被称为序列化
?(它会避免填充问题吗?)与其手动计算结构中每个字段的偏移量,不如使用宏来完成此操作。与其使用foo+sizeof s.member1
我可以执行&foo[16]
?是的,这很好。我只是使用了sizeof
以便于维护。虽然这是有效的C,但它不一定能满足OP的要求。@5gon12eder我不明白你想说什么。在任何情况下,iy都是决定他拥有什么的OP。我猜他实际上想要foo=s.member1+s.mamber2+s.member3
,就像我们用Python编写的那样,+
执行列表串联。您的解决方案将复制对象的字节,正如您在答案中所解释的那样。