代码应该计算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;
    }
};

有人能帮我处理这段代码吗?

最佳答案

最早到达内部循环主体的代码是当j时。在这一点上,您已经将两行放入i == 3(一行在triangle时,另一行在i == 1时)。然后尝试访问i == 2,这将尝试访问triangle[i - 1][j - 1]。由于向量中只有两个条目,因此此访问超出了向量的边界,从而导致未定义的行为(您的崩溃)。
因为triangle[2]是在vector[i - 1]中构造的,所以只需使用该变量即可。您不需要ithRow,因为您已经向push_back添加了i元素。

关于c++ - 将vector <int>插入vector <vector <int >>时发生堆溢出错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56535011/

10-12 18:20