你真的掌握结构体了么?结构体习题(C语言)

前言

上一期博客我们学习了结构体的相关知识(上期链接),但是学了不练也是不行的,我们今天讲给大家分享两道有点恶心的题目,让大家来加深对结构体的理解,那么话不多说我们现在开始吧!

第一题

有如下宏定义和结构定义

c 复制代码
#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,这是很常见的一种犯错,一定要记住哦~
第二题

这段代码的结果是?

c 复制代码
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;
}

解析

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.

结尾

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

相关推荐
朝新_2 小时前
【多线程初阶】阻塞队列 & 生产者消费者模型
java·开发语言·javaee
立莹Sir2 小时前
Calendar类日期设置进位问题
java·开发语言
风逸hhh3 小时前
python打卡day46@浙大疏锦行
开发语言·python
火兮明兮3 小时前
Python训练第四十三天
开发语言·python
ascarl20104 小时前
准确--k8s cgroup问题排查
java·开发语言
fpcc5 小时前
跟我学c++中级篇——理解类型推导和C++不同版本的支持
开发语言·c++
莱茵菜苗5 小时前
Python打卡训练营day46——2025.06.06
开发语言·python
爱学习的小道长5 小时前
Python 构建法律DeepSeek RAG
开发语言·python
luojiaao5 小时前
【Python工具开发】k3q_arxml 简单但是非常好用的arxml编辑器,可以称为arxml杀手包
开发语言·python·编辑器
终焉代码5 小时前
STL解析——list的使用
开发语言·c++