其他:
1.数组下标可为负:a[-1] 相当于 a+(-1);
2.联合体大小就是成员中最大类型的大小;
如何计算一个结构体的大小?
例如:
struct Test{
int Num;
char *name;//指针大小取决于编译器的位数 ,64位 为:8字节 32位为:4字节
short date;
char ch;
}*p;
总结计算大小规则:
1.其大小也与成员顺序有关系,因为前一个成员地址需要与下一个成员地址构成需要满足地址对齐,即当前所占字节数需为当前编译器宽度的整数倍
如以上结构体(假设编译器为64位):int num 占4字节,下一成员char * name 占用8字节
首先4+8=12>8,即编译器宽度(即指针所占大小:8)存放不下,故第一个成员补全为编译器宽度为8字节,(需保持和下一成员地址对齐,如果当前几个数据成员地址实现对齐,则从下一个成员为起点再重复以上规则))
接下来:short date 占用2字节,char ch 占用1字节 2+1=3字节,一个地址宽度能放下,但8+8+3=19不是8的倍数,故需要补齐,其实就是再补5个字节,故此结构体大小为:24字节
注意:如何补?补几个字节,取决于编译器宽度,和其中占用内存大小最大的成员,如过超过编译器宽度,以其数据成员所占内存大小为对齐基准,否则补齐到编译器宽度即可
- 再举个例子:
struct Test{
//int Num;
//char *name;//指针大小取决于编译器的位数 ,64位 为:8字节 32位为:4字节
short date;
char ch;
}*p;
以上结构体多大呢? 答案:4字节 (没有达到编译器宽度,以最大成员对齐)
再来个例子:
struct Test{ int Num; char *name;//指针大小取决于编译器的位数 ,64位 为:8字节 32位为:4字节 short date; char ch; int ch1; //char k; }TEST;
答案:24 每对其一次,从当前开始对齐,小于编译器宽度以当前 最大元素对齐
8: 4+补齐4
8:8(4+8=12 >8,但不是8倍数,故上面元素需补齐4)
8:2+1+补齐1 + 4
总和:刚好24 不用再补齐