问题描述:统一程序在不同电脑上编译时结果不同,其原因是因为内存未对齐,内存地址问题
通过计算结构体字节数来加深理解
1.相同变量类型字节数
规律:即为他们各自本身字节数相加
struct A
{
int a;//4字节
int b;//4字节
};//8字节
2.不同变量类型
规律:按顺序从上向下依次计算字节数
第一个为本身类型字节数
下一个为之前字节数的倍数,若不足则将其补充为倍数关系
例:char a为1字节,下一变量int b为4字节,但1不是4的倍数,所以将它补为4 的倍数即+3字节
struct B
{
char a;//1字节+3
int b;//4字节
};//8字节
例:char a为1字节,下一变量short b为2字节,但1不是2的倍数,所以将其补为2的倍数即+1
下一变量int c为4字节,之前字节数和为4字节(包括已经补充的字节数),4是4的倍数,所以不需要补充
struct C
{
char a;//1字节+1
short b;//2字节
int c;//4字节
};//8字节
其他例子:
struct D
{
char a;//1+3
int b;//4
int c;//4+4
double d;//8
};
struct E{short a;//2+2int b;//4long long *c;//4};
3.考虑数组内存
计算数组内存时需要考虑,数组中每一个元素所分配字节数于下一元素所分配字节数是否相同
例:下例所计算得到字节数为10,如果此数组从内存为100的格子开始分配,则第一个元素所占格子为100~109
第二个元素为110~109,但众所周知编译时系统以4个字节为单位,所以在编译第二个元素时是从112开始,即出现错误
所以此时规则为:计算数组元素字节数时,总数应为最大变量类型倍数,若不足,则补充
即下例总数为10,最大变量类型字节数为4,所以补充为4的倍数,即+2
struct F
{
char a;//1+3
int b;//4
short c;//2
};//10+2,
4.不需要考虑对齐的应用
struct G
{
char a;
char x;//保留,不使用
short b;
int c;
};
5.特殊
此例12字节、16字节都满足,但优先选择更小的字节
struct H
{
int a;//4
struct HH
{
char b;//1+3
int c;//4
}d;
};//12