拉撒路的宣告

问题描述 投票:0回答:1

我在lazaus(2.0.6)中的变量声明时遇到了奇怪的行为

如果我按照以下顺序声明变量,则程序将显示SIGSEGV错误,从而停止执行,如果我将初始值分配给TabCellContent var的第二个字段,则会弹出该错误

TabReadActive: Boolean;
ShCol: Array[0..6] of Boolean;
TabCellContent: Array [0..6] of Array [1..50] of TCellContent;

但是如果我将“ TabReadActive”放在Array的声明下面,则程序可以正常运行而不会出现错误

ShCol: Array[0..6] of Boolean;
TabCellContent: Array [0..6] of Array [1..50] of TCellContent;
TabReadActive: Boolean;

有人遇到过相同的行为吗?这是什么原因呢?

variables sequence declaration freepascal lazarus
1个回答
0
投票

原因是访问变量的代码超出范围。超出范围访问数组会导致未定义的行为。声明变量的顺序更改行为只是一个巧合。但这就是不确定行为的本质。很好,它是未定义的。

在编译器选项中启用范围检查,并通过调试器运行程序。这将标识代码中超出界限的数组访问点。

© www.soinside.com 2019 - 2024. All rights reserved.