我可以帮您翻译成中文:我有以下代码示例,已在Delphi XE5 Update 2中编译。
如果我运行它,它会显示变量的地址。变量i和t在内存范围
图片展示了我的意思。
我的设置:
- Windows 7 64位 - Delphi XE 5 更新2 - 调试配置32位
奇怪,不是吗?有人能够复现吗?这是Delphi编译器的一个错误吗?
谢谢。
编辑:下面是相同的例子,可能更容易理解我的意思:
此外,对于我的糟糕英语感到抱歉 ;)
procedure TForm1.FormCreate(Sender: TObject);
var i,t:Integer;
buf: array [0..20] of TPair<Integer,Integer>;
begin
t := 0;
for i := Low(buf) to High(buf) do begin
ShowMessage(
Format(
'Pointer to i = %p;'#$d#$a+
'Pointer to buf[%d].Key = %p;'#$d#$a+
'Pointer to buf[%d].Value = %p;'#$d#$a+
'Pointer to t = %p',
[@i, i, @(buf[i].Key), i, @(buf[i].Value), @t]
)
);
buf[i].Key := 0;
buf[i].Value := 0;
t := t + 1;
end;
end;
如果我运行它,它会显示变量的地址。变量i和t在内存范围
buf
中有地址!当i达到3时,赋值buf[i].Value := 0;
会覆盖i的前3个字节和t的最后一个字节。这导致无限循环,因为i每次达到3时都会被重置为0。如果我使用SetLength(buf,20);
自己分配内存,一切都好。图片展示了我的意思。
我的设置:
- Windows 7 64位 - Delphi XE 5 更新2 - 调试配置32位
奇怪,不是吗?有人能够复现吗?这是Delphi编译器的一个错误吗?
谢谢。
编辑:下面是相同的例子,可能更容易理解我的意思:
此外,对于我的糟糕英语感到抱歉 ;)