C++ malloc():内存损坏
C++ malloc(): memory corruption
我目前正在 hackerrank 上做一道斐波那契练习题,并且遇到 malloc 内存损坏错误。这是我正在做的问题的link:
https://www.hackerrank.com/contests/programming-interview-questions/challenges/fibonacci-returns/
输入0-10,每个数字用新行隔开。
对于每个输入,打印序列中该点的值。它适用于小输入,但在 6 之后会出现 malloc 错误。序列的大小似乎也不是问题,只是连续完成了多少。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
vector<int> bigFib(1);
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int x;
while(cin >> x){
if(bigFib.size()-1 >= x){
cout << bigFib[x] << endl;
}
else{
vector<int> fib(x);
fib[0] = 0;
fib[1] = 1;
for(int j = 2; j <= x; j++){
fib[j] = fib[j-1] + fib[j-2];
}
bigFib = fib;
cout << fib[x] << endl;
}
}
return 0;
}
我是 C++ 的新手,找不到问题所在。谢谢你的时间。
当您创建大小为 N 的 std::vector
时,您可以访问索引为 [0, N-1] 的元素 - 即 N 个元素。您创建大小为 x
的向量,并在循环中:
for(int j = 2; j <= x; j++){
fib[j] = fib[j-1] + fib[j-2];
}
并在此声明中
cout << fib[x] << endl;
您尝试访问索引等于 x
的元素,即 UB。如果您确实需要访问索引 x
,请创建大小至少为 x+1
的向量
在 vector<int> fib(x);
中,您声明了一个包含 x
个元素的 vector<int>
。这些元素是 fib[0]
到 fib[x - 1]
。但是,在 for(int j = 2; j <= x; j++){ fib[j] = ...
中,您分配给一个超出范围的元素。
想象一下,如果 x
是 1,那么您希望 fib
向量只包含一个元素:fib[0]
...但是您的循环正在分配给 fib[1]
.问题?是的
我估计 for(int j = 2; j <= x; j++){
应该是 for(int j = 2; j < x; j++){
...
... cout << fib[x] << endl;
应该是 cout << fib[x - 1] << endl;
我目前正在 hackerrank 上做一道斐波那契练习题,并且遇到 malloc 内存损坏错误。这是我正在做的问题的link:
https://www.hackerrank.com/contests/programming-interview-questions/challenges/fibonacci-returns/
输入0-10,每个数字用新行隔开。 对于每个输入,打印序列中该点的值。它适用于小输入,但在 6 之后会出现 malloc 错误。序列的大小似乎也不是问题,只是连续完成了多少。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
vector<int> bigFib(1);
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int x;
while(cin >> x){
if(bigFib.size()-1 >= x){
cout << bigFib[x] << endl;
}
else{
vector<int> fib(x);
fib[0] = 0;
fib[1] = 1;
for(int j = 2; j <= x; j++){
fib[j] = fib[j-1] + fib[j-2];
}
bigFib = fib;
cout << fib[x] << endl;
}
}
return 0;
}
我是 C++ 的新手,找不到问题所在。谢谢你的时间。
当您创建大小为 N 的 std::vector
时,您可以访问索引为 [0, N-1] 的元素 - 即 N 个元素。您创建大小为 x
的向量,并在循环中:
for(int j = 2; j <= x; j++){
fib[j] = fib[j-1] + fib[j-2];
}
并在此声明中
cout << fib[x] << endl;
您尝试访问索引等于 x
的元素,即 UB。如果您确实需要访问索引 x
,请创建大小至少为 x+1
的向量
在 vector<int> fib(x);
中,您声明了一个包含 x
个元素的 vector<int>
。这些元素是 fib[0]
到 fib[x - 1]
。但是,在 for(int j = 2; j <= x; j++){ fib[j] = ...
中,您分配给一个超出范围的元素。
想象一下,如果 x
是 1,那么您希望 fib
向量只包含一个元素:fib[0]
...但是您的循环正在分配给 fib[1]
.问题?是的
我估计 for(int j = 2; j <= x; j++){
应该是 for(int j = 2; j < x; j++){
...
... cout << fib[x] << endl;
应该是 cout << fib[x - 1] << endl;