gpt4 book ai didi

c++ - 将 vector 插入 vector> 时出现堆溢出错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:46 25 4
gpt4 key购买 nike

代码应该计算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 中只有两个条目,这种访问超出了 vector 的范围,导致未定义的行为(您的崩溃)。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com