一个关于struct与sizeof的问题

coolicelee 2003-07-09 10:16:30
有如下定义
typedef struct a
{
unsigned int a1;
unsigned int a2;
unsigned int a3;
char a4[6];
char a5[16];
unsigned char a6;
unsigned int a7;
}aa;

sizeof(aa) 结果是 40,然而实际上大家可以算一下,应该是39,还有更奇怪的,你可以试着注释掉一部分,结果更离谱。
例如
typedef struct a
{
unsigned int a1;
unsigned int a2;
unsigned int a3;
char a4[6];
char a5[16];
// unsigned char a6;
unsigned int a7;
}aa;
sizeof(aa)结果还是40,然而算一下应该是38
这个问题是出现在C++ Builder 5(D板)中的,不知道是什么原因,请高人指点
...全文
129 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolicelee 2003-07-10
  • 打赏
  • 举报
回复
查到了,好使!给分!
coolicelee 2003-07-10
  • 打赏
  • 举报
回复

#pragma pack(push,1)
#pragma pack(pop)
是什么意思?
ThinkX 2003-07-09
  • 打赏
  • 举报
回复
vc,bcc,gcc,delphi都可以设置字节对齐选项的。
aawolf 2003-07-09
  • 打赏
  • 举报
回复
大家编译出来的结果不一样,可能是因为编译器的设置有差异。
大家看下Project-Options-Advanced Compiler中的Data alignment的设置。

编译器会自动取齐,提高CPU的效率。
aawolf 2003-07-09
  • 打赏
  • 举报
回复
建议看下《深度探索C++对象模型》,那里边的解释比较清楚。
另外耙子是这方面的大行家,为什么到现在还没现身呢?
ljwwjh 2003-07-09
  • 打赏
  • 举报
回复
up
yesry 2003-07-09
  • 打赏
  • 举报
回复
#pragma pack(1)
要和其他语言编写的程序通讯都要这样。
penu 2003-07-09
  • 打赏
  • 举报
回复
数据的字节对齐问题。
wyz52126 2003-07-09
  • 打赏
  • 举报
回复
struct b
{
unsigned int a1;
unsigned int a2;
unsigned int a3;
unsigned int a7;
}; length = 16
struct c
{ char a4[6];
char a5[16];
unsigned char a6;
}; length = 23
struct a
{
char a4[6];
char a5[16];
unsigned char a6;
unsigned int a1;
unsigned int a2;
unsigned int a3;
unsigned int a7;
}; length = 40 ????
FlySky01 2003-07-09
  • 打赏
  • 举报
回复
我的没有问题
怪了!
zxcdewq 2003-07-09
  • 打赏
  • 举报
回复

结构成员类型可以不同,有时这会给实现带来一点麻烦。例如,下面描述的结构:
struct exam {
char aa;
int nn;
double xx;
} ss;
实现时就会出现一种特殊情况。引起问题的原因是这个结构包含几个类型不同的成员,而这
几个成员的大小又不同。成员aa 是字符类型,一般需要一个字节;nn 的大小依赖于系统,
如果是16 位就需要2 个字节;而双精度成员xx 一般需要8 个字节。
为了程序执行效率,计算机硬件通常规定了各种基本类型数据的摆放方式。例如,通常
要求两字节表示的整数从偶数地址的单元开始存放;对于需要8 个字节表示的双精度数,可
能要求从4 的倍数(或者8 的倍数)地址的单元开始存放*。此外,系统对整个结构对象的
存放也可能有起始位置要求,这样,存储exam 结构的区域中就可能出现空位。这类问题一
般统称为对齐问题。由此引起的问题包括:(1)结构里的后续成员未必紧接着前一个成员存
放,成员间可能出现空位;(2)结构的大小未必是其各个成员的大小之和。
zxcdewq 2003-07-09
  • 打赏
  • 举报
回复
#pragma pack(push,1)
typedef struct a
{
unsigned int a1;
unsigned int a2;
unsigned int a3;
char a4[6];
char a5[16];
unsigned char a6;
unsigned int a7;
}aa;

#pragma pack(pop)//上面的少了

wyz52126 2003-07-09
  • 打赏
  • 举报
回复
yesry(),不对啊,我这里显示的不是39哦,也是40哦!
zxcdewq 2003-07-09
  • 打赏
  • 举报
回复
结构的对齐方式
yesry 2003-07-09
  • 打赏
  • 举报
回复
#pragma pack(1)
typedef struct a
{
unsigned int a1;
unsigned int a2;
unsigned int a3;
char a4[6];
char a5[16];
unsigned char a6;
unsigned int a7;
}aa;


void __fastcall TForm1::Button1Click(TObject *Sender)
{
Caption=sizeof(a);//显示39
}
//---------------------------------------------------------------------------
alenwelkin 2003-07-09
  • 打赏
  • 举报
回复
呵呵,没想过这个问题,帮你UP吧

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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