struct A
{
int iXX;
char cNN;
}a; sizeof(a)=8;
int x;sizeof(x)=4;
char cx; sizeof(cx)=1; 这上边的结果都是我电脑的结果 那么这个结构体A的字节8是怎么得来的 怎么算的?
sizeof(a)
说的是结构体的大小2+1+2=5
sizeof(b)是指针b的大小,它在不同位的机器上占的字节数不同,在你的机器上可能是2了
指针不因为类型的不同而使占的自己数变化
它就是一个整型占的字节数
char
*p;
int
*q;
printf("%d\n",sizeof(p));
printf("%d\n",sizeof(q));
结果都是2,不信自己试试
说的是结构体的大小2+1+2=5
sizeof(b)是指针b的大小,它在不同位的机器上占的字节数不同,在你的机器上可能是2了
指针不因为类型的不同而使占的自己数变化
它就是一个整型占的字节数
char
*p;
int
*q;
printf("%d\n",sizeof(p));
printf("%d\n",sizeof(q));
结果都是2,不信自己试试
温馨提示:答案为网友推荐,仅供参考
第1个回答 2012-06-22
应该是编译器的内存对齐问题……cNN偏移了吧……
下面列出常用类型的对齐方式(vc6.0,32位系统)。
类型
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char
偏移量必须为sizeof(char)即1的倍数
int
偏移量必须为sizeof(int)即4的倍数
float
偏移量必须为sizeof(float)即4的倍数
double
偏移量必须为sizeof(double)即8的倍数
Short
偏移量必须为sizeof(short)即2的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。追问
下面列出常用类型的对齐方式(vc6.0,32位系统)。
类型
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char
偏移量必须为sizeof(char)即1的倍数
int
偏移量必须为sizeof(int)即4的倍数
float
偏移量必须为sizeof(float)即4的倍数
double
偏移量必须为sizeof(double)即8的倍数
Short
偏移量必须为sizeof(short)即2的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。追问
非常感谢你。。
第2个回答 2012-06-22
结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是32Bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会相对更高效,这就是内存对齐的由来。本回答被提问者采纳
结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是32Bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会相对更高效,这就是内存对齐的由来。本回答被提问者采纳
第3个回答 2012-06-22
根据内存对齐原理,按照结构体中最大的类型算,也就是每个都是占用4字节,合起来就是8字节。
第4个回答 2012-06-22
空间大小计算