【问题标题】: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]

标签: c++


【解决方案1】:

这不是有效的 c++ 代码:

vector<int> adj[n];

它可能适用于 gcc 和其他一些编译器,因为它们可能具有 c99 样式数组的扩展名。 如果您打开编译器警告,您可以检测到这些警告。 Live

正如@Prakasht 在他们的回答中指出的那样,代码中还有未初始化的变量n。使用n 是一种未定义的行为,任何事情都可能发生。

【讨论】:

  • 感谢您指出这一点!
【解决方案2】:

那是因为你没有初始化n。在声明你的向量之前初始化n。类似n=10cin&gt;&gt;n

【讨论】:

  • 虽然我同意这是问题的一部分,但这不是唯一的问题。
  • 正确!在我开始的日子里,我曾经写过这样的代码。:p
  • 也许我应该更清楚。请看我对原帖的评论。它将解释另一个主要问题。
  • 谢谢@Chipster。我还发现了一篇不错的文章here。学习新事物很棒!
  • @TamalMaity 否。这个问题将来可能对其他人有所帮助。
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2021-06-19
  • 1970-01-01
  • 2018-08-28
  • 2019-12-25
相关资源
最近更新 更多