2010-02-13 5 views
1

벡터에 문제가 있습니다 (push_back 사용시)하지만 추가 g ++ 플래그 -O2 (필요할 경우)를 사용할 때만 나타납니다. 입력 동작은 당신이 지칠대로 지친 정의되지 않은 동작을 호출하고 의미 전에벡터 (push_back); g ++ -O2; 분할 오류

#include <cstdio> 
#include <vector> 

typedef std::vector<int> node; 
typedef std::vector<node> graph; 

int main() 
{ 
    int n, k, a, b, sum; 
    bool c; 
    graph g(n, node()); 
    c = scanf("%i%i", &n, &k); 

    for(int i=0; i<n; i++) 
    { 
     sum=2; 
     for(int j=0; j<i; j++) 
      sum*=2; 
     for(int j=0; j<sum; j++) 
     { 
      if(j%2==0) 
       c = scanf("%i", &a); 
      else 
      { 

       c = scanf("%i", &b); 
       a += b; 
       g[i].push_back(a); //---------------LINE WHICH CAUSES SEGMENTATION FAULT 
      } 

     } 
    } 

    for(int i=n-2; i>=0; i--) 
    { 
     for(size_t j=0; j<g[i].size(); j++) 
     { 
      if(g[i+1][(j*2)] >= g[i+1][(j*2)+1]) 
       g[i][j] = g[i+1][j*2]; 
      else 
       g[i][j] = g[i+1][(j*2)+1]; 
     } 
    } 

    printf("%i\n", g[0][0]); 

    return 0; 
} 
+6

왜 'n'을 초기화하지 않았습니까? – AndiDog

답변

4

나는 당신이 생각 :

graph g(n, node()); 
c = scanf("%i%i", &n, &k); 

를 역순으로. 그래프 크기를 지정하기 위해 사용하는 변수 'n'은 초기화되지 않습니다.

+0

오른쪽, 나는 통지를하지 않았다 :) 감사합니다 Logged – user85423

3

n와 벡터를 초기화. here에 명시된 바와 같이, 프로그램은 그 이후에 아무 것도 할 수 없습니다.

+0

밤은 N 라인에서 초기화 : &k); 하지 않으면 C =는 scanf ("% i 서 % 내가", N, I는이 경우에 그것을 할 방법을 도움을 감사합니다 :) – user85423

+0

user85423 @ : 예,이 (scanf가 성공했다고 가정),하지만 당신은 그것을하기 전에 n *을 사용합니다. 그래서 sbi는 "너는 결코 너 대신에"네가 사용하기 전에 "n"을 초기화하지 말았어야했다고 생각해. – sepp2k

+0

@ sepp2k : 댓글을 추가하는 동안 수정했습니다. 난 그냥 초기화되지 않은 변수의 사용보다 더 코드를 읽지 않았다 ... – sbi

2

내 의견에 이미 언급 한대로 n을 초기화하면 완벽하게 작동합니다. 첫 번째 줄을 다음과 같이 변경하십시오 :

int n, k, a, b, sum; 
int c; 
c = scanf("%i%i", &n, &k); // initialize n *first* 
if(c != 2) return -1; // scanf does not return bool but the number of parsed arguments 
graph g(n, node());