[英]Vector (push_back); g++ -O2; Segmentation fault
我在使用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;
}
我认为您有:
graph g(n, node());
c = scanf("%i%i", &n, &k);
以相反的顺序。 就目前而言,用于对图形进行大小调整的变量“ n”未初始化。
在输入操作之前使用n
初始化向量意味着您正在调用可怕的未定义行为。 如前所述这里 ,该程序允许后做的事情。
如果您按我在评论中已经提到过的那样初始化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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.