You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:50:30