复制结构的一部分

时间:2015-05-12 14:48:45

标签: c++ c pointers

我正在尝试复制大型结构的一部分,我希望我可以使用指针算法一次复制它的块。所以,如果我有以下结构

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 *)来解决这个问题。

3 个答案:

答案 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()复制对象的成员变量会破坏封装,并且一般不是好习惯。即只有你有非常好的理由才能这样做。如果你小心,它可以工作,但你使你的程序非常脆弱:你增加了未来的变化将引入错误的风险。

E.g。另见http://flylib.com/books/en/2.123.1.431/1/

答案 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))