程序执行至player[aplyr].grid[X][Y] = isSHIP;时崩溃的技术求助
程序执行
player[aplyr].grid[X][Y] = isSHIP;时崩溃的问题分析 我最近碰到个头疼的问题:程序运行到player[aplyr].grid[X][Y] = isSHIP;这句代码时直接崩溃了,相关的代码片段如下:
const char isSHIP = 'S'; struct PLAYER{ char grid[10][10]; }player[3]; //玩家1和2,忽略玩家0 int main () { int X; int Y; //"放置战舰"游戏阶段 //遍历每位玩家... for (int aplyr=1; aplyr<3; ++aplyr) { //遍历每种待放置的战舰类型 for (int thisShip=0; thisShip<15; ++thisShip) { //获取用户输入 PlaceShips(); //将首个网格点添加至当前玩家的游戏棋盘 player[aplyr].grid[X][Y] = isSHIP; } } }
可能的崩溃原因排查方向
从现有代码来看,最容易触发崩溃的几个点:
- X/Y下标越界:
grid是10×10的二维数组,合法下标范围是0到9。如果PlaceShips()没有限制用户输入的坐标范围,比如输入了负数或≥10的数值,就会触发数组越界访问,直接导致内存错误崩溃。 - X/Y未正确赋值:如果
PlaceShips()函数没有把用户输入的坐标正确传递给main里的X、Y变量(比如参数传递错误,或者函数内部定义了同名局部变量覆盖外部变量),X、Y会是随机垃圾值,大概率超出合法范围,访问非法内存。 - player数组被意外篡改:虽然全局的
player数组会被默认初始化,但如果其他代码存在越界写入的情况,破坏了player的内存结构,也会导致访问时崩溃。
快速排查建议
- 在赋值语句前加调试输出,确认当前变量的合法性:
printf("当前玩家:%d,坐标X:%d,Y:%d\n", aplyr, X, Y); - 给坐标添加合法性校验,避免非法访问:
if (X < 0 || X >= 10 || Y <0 || Y >=10) { printf("坐标非法!X=%d, Y=%d\n", X, Y); // 这里可以添加重新获取输入的逻辑 continue; } - 检查
PlaceShips()的实现,确保它正确把用户输入赋值给main中的X、Y变量,没有参数传递或变量覆盖的问题。
内容的提问来源于stack exchange,提问作者Monxstar
相关产品推荐
相关产品推荐

