【问题标题】:Runtime error: Reference binding to null pointer of type 'std::vector<int, std::allocator<int>>' (stl_vector.h)运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)
【发布时间】:2021-09-09 05:12:36
【问题描述】:
 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int row = obstacleGrid.size();
        int col = obstacleGrid[0].size();
       
        if(obstacleGrid[0][0] == 1){
            return 0;
        }
        
        if(row = 1 && col == 1){
            return 1;
        }
        
        vector<vector<int>> dp(row, vector<int>(col, 0));
        bool flag = false;
        if(col > 1){
            for(int i = 0; i < col; i++){     
                if(flag == true || obstacleGrid[0][i] == 1){
                    flag = true;
                    dp[0][i] = 0;
                }else{
                    dp[0][i] = 1;
                }
            }
            if(row == 1){
                return dp[0][col - 1];
            }
        }
        
        flag = false;
        
        if(row > 1){    
            for(int j = 1; j < row; j++){
                if(flag == true || obstacleGrid[j][0] == 1){
                    flag == true;
                    dp[j][0];
                }else{
                    dp[j][0] = 1;
                }
            }
            if(col == 1){
                return dp[row - 1][0];
            }
        }
        //fill the rest

        for(int i = 1; i < row; i++){
            for(int j = 1; j < col; j++){
                if(obstacleGrid[i][j] == 1){
                    dp[i][j] = 0;
                }else{
                    dp[i][j] = (dp[i-1][j] + dp[i][j-1]);
                }
            }
        }
        return dp[row - 1][col - 1];
    }

Testcase
Run Code Result
Debugger
Runtime Error
Line 1034: Char 9: runtime error: reference binding to null pointer of type 'std::vector<int, std::allocator<int>>' (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:9

作为参考,这是关于 leetcode (Unique Paths II) 的问题 58。我设法将错误的来源缩小到这部分代码

         if(col > 1){
            for(int i = 0; i < col; i++){
                if(flag == true || obstacleGrid[0][i] == 1){
                    flag = true;
                    dp[0][i] = 0;
                }else{
                    dp[0][i] = 1;
                }
                
            }
            if(row == 1){
                return dp[0][col - 1];
            }
         }

奇怪的是,它在 VSCode 的 WSL 调试器上正常工作,使用参数 {{0,0,0}, {0,1,0}, {0,0,0}} 它返回“2”,如预期的那样。此外,直到我输入条件 (col &gt; 1)(row &gt; 1) 以避免分别只有 1 列或 1 行的极端情况的缓冲区溢出,它才出现此问题。

【问题讨论】:

  • 我认为你错过了,处理row == 0col == 0 案件,最后你有dp[row - 1][col - 1]
  • 从它看起来的约束来看,m 和 n(行,列)必须至少为 1。无论如何,当行或列之一的值为 1 但如果两者都大于 1 时,它可以工作它会触发错误。

标签: c++ vector


【解决方案1】:

改正错别字,效果很好。

int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
    int row = obstacleGrid.size();
    int col = obstacleGrid[0].size();
       
    if(obstacleGrid[0][0] == 1){
        return 0;
    }
        
    if(row == 1 && col == 1){ // First typo. row == 1 instead of row = 1
        return 1;
    }
        
    vector<vector<int>> dp(row, vector<int>(col, 0));
    bool flag = false;
    if(col > 1){
        for(int i = 0; i < col; i++){     
            if(flag == true || obstacleGrid[0][i] == 1){
                flag = true;
                dp[0][i] = 0;
            }else{
                dp[0][i] = 1;
            }
        }
        if(row == 1){
            return dp[0][col - 1];
        }
    }
    
    flag = false;
        
    if(row > 1){    
        for(int j = 1; j < row; j++){
            if(flag == true || obstacleGrid[j][0] == 1){
                flag = true; //second one. flag = true instead of flag == true
                dp[j][0] = 0; //third. no value assigned.
            }else{
                dp[j][0] = 1;
            }
        }
        if(col == 1){
            return dp[row - 1][0];
        }
    }
    //fill the rest

    for(int i = 1; i < row; i++){
        for(int j = 1; j < col; j++){
            if(obstacleGrid[i][j] == 1){
                dp[i][j] = 0;
            }else{
                dp[i][j] = (dp[i-1][j] + dp[i][j-1]);
            }
        }
    }
    return dp[row - 1][col - 1];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2021-04-30
    • 2022-08-20
    • 2022-06-03
    • 2020-07-01
    相关资源
    最近更新 更多