Delphi结构类型包含String字符串使用需要注意的地方

时间:2021-11-09 08:49:05 资料 我要投稿

Delphi结构类型包含String字符串使用需要注意的地方

Delphi结构类型包含String字符串使用需要注意的地方

TCSInfo = record

Cs_Str??? :String;

Count:Integer;

CS_Str2:String;

end;????? //SizeOf:12

TCSInfo2 = record

Cs_Str??? :String[20];??? //1字节的长度,20字节的字符串空间,共21字节, 补齐到24字节

Count:Integer;

CS_Str2:String;

end;? //sizeOf:32

内存布局。

TCSInfo中的Cs_Str? 是一个指向真实字符串的指针,初始化时是一个空指针。

当Cs_Str的内容长度变化时,对应的指针也发生变化。

procedure TFormImport.Button4Click(Sender: TObject);

var

CSInfo:TCSInfo;

CSInfohttp://www.unjs.com2:TCSInfo2;

p:Pointer;

begin

p:=? Pointer(@CSInfo);

ShowMessage(IntToStr(Cardinal(p^)));

ShowMessage(IntToStr(Cardinal(Pchar(CSInfo.Cs_Str))));

CSInfo.Cs_Str:='ab';

p:=? Pointer(@CSInfo);

ShowMessage(IntToStr(Cardinal(p^)));

ShowMessage(IntToStr(Cardinal(p^)));

ShowMessage(IntToStr(Cardinal(Pchar(CSInfo.Cs_Str))));

CSInfo.Cs_Str:='abcdeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';

p:=? Pointer(@CSInfo);

ShowMessage(IntToStr(Cardinal(p^)));

ShowMessage(IntToStr(Cardinal(Pchar(CSInfo.Cs_Str))));

end;

有些人提倡当在结构里面包含字符串类型的时候最好采用定长的方式。

比如像下面这样:

TCSInfo = record

Cs_Str??? :String;

Count  :Integer;

CS_Str2 :String;

end;

如果Cs_Str在这里不采用定长的方式,那么当采用SizeOf()获取结构的大小的时候,可能得不到正确的大小值。

另外这个首位成员变量的值,很有可能出现随机值的情况,就是你已经给它赋了值,在当前的显示是正确的,但是——

如果把该结构保存为结构文件的时候,下次打开取值的时候就会出现随机值的情况。

但是后面的变量的值是正常的,所以如果字符串变量放在首位,那么应该采用定长的方式:

Cs_Str??? :String[20];

或者把Count放在首位。

有些朋友没有试过存储过结构化文件,所以在程序运行的时候,不会发现有什么问题。

简单的使用是不会发现问题,因为我在测试的时候,也发现第一次赋值的时候,完全没有发现问题。

然后关闭程序,第二次打开文件的时候,就发现了问题。

而且凡是前面的.变量的类型是String的话,得到的全部是随机值,但是只要紧随其后有一个别的类型,那么之后的非定长的字符串变量的值却是正常的。就像上面的CS_Str2那样,值是正常的,问题出现在其它类型变量之前的非定长字符串类型的变量的身上。

如果说是寻址的问题,那么为什么后面的变量值是正确的?

我们知道文件流的指针位置如果不正确,那么是无法取得正确的结果的。

总之涉及到字符串类型都是比较复杂的。

如果不深究其中的原因,保证我们的程序完美实现,不会出现隐患。

我的建议是:要么把其它类型的变量至于首位,那么后面的字符串可以不采用定长的方式。

要么就采用定长的方式,这种情况最好必须把变量至于首位的情况下。

采用定长的方式,会浪费很多空间,而且文件不会很紧凑,而且大多数时候,我们的值都是不确定的,如果采用定长的方式,显然会导致在赋值的时候带来不可预料的情况,当然自己使用不会有问题,如果是客户,那么我们不得不增加代码的开销来避免这种情况的出现,对吧。

我个人相当习惯采用流的方式来处理文件,但是采用内存流或者文件流处理文件会有好几个陷阱,会令人误以为不能够采用流的方式处理。

这个问题下次我会提到。

为什么需要习惯流的方式处理文件,主要的原因是需要了解大数据处理和各种结构化文件处理的问题。

尤其是大多数的处理都是在内存里面进行,效率还可以。

【Delphi结构类型包含String字符串使用需要注意的地方】相关文章:

[DELPHI]字符串列表使用01-01

在PostgreSQL中使用日期类型时一些需要注意的地方 -电脑资料01-01

菜单文件的类型,结构及使用 -工程01-01

JAVA String 字符串压缩 -电脑资料01-01

Redis数据类型之string类型 -电脑资料01-01

AutoCad菜单文件的类型,结构及其使用 -工程01-01

跳槽规划需要注意的地方01-18

求职前需要注意的地方02-08

处暑养生需要注意的地方02-25