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
相关产品推荐
相关产品推荐

