打印
[STM32]

关于结构体变量所占地址的问题

[复制链接]
1232|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序小白,在用KEIL测试STM32结构体所占空间大小,定义了一个变量
typedef struct
{
     u8 x;
     u16 y;         
     u8 z;
}TestStruct;
用sizeof(TestStruct)测试为6个字节,x和z后面地址空间都放了一个0x00,改变一下y和z的顺序
typedef struct
{
     u8 x;         
     u8 z;
     u16 y;
}TestStruct;
在用sizeof(TestStruct)测试位4个字节,感觉这个正常。始终弄不明白,不知道为什么

相关帖子

沙发
sjnh| | 2016-3-19 07:37 | 只看该作者
自己找张纸一画就出来了
u8是单字节对齐;
u16是双字节对齐,对齐地址是偶数(小端);
结构体按最长的定义对齐;

使用特权

评论回复
板凳
banimashal| | 2016-3-19 12:13 | 只看该作者
那为什么后面一个结构体是4个字节

使用特权

评论回复
地板
dirtwillfly| | 2016-3-19 15:04 | 只看该作者
sjnh 发表于 2016-3-19 07:37
自己找张纸一画就出来了
u8是单字节对齐;
u16是双字节对齐,对齐地址是偶数(小端);

使用特权

评论回复
5
pkuzhx| | 2016-3-19 16:09 | 只看该作者
banimashal 发表于 2016-3-19 12:13
那为什么后面一个结构体是4个字节

大概是这样的

使用特权

评论回复
6
pkuzhx| | 2016-3-19 16:18 | 只看该作者
结构体是以其中最长的元素长度为一个“单元”,总是先填满一个单元,再去填下一个单元,如果一个单元还没有使用完,而下一个元素放进来又会“撑爆”这个单元,那就不使用这个单元的剩余部分,而是新开一个单元,就像你的第一个例子。如果新放进来的元素不会撑爆这个单元,才可以把它挤进来,就是第二个例子。
你可以试一下,以下两个结构踢都是12个字节,就理解更深了:
typedef struct
{
     u8 x1;
     double y;         
}TestStruct1;
typedef struct
{
     u8 x1;
     u8 x2;
     u8 x3;
     u8 x4;
     u8 x5;
     u8 x6;
     u8 x7;
     u8 x8;
     double y;         
}TestStruct2;

使用特权

评论回复
7
pkuzhx| | 2016-3-19 16:21 | 只看该作者
以上说法仅针对结构体中元素长度是1、2、4、8等长度时,肯定是正确的。
如果结构体内嵌套了结构体,内部结构体是3或5字节,上面就不适用了,你可以自己实验一下

使用特权

评论回复
8
diweo| | 2016-3-20 08:35 | 只看该作者
5楼画的很清楚了

使用特权

评论回复
9
banimashal| | 2016-3-20 15:13 | 只看该作者
明白了,多谢各位解答。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

1

粉丝