结构体的空间分配和位定义

Posted 何事误红尘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体的空间分配和位定义相关的知识,希望对你有一定的参考价值。

概述

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

空间分配

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

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

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

以上是关于结构体的空间分配和位定义的主要内容,如果未能解决你的问题,请参考以下文章

操作系统存储空间管理和位示图法

C语言结构体在定义的时候,各成员后面加冒号是啥意思?

结构体联合体

Swift中结构体的方法调度&内存分区

c语言自定义类型——结构体,位段(匿名结构体,结构体的自引用,结构体的内存对齐)

C语言中如何将16位结构体定义为4位和12位两部分