请问为什么sizeof(struct)长度不正确?

leolance 2002-12-04 11:54:49
我的例子:


struct Header
{
char IDString[4];
int Length;
short Format;
short TNum;
short PNum;
};

cout << sizeof(struct Header) << endl;


结果是16,why?
...全文
250 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
leolance 2002-12-04
  • 打赏
  • 举报
回复
?
leolance 2002-12-04
  • 打赏
  • 举报
回复
ok !

多谢了!
leolance 2002-12-04
  • 打赏
  • 举报
回复
多谢,这样的话,如果要取得正确的值是不是就要把该结构的每一个值的长度相加:


suruct Header this_header;

...

cout << (sizeof(this_header.IDString) + sizeof(this_header.Length) + sizeof(this_header.Format) + sizeof(this_header.TNum) + sizeof(this_header.PNum)) << endl;


有没有更方便的方法?

另外,为什么sizeof(short)是2呢?
用户 昵称 2002-12-04
  • 打赏
  • 举报
回复
pack
#pragma pack([n])
该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合
的紧凑对齐由/Zp选项设置。紧凑对齐用pace编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。该编译指示对定义无效。当你使用#pragma pack(n)时,这里n为1、2、4、8或16。第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n字节界限内。如果你使用无参量的#pragma pack,结构成员被紧凑为以/Zp指定的值。该缺省/Zp紧凑值为/Zp8。
编译器也支持以下增强型语法:
#pragma pack([[{push|pop},][标识符,]][n])
若不同的组件使用pack编译指示指定不同的紧凑对齐,这个语法允许你把程序组件组合为一个单独的转换单元。
带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。编译指示的参量表从左到右读取。如果你使用push,则当前紧凑值被存储起来;如果你给出一个n的值,该值将成为新的紧凑值。若你指定一个标识符,即你选定一个名称,则该标识符将和这个新的的紧凑值联系起来。
带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使该值为新的紧凑对齐值。如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值,并且将产生一个警告信息。若你使用pop且指定一个n的值,该值将成为新的紧凑值。
若你使用pop且指定一个标识符,所有存储在堆栈中的值将从栈中删除,直到找到一个匹配的标识符,这个与标识符相关的紧凑值也从栈中移出,并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,将使用命令行设置的紧凑值,并且将产生一个一级警告。缺省紧凑对齐为8。
pack编译指示的新的增强功能让你编写头文件,确保在遇到该头文件的前后的紧凑值是一样的。
/* File name: include1.h*/
#pragma pack(push,enter_include1)
/* 你的包括文件代码... */
#pragma pack(pop, enter_include1)
/* include1.h结束 */
在上面的例子中,当前紧凑值与标识符enter_include1联系起来,并被压入头文件的项中。头文件末尾的pack编译指示删除所有可能出现在头文件中的干预紧凑值,并且删除与enter_include1相关的紧凑值。因此确保该头文件的前后的紧凑值是相同的。
这种新功能也允许你使用代码,例如头文件,它可以使用pack编译指示设置不同于在你的代码中设置的紧凑值的紧凑对齐:
#pragma pack(push,before_include1)
#include "include1.h"
#pragma pack( pop,before_include1)
在上面的例子中,对于出现在include.h中的紧凑值的任何变化,你的代码是受到保护的。
用户 昵称 2002-12-04
  • 打赏
  • 举报
回复
struct Header
{
char IDString[4];
int Length;
short Format;
short TNum;
//short PNum;
};

cout << sizeof(struct Header) << endl;
12
struct Header
{
char IDString[4];
int Length;
short Format;
//short TNum;
//short PNum;
};

cout << sizeof(struct Header) << endl;
12
struct Header
{
char IDString[4];
int Length;
//short Format;
//short TNum;
//short PNum;
};

cout << sizeof(struct Header) << endl;
8
用户 昵称 2002-12-04
  • 打赏
  • 举报
回复
内存默认指定4字节(整数)对齐,现在长度为14,对齐后为16,这是著名的“内存空洞”现象。
leolance 2002-12-04
  • 打赏
  • 举报
回复
是,sizeof是正确的;大家可不可以帮忙看一下,代码错在了哪里?谢谢!
用户 昵称 2002-12-04
  • 打赏
  • 举报
回复
sizeof 永远正确

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧