2017-02-16 132 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

'vector 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; 

你嘗試用指數等於x,這是UB訪問元素。如果你確實需要訪問索引x創建矢量至少x+1大小

0

vector<int> fib(x);你聲明vector<int>x元素。這些元素是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;