为啥我不能在这种情况下使用 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=10cin&gt;&gt;n

【讨论】:

虽然我同意这是问题的一部分,但这不是唯一的问题。 正确!在我开始的日子里,我曾经写过这样的代码。:p 也许我应该更清楚。请看我对原帖的评论。它将解释另一个主要问题。 谢谢@Chipster。我还发现了一篇不错的文章here。学习新事物很棒! @TamalMaity 否。这个问题将来可能对其他人有所帮助。

以上是关于为啥我不能在这种情况下使用 push_back? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在 2D 向量中 push_back? C++

为啥在这种重载解析情况下编译器不能告诉更好的转换目标? (协方差)

为啥我不能直接从向量中的函数 push_back 更新值? [关闭]

为啥在这种情况下需要使用 *this 返回对象引用? [复制]

为啥使用?在这种情况下不工作? (迅速)

为啥向量总是比 C 数组慢,至少在这种情况下?