社区
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?
...全文
250
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
计算数组
长度
为啥就不
正确
了?
在自定义函数中使用
sizeof
结果为啥不
正确
?
sizeof
struct
为什么总是一个问题
在Win32 Crypto API里面很常用的一些接口如CryptImportKey, 会引入一些特定的数据结构作为key的内容和说明。我们在很多的sample里面看到了类似的定义,从而也发现了很诡谲的问题
struct
KeyBLOB { BLOBHEADER header; DWORD cbKeySize; BYTE
c/c++中使用
sizeof
计算结构体
struct
和类class的
长度
(字节)
前言 在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素
长度
都小于处理器的位数的时候,便以结构体内最长的数据元素为对齐单位,也就是说,结构体的
长度
一定是最长的数据元素的整数倍。如果结构体内存在的
长度
大于处理器位数的,那么就以处理器的位数为对齐单位。结构体内类型相同的连续元素,将在练习的空间内,和数组一样。多说无益,直接看程序。
struct
{short a1;short
sizeof
(
struct
student)(字节对齐)
字节的对齐原理 一.什么是字节对齐,为什么要对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某...
c语言获取结构体大小
sizeof
,C语言
sizeof
求结构体数组
长度
C语言
sizeof
求结构体数组
长度
C语言
sizeof
求结构体数组
长度
#include typedef
struct
ss{char a;//偏移量为0,大小为1,0能被1整除,=1short b;//偏移量为1,大小为2,1不能被2整除,=1+1+2=4int c;//偏移量为4,大小为4,4能被4整除,=4+4=8long d;//偏移量为8,大小为4,8能被4整除,=8+4=12} ss_t;...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章