Lazarus 中的 Var 声明

0 variables freepascal declaration sequence lazarus

我在 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;
Run Code Online (Sandbox Code Playgroud)

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

ShCol: Array[0..6] of Boolean;
TabCellContent: Array [0..6] of Array [1..50] of TCellContent;
TabReadActive: Boolean;
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过同样的行为?这是什么原因?

Dav*_*nan 5

原因是访问变量的代码越界了。越界访问数组会导致未定义的行为。声明变量的顺序会改变这种行为,这只是巧合。但这就是未定义行为的本质。嗯,它是未定义的。

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