//定义记录
type
  h=record
    a:array [0..10] of char;
    b:array [0..10] of char;
    c:array [0..10] of char;
    e:longword;
  end;//输出记录长度
var
  h1:h;
begin
  Memo1.lines.add(IntToStr(sizeof(h1)));
end;
//输出结果:
40可实际上记录h中4个字段长度相加应是:11+11+11+4=37为什么输出结果会多出3? 如果记录h只有a和e字段,则输出多1;如果只有a,b,e则输出多出2。我知道零基准数组存储NULL结尾的字符串,和这个有关系吗。而且如果把记录h的e字段去掉,则输出长度是正确的。请问这是怎么会事情?多出的长度是从那里来的?在记录h的什么位置?谢谢!

解决方案 »

  1.   

    h= packed record
        a:array [0..10] of char;
        b:array [0..10] of char;
        c:array [0..10] of char;
        e:LongWOrd;
      end;
    定义为packed record长度将会正常
      

  2.   

    缺省状态下,结构化数据为了访问速度更快,数据位的对其方式为:字或者双字,使用了packed 保留字,就可以将该结构数据压缩到最小的实际长度。11+11+11+4=37为什么输出结果会多出3?————前面三个数组为单数,最后一个e为4byte,为了凑足整数个数的word,每一个数组后面加了一个byte。如果记录h只有a和e字段,则输出多1;
    ————同上如果只有a,b,e则输出多出2
    ————同上
      

  3.   

    record 和packed record的区别是:
    record要进行边界对齐,牺牲存储空间以提高访问速度
    packed record是不进行对其,所以是实际声明的空间长度!
    对齐的过程中是以32位进行的!
    1个char是8位,所以4个char对应一个32位,那么就需要(11+1) / 4 才可以除端
    所以要补足一个char对与a, b, c就要补3个,所以大小是11*3 + 4 + 3 = 40
      

  4.   

    参考楼上所述,我个人觉得应该{X即为多出的size}:
    (sizeof(a)+sizeof(b)+sizeof(c)+X)/4整除才是正确解释
    如果按楼上的两种解释:
      h = record
        a:array[0..1]of char;
        b:array[0..1]of char;
        c:integer;
      end;  
      size(h1)=8; {zwjchina(蒲石)的说法对这个结论解释不通}  h = record
        a:array[0..1]of char;
        b:array[0..2]of char;
        c:integer;
      end;
      size(h1)=12;:{ bigysw(大花脸)的说法对这个好像解释不通}
      

  5.   

    除了通过packed解决,也可以通过加{$A-}编译开关解决。系统默认{$A+}
    ...........................................................
    {$A-}
    type
      h = record
        a:array[0..1]of char;
        b:array[0..2]of char;
        c:integer;
      end;
      

  6.   

    有个疑问。
    补上的char的位置在那里?是每个数组字段的后面,还是这个记录h的后面补?
    因为如果是后者,则可以在不影响访问速度的情况下轻易去掉这些补上的char的。
      

  7.   

    laihecongxi(兴哥) ( ) 你估计没明白我说的意思!
    对于你那个记录  h = record
        a:array[0..1]of char;
        b:array[0..1]of char;
        c:integer;
      end;  
      size(h1)=8; {zwjchina(蒲石)的说法对这个结论解释不通}a的长度为2,所以要(2+2)/4才可以除断,
    b同样要加2,
     所以就是 2(a的)+ 2(补齐a的) + 2(b的)+ 2(补齐b的) + 4(c的) = 8
    没有任何解释不通的地方!