该代码应计算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;
}
};
有人可以帮我这段代码吗?
答案 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
。