要考试了,还没搞清楚?

小牛毛 2011-09-15 03:08:21
struct test
{ int ml; char m2; float m3;
union uu { char ul[5]; int u2[2];} ua;
} myaa;
则sizeof(struct test )的值是
A)12
B)16
C)14
D)9
答案好像是A,不知道怎么算的?
...全文
161 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
feidaosh 2011-09-15
  • 打赏
  • 举报
回复
看到上面有人提到“共用体长度是第一次输入数据占内存的长度”,这句话很危险。。。这是一句来自教课书中的有上下文语境的话,举一个简单的例子,还用你的结构,只是把共用体中的整型数组元素个数改成3,然后再定义一个变量c1,在8位机上运行。
struct test
{ int ml; char m2; float m3;
union uu { char ul[5]; int u2[3];} ua;
} myaa;
char c1;

如果uu的长度是“共用体长度是第一次输入数据占内存的长度”=5的话,.u2[2]和c1就重合了!
feidaosh 2011-09-15
  • 打赏
  • 举报
回复
也就学校会出这种蛋痛的题目,最后结果涉及3个问题,int类型的长度、寻址的字长、有无pack定义。这三个条件都没有定义,怎么给出标准答案。
如果标准答案是12的话,只有一种可能,就是8位机单字节寻址,int为2字节,默认pack(1).
int ml;//2 byte
char m2;//1 byte
float m3;//4 byte
union uu {char ul[5];int u2[2];} ua;//5 byte union的长度是所有成员中的最大长度
2+1+4+5=12;
这种结果只有在8位的单片机上才能跑出来,你手边的任何一台微机都跑不出这个结果来,你们是什么课考试?单片机吗?
如果int长度为2,双字节寻址,无pack定义,结果是2+2+4+6=14。
如果int长度为4,双字节寻址,无pack定义,结果是,4+2+4+8=18。
如果你在VC里跑这个,int长度为4,双字节寻址,默认pack(4),结果是4+4+4+8=20。
出这种题目的老师纯属蛋痛。
laoyu001 2011-09-15
  • 打赏
  • 举报
回复
你的题目要求机器上int型占2个字节.char型占1个字节.float型占4个字节.所以int ml+char m2+ float m3=7.共用体长度是第一次输入数据占内存的长度.共用体第一次输入数据是char ul[5]所以
共用体长度是5.最后int ml+char m2+ float m3+char ul[5]=12.书中的答案A(12)每错.
小牛毛 2011-09-15
  • 打赏
  • 举报
回复
恩,运行了一下是20,可能是标准不同所以答案不同,总之谢谢大家的回答!
wopabe 2011-09-15
  • 打赏
  • 举报
回复
感觉都不对 跑一下就知道了
xialeijie368 2011-09-15
  • 打赏
  • 举报
回复
4+4+4+8=20
lee275 2011-09-15
  • 打赏
  • 举报
回复
补充下:
个人认为 应该是
int ml; 4
char m2; 1 但是要四字节对齐 所以也要算4
float m3; 4
union uu 8 union按最大算按2*4=8
{
char ul[5];
int u2[2];
} ua;
最后得到 4+4+4+8=20
bdmh 2011-09-15
  • 打赏
  • 举报
回复
struct test
{ int ml; char m2; float m3;
union uu { char ul[5]; int u2[2];} ua;
} myaa;


32位机器 m1:4字节,m2对齐到4字节,m34字节,uu是联合体,取其中最大的的,u2:8字节,总共20字节
lee275 2011-09-15
  • 打赏
  • 举报
回复
在机子跑了 GCC编译的 得到的答案是20
  • 打赏
  • 举报
回复
你的不对
char[5]占5个字节,大于int[2]的四个,所以应该是5+1=6,应该是14
[Quote=引用 10 楼 hjywyj 的回复:]

2+1+1+4+2*2=12
//16位机器上int是2字节
[/Quote]
ddownload 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
是B吧,第二个char要对齐到4字节
[/Quote]

兄弟,每次见你的回答总是相当的给力,你自己就是个B,知道不?B回答B有趣啊
  • 打赏
  • 举报
回复
在16位机子上,int占两字节,按4字节对齐的话,是4+4+8=16
zscedu 2011-09-15
  • 打赏
  • 举报
回复
四字节对齐,应该是20
  • 打赏
  • 举报
回复
2+1+1+4+2*2=12
//16位机器上int是2字节
  • 打赏
  • 举报
回复
在16位机子上,int占两字节,按2字节对齐的话,是2+2+4+6=14
  • 打赏
  • 举报
回复
如果默认是两字节对齐的话,#progma pack(2),就是18了
如果是#progma pack(1),就是17了
MYMGrub 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nice_cxf 的回复:]

怎么感觉都不对啊?
4+4—+4+8=20?
[/Quote]

亲娘啊,题错了??
nice_cxf 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuxingjiaofu 的回复:]
C/C++ code


struct test//假设默认的是四字节对齐
{ int ml; //4
char m2; //1
//char a[3];//自动补齐3个
float m3;//4
union uu //union占的地址由最大的一个元素决定,8
{ char ul[5]; //5
int u2[2];//8
} ua;
} myaa;//总数是4+1+3+……
[/Quote]
浮点那的4个那去了?
  • 打赏
  • 举报
回复
4+1+3+4+8=20
小牛毛 2011-09-15
  • 打赏
  • 举报
回复
加8是怎么回事呢?[Quote=引用 2 楼 nice_cxf 的回复:]

怎么感觉都不对啊?
4+4—+4+8=20?
[/Quote]
加载更多回复(3)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧