var 
  str: string[20];
  
sizeof(str)等于多少
周爱民的书上说堆栈的分配最小单位是4字节所以是24
但是我D7上实验出来的效果是21 
有D7一下版本的实验效果

解决方案 »

  1.   

    相信你自己的实验。照你理解sizeof(byte)应该等于4?
      

  2.   

    我突然想,可能sizeof与分配的无关与真正使用的有关
      

  3.   

       字符串类型实际上就是一个字符序列,序列的头部是一个长度字节,指示当前字符串的长度,由于只用一个字节来表示字符串的长度,所以字符串的长度不能超过255个字符。当然程序员可以定义长度声明更短的字符串以节约存储空间,正如你的代码:
        var
          str: string[20]; 
    用sizeof得到的值当然就是你指定的长度20加上字符串类型头部的长度共21了
      

  4.   

    贴出原话:
    短字符串的声明有两种方式
    var
      var1: string[20];
      var3: shortstring;
      var1的声明限定字符串长度为0~20字节,var2声明使用默认值,因而限定为0~255字节。
    Delphi总是按最大上限为段字符串分配内存。这样,最少的情况下,var1将占用20+1字
    节,而var2将占用255+1字节。----这1字节是var1[0],var2[0]的记数位保留的。
      由于堆栈以4字节为单位进行分配。因此var1在堆栈中将被分配24字节,而var2将被
    分配256字节。源于堆栈的这种分配,在应用程序内存区中,短字符串类型化常量采用与堆
    栈分配一致的长度分配。
      

  5.   

    MSDN上对sizeof的定义是,对一位数组使用sizeof会返回数组的长度,实际上并不是堆栈的长度
      

  6.   

    这个和堆栈分配多少空间没有关系。
    SizeOf 仅仅返回你定义的数据的数据类型的长度,不会因为在堆中或者在栈中因为需要对齐而多分配了几个字节就会返回分配的字节,实际上,你也不能使用多分配出来的那部分内存(强行访问除外)
    数据在内存中,尤其是在栈中,实际分配的内存往往和数据本身的长度不等。