我正在偏移我的指针,如下面的代码所示,以复制到另一个结构。
#include <stdio.h>
struct a
{
int i;
};
struct test
{
struct a *p;
int x,y,z;
};
int main()
{
struct test *ptr = malloc(sizeof(struct test));
struct test *q = malloc(sizeof(struct test));
ptr->x = 10;
ptr->y = 20;
ptr->z = 30;
memcpy(&(q->x),&(ptr->x),sizeof(struct test)-sizeof(struct a*));
printf("%d %d %d\n",q->x,q->y,q->z);
return 0;
}
有没有更好的办法来memcpy()
?
我的问题是,如果我认识到结构的成员并希望只用sizeof(struct a*)
移动指针并复制结构的其余部分,该怎么办?
编辑:
我想复制结构的某些部分,但我不知道其中的成员,但我知道我想跳过某些类型的变量,如示例中所示(struct a *)并复制结构的其余部分
答案 0 :(得分:5)
使用offsetof(struct test, x)
(C99,gcc),而不是sizeof(stuct a *)
。由于填充/对齐,它们不能保证相等。 警告:由于填充,使用sizeof(..)
会导致未定义的行为,因为复制了过多的字符。
offsetof(<type>, <member>)
返回从开头的偏移量。因此,sizef(struct test) - offsetof(struct test, x)
会产生char
的数量,以x
开头复制所有字段。
答案 1 :(得分:4)
我认为最好的方法是使用offsetof
memcpy(&(q->x),&(ptr->x),sizeof(struct test)-offsetof(struct test, x));
因为如果第一个元素有点不同,则可能存在对齐问题,而offsetof会为您进行对齐。
当然,指针上的对齐问题不应该出现在常见架构上,但我认为offsetof
无论如何都是更好的做法