Pascal实现Connect4游戏时调用SetLength()触发Access Violation错误
Connect4默认运行触发EAccessViolation的原因分析
核心错误:局部变量未初始化
你的代码在无参数运行(默认6×7棋盘)的分支中,存在未初始化的局部变量,这是触发访问违规的直接原因。
看PlayGame过程的else分支代码:
else begin SetLength(Board, Rows); for g := 0 to rows-1 do SetLength(Board[g], cols); WinSize := 4; end;
这里的rows和cols是PlayGame内定义的局部变量,在默认分支中没有被赋值,它们的初始值是内存中的随机垃圾数据。当用这个不可控的垃圾值作为循环边界(rows-1)或数组长度参数时,会导致数组越界访问,直接触发EAccessViolation错误。
修复方案
在默认分支中先给rows和cols赋值为全局常量Rows和Columns:
else begin rows := Rows; cols := Columns; SetLength(Board, rows); for g := 0 to rows-1 do SetLength(Board[g], cols); WinSize := 4; end;
关于Mac环境的影响
这个错误本质是代码逻辑问题,和Mac环境没有直接关联。不过不同操作系统下,FreePascal对未初始化局部变量的内存填充值可能存在差异:某些系统中垃圾值可能刚好不会触发明显崩溃,但Mac下的垃圾值直接导致了数组越界。但核心问题始终是未初始化变量,和操作系统无关。
内容的提问来源于stack exchange,提问作者Don Nguyen
相关产品推荐
相关产品推荐

