版本声明:本文转载于公众号TeachPlus
C语言面试题---结构体
请看下面这道题:
有程序:
# include <stdio.h>
struct a{
double a;
char b;
int c;
}A;
int main()
{
int size = sizeof(A);
printf("%d\n",size);
return 0;
}
请写出输出的结果是什么?
本题解析
答案:12
知识点详解
C语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础,但一不
小心就会弄错。写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往
都比你声明的变量总长度要大,这是怎么回事呢?
开始学的时候,也被此类问题困扰很久。其实相关的文章很多,感觉说清楚的不多。首先看为什
么要结构体对齐?
结构体数据成员对齐的意义
许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始
地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数
(alignment modulus)。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以
提升读取数据的速度。
比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字
节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型
数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据
或许恰好横跨在两个符合对齐要求的8字节内存块上。
结构体对齐包括两个方面的含义
1)结构体总长度;
2)结构体内各数据成员的内存对齐,即该数据成员相对结构体的起始位置;
结构体大小的计算方法和步骤
1)将结构体内所有数据成员的长度值相加,记为sum_a;
2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为
sum_b。对齐模数是#pragma pack指定的数值以及该结构体中数据成员自身长度中数值最大者
之间两者较小者。该数据相对起始位置应该是对齐模式的整数倍;
3)将和sum_b向结构体模数对齐,该模数是【#pragma pack指定的数值】、【未指定#pragma