对于如下程序:
struct node{
char a;
}node1;
sizeof(node1)显然大小为1;但是如下程序:
struct node{
char a;
int b;
}node1;
sizeof(node1)大小却为8,因为结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小,依次类推。
另外:由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。因此最宽的成员大小为此偏移量。又有如下程序:
struct node{
char a;
char b;
int c;
}node1;sizeof(node1)大小却为8,那么对于如下程序呢?
typedef struct node{
char a;
struct node *next;
}node1;
typedef struct node{
char a;
node1 c;
}node2;sizeof(node1)大小为8,要知道指针也是变量,占用4个字节。而sizeof(node2)呢?它的字节为12。偏移量取node1中偏移量与char字节大小取最大值。
另外,顺便提下:
typedef union //定义共用体
{
long i; //long 四个字节
int k[5]; //int 四个字节 4*5 = 20
char c; //char 一个字节:
}DATE;
上面的结构体是联合:联合的结构体取中间最大的就可以了,因为他们是公用的,所以找到最大的空间,那么小的也能装在大的里面,如果你取小的,那么大的就不能装在小的里面了; 分析一下:上面最大的是:20此外,可以用#pragma pack(n)来决定偏移量的大小,n为此偏移量。