2014-11-04 33 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