如何避免FPC编译器上的SIGSEGV错误?

时间:2015-03-03 22:51:44

标签: arrays lazarus freepascal sigsegv

我目前在为我的编程课程构建的程序中遇到了几个访问冲突问题。它是用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?

1 个答案:

答案 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])是一个超出范围的访问权限。

如果在编译器选项中启用范围检查,则编译器将发出代码以检查每个阵列访问的有效性。这样做可以让您更快地解决此类错误。