鱼C论坛

 找回密码
 立即注册
查看: 1617|回复: 5

关于结构体中含有数组怎么计算大小的问题

[复制链接]
发表于 2016-7-20 16:08:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. struct student
  3. {
  4.        
  5.         int i;
  6.         char j;
  7.         char a[10];
  8. }stud1;
  9. int main()
  10. {
  11.        
  12.         printf("%d",sizeof(stud1));
  13.        
  14.         return 0;
  15. }
复制代码



结果为16,不用算数组的话我知道怎么算,加个数组就懵逼了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-20 16:23:28 | 显示全部楼层
如果是按最大是默认8字节算的,把上述char a[10]改成char a[20];结果为28.再次懵逼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-20 16:37:53 | 显示全部楼层
能弄明白大概是怎么回事了,
int     i 申请了4字节来用,
char  j 只占1字节,但为了对齐也申请了4字节来用,
重点来了char a[10],申请了10字节,他考虑到j申请了4字节实际却只用了一字节,剩下3字节是空的,如果啊char a[10]拿来用的话自己就只剩7个字节还没着落,这时用系统默认分配的字节,默认分配为8(我的编译器默认的),所以4+4+8=16
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-20 16:45:49 | 显示全部楼层
当char a【10】改为char a【11】时,结果也一样;
但是!char a【10】改为 char【12】时,就差远了,结果为20;为什么会这样呢?
我的猜想应该是正确的:
一开始跟原来差不多,
int     i 申请了4字节来用,
char  j 只占1字节,但为了对齐也申请了4字节来用,
重点来了char a[12],申请了12字节,他考虑到j申请了4字节实际却只用了一字节,剩下3字节是空的,如果啊char a[10]拿来用的话自己就只剩9个字节还没着落,按默认的话再申请了默认的8字节,这时就剩一个字节了,再按默认申请8字节给他?那结果应该为4+4+8+8=24;nonono,想到这,啊char【12】说我那char j留下来那3个没用的字节我也不用了,自己直接申请12字节来用,那么大小为4+4+12=20,你看,20比24小,是不是理智点啊。

点评

我很赞同!: 4.0
我很赞同!: 4
思路很好啊  发表于 2016-7-20 16:51
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-20 17:18:38 | 显示全部楼层
对不起。。。
对不起。。。
对不起。。。
科学证明,做错一次。。。记住的东西比直接背100次都来的有效。。。
其实这是错的。。。才发现,跟结构体中包含数组 和 结构体包含结构体时差不多的,什么默认分配8字节在这里都是扯淡...把数组展开来,比如char a【10】展开成
  1. char a1;

  2. char a2;
  3. char a3;
  4. ...
  5. char a10;
复制代码

就可以了,不把数组看做整体来算偏移值
所以真相是这个
对不起各位
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-18 10:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表