原因:CPU为了快速的存取内存从而存在内存问题
分析方法:
- 有例子1:
#include <stdio.h>
struct A{
char a2; // 占一字节
char a3;
char a;
short i; // 占两字节
};
int main(int argc, const char *argv[])
{
struct A aa = {0x1, 0x2, 0x3, 0x5555};
char *p = &aa;
int i;
printf("sizeof(struct A) = %d\n", sizeof(aa));
for (i = 0; i < sizeof(aa); i++)
{
printf("%#x ", *p);
p++;
}
putchar(10);
return 0;
}
执行结果是:
sizeof(struct A) = 6
0x1 0x2 0x3 0 0x55 0x55
- 例子2:
#include <stdio.h>
struct A{
short b;
char a;
int c;
};
int main(int argc, const char *argv[])
{
char array[100] = {0x0,0x0,0,0,0,0,0,0,0};
struct A *aa = (struct A *)array;
aa->b = 0x1122;
aa->a = 0x33;
aa->c = 0x01223344;
int i;
printf("sizeof(struct A) = %d\n", sizeof(struct A));
for (i = 0; i < sizeof(struct A); i++)
{
printf("%#2x ", array[i]);
}
putchar(10);
return 0;
}
执行结果是:
sizeof(struct A) = 8
0x22 0x11 0x33 0 0x44 0x33 0x22 0x1
如果结构体是这种:
struct A{
char a; //这两个位置互换
short b; //至两个位置互换
int c;
};
sizeof(struct A) = 8
0x33 0 0x22 0x11 0x44 0x33 0x22 0x1
结论/方法:
- 当一个结构体中有不同的数据时,在 linux 中遵循 1,2,4的对齐方式,注意没有 8
- 结构体中的占字节数最多的元素决定二维容器的宽度
- 最近的两个数据要对齐到其中最大的边界上,小的那个要用0来对齐。比如 1,2 则对齐的方式是1 0 2 。
图形表示:
在程序一和程序二中内存的情况是: