关于结构体中含有数组怎么计算大小的问题
#include<stdio.h>struct student
{
int i;
char j;
char a;
}stud1;
int main()
{
printf("%d",sizeof(stud1));
return 0;
}
结果为16,不用算数组的话我知道怎么算,加个数组就懵逼了{:10_257:} 如果是按最大是默认8字节算的,把上述char a改成char a;结果为28.再次懵逼{:10_285:} 能弄明白大概是怎么回事了,
int i 申请了4字节来用,
charj 只占1字节,但为了对齐也申请了4字节来用,
重点来了char a,申请了10字节,他考虑到j申请了4字节实际却只用了一字节,剩下3字节是空的,如果啊char a拿来用的话自己就只剩7个字节还没着落,这时用系统默认分配的字节,默认分配为8(我的编译器默认的),所以4+4+8=16 当char a【10】改为char a【11】时,结果也一样;
但是!char a【10】改为 char【12】时,就差远了,结果为20;为什么会这样呢?
我的猜想应该是正确的:
一开始跟原来差不多,
int i 申请了4字节来用,
charj 只占1字节,但为了对齐也申请了4字节来用,
重点来了char a,申请了12字节,他考虑到j申请了4字节实际却只用了一字节,剩下3字节是空的,如果啊char a拿来用的话自己就只剩9个字节还没着落,按默认的话再申请了默认的8字节,这时就剩一个字节了,再按默认申请8字节给他?那结果应该为4+4+8+8=24;nonono,想到这,啊char【12】说我那char j留下来那3个没用的字节我也不用了,自己直接申请12字节来用,那么大小为4+4+12=20,你看,20比24小,是不是理智点啊。{:10_335:} 对不起。。。
对不起。。。
对不起。。。
科学证明,做错一次。。。记住的东西比直接背100次都来的有效。。。
其实这是错的。。。才发现,跟结构体中包含数组 和 结构体包含结构体时差不多的,什么默认分配8字节在这里都是扯淡...把数组展开来,比如char a【10】展开成
char a1;
char a2;
char a3;
...
char a10;
就可以了,不把数组看做整体来算偏移值{:10_247:}
所以真相是这个{:10_247:}
对不起各位
页:
[1]