是Delphi的Bug吗?(80分)

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

chcw

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个函数中执行以下语句:
var
; a: array of Byte;
begin
; SetLength(a, 20);
; FillChar(a, 20, 0);
; a[1] := 1;
end;
结果执行到第三句的时候就出错,请问这是什么原因?
 
var
; a: array[1..20] of Byte;
begin
; FillChar(a, 20, 0);
; a[1] := 1;
end;


这样就 OK
 
实际是FillChar(a, 20, 0);的问题。
Warning: This function does not perform any range checking.
 
同意VGA!
 
难道就不能用在动态生成的数组吗?
 
动态生成的数组当然可以用,不过你的用法有问题
这样用:
var
; a: array of Byte;
begin
; SetLength(a, 20);
; FillChar(a[0], 20, 0);
; a[1] := 1;
end;

原因:
Delphi的动态内存管理。a是一个指针,它指向的地方存放的是该数组的起始地址,
长度,类型等信息(根据我的经验),a[0]才是该动态数组的真正起始地址
Do you konw?
 
我不知道你的FillChar(a, 20, 0)有什么用
但是:
var
; a: array of Byte;
begin
; FillChar(a, SizeOf(a), 0);
; SetLength(a, 20);
; a[1] := 1;
end;
 
to X-MAX:
; FillChar的目的就是把数组a的内容全部清0。你写的那段代码倒有点匪夷所思,a没分配
空间就来个FillChar,此为何意?
 
FillChar不知怎么会出错?
当填的对象是动态数组就出错,静态就不会。

用这个代替吧^_^ :
var
; a: array of Byte;
; i: integer;
begin
; SetLength(a, 20);
; for i := Low(a) to High(a) do
; ; a:=0;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
704
SUNSTONE的Delphi笔记
S
S
回复
0
查看
699
SUNSTONE的Delphi笔记
S
S
回复
0
查看
848
SUNSTONE的Delphi笔记
S
后退
顶部