找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

143

积分

0

好友

12

主题
发表于 2023-10-2 03:55:55 | 查看: 656| 回复: 5 IP:中国广东省 中国电信公众宽带

我定义了一个结构如下

  1. <div>typedef struct tagDat
  2. {
  3.     short A ;
  4.     short B;
  5.     char C;
  6. }stDat;</div>
复制代码


开发编译环境:keil 5
当使用sizeof(stDat)返回的数据长度是6,而不是5.
问题出在哪里?
望各位不吝赐教。
谢谢。
发表于 2023-10-2 03:56:32 IP:中国广东省 中国电信公众宽带

这个问题出在结构体的内存对齐(alignment)上。在结构体中,成员变量通常会被按照某种规则对齐,以提高访问速度和内存访问的效率。默认情况下,Keil编译器会使用4字节对齐,也就是说,每个成员变量的地址都会被对齐到4的倍数。

所以,在你的结构体中,A和B都占据了2个字节,而C只占据了1个字节,因此编译器在C后面自动填充了1个字节来满足对齐要求。因此,结构体的总大小为6个字节。

如果你想要修改对齐方式,可以使用#pragma pack(n)指令来指定对齐字节数,其中n是对齐字节数。例如,如果你想要将对齐字节数设置为1,可以使用以下指令:

pragma pack(1)

这样,结构体的总大小就会变成5个字节。

发表于 2023-10-2 03:57:43 IP:中国广东省 中国电信公众宽带

你的问题出在内存对齐上。许多编译器为了效率会对数据结构进行内存对齐,这可能会引入一些填充字节。

在你的例子中,short Ashort B 各占2个字节,char C 占1个字节。如果编译器按照顺序紧密排列这三个成员,那么结构体的大小应该是5个字节。然而,由于内存对齐的原因,编译器可能会在 char C 后面添加一个填充字节,使得 short Ashort B 能够对齐到4字节边界(在许多架构中,访问对齐的数据更快)。因此,sizeof(stDat) 返回的可能是6。

你可以通过编译器设置来禁止内存对齐,或者手动调整结构体的成员顺序和填充来控制结构体的大小。但是在大多数情况下,最好让编译器自行处理内存对齐,因为这通常可以提高代码的执行效率。

在Keil中,你可以在项目选项中禁用内存对齐。具体操作是:

  1. 打开你的Keil项目。
  2. 在"Project"菜单下选择"Options for Target..."。
  3. 在弹出的对话框中,展开"C/C++"选项卡,然后选择"Code Generation"。
  4. 在右侧的"Struct Member Alignment"下拉菜单中,选择"1 Byte"。
  5. 点击"OK"。

这样设置后,sizeof(stDat) 应该会返回5。但是请注意,这可能会影响代码的执行效率。

发表于 2023-10-2 03:58:06 IP:中国广东省 中国电信公众宽带

在结构体中,char 类型变量 C 占用了1个字节的存储空间,short 类型变量 A 和 B 各占用2个字节的存储空间。因此,结构体 stDat 的大小应该是6个字节,而不是5个字节。

如果使用 sizeof(stDat)返回的数据长度是6,那么很可能是编译器默认为 char 类型变量 C 添加了一个字节的对齐填充,以确保结构体的起始地址是4字节对齐的。因此,实际的结构体大小应该是7个字节,而不是6个字节。

如果您需要确保结构体的大小为5个字节,可以将 char 类型变量 C 改为 int 类型变量 C,因为 int 类型变量占用4个字节的存储空间,不会对结构体的大小产生影响。

发表于 2023-10-2 03:59:02 IP:中国广东省 中国电信公众宽带
#pragma pack (1)
在你的结构体上边加这个即可,
结构体以及变量申明上都加上。
发表于 2023-10-2 03:59:41 IP:中国广东省 中国电信公众宽带
“内存对齐”了解一下
https://zhuanlan.zhihu.com/p/30007037
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|国产电子社区 ( 沪ICP备2023018578号-1|

苏公网安备 32011102010465号


)|网站地图

GMT+8, 2024-7-27 23:40 , Processed in 0.064918 second(s), 25 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表