Delphi中的访问冲突?

时间:2013-06-25 21:52:56

标签: arrays delphi exception matrix

我得到了以下代码,它应该正确地访问矩阵位置,但是我总是遇到这种访问违规行为......

var
tabla : array of array of string;

....
implementation

SetLength(tabla, minterms.Count+1, minterms_essentials.Count+1);

for i := 0 to minterms.Count-1 do
begin
  tabla[i+2,1] := minterms[i];
end;

for i := 0 to minterms_essentials.Count-1 do
begin
  tabla[1, i+2] := minterms_essentials[i];
end;

end

基本上,我正在生成一个表,并且在循环中我试图在第二个循环中填充列标记和行标记。只要我知道,数组从1开始。

tabla[1][1]是一个未占用的索引,这就是为什么我不是触摸它

为何违反访问权限?

3 个答案:

答案 0 :(得分:6)

在Delphi中,动态数组(你可以调用SetLength的任何数组,而不是像编译array[1..5] of integer那样在编译时声明它的边界)从0开始索引,而不是从1开始。因此将数组视为如果它使用基于1的索引而不是基于0的索引,则会溢出数组的边界并尝试写入未分配给您的内存,这可能会导致访问冲突。

答案 1 :(得分:4)

动态数组始终从0开始。

因为

SetLength(tabla, minterms.Count+1, minterms_essentials.Count+1);

tabla的最高第一索引为minterms.Count

现在,想想

for i := 0 to minterms.Count-1 do
begin
  tabla[i+2,1] := minterms[i];

iminterms.Count-1时,i+2minterms.Count+1。因此,您尝试访问tabla[minterms.Count+1]。但这不存在,因为正如我们所看到的,tabla的最大可能第一个索引是minterms.Count

因此,您尝试访问不存在的内容。

答案 2 :(得分:3)

阵列从零开始,最大值。 index是Count-1

因此,如果minterms.Count等于3,则setlength(...,4)==>索引在0和3之间。

for i := 0 to minterms.Count-1 do

会做得很好,但是在循环体中将i + 2改为i。