2012-08-10 68 views
1

在一些继承遗留代码中,我跟踪了一个随机垃圾出现在输出到非初始化数据结构的问题。它的定义为:正确的方式来初始化短阵列数组的数组?

MyArray: array of array of ShortString; 

当我们从这个结构中读取值,我们有时会收到的垃圾,这显然是从一个糟糕的地方来了,它改变了我们每次运行时间。

我认为这将是初始化数组的正确方法:

FillChar (MyArray, SizeOf (MyArray), 0) 

然而,当我开始阅读各种网站,我开始怀疑自己。这是初始化这个数组的最好/正确的方法吗?是0是正确的FillValue,还是应该是#32?

+3

尝试执行此:'ShowMessage(IntToStr(中SizeOf(MYARRAY)));'你可以预测的结果? :) – kludg 2012-08-10 16:11:31

回答

-2

Afaik shortstrings不会自动初始化。所以,设置长度到正确的尺寸,例如

setlength(myarray,10,12); 

然后将所有的字符串为0长度:

for i:=0 to length(myarray)-1 do 
    for j:=0 to length(myarray[i])-1 
     setlength(myarray[i][j],0); 
+3

短弦不是,但设置动态数组的长度将导致所有新分配的内存块都填充零。 – 2012-08-10 17:55:55

+0

这似乎已经做到了,谢谢! – 2012-08-10 18:08:42

+0

您应该使用i:= low(myarray)至high(myarray)do for j:= low(myarray [i])至high(myarray [i])... – HeartWare 2012-08-10 18:26:13

2

由于未指定大小,因此这是一个动态数组。 Fillchar不是初始化这些的正确方法。由于它们是托管类型,因此它们会自动初始化。如果稍后想要清空阵列,则可以使用SetLength(MyArray,0)或仅使用MyArray := nil

+2

'MyArray:= nil'也可以。 – 2012-08-10 16:18:23

+2

好吧,如果我们要挑剔,因为它是一个托管类型,它会自动初始化为零。 – 2012-08-10 16:50:14

+0

严格地说,这些位是最终化建议,而Eric则要求初始化。 – 2012-08-10 17:21:52