推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

结构体占用的内存大于等于所有成员占用同一段内存

   2023-06-05 网络整理佚名1530
核心提示:中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。整个位域结构体占用2个字节,bit1占3位,bit2占5位,bit1和bit2共用一个字节,bit3占7位,独占一个字节

我们知道()是一个构造类型或复杂类型,它可以包含多个不同类型的成员。

在C语言中,还有一种和结构体很相似的语法,叫做Union,它的定义格式是:

union body name { list };

联合体有时也被称为联合体或联合体,这就是联合体这个词的意思。

结构体和联合体的区别在于结构体​​的每个成员占用不同的内存,相互之间没有影响; 而工会的所有成员

有些成员占用同一段内存,修改一个成员会影响所有其他成员。

结构体占用内存大于等于所有成员占用内存(成员之间可能有空隙)和联合体占用内存之和

内存等于最长成员占用的内存。联合使用内存覆盖技术,一次只能保存一个成员的值。

当一个新成员被赋值时,原成员的值将被覆盖。

运行结果:

2.结构冒号的使用

结构中的冒号代表一个位域。 位域的出现是因为一些信息的存储表示只需要几个位来表示,而不是一个完整的字节,也是为了节省存储空间,方便处理。

其表示形式为:

位域结构名

{

类型说明符位域:位域长度

}

其表示形式为:

{

int 位 1:3;

int 位 2:5;

整数位 3:7;

}数据;

其中,表示位域结构,bit1、bit2、bit3表示对应的位域,data表示位域结构定义的变量。整个位域结构占2个字节,bit1占3位,bit2占5位,bit1和bit2共用一个字节,bit3占7位,独占一个字节

运行结果:

3.联合使用

举个芯片的例子:先看CAN帧格式:

不懂的朋友可以忽略:

//占用4个字节typedef struct _CAN_MSGOBJ_ID {uint32_t SID : 11;uint32_t EID : 18;uint32_t SID11 : 1;uint32_t unimplemented1 : 2;} CAN_MSGOBJ_ID;//占用4个字节typedef struct _CAN_TX_MSGOBJ_CTRL {uint32_t DLC : 4;uint32_t IDE : 1;uint32_t RTR : 1;uint32_t BRS : 1;uint32_t FDF : 1;uint32_t ESI : 1;#ifdef MCP2517FDuint32_t SEQ : 7;uint32_t unimplemented1 : 16;#elseuint32_t SEQ : 23;#endif} CAN_TX_MSGOBJ_CTRL;//占用4个字节typedef uint32_t CAN_MSG_TIMESTAMP;//没有用到typedef union _CAN_TX_MSGOBJ {struct {CAN_MSGOBJ_ID id; //占4个字节CAN_TX_MSGOBJ_CTRL ctrl; //占4个字节CAN_MSG_TIMESTAMP timeStamp;//占4个字节} bF; //共享12个字节uint32_t word[3];//共享12个字节uint8_t byte[12];//共享12个字节} CAN_TX_MSGOBJ;txObj.bF.id.SID = CAN_TX_ID;txObj.bF.ctrl.DLC = CAN_DLC_4;//发送的数据长度txObj.bF.ctrl.IDE = 0;//标识符扩展位,在扩展帧中恒为隐性1,在标准帧中,IDE位于控制段,且恒为显性0txObj.bF.ctrl.BRS = 0;//BRS(Bit Rate Switch)位速率转换开关,当BRS为显性位时数据段的位速率与仲裁段的位速率一致,当BRS为隐性位时数据段的位速率高于仲裁段的位速率txObj.bF.ctrl.FDF = 0;//扩展数据长度,在标准的CAN帧中,控制场包含的保留位被指定为显性位发送,但是在CAN-FD帧中以隐性位发送,主要用于区分标准CAN帧格式和CAN-FD的帧格式n = DRV_CANFDSPI_DlcToDataBytes(CAN_DLC_4);for (i = 0; i < n; i++){txd[i] = Count;Count++;}uint8_t txBuffer[MAX_MSG_SIZE];txBuffer[0] = txObj->byte[0]; //not using 'for' to reduce no of instructionstxBuffer[1] = txObj->byte[1];txBuffer[2] = txObj->byte[2];txBuffer[3] = txObj->byte[3];txBuffer[4] = txObj->byte[4];txBuffer[5] = txObj->byte[5];txBuffer[6] = txObj->byte[6];txBuffer[7] = txObj->byte[7];uint8_t i;for (i = 0; i < txdNumBytes; i++){txBuffer[i + 8] = txd[i];}// Make sure we write a multiple of 4 bytes to RAMuint16_t n = 0;uint8_t j = 0;if (txdNumBytes % 4){// Need to add bytesn = 4 - (txdNumBytes % 4);i = txdNumBytes + 8;for (j = 0; j < n; j++){txBuffer[i + 8 + j] = 0;}}spiTransferError = DRV_CANFDSPI_WriteByteArray(index, a, txBuffer,txdNumBytes + 8 + n);if (spiTransferError){return -4;}// Set UINC and TXREQspiTransferError = DRV_CANFDSPI_TransmitChannelUpdate(index, channel,flush);if (spiTransferError){return -5;}return spiTransferError;

原文链接:

另外,对于我们现在的大部分朋友来说,学习编程技术才是最重要的! 种一棵树最好的时间是十年前,其次是现在。 对于准备学习编程的小伙伴来说,想要更好的提升自己的编程核心能力(内功),不妨现在就开始吧!

整理分享(多年学习的源码、实际项目视频、项目笔记、基础入门教程)

欢迎转行学习编程的小伙伴,多用资料学习,比自己想的更快,成长更快!

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON