越界异常,因为 for 循环不会移动到下一个循环/索引

时间:2021-01-12 00:21:39

标签: c++ for-loop indexoutofboundsexception

我正在做 leetcode 问题 289. 生命游戏 在运行我粘贴在下面的代码时,出现以下错误

第 1034 行:字符 34:运行时错误:将无符号偏移添加到 0x608000000020 溢出到 0x608000000008 (stl_vector.h) 总结:UndefinedBehaviorSanitizer:undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h :1043:34

我尝试使用打印语句来了解似乎是 for 循环适用于索引 [0][0] 并且不会移动到下一个索引的问题。我也粘贴了下面的打印语句。如果有人可以帮助我将非常感谢

0 代表循环 i 0 代表循环 j 0输入行 0行 1col 1个 0输入行 1排 0 列 1个 0输入行 -1行 0col

class Solution {
public:
    
    int countLives(vector<vector<int>>& board, int & i, int &j)
    {
        int count=0;
        vector<vector<int>> directions={{0,1},{1,0},{-1,0},{0,-1},{-1,-1},{1,1},                {-1,1},{1,-1}};
        for(int k=0;k<directions.size();k++)
        {
                int r=(i+directions[k][0]);
            cout<<i<<"input row"<<endl;
            cout<<r<<"row"<<endl;
                int c=j+directions[k][1];
            cout<<c<<"col"<<endl;
                if(r>=0 && r<board.size() && c>=0 && c<board[0].size() && board[r][c]==1|| board[r][c]==2) 
                    count++;
            cout<<count<<"count"<<endl;
            

        }
            
        return count;
    };
    
    void gameOfLife(vector<vector<int>>& board) {
        if(board.size()==0)
            return;
        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                cout<<i<<" for loop i "<<j<<" for loop j"<<endl; 
                
                int count=countLives(board,i,j);
                if(board[i][j]==1 && count<2 || count>3)
                   board[i][j]=2;
                if(board[i][j]==0 && count==3)
                    board[i][j]=3;
            }
        }
        cout<<"done counting"<<endl;
          for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                if(board[i][j]==3)
                    board[i][j]=1;
                if(board[i][j]==2)
                    board[i][j]=0;
            }}
        
        
    }
};

1 个答案:

答案 0 :(得分:2)

if(r>=0 && r<board.size() && c>=0 && c<board[0].size() && board[r][c]==1|| board[r][c]==2) 

&& 运算符的优先级高于 ||,参见 https://en.cppreference.com/w/cpp/language/operator_precedence,因此解析为

if( (r>=0 && ... && board[r][c]==1) || board[r][c]==2) 

因此,例如,如果 r 为负,则 || 的左侧操作数将为假,然后程序将评估右侧操作数 board[r][c]==2,即当然无效,因为 r 是负数。

你可能是说

if(r>=0 && r<board.size() && c>=0 && c<board[0].size() && (board[r][c]==1 || board[r][c]==2)) 

并且您可能还想将其分成几行,以便更具可读性。这可能使错误更容易被发现。

作为一般规则,每当在表达式中混合 &&|| 时,始终使用显式括号而不是依赖运算符优先级。 (阅读你的代码的人可能会发现优先级也很难记住。)

有一个类似的错误

if(board[i][j]==1 && count<2 || count>3)