复制结构的一部分
copying part of a structure
我正在尝试复制大型结构的一部分,我希望我可以使用指针算术来一次复制它的块。因此,如果我有以下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))
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- C++结构的一部分
- 复制结构的一部分
- 将哈希函数定义为结构的一部分
- 我怎样才能把这行的某一部分读成一个结构呢
- c++ WriteProcessMemory() -写结构体的一部分
- 提升:精神 解析结构并重用其中的一部分
- c++只赋值函数调用返回的结构体的一部分