全局向量在 C++ 程序结束时导致段错误
Posted
技术标签:
【中文标题】全局向量在 C++ 程序结束时导致段错误【英文标题】:Global vector causing a segfault at end of c++ program 【发布时间】:2020-06-18 23:30:45 【问题描述】:该程序在最后打印出“再见”,然后出现段错误。我不知道为什么。我认为这可能与全局向量有关?我玩过它,发现如果我去掉 cout
int n, p, k;
vector<vector<int>> plates;
int main()
int T;
cin >> T;
for (int t = 1; t != 1 + T; ++t)
cin >> n >> k >> p;
plates.resize(n + 1, vector<int>(k + 1, 0));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= k; ++j)
cin >> plates[i][j];
cout << i << "," << j << "\t";
cout << endl;
cout << "bye" << endl;
【问题讨论】:
为什么首先要有一个全局的vector
?
你可能超出了你的向量范围。
n,p,k,T都不是很大,最多30个。 -- 那你应该把这些值直接放到变量里面,不要用@ 987654323@。我们不知道您的代码真正输入了什么。我们所拥有的只是您的承诺,而在从某个地方获取意见时,承诺很多时候都没有兑现。
我使用一个全局的所以我不必传入参数。这是针对时间=更多积分的编码竞赛。 @drescherjm
改用参考参数。全局变量应保持在最低限度。当你的代码是成千上万的 c++ 源代码行并且你需要调试时,你会感谢自己没有使用全局变量。
【参考方案1】:
plates.resize(n + 1, vector<int>(k + 1, 0));
resize()
并没有按照你的想法去做。 resize()
确实不将调整大小的向量中的每个值设置为第二个参数,在这里。只有向量中的 新 值(如果增长)被设置为此值。
因此,如果第一次通过外循环向量是 2 行乘 2 列,第二次通过外循环将尺寸指定为 50x50,这将向 plates
添加 48 个值,这每个值都是一个包含 50 个值的向量。
但plates
向量中的前两个值保持不变,其中包含它们原来的二值向量。
解决方案似乎很明显:在此resize()
之前添加plates.clear()
。
【讨论】:
谢谢!这就解释了。以上是关于全局向量在 C++ 程序结束时导致段错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]