#pragma pack(1)//一字节对其方式 #include<stdio.h> #include<stddef.h> #include<string.h> struct node_t{ int offset[10]; char a[9]; int b; int c; }; int main() { struct node_t node; size_t size; //方式1 /*经过函数库的offsetof()宏来获取成员变量的偏移量*/ size = offsetof(struct node_t,c); printf("method one:%d\n",size); //思路:(结构体成员变量c的地址) 减去 (结构体起始地址)获取偏移量 size = (unsigned long)(&(node.c)) - (unsigned long)(&node); printf("method two:%d\n",size); int *p_c;//成员变量c的指针 char *p_a;//成员变量a的指针 //经过偏移地址获取成员变量c的地址 p_c = (int*)((unsigned long)(&node)+sizeof(char)*9 +sizeof(int) + sizeof(int)*10); //设置其值为12 *p_c = 12; //正常方式访问变量,检测是否设置成功 printf("node_c = %d\n",node.c); //获取成员变量a的地址 p_a = (char*)((unsigned long)(&node)+sizeof(int)*10); strcpy(p_a,"hello"); //检测是否设置成功 printf("p_a = %s\n",node.a); //方式2 //(struct node_t *)0 是骗编译器说有一个指向类(或结构)node_t的指针,其地址值0, /*offset宏的原型 #define offsetof(s, m) (size_t)&(((s *)0)->m) s是一个结构名,它有一个名为m的成员(s和m 是宏offsetof的形参,它实际是返回结构s的成员m的偏移地址 (s *)0 是骗编译器说有一个指向类(或结构)s的指针,其地址值0 &((s *)0)->m 是要取得类s中成员变量m的地址. 因基址为0,这时m的地址固然就是m在s中的偏移 最后转换size_t 型,即unsigned int。 */ size = (unsigned long)&(((struct node_t *)0)->c); printf("method two:%d\n",size); return 0; }