我正在尝试复制大型结构的一部分,我希望我可以使用指针算法一次复制它的块。所以,如果我有以下结构
struct {
int field1;
char field2;
myClass field3;
.
.
.
myOtherClass field42;
} myStruct;
struct origionalStruct;
struct *pCopyStruct;
我可以使用memcpy()使用指针算法复制部分内容吗?
memcpy(pCopyStruct, &origionalStruct.field1,
(char*)&origionalStuct.field1 - (char*)&origionalStuct.field23);
我知道指针算法只对数组有效,但我希望通过将所有内容都转换为(char *)来解决这个问题。
答案 0 :(得分:1)
最好将要复制的字段放入嵌套结构中,然后将其分配给新结构的相应字段。这样可以避免写入,提高可读性,并且 - 至少不会持续 - 保持类型安全。所有memcpy都没有提供。
如果复制的字段位于结构的结尾或开头,那么offsetof()或使用封闭字段的地址显然不起作用。
struct {
int field1;
struct { char fields } cpy_fields;
} a, b;
a.cpy_fields = b.cpy_fields;
使用gcc时,您可以启用plan9-extensions并使用匿名结构,但需要内部的typedef:
typedef struct { char field1; } Inner;
struct {
int field1;
Inner;
} a, b;
这不会改变现有的代码:a.field2
。您仍然可以通过其类型名称来访问整个结构(前提是您只在外部结构中有一个实例):a.Inner = b.Inner
。
虽然第一部分(匿名结构)是自C99以来的标准,但后者是plan9-extensions的一部分(对于其他功能也非常有趣)。实际上,其他功能可能会为您的问题提供更好的解决方案。您可以查看the doc-page并让它稳定一两秒以获得影响。仍然想知道为什么这个功能没有达到标准(没有额外的代码,更多的类型安全,因为需要更多的演员阵容)。
答案 1 :(得分:1)
我的回答仅适用于 c ++ 。
使用 memcpy()复制对象的成员变量会破坏封装,并且一般不是好习惯。即只有你有非常好的理由才能这样做。如果你小心,它可以工作,但你使你的程序非常脆弱:你增加了未来的变化将引入错误的风险。
答案 2 :(得分:0)
是的,你可以这样做:
memcpy(pCopyStruct, &origionalStruct.field1,
(char*)&origionalStuct.field23 - (char*)&origionalStuct.field1);
但是,您可能希望使用offsetof()
中的stddef.h
宏。
memcpy(pCopyStruct, &originalStruct.field1,
offsetof(struct myStruct, field23)-offsetof(struct myStruct, field1));
如果field1
位于偏移0(结构中的第一个),则可以省略减法。
为完整起见,offsetof
宏可以定义为:
#define offsetof(st, m) ((size_t)(&((st *)0)->m))