目录
结构体的声明
struct tag{
char name[];
int age;
}peo;
注意:结构体中的分号一定不能省,不可忽略
结构体定义和赋初值
struct tag p={"zhangsan",23};
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu
{//类型声明 char name[15];//名字 int age; //年龄 };
struct Stu s = {"zhangsan", 20};//初始化
结构体的内存对齐数
!计算结构体的大小,下面我们就来讨论一下最热门的考点:结构体内存对齐数
结构体的对齐数规则
1、第一个成员位于0偏移处的位置
2、其他成员要对齐到某个数字(对齐数)的整数倍
对齐数:为编译器所默认的对齐数与成员本身大小之间的最小值
3、结构体内存对齐数为所有成员中最大对齐数的整数倍
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
例题:
1、
typedef struct s1{ int a; char b; short c; short d; }AA_t;
分析:画图->
一个int a,整型需要4个字节,在0偏移处开始数,占四个格子,到3处,接下来char b 需要一个字节,最小对齐数为1,刚好在4处,此时4也 1的整数倍,到5处时,short是两个字节,和规定的编译器的8比较,明显是2比较小,但5不是2的整数倍,故要浪费一个字节,跳到6处才能填充short c,
接着short d同short c 最小对齐数为2,刚好来到8处,8是其整数倍,可直接填充,属下来包括浪费掉的空间,刚好是10个字节,其中4个最小对齐数:4 1 2 2中4是最大对齐数,此时10不是4的整数倍,故只能是12,所以该内存最大数为12.
运行代码
#include<stdio.h>
typedef struct s1 {
int a;
char b;
short c;
short d;
}AA_t;
int main()
{
printf("%d", sizeof(struct s1));
}
结果:
2、
在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少?
struct A { int a; short b; int c; char d; }; struct B { int a; short b; char c; int d; };
通过画图和代码运行结果均为16 12
画图分析如下
左边为结构体A的图,右边为结构体B的图
以上两题均是笔试中常见类型,此题不再一一分析,读者可按照题一进行具体分析,也可看我画的图,或者自行画图理解,这样会深刻。