最近决定好好把C看下,虽然学过C++,但是对于C中的常用函数特别是内存管理的函数还不甚了解,刚开始的时候就遇到一个小问题==!
用 sizeof 看 struct 占用内存字节问题:
//sMem.c #include <stdio.h> typedef struct TagS_A { int i; char c; double d; } A; int main(void) { A a; printf("sizeof int=%d\n",sizeof(int)); printf("sizeof char=%d\n",sizeof(char)); printf("sizeof double=%d\n",sizeof(double)); printf("sizeof A=%d\n",sizeof (A)); printf("sizeof a=%d\n",sizeof a); return 0; }
输出结果:sizeof int=4 sizeof char=1 sizeof double=8 sizeof A=16 sizeof a=16
注意到 4+1+8!=16 ==!遂分别试验了下不同变量类型组合成的结构体占内存字节数,结果如下
struct 只有 int 占内存 4 字节;
struct 只有 char 占内存 1 字节;
struct 只有 double 占内存 8 字节;
struct 包含 int, char 占内存 8 字节;
struct 包含 char double 占内存 12 字节;
struct 包含 int double 占内存 12 字节;
结果很明显,当struct 只存储 char 时占1 字节,再加上其他类型时,char 占4 个字节
记的 C Primer Plus 上写道 char 在参与计算的表达式里会自动转换成 int 类型,取结果时 发生截断只取 int 第一个字节
但是此种情况却未提及,还请高手解释!!
现已知道原因:
“在一些系统中,结构的大小有可能大于它内部各成员大小之和,那是因为系统对数据的对齐存储需求会导致缝隙。例如,系统有可能必须把每个偶数地址的成员放在是4的倍数的地址上,这样的结构就可能在其内部存在存储缝隙。” ——C Primer Plus 14.6.1 声明和初始化结构指针
至于系统对数据的对齐存储还真是有点门道 可参看此文——详解结构体、类等内存字节对齐 - 张宇(数据恢复) - 51CTO技术博客 http://zhangyu.blog.51cto.com/197148/673792。