2010-02-13 59 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());