将指针移动到所需位置

时间:2015-06-10 11:26:14

标签: c

我正在偏移我的指针,如下面的代码所示,以复制到另一个结构。

#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 *)并复制结构的其余部分

2 个答案:

答案 0 :(得分:5)

使用offsetof(struct test, x)(C99,gcc),而不是sizeof(stuct a *)。由于填充/对齐,它们不能保证相等。 警告:由于填充,使用sizeof(..)会导致未定义的行为,因为复制了过多的字符。

offsetof(<type>, <member>)返回从开头的偏移量。因此,sizef(struct test) - offsetof(struct test, x)会产生char的数量,以x开头复制所有字段。

Just read here for more details

答案 1 :(得分:4)

我认为最好的方法是使用offsetof

memcpy(&(q->x),&(ptr->x),sizeof(struct test)-offsetof(struct test, x));

因为如果第一个元素有点不同,则可能存在对齐问题,而offsetof会为您进行对齐。

当然,指针上的对齐问题不应该出现在常见架构上,但我认为offsetof无论如何都是更好的做法