学科分类
目录
C语言

嵌套结构体的内存管理

当结构体中存在结构体类型成员时,结构体变量在内存中的存储依旧遵循内存对齐机制,此时结构体以其普通成员和结构体成员中的最长数据类型为准,对各成员进行对齐。如例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所示存储方式完全相符。

点击此处
隐藏目录