2017-02-16 8 views
-4

現在、hackerrankでフィボナッチ練習問題が発生しており、mallocメモリ破損エラーが発生しています。これは私がやっている問題へのリンクです:C++ malloc():メモリ破損

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++にはかなり新しいですし、問題を見つけることができません。御時間ありがとうございます。

+0

する必要があります数えます。 –

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

'ベクトル fib(x)'は '0..x-1'でインデックス付けされた' x'要素のベクトルを割り当てます。あなたのループ終了条件は 'j <= x'です。これは、' fib [x] 'をしようとすると –

答えて

1

サイズ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; 

あなたはUBであるxに等しい指数、と要素にアクセスしてみてください。あなたがアクセスする必要がない場合は、インデックスxはあなたがx要素を持っているvector<int>宣言少なくともx+1サイズvector<int> fib(x);

0

でベクトルを作成します。これらの要素は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;