sizeof的奇怪问题

liuanjun_v 2003-10-16 01:19:02
Type1=Record //4+13=17
id :longword;
terminal_id:array[0..12] of char;
end;
在程序中sizeof(type1)=20
Type2=Record //4+4=8
id :longword;
id2 :longword;
end;
在程序中sizeof(type2)=8
Type3=Record //4+13+50=67
id :longword;
terminal_id:array[0..12] of char;
dest:array[0..49] of char;
end;
在程序中szieof(type3)=68


这是为什么?害得我调了几天,老是读数据错位
...全文
36 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmzgz81 2003-10-16
  • 打赏
  • 举报
回复
结帖吧! 呵呵
Delphi_Li 2003-10-16
  • 打赏
  • 举报
回复
这是Delphi编译器搞的鬼!!!默认情况下Delphi是按照字长度对齐的,这样可以提高程序的执行效率,所以你的结构得到的长度肯定是你的计算机字长的整数倍,目前的计算机都是32位的,所以你看看你的SizeOf的结果,肯定都是4的整数倍!!!避免这种情况有两种方法:1、取消Delphi的编译优化选项,但这样讲损失程序执行的效率(至少我感觉不到);2、使用Packed的关键字!!!
milerzhang 2003-10-16
  • 打赏
  • 举报
回复
学习ing
flyinwuhan 2003-10-16
  • 打赏
  • 举报
回复
缺省是双字对齐,而双字的长度是4,所以必须要被4 整除。
liuanjun_v 2003-10-16
  • 打赏
  • 举报
回复
明白了谢谢
ahjoe 2003-10-16
  • 打赏
  • 举报
回复
结构的起始地址为4的倍数。
在未压缩的结构中,单字节类型域从任何地址开始,双字节类型域从偶地址开始,四字节类型从4的倍数地址开始。
例1:
rec= record
a: char;
b: word;
end;
因为word型是双字节,需从偶地址开始存放,所以a后面会有一个字节空间不用,整个结构总共占用4个字节。
例2:
rec= record
a: char;
b: integer;
end;
因为integer型是4字节,需从4倍地址开始存放,所以a后面会有三个字节空间不用,整个结构总共占用8个字节。
flyinwuhan 2003-10-16
  • 打赏
  • 举报
回复
同意pankun(剑神一笑)
ahjoe 2003-10-16
  • 打赏
  • 举报
回复
其实很简单,DELPHI帮助里面有说的,未压缩的Record与压缩的Record的区别。

Instances of a structured type hold more than one value. Structured types include sets, arrays, records, and files as well as class, class-reference, and interface types. Except for sets, which hold ordinal values only, structured types can contain other structured types; a type can have unlimited levels of structuring.
By default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage. For example,

type TNumbers = packed array[1..100] of Real;

Using packed slows data access and, in the case of a character array, affects type compatibility. For more information, see Memory management.
marlboroywp 2003-10-16
  • 打赏
  • 举报
回复
关注,应该是数组初始化出的问题吧,不知道数组在内存中是怎么分配的
rummy 2003-10-16
  • 打赏
  • 举报
回复
楼上说得对,其实terminal_id:array[0..12] of char;占了16位
pankun 2003-10-16
  • 打赏
  • 举报
回复
这是因为DELPHI的编译器默认会对结构进行数据对齐.这样有利于速度.
但只要加上packed就不会(如上)这样有利于结约内存空间,但速度会慢一点.
pankun 2003-10-16
  • 打赏
  • 举报
回复
Type3= packed Record //4+13+50=67
id :longword;
terminal_id:array[0..12] of char;
dest:array[0..49] of char;
end;
就不会了.
idilent 2003-10-16
  • 打赏
  • 举报
回复
我觉得是里面有两个数组的原因,你再加一个数组看看。
rwdx 2003-10-16
  • 打赏
  • 举报
回复
把longword类型换成其它类型看看

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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