#include <stdio.h>
#if 1
typedef struct MyStruct
{
double dda0;
char dda1;
short dda3;
double dda4;
int type ;
}testS;
char *p;
char *q[20];
char *m[20][20];
int (*n)[10];
testS k;
#define TITLE() printf("%-20s" " %-10s/n", "Data Type", "Data Size")
#define PRINTSIZE(type) printf("%-20s"": %-10d/n", #type,sizeof(type))
void main(void)
{
TITLE();
memset(&k, 0, sizeof(testS));
PRINTSIZE(int);
PRINTSIZE(char);
PRINTSIZE(short);
PRINTSIZE(long);
PRINTSIZE(double);
PRINTSIZE(float);
PRINTSIZE(long int);
PRINTSIZE(long double);
PRINTSIZE(long float);
PRINTSIZE(p);
PRINTSIZE(q);
PRINTSIZE(m);
PRINTSIZE(n);
PRINTSIZE(k);
}
#endif
该程序在我的机器(32位,P4)上的运行结果如下:
Data Type Data Size
int : 4
char : 1
short : 2
long : 4
double : 8
float : 4
long int : 4
long double : 8
long float : 8
p : 4
q : 80
m : 1600
n : 4
k : 32
Press any key to continue
我们看到了这个结果, 其中有一项
k : 32
说明struct MyStruct的大小是32bytes.
有些人会认为应该是24才对.
下面我们来分析一下为什么会是32:
首先我来看以下结构:
typedef struct MyStruct
{
double dda0;
char dda1;
short dda3;
double dda4;
int type ;
}testS;
double类型占8bytes,这个是没有问题的了 , 接下来 char类型占1byte,short类型占2bytes,int类型占4bytes,
我们常认为在32位机上内存的对齐方式是4bytes(32位)对齐。使用我们认为的dda1和dda2占4bytes, 这样算下来就是8+4+8+4=24.
但是在这里不是这样的了,在这个结构里有double 类型,它是一个c的基本类型,在这里内存的对齐方式是8bytes。这是因为
struct中的各成员变量的存储地址有一套对齐的机制。这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足;第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充。
所以testS的大小是8+8+8+8=32