2道经典的C语言练习题(解答超详细)

每日一言

当你关注到自己行为背后的意图时,你开始看见自己了;当你关心意图背后的需要和感受时,你才真的看见了。
-伯特·海灵格


1

下面代码的运行结果为?

int main()
{
  unsigned char puc[4];
  struct tagPIM
  {
    unsigned char ucPim1;
    unsigned char ucData0 : 1;
    unsigned char ucData1 : 2;
    unsigned char ucData2 : 3;
  }*pstPimData;
  pstPimData = (struct tagPIM*)puc;
  memset(puc,0,4);
  pstPimData->ucPim1 = 2; 
  pstPimData->ucData0 = 3;
  pstPimData->ucData1 = 4;
  pstPimData->ucData2 = 5;
  printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);
  return 0;
}

正确答案:

02 29 00 00

解析:
想要回答正确这道题,你必须要对位段有一定的了解(如果忘记了,快去复习吧~),接下来我们一步步分析
我们先看结构体:

 struct tagPIM
  {
    unsigned char ucPim1;
    unsigned char ucData0 : 1;
    unsigned char ucData1 : 2;
    unsigned char ucData2 : 3;
  }*pstPimData;

首先思考一下这个问题:这个结构体占用了几个字节?
让我们把图画出来:
在这里插入图片描述
答案是2个字节

 unsigned char puc[4];
 给了我们4个字节

 pstPimData = (struct tagPIM*)puc;
 结构体只占用2个字节

知道了这些,我们再看赋值

 pstPimData->ucPim1 = 2; 
 pstPimData->ucData0 = 3;
 pstPimData->ucData1 = 4;
 pstPimData->ucData2 = 5;

因为 ucPim1 把一个字节占据了,所以在这里插入图片描述
因为 ucData0 = 3 ,而 3 转换成二进制为 11 ,而又因为 ucData0 只分配到了一个比特位,于是越界了,发生截断,只保留了后一位 1
因为 ucData1 = 4 ,而 4 转换成二进制为 100 ,而又因为 ucData1 只分配到了两个比特位,于是越界了,发生截断,只保留了后两位 00
大家根据以上过程来想一想 ucData2 = 5 的结果吧。
最终 puc[1] 如下:
在这里插入图片描述
最后用16进制打印出 puc 的每个元素
其中 puc[0] 不用多说,就是 2
puc[1] 为 29
计算过程如下:
在这里插入图片描述
如果看不懂的话,就去复习进制转换吧~
puc[2] 和 puc[3] memset 后都动过,不必多说,肯定是00
嘿嘿,这道题就做出来了 ^_^

2

有以下宏定义和结构定义

#define MAX_SIZE A+B
struct _Record_Struct
{
  unsigned char Env_Alarm_ID : 4;
  unsigned char Para1 : 2;
  unsigned char state;
  unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);

当 A=2,B=3时,pointer 分配几个字节的空间?

正确答案:

9

在做这道题时要注意,#define 执行的是查找替换
让我们一步一步来分析
首先看结构体

struct _Record_Struct
{
  unsigned char Env_Alarm_ID : 4;
  unsigned char Para1 : 2;
  unsigned char state;
  unsigned char avail : 1;
}*Env_Alarm_Record;

它占几个字节呢?
答案是 3
原因:
结构体向最长的 char 对齐,前两个位段元素一共 4+2 位,不足8位,合起来占 1 字节,最后一个单独 1 字节,一共 3 字节。
由于 #define 执行的是查找替换, sizeof(struct _Record_Struct) * MAX_SIZE这个语句其实是 3*2+3 ,结果为9

结语

⭐如果发现自己做错了,请不要气馁,做题就是一个查漏补缺的过程。每个人不是天生就会写代码的,给自己一些时间,不要放弃,加油陌生人!


请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月临水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值