为啥我不能在这种情况下使用 push_back? [复制]
Posted
技术标签:
【中文标题】为啥我不能在这种情况下使用 push_back? [复制]【英文标题】:Why can't I use push_back in this scenario? [duplicate]为什么我不能在这种情况下使用 push_back? [复制] 【发布时间】:2019-08-06 04:06:32 【问题描述】:我认为我在代码中所做的事情是合法的,但它显示了运行时错误。为什么?
int main()
int q;
cin>>q;
while(q--)
int n, start;
vector<int> adj[n];
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
int x;
cin>>x;
//if(x==1) start = i;
adj[i].push_back(x);
//code
return 0;
运行时错误: 来自 abort(3) (SIGABRT) 的运行时错误中止信号
【问题讨论】:
首先,数组在 C++ 中必须具有恒定大小。其次,n
没有在任何地方初始化。
你创建了一个没有值的变量n
,然后尝试创建一个数组。超级未定义的行为
部分原因是your code is ill-formed.
编译时应使用最高警告级别。 gcc 警告warning: ‘n’ may be used uninitialized in this function [-Wmaybe-uninitialized]
【参考方案1】:
这不是有效的 c++ 代码:
vector<int> adj[n];
它可能适用于 gcc 和其他一些编译器,因为它们可能具有 c99 样式数组的扩展名。 如果您打开编译器警告,您可以检测到这些警告。 Live
正如@Prakasht 在他们的回答中指出的那样,代码中还有未初始化的变量n
。使用n
是一种未定义的行为,任何事情都可能发生。
【讨论】:
感谢您指出这一点!【参考方案2】:那是因为你没有初始化n
。在声明你的向量之前初始化n
。类似n=10
或cin>>n
。
【讨论】:
虽然我同意这是问题的一部分,但这不是唯一的问题。 正确!在我开始的日子里,我曾经写过这样的代码。:p 也许我应该更清楚。请看我对原帖的评论。它将解释另一个主要问题。 谢谢@Chipster。我还发现了一篇不错的文章here。学习新事物很棒! @TamalMaity 否。这个问题将来可能对其他人有所帮助。以上是关于为啥我不能在这种情况下使用 push_back? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在这种重载解析情况下编译器不能告诉更好的转换目标? (协方差)
为啥我不能直接从向量中的函数 push_back 更新值? [关闭]