社区
C语言
帖子详情
请问为什么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?
...全文
288
8
打赏
收藏
请问为什么sizeof(struct)长度不正确?
我的例子: struct Header { char IDString[4]; int Length; short Format; short TNum; short PNum; }; cout << sizeof(struct Header) << endl; 结果是16,why?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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 永远正确
为什么结构体可以用
sizeof
计算大小,而 enum 却不行?
摘要: 在C语言中,
sizeof
(
struct
)能
正确
计算结构体的内存大小,但
sizeof
(enum)无法获取枚举成员数量,因为两者本质不同。结构体是内存中的复合对象,而枚举仅是编译期的符号集合,其
sizeof
结果仅反映底层整数类型的大小(如int)。枚举成员数量需通过人工定义边界(如_BASE和_MAX)显式计算,而非依赖语言特性。工程中应避免混淆逻辑与物理概念,确保代码可维护性。 (字数:150)
sizeof
(
struct
)与
sizeof
(union)的区别
sizeof
(
struct
)与
sizeof
(union)的区别1、关于
struct
与union的内存分配方式2、关于
struct
与union的大小计算方式1、关于结构体的大小 1、关于
struct
与union的内存分配方式 (1)、结构体(
struct
)按照定义时的顺序,为每个成员在内存中依次分配独立空间; (2)、联合(union)只按成员中最大的类型分配空间,所有成员共享这个内存空间。 如下:...
使用
sizeof
得到
struct
大小的规则
在vchelp上ll199(赵小雅)的耐心教导下,我终于明白了使用
sizeof
来得到
struct
的原理,首先表示一下感谢。首先拉来看个例子:
struct
test{ char a; int b;};int main(){ int nSize =
sizeof
(test); return 0;} 在使用vc编译器默认设置下得到的nsize是8,而不是5.为什么要这样呢?原来在cpu寻址是是8的
关于
sizeof
求
struct
和union
长度
的问题
sizeof
求
struct
和union
长度
的问题
sizeof
(
struct
var) 的
长度
如何计算
http://goodfunman.itpub.net/post/15807/148405 本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用
sizeof
来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中
sizeof
的主要用法。 1、
sizeof
应用在结构上的情况 请看下面的结构:
struct
My
Struct
{ double dda1;
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章