按地址访问struct成员

Jac*_*ack 4 c struct pointers

考虑具有两个整数类型成员的结构.我希望通过地址获得两位成员.我可以成功获得第一个,但是我的第二个错误.我相信这是垃圾价值.这是我的代码:

#include <stdio.h>

typedef struct { int a; int b; } foo_t;

int main(int argc, char **argv)
{

  foo_t f;
  f.a = 2;
  f.b = 4;
  int a = ((int)(*(int*) &f));
  int b = ((int)(*(((int*)(&f + sizeof(int)))))); 
  printf("%d ..%d\n", a, b);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我越来越:

2 ..1

谁能解释我哪里出错了?

das*_*ght 7

根据C标准,第一个成员的偏移量必须始终为零; 这就是你的第一次演员工作的原因.然而,由于填充,第二构件的偏移可能不一定等于结构的第一构件的尺寸.

此外,向指针添加数字不会向地址添加字节数:而是添加指向的事物的大小.所以当你添加sizeof(int)&f,sizeof(int)*sizeof(foo_t)会被添加.

offsetof如果你想自己做数学运算,你可以使用运算符

int b = *((int*)(((char*)&f)+offsetof(foo_t, b)));
Run Code Online (Sandbox Code Playgroud)

这部作品的原因是sizeof(char)始终之一,所要求的C标准.

当然,您可以使用&f.b以避免手动进行数学运算.

  • @Dolda2000不,那是ANSI C:见7.17.3节[这里](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf); (2认同)