2017-02-16 1 views
-4

현재 hackerrank에서 fibonacci 연습 문제를 겪고 있으며 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

... 그리고 cout << fib[x] << endl;이 있어야 할 ... for(int j = 2; j <= x; j++){ 아마 for(int j = 2; j < x; j++){해야한다 생각한다. –

+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 동일 인덱스로 요소에 액세스하려고합니다. 사용자가 액세스해야하는 경우 인덱스 xx 요소가있는 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]에 할당된다. 문제? 예.

나는 당신은 아마 당신의 범위를 벗어났습니다 메모리에 쓰고있어 cout << fib[x - 1] << endl;