Sizeof函数用法的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 cherywq
  • 开始时间 开始时间
C

cherywq

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下:
var A:string;
begin
SetLength(A,6);
Showmessage(inttostr(Sizeof(A)))
//这里返加为4
end;

var A:string[7];
begin
Showmessage(inttostr(Sizeof(A)))
//这里返加为7
end;
我想知道为什么第一个Sizeof函数会返回4,书上说明的不太详细,只是说返回A的内存大小,而不是字符串本身所占用的内存大小。对于这点解释我不是太明白。是不是指的是一个32位地址然后指向这个字符串啊,请各位大侠帮忙看看。另外后面的返回值为7,是不是就是指字符串所占用的内存大小呢?
 
Delphi中,String默认情况下,是动态分配内存指针,如果你用Sizeof(String)得到的结果是4,String默认是指向PAnsiChar串的指针,除非指定长度像“String[20]”一样,才会固定起来
 
var A:string[7];变成固定数组 了
 
默认String就是AnsiString;AnsiString是指针,指针长度当然是4.
_AnsiString = record
AllocLen : LongWord
//分配长度,总是大于实际长度,主要是内存管理器分配的时候有对齐的原则.
RefCount : LongWord
//引用次数,当引用次数是0的时候就销毁.
Len : LongWord
//实际字符串的长度
Data : Array[0..Len] of char
//数据,最后一个字节会补一个#0
end;
AnsiString = ^_AnsiString;//AnsiString是一个指针.
 
zhj09,那string[20]应该说也是指针指向的呀,那为什么这里就反映的他的整个字符串大小了呢。另外,你指的固定是什么固定,是地址还是大小?
 
String[XXX]
这样的字符串不是AnsiString而是ShortString.
最大长度255.这种字符串不是指针.是兼容旧的Pascal的一种字符串数据类型.
第一个字节表示长度,后面是数据.
 
后退
顶部