C++数独生成器出现Run-Time Check Failure #2错误求助
数独生成代码栈内存损坏问题解决
编写了一段C++数独表格生成代码,遇到无法填充的情况时会重置表格并重试,但运行时触发栈内存损坏错误,错误信息如下:
Debug Error!
Program: E:\Sudoku.exe
Module: E:\Sudoku.exe
Run-Time Check Failure #2 - Stack around the variable 'Table' was corrupted.
(Press Retry to debug the application)
原代码如下:
int TableGenerator() { int Table[9][9] = { {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}, }; srand(time(nullptr)); list<int> AvailableNumbers; int ySquare; int xSquare; int y = 0; int x; while (y < 9) { AvailableNumbers = { 1,2,3,4,5,6,7,8,9 }; x = 0; while (x < 9) { list<int> ColumnAvailableNumbers = AvailableNumbers; ySquare = y - (y % 3); xSquare = x - (x % 3); for (int yCoSquare = ySquare; yCoSquare < ySquare + 3; yCoSquare++) { for (int xCoSquare = xSquare; xCoSquare < xSquare + 3; xCoSquare++) { ColumnAvailableNumbers.remove(Table[yCoSquare][xCoSquare]); } } for (int Checker = 0; Checker < y; Checker++) { ColumnAvailableNumbers.remove(Table[Checker][x]); } if (ColumnAvailableNumbers.size() > 0) { auto it = next(ColumnAvailableNumbers.begin(), rand() % ColumnAvailableNumbers.size()); Table[y][x] = *it; AvailableNumbers.remove(*it); } else { for (int yClear = 0; yClear < 9; yClear++) { for (int xClear = 0; xClear < 9; xClear++) { Table[yClear][xClear] = 0; } } y = -1; } x++; } y++; } for (int y = 0; y < 9; y++) { for (int x = 0; x < 9; x++) { std::cout << Table[y][x]; } cout << endl; } return 0; }
错误原因
当代码进入填充失败的分支(ColumnAvailableNumbers.size() == 0)时,仅设置了y = -1,但内层的x循环并未终止,x会继续递增并执行后续循环逻辑。此时y的值为-1,后续代码中访问Table[y][x](即Table[-1][x])属于数组越界访问,直接破坏了栈内存中Table变量周围的数据,触发栈损坏检测错误。
解决方案
在填充失败的分支中,设置y = -1后,立即添加break;语句终止内层x循环,避免后续越界访问:
修改后的关键代码片段:
else { for (int yClear = 0; yClear < 9; yClear++) { for (int xClear = 0; xClear < 9; xClear++) { Table[yClear][xClear] = 0; } } y = -1; break; // 终止内层x循环,避免越界访问 }
修改后逻辑说明
添加break;后,当填充失败时,会立即退出内层x循环,外层循环执行y++后,y的值变为0,重新开始整个数独表格的生成流程,此时x会被重新初始化为0,不会出现越界访问Table[-1][x]的情况,彻底解决栈内存损坏问题。
内容的提问来源于stack exchange,提问作者Elyar
相关产品推荐
相关产品推荐

