我目前在为我的编程课程构建的程序中遇到了几个访问冲突问题。它是用pascal(课程使用的语言)和使用Lazarus IDE(类似于Delphi但是打开)构建的。
据我所知,当您尝试使用或寻址无效的内存位置时,会发生访问冲突或SIGSEGV错误。我已经经历了很多这些,特别是当我没有声明动态数组的长度时。
现在看来我在使用字符串时遇到了麻烦。 (或者我可能正在使用多维数组)。
我只会粘贴SIGSEGV指向的过程,但上下文是:
我有一个整数数组和一个包含它的幂集(subconjuntos)的多维数组,弹出错误的函数(如下所述)用于将此电源组打印到a TextBox(由本地索引):
procedure writeSub(local: TEdit);
var
i, j: integer;
begin
for i:= 0 to High(subconjuntos)+1 do
if Length(subconjuntos[i])>1 then
begin
local.Text:=local.Text+'[';
for j:=0 to High(subconjuntos[i])+1 do local.Text:=local.Text+'('+IntToStr(subconjuntos[i][j])+') ';
local.Text:=local.Text+'] ';
end
else local.Text:=local.Text+'['+IntToStr(subconjuntos[i][0])+'] '; {this is where I'm having the SIGSEG, the program wont compile if I don't reference it without the double brackets}
end;
为什么它会抛出SIGSEGV?
答案 0 :(得分:3)
动态数组的有效索引范围为low(arr)
到high(arr)
。对于动态数组,low(arr)
始终为零。您尝试访问索引为high(arr)+1
的元素。这是阵列的结束,肯定是一个错误。
你写的地方
for i:= 0 to High(subconjuntos)+1 do
应该是
for i:= 0 to High(subconjuntos) do
或
for i:= Low(subconjuntos) to High(subconjuntos) do
同样适用于你的其他循环。
最重要的是,如果subconjuntos[i][0]
为零,则Length(subconjuntos[i])
是一个超出范围的访问权限。
如果在编译器选项中启用范围检查,则编译器将发出代码以检查每个阵列访问的有效性。这样做可以让您更快地解决此类错误。