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;