鱼C论坛

 找回密码
 立即注册
查看: 1193|回复: 4

[已解决]快来人哪

[复制链接]
发表于 2018-12-30 19:29:52 | 显示全部楼层 |阅读模式

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

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

x
求个老哥分析分析这几题
1.下列程序中,结构体变量n所占内存字节数是(答案为6?)
union U
{
        char s[4];       
        int i;
        long l;
};
struct A
{
        int c;
        union U u;
}a;

2.若有下面的说明和定于:
struct test
{
        int m1;char m2;float m3;
        union uu{ char u1[5];int u2[2];} ua;

}myaa;
则sizeof(struct test)的值是(答案为12?)

3.在16位的PC机上使用c语言,若有如下定义:
struct data
{
        int i;
        char ch;
        double f;
}b;
则结构变量b占用内存的字节数是(答案为11?)





最佳答案
2018-12-31 07:13:51
本帖最后由 行客 于 2018-12-31 08:03 编辑

如果你这是考试用题,建议你采用这个方式来计算:
1、假设是在16位IBM-PC机上计算所占用内存的字节数,决定了各类型的宽度;
2、union(共用体)变量的所占用内存的字节数为变量类型定义的变量的最大宽度变量;
3、如果有数组要考虑数组的宽度(比如char[3]肯定小于int[2],cha[5]就按5个字节算,因为大于了int[2]);
4、结构体变量所占用内存的字节数是其所有成员所占用内存字节数之和;
5、结构体里有结构体也要按照上面的方法计算。

那么,由于假设16位IBM-PC机,所以:
char:1字节、short:2字节、int:2字节、long:4字节、long long(即long long int):4字节、float:4字节、double:8字节、long doubule:10字节
这样你就好计算了:
题目1:union U u; u的宽度为最大char s[4];的4个字节,int c;2个字节。所以结果为6个字节。
题目2、题目3你自己应该就会算了吧?

有个问题还是要补充一下,在现在我们用的IDE在实际环境中,由于为了实现更快寻址和达到性能更优的原因,会有本机宽度和字节对齐的情况发生,所以你在你具体应用中会有一些不同情况的出现。比如,long double占用10字节空间,但有的编译器并不认可10字节,还是8字节,比如在VC++6.0下,用sizeof(long double)测出来的值仍然是8。所以我强调了第1点假设是在16位IBM-PC机上,而且估计你提的这几个问题都是考试用的,所以就按我上面说的方法去计算就可以。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-30 20:01:09 | 显示全部楼层
你这些题目的答案都是对于16位机器的,32位肯定不是这个答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-30 20:04:42 | 显示全部楼层
1.png
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-30 22:25:13 | 显示全部楼层
你要考虑本机宽度和字节对齐对变量字节数的影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-31 07:13:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 行客 于 2018-12-31 08:03 编辑

如果你这是考试用题,建议你采用这个方式来计算:
1、假设是在16位IBM-PC机上计算所占用内存的字节数,决定了各类型的宽度;
2、union(共用体)变量的所占用内存的字节数为变量类型定义的变量的最大宽度变量;
3、如果有数组要考虑数组的宽度(比如char[3]肯定小于int[2],cha[5]就按5个字节算,因为大于了int[2]);
4、结构体变量所占用内存的字节数是其所有成员所占用内存字节数之和;
5、结构体里有结构体也要按照上面的方法计算。

那么,由于假设16位IBM-PC机,所以:
char:1字节、short:2字节、int:2字节、long:4字节、long long(即long long int):4字节、float:4字节、double:8字节、long doubule:10字节
这样你就好计算了:
题目1:union U u; u的宽度为最大char s[4];的4个字节,int c;2个字节。所以结果为6个字节。
题目2、题目3你自己应该就会算了吧?

有个问题还是要补充一下,在现在我们用的IDE在实际环境中,由于为了实现更快寻址和达到性能更优的原因,会有本机宽度和字节对齐的情况发生,所以你在你具体应用中会有一些不同情况的出现。比如,long double占用10字节空间,但有的编译器并不认可10字节,还是8字节,比如在VC++6.0下,用sizeof(long double)测出来的值仍然是8。所以我强调了第1点假设是在16位IBM-PC机上,而且估计你提的这几个问题都是考试用的,所以就按我上面说的方法去计算就可以。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 04:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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