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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:15:02