复制结构的一部分

copying part of a structure

本文关键字:一部分 结构 复制      更新时间:2023-10-16

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

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

我的答案仅适用于 c

使用 memcpy()复制对象的成员变量打破封装,并且通常不是很好的实践。IE。仅当您有很好的理由时才这样做。如果您小心,它可以工作,但是您的程序非常脆弱:您会增加未来更改会引入错误的风险。

例如。另请参阅http://flylib.com/books/en/2.123.1.431/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的一部分(对于其他功能也非常有趣)。实际上,另一个功能可能会为您的问题提供更好的舒适性。您可能会查看DOC页面,并让它安置一两个SEC以获得含义。仍然想知道为什么此功能没有将其纳入标准(没有额外的代码,更少得多的类型安全性)。

是的,您可以做:

memcpy(pCopyStruct, &origionalStruct.field1, 
  (char*)&origionalStuct.field23 - (char*)&origionalStuct.field1);

但是,您可能想使用stddef.h中的offsetof()宏。

memcpy(pCopyStruct, &originalStruct.field1, 
  offsetof(struct myStruct, field23)-offsetof(struct myStruct, field1));

如果 field1在偏移0(结构中首先),则可以省略减法。

为了完整性,offsetof宏可以定义为:

#define offsetof(st, m) ((size_t)(&((st *)0)->m))