我想知道是否有可靠且符合标准的方法仅从结构中的某个位置复制成员。例如像这样的东西
struct A {
char* baz;
int foo;
int bar;
};
void copy(struct A* dst, const struct A* src) {
dst->baz = malloc(1 + strlen(src->baz));
strcpy(dst->baz, src->baz);
memcpy(
((void*)dst) + sizeof(char*),
((void*)src) + sizeof(char*),
sizeof(struct A) - sizeof(char*)
);
}
这是有效的C并且不违反标准吗?我知道有时内存对齐可能存在一些问题,我不知道它是否适用于这种情况。
第二个问题是 - 跳过多个成员时该怎么做,因为填充问题开始抬起他们丑陋的头
-
void copy(A* dst, const A* src)
不是有效的C,因为你没有typedef结构。如果要使用此样式,请更改为typedef struct {...} A;
。 -
strdup
不是有效的 C(但有效的 POSIX)。我不建议将其用于任何目的。请改用malloc
+strcpy
(如果大小已知,则使用memcpy
)。 -
dst + sizeof(char*)
是无稽之谈,因为这对整个结构进行指针运算。与src + sizeof(char*)
相同。 -
修复该错误后,仍然无法保证
(uint8_t*)dst + sizeof(char*)
提供成员foo
的地址。编译器可以自由地在结构内的任何位置插入填充(第一个成员之前除外)。您可以通过
offsetof(struct A, foo)
可靠地获取特定成员的位置,这为您提供了从结构开头到该特定成员的字节数。
否则,复制结构的特定成员的理智方法是dst->foo = src->foo;
。没有明显的理由说明为什么你的代码不应该这样做。
同样,您可以使用复合文本仅复制特定成员并将其余成员设置为零/NULL:
*dst = (A){ .foo = src->foo };