Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将结构复制到char数组中_C_Struct - Fatal编程技术网

将结构复制到char数组中

将结构复制到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

我正在学习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);
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编写的那样,
+
执行列表串联。您的解决方案将复制对象的字节,正如您在答案中所解释的那样。