【问题标题】:How to avoid SIGSEGV Errors on FPC compiler?如何避免 FPC 编译器上的 SIGSEGV 错误?
【发布时间】:2015-03-03 22:51:43
【问题描述】:

我目前在为我的编程课程构建的程序中遇到访问冲突的几个问题。它是用 pascal(课程使用的语言)构建的,并使用 Lazarus IDE(类似于 Delphi,但开放)。

据我所知,当您尝试使用或解决无效的内存位置时,会发生访问冲突或 SIGSEGV 错误。我经历过很多这样的事情,特别是当我没有声明动态数组的长度时。

现在看来我遇到了字符串问题。 (或者我可能会使用多维数组)。

我将只粘贴 SIGSEGV 指向的过程,但上下文是:

我有一个整数数组和一个包含它的幂集 (subconjuntos) 的多维数组,弹出错误的函数(如下所述)用于将此幂集打印为文本框(由本地索引):

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 吗?

【问题讨论】:

  • 我删除了 Delphi 标签,因为这个问题不适用于 Delphi。 Delphi 不抛出 SIGSEGV,不使用 FPC,因此与此问题无关。在你的问题标题中包含标签信息也是不合适的;标签系统在这里工作得非常好,可以对问题进行分类并将它们提供给熟悉这些标签的人。

标签: arrays lazarus freepascal segmentation-fault


【解决方案1】:

动态数组在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

同样适用于您的另一个循环。

最重要的是,如果Length(subconjuntos[i]) 为零,则subconjuntos[i][0] 是越界访问。

如果您在编译器选项中启用范围检查,那么编译器将发出代码来检查每个数组访问的有效性。这样做会导致您更快地出现此类错误。

【讨论】:

  • 感谢大卫的耐心等待。你让我学到了很多东西。现在它正在工作。我使用了 subconjuntos[i][low(subconjuntos[i])] 并且效果很好。
  • 好吧,如果subconjuntos[i]nil,那么它没有元素,所以subconjuntos[i][...] 将是一个错误,无论你放在内部数组索引中。所以你需要确保subconjuntos[i] 不是nil。另外,简写是写arr[i,j]而不是arr[i][j]
  • 不知道 FPC 支持 arr[i,j] 表示法。感谢您提供新信息。
猜你喜欢
  • 2012-10-06
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多