测试环境:visual studio2019
#include <stdio.h>
//取结构体某成员在结构体内部的偏移
#define MY_OFFSET(st,field) (size_t)&(((st*)0)->field)
struct A {
int a;//4
char b;//1
short c;//2
};//7 8
struct B {
char b;//1
int a;//4
short c;//2
};// 12
struct C {
char b;//1
short c;//2
int a;//4
};// 12
typedef struct {
char a;//1
short b;//2
char c;//1
int d;//4
char e[3];//3
struct A my_A;
struct B my_B;
}test;
int main()
{
test st;
printf("size = %d\n a-%d\n b-%d\n c-%d\n d-%d\n e-%d\n my_A-%d\n my_B-%d\n",
sizeof(test), MY_OFFSET(test,a), MY_OFFSET(test, b), MY_OFFSET(test, c), MY_OFFSET(test, d),
MY_OFFSET(test, e), MY_OFFSET(test, my_A), MY_OFFSET(test, my_B));
//printf("sizeof(struct A) = %d\n", sizeof(struct A));
//printf("sizeof(struct B) = %d\n", sizeof(struct B));
//printf("sizeof(struct C) = %d\n", sizeof(struct C));
//printf("sizeof(test) = %d\n", sizeof(test));
printf("Hello World!\n");
}
测试结果:
理论分析:测试test结构体的大小
理论分析技巧:(重要),尤其是第二条
(1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
(2)结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);上面图一左边的地址编号就是偏移量offset
(3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节{trailing padding}。