2010-02-13 61 views
1

我遇到了向量問題(在使用push_back時),但它只在使用其他g ++標誌-O2(我需要它)時纔出現。Vector(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 2010-02-13 17:16:58

回答

4

我認爲你必須:

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

以相反的順序。就目前而言,用於調整圖形大小的變量「n」未被初始化。

+0

對,我沒有注意到:) 謝謝 – user85423 2010-02-13 17:21:08

3

初始化與n矢量輸入操作意味着你調用可怕的未定義行爲之前。如here所述,該程序被允許在此之後做任何事情。

+0

心不是n的行初始化:C = scanf函數( 「%I%I」,&N,&k); 如果沒有,我應該怎麼做,在這種情況下 感謝您的幫助:) – user85423 2010-02-13 17:20:20

+0

@ user85423:??是的,這是(假設scanf成功),但是你在*之前使用n *。所以我想sbi應該說「在你使用它之前不要初始化'n」而不是「你永遠不會」。 – sepp2k 2010-02-13 17:23:00

+0

@ sepp2k:我解決了這個問題,同時你添加了你的評論。我只是沒有閱讀代碼進一步比使用未初始化的變量... – sbi 2010-02-14 22:16:11

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());