嵌套结构体的内存管理
当结构体中存在结构体类型成员时,结构体变量在内存中的存储依旧遵循内存对齐机制,此时结构体以其普通成员和结构体成员中的最长数据类型为准,对各成员进行对齐。如例9-4中的结构体struct Person,该结构体中包含一个struct Birth结构体类型的成员变量,在所有成员中,int类型为最长数据类型,因此,struct Person结构体变量在内存中以4字节为准进行对齐。struct Person结构体变量的内存示意图如图1所示。
图1 struct Person结构体变量的内存示意图
下面修改上一节案例,将struct Person结构体变量p及其成员地址打印出来,如例1所示。
例1 printAddr.c
1 #include <stdio.h>
2 struct Birth //定义结构体类型struct Birth
3 {
4 int year;
5 int month;
6 int day;
7 };
8 struct Person //定义结构体类型struct Person
9 {
10 int ID;
11 char name[10];
12 char sex;
13 struct Birth birthDate; //包含struct Birth结构体类型的变量birthDate
14 };
15 int main()
16 {
17 struct Person p = { 0006,"chenyan",'F',{1980,1,1}};
18 printf("&p:%p\n", &p); //输出结构体变量p的地址
19 printf("ID:%p\n", &p.ID); //输出成员ID的地址
20 printf("name:%p\n", &p.name); //输出成员name的地址
21 printf("sex:%p\n", &p.sex); //输出成员sex的地址
22 printf("year:%p\n", &p.birthDate.year);//输出成员birthDate.year地址
23 printf("month:%p\n", &p.birthDate.month);//输出成员birthDate.month地址
24 printf("day:%p\n", &p.birthDate.day); //输出成员birthDate.day地址
25 return 0;
26 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~7行代码定义了struct Birth结构体类型;第8~14行代码定义了struct Person结构体类型;第17行代码定义了struct Person结构体变量p并初始化;第18~24行代码分别调用printf()函数输出变量p及其各成员的地址。图1输出了struct Person结构体变量p的内存地址及其各个成员的内存地址,读者可计算各个成员地址之间的差值,与图1所示存储方式完全相符。