【C语言学习——————————结构体对齐案例解析】

1.在VS2013下,默认对齐数为8字节,这个结构体所占的空间大小是( )字节

typedef struct{
  int a;
  char b;
  short c;
  short d;
}AA_t;

【解析】:

对于结构体来说,对齐方式需要遵循一定的规则,如图

那么对于这一题我们可以直接画图进行分析

计算完成后下面开始对内存进行划分

2.下面代码的结果是:( )

#pragma pack(4)/*编译选项,表示4字节对齐 平台:VS2013。语言:C语言*/
//假设long 是4个字节
int main(int argc, char* argv[])
{
  struct tagTest1
  {
    short a;
    char d; 
    long b;   
    long c;   
  };
  struct tagTest2
  {
    long b;   
    short c;
    char d;
    long a;   
  };
  struct tagTest3
  {
    short c;
    long b;
    char d;   
    long a;   
  };
  struct tagTest1 stT1;
  struct tagTest2 stT2;
  struct tagTest3 stT3;

  printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
  return 0;
}
#pragma pack()

【解析】:

A.12 12 16

B.11 11 11

C.12 11 16

D.11 11 16

所以总的大小为 12 12 16,选择A

3.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是( )

struct A
{
	int a;
	short b;
	int c;
	char d;
};

struct B
{
	int a;
	short b;
	char c;
	int d;
};

A.16,16

B.13,12

C.16,12

D.11,16

【解析】:

A

B

所以选C        

4.下面代码的结果是( )

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;
}

A.02 03 04 05

B.02 29 00 00

C.02 25 00 00

D.02 29 04 00

【解析】:

ucPim1在内存中单独占一个字节空间,然后在开辟一个字节空间用来存放ucData0,如果有充足空间则接着放udData1,ucData2,若没有则在开辟一个字节空间存放,如下图

先存放3----3的二进制序列为00000011,因为只取一个bit位,保留1所以是第二个字节空间内为

00000001

然后存放4 ------4的二进制序列为00000100,因为有两个bit位空间,只保留00,所以第二个字节空间变为0000001

最后存放5 ------5的二进制序列为00000101,因为要保留三个bit位空间,保留101,所以第二个字节空间位00101001

第一个字节空间因为只存放ucPim1 ----- 2,所以只保留最后两位bit位10,所以是00000010

最后的答案只需要将2进制转为16进制,为02 29 00 00


以上就是结构体对齐的部分相关练习,老样子希望大佬们点赞支持三连一波

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

-_Joker_-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值