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