C语言:结构体的空间分配和位定义

概述

本文收录结构体相关的知识点,将遇到的相关问题和找到的解释说明集中在一起,便于需要时快速查找。

空间分配

请计算以下两个结构体所占用的空间大小:

	struct CAT {
		char a;
		short b;
		int c;
		short d;
	}cat; 
	
	struct DOG {
		int a;
		short b;
		short c;
		char d;
	}dog;

可以看到,这两个结构体组成元素是相同的,只是定义时的顺序不同。使用sizeof查看占用的内存大小:
在这里插入图片描述
1个char+2个short+1个int,不应该是1+4+4=9吗,为什么会是12?空间分配的过程是怎么样的?

struct内存原则: 从上至下进行内存分配,对齐方式以当前分配到的内部成员类型最宽字节数为基准;整体以结构体成员最宽类型字节为基准,且整个结构体的总大小为最宽基本类型成员大小的整数倍。点击跳转

位定义

请用结构体表示以下一帧CAN信息:
11bit的ID、1bit的RTR、3bit的长度、8byte的数据,
要求使用的空间尽可能小。
从空间要求上看,可以知道这是考验对结构体位定义的使用:

struct CANFRAME {
	uint16_t ID : 11;
	uint16_t RTR : 1;
	uint16_t LEN : 3;
	uint8_t DATA[8];
}

需要注意,使用位定义的成员,类型应相同(更多解析)。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值