前言
上一期博客我们学习结构体的相关知识上期链接),但是学了不练也是不行的,我们今天讲给大家分享两道有点恶心的题目,让大家来加深对结构体的理解,那么话不多说我们现在开始吧!
在这里插入图片描述
第一题
如下定义结构定义

#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分配( )个字节空间
大家先读完题思考后再看解析

解析
首先结构体向最长的char整体对齐数,前两个位段元素一共4+2个bit位,不足8位,合起来占1字节最后一个单独1字节,一共3字节。另外,#define执行的是查找替换sizeof(struct _Record_Struct) * MAX_SIZE这个语句其实是3*2+3,固结果为9。如果是(2+3)的话答案是15,这是很常见的一种犯错,一定要记住哦~
第二题
这段代码结果是?

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 %02xn",puc[0], puc[1], puc[2], puc[3]);
  return 0;
}

解析
puc是一个char数组,每次跳转一个字节,结构体不是,它只有第一个元素单独享用一字节,其他三个元素一起共用一字节,所以puc被结构体填充后,本身只有两个字节会被写入,后两个字节肯定是0,然后第一个字节是2就是2了,第二个字节比较麻烦,首先ucData0给了3其实是越界了,1位的数字只能是0或1,所以11截断后只有1,同理ucData1给的4也是越界的,100截断后是00,只有5的101是正常的。填充序列是类似小端的低地址在低位,所以排列顺序是00 101 00 1。也就是0010 1001,即0x29。固答案应为0x02 0x29 0x00 0x00.

结尾
这次的题目分享就到这里了,希望大家都能对结构体有更深的理解,如果觉得博主讲的不要错记得要关注博主哦~。我们下期再见。

原文地址:https://blog.csdn.net/Tokai___Teio/article/details/134829910

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_49702.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注