#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef unsigned char uint8_t;
struct AA{
uint8_t a;
uint8_t *st;
};
int main(int argc,char *argv[])
{
AA a;
a.a=0x11;
a.st=new uint8_t[10];
printf("%d",sizeof(AA)/sizeof(uint8_t));
return 0;
}
为什么结果不是输出11(1+10)或者 2(a和st各占1),而是输出8呢?
AA.a一个字节,AA.st是一个指针,在32位应用下是4字节,而不是10字节,10字节数组是指针指向的一块内存,应该在heap里面,而AA在栈里。
32位系统下,AA占5个字节,可能编译设置使用4字节边界,也就是所有变量类成员起始地址都是4个倍数,这样cpu读写快几倍。所以AA本来占用5字节,但编译器给它分配8字节,这样AA.a和AA.st的地址都是4的整数倍。
所以sizeof(AA)等于8