C++实现生命游戏触发std::vector空指针运行时错误求助
错误原因分析
- 核心报错原因:你声明的
newBoard是未初始化尺寸的空二维向量,没有提前分配和输入board完全匹配的行列空间,直接通过newBoard[i][j]进行下标访问赋值属于越界访问,触发了未定义行为,对应你收到的空指针绑定报错。 - 逻辑缺陷:原代码的else分支逻辑不符合生命游戏规则,死细胞在邻居数不等于3的情况下应该保持死亡状态,直接赋值为1会导致计算结果完全错误。
- 需求遗漏:题目要求修改输入的引用参数
board,原代码仅打印新棋盘没有回写,最终输出不满足题目要求。 - 潜在风险:如果你的
neibSum函数没有处理棋盘边界的下标越界判断,也可能额外触发访问越界错误,需要确保计算邻居数时只访问合法的下标区间。
修复方案
首先初始化newBoard的尺寸和初始值与原board一致,再修正状态判断逻辑,最后将计算完成的新棋盘回写到原输入参数中即可。
修正后代码
void gameOfLife(vector<vector<int>>& board) { // 处理边界输入 if (board.empty() || board[0].empty()) return; int m = board.size(), n = board[0].size(); // 初始化新棋盘尺寸和原棋盘一致,初始值全0 vector<vector<int>> newBoard(m, vector<int>(n, 0)); for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ int cnt = neibSum(board, i, j); if(board[i][j] == 1){ // 活细胞规则:邻居数2~3则存活,否则死亡 newBoard[i][j] = (cnt >=2 && cnt <=3) ? 1 : 0; }else{ // 死细胞规则:邻居数等于3则复活,否则保持死亡 newBoard[i][j] = (cnt == 3) ? 1 : 0; } } } // 回写结果到原输入变量 board = move(newBoard); // 按需保留打印逻辑 for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ cout << board[i][j] << " "; } cout << endl; } }
内容的提问来源于stack exchange,提问作者Karanbir Singh
相关产品推荐
相关产品推荐

