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

本文详细解析了结构体中内存分配的原理,探讨了`struct CAT`和`struct DOG`的空间占用,并介绍了如何通过位定义最小化CAN信息帧结构。重点讲解了内存对齐、结构体成员排列和位操作在节省空间上的应用。
摘要由CSDN通过智能技术生成

概述

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

空间分配

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

	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、付费专栏及课程。

余额充值