2017-02-16 4 views
-4

Ich bin derzeit durch ein Fibonacci-Praxis-Problem auf hackerrank und habe einen Malloc-Speicher Korruption Fehler. Dies ist der Link zu dem Problem, das ich tue:C++ malloc(): Speicher Korruption

https://www.hackerrank.com/contests/programming-interview-questions/challenges/fibonacci-returns/

Eingang 0-10, jede Nummer durch eine neue Zeile getrennt. Für jeden Eingang wird der Wert an diesem Punkt in der Sequenz gedruckt. Es funktioniert für kleine Eingaben, aber nach 6 erhält es den malloc Fehler. Es scheint auch nicht, dass die Größe der Sequenz ein Problem ist, sondern wie viele nacheinander ausgeführt werden.

#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; 
} 

Ich bin ziemlich neu in C++ und kann das Problem nicht finden. Vielen Dank für Ihre Zeit.

+0

Du bist wahrscheinlich zu Erinnerung sein sollten schriftlich sein soll, die von Ihren Grenzen ist. –

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

'vector fib (x)' allokiert einen Vektor von 'x' Elementen indexiert' 0..x-1'. Ihre Bedingung für die Schleifenbeendigung ist 'j <= x ', was bedeutet, dass Sie einmal versuchen werden,' fib [x] ' –

Antwort

1

Wenn Sie std::vector der Größe N erstellen, können Sie auf Elemente mit dem Index [0, N-1] zugreifen - das sind N Elemente. Sie erstellen Vektor der Größe x und in der Schleife:

for(int j = 2; j <= x; j++){ 
    fib[j] = fib[j-1] + fib[j-2]; 
    } 

und in dieser Aussage

cout << fib[x] << endl; 

Sie versuchen, Element für den Zugriff mit dem Index gleich x, die UB ist. Wenn Sie tun müssen, um Index x Zugriff erstellen Vektor mit mindestens x+1 Größe

0

In vector<int> fib(x); erklären Sie ein vector<int> die x Elemente. Diese Elemente sind fib[0] bis fib[x - 1]. In for(int j = 2; j <= x; j++){ fib[j] = ... weisen Sie jedoch einem Element außerhalb der Grenzen zu.

Stellen Sie sich vor, wenn x 1 ist, dann würden Sie Ihren fib Vektor erwarten nur ein Element enthalten: fib[0] ... noch Ihre Schleife fib[1] zuweist. Problem? Jep.

Ich rechne for(int j = 2; j <= x; j++){ wahrscheinlich for(int j = 2; j < x; j++){ ...

... und cout << fib[x] << endl;cout << fib[x - 1] << endl;