考虑具有两个整数类型成员的结构.我希望通过地址获得两位成员.我可以成功获得第一个,但是我的第二个错误.我相信这是垃圾价值.这是我的代码:
#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
谁能解释我哪里出错了?
根据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以避免手动进行数学运算.