2014-11-04 73 views
0

我有代码,其中我在新行上输入每个数字,直到我写0。我对数组的大小感到困惑。在开始我宣布A是索引1到5的数组。但是当我继续写入并放置超过5个数字时,它似乎仍然保存,然后在第二个循环中使用。这怎么可能?我想如果我用尽索引,我会得到一个错误。帕斯卡 - 阵列的大小

program testarray; 
var hmez,        
    i:integer;       
    A:array [1..5] of integer; 

begin 
i:=0; 
    repeat            
    inc(i); 
    readln(A[i]); 
    if A[i]=0 then hmez:=i-1; 
    until A[i]=0; 
for i:=1 to hmez do 
    writeln(A[i]); 
end. 

回答

3

您正在覆盖不属于A变量的内存。这会迟早会导致未处理的异常(运行时错误)或任何其他'怪异'行为导致的内存泄漏。与“受管理”语言(如C#或Java中的Pascal)不同,对数组索引的运行时检查是一项可选功能,而不是强制执行的语言功能。

Pascal编译器通常可以打开或关闭被称为“范围检查”的数组索引检查。指令{$R+}打开了这些范围检查 - 请参阅documentation here

在你的情况下,代码似乎'工作',只是因为,可能没有其他有用的变量放在内存后分配为A的空间。请注意,这只是一个巧合,在您的程序的所有运行中可能都不是这种情况。所以一般来说,你的程序是不正确的。

+0

谢谢你,所以你建议打开范围检查,使我的程序正确? – cgnx 2014-11-04 18:04:51

+0

您应该首先检查索引在您的代码中是否有效。编译器生成的范围检查是一个安全网。但是,是的,你一定要让它们随时打开。 – 2014-11-05 11:22:49

+0

你的程序本质上不正确。转向范围检查不会引入正确性;它会让你明确知道这是不正确的。 – 2014-11-05 11:25:10