将vector <int>推入vector <vector <int >>时发生堆溢出错误

时间:2019-06-11 00:33:45

标签: c++ algorithm

该代码应计算pascal's triangle。 像

   1

 1   1

1    2   1 

1  3   3   1
    ...

但是,当我运行代码时,它向我显示了堆溢出错误:

AddressSanitizer: heap-buffer-overflow on address 0x604000000040 at pc 0x00000040634d bp 0x7fff26a50360 sp 0x7fff26a50358

我的代码是

vector<vector<int>> generate(int numRows) {
    vector<vector<int>> triangle;
    if(numRows == 0)    return triangle;

    for(int i = 1; i <= numRows; i++) {
        vector<int> ithRow(i, 1);  //ith Row should have i numbers
        for(int j = 1; j < i - 1; j++) { //numbers other than first and last are calculated using two values from previous row
            ithRow.push_back(triangle[i - 1][j - 1] + triangle[i - 1][j]);
        }
        triangle.push_back(ithRow);
    }
    return triangle;
}

当我没有创建新变量来保存新行时,它可以工作。

public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> triangle;

        for(int i = 0; i < numRows; i++) {
            triangle.push_back(vector<int>(i+1,1));            
            for(auto j = 1; j < i; j++) {
                triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
            }
        }
        return triangle;
    }
};

有人可以帮我这段代码吗?

1 个答案:

答案 0 :(得分:3)

最早的代码到达内部j循环的主体是i == 3。那时,您已将两行推入triangle中(一行在i == 1时,另一行在i == 2时)。然后,您尝试访问triangle[i - 1][j - 1],这将尝试访问triangle[2]。由于向量中只有两个条目,因此这种访问超出了向量的范围,从而导致行为未定义(崩溃)。

由于vector[i - 1]是在ithRow中构造的,因此只需使用该变量即可。由于您已经向push_back添加了i个元素,因此不需要ithRow