C中char 在 struct 中所占字节问题

来源:互联网 发布:java的jvm 编辑:程序博客网 时间:2024/05/05 20:52


最近决定好好把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=4sizeof char=1sizeof double=8sizeof A=16sizeof 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。