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

C++跑马棋项目报Run-Time Check Failure #2 变量board周围栈损坏

错误原因分析

这个报错是典型的栈缓冲区越界写入,你声明的board数组是栈上的局部变量,程序写入了超出board数组边界的内存地址,破坏了栈上的额外数据,因此运行时检测触发了该报错。

核心触发点

问题出在updatingBoard函数的逻辑:

void updatingBoard(char board[50][50], char name[], int pos[], int n, int size) {
    init_board(board, size);
    for (int k = 0; k < n; k++)
    {
        int x, i, j;
        x = pos[k];
        i = x / size;
        j = x % size;
        board[i][j] = name[k];
    }
}

玩家初始位置pos[k] = -1,被踢回起点后pos[k]也会被设为-1,代码没有对x >= 0做判断,直接用负数计算数组下标。当x为负数时,计算得到的i或j会是非法的负数下标,写入board[i][j]就会访问board数组之外的栈内存,直接破坏栈结构。

其他潜在越界风险

  • 你定义的char board[50][50]最大仅支持50x50的棋盘,若输入的size > 50,棋盘初始化、渲染、更新逻辑都会出现数组越界
  • char name[10]最多只能存10个玩家的标识,若输入的玩家数量n > 10,enteringPlayerName函数写入时会越界
  • int pos[200]最多支持200个玩家,若n > 200也会触发越界
  • 目前name数组的每个元素是单个char类型,若玩家输入长度超过1的名字,也会导致name数组越界
修复方案

首先修复updatingBoard的越界问题,增加下标合法性判断:

void updatingBoard(char board[50][50], char name[], int pos[], int n, int size) {
    init_board(board, size);
    for (int k = 0; k < n; k++)
    {
        int x = pos[k];
        // 只有位置合法的时候才更新棋盘
        if (x >= 0 && x < size * size) {
            int i = x / size;
            int j = x % size;
            board[i][j] = name[k];
        }
    }
}

如果要彻底避免所有越界风险,还可以在main函数读取size和n之后增加输入校验:

cin >> size;
cin >> n;
// 增加输入合法性校验
if (size > 50 || size < 2) {
    cout << "棋盘边长只能在2~50之间" << endl;
    return 1;
}
if (n > 10 || n < 2) {
    cout << "玩家数量只能在2~10之间" << endl;
    return 1;
}

内容的提问来源于stack exchange,提问作者Thanh Phương

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:15:09