在给出分段错误时,这个c ++代码有什么问题?

时间:2014-10-11 05:45:26

标签: c++

#include<iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;

int main (void)
{
    int z,foo,t,n,k,i;
    cin>>t;
    while (t--)
    {
         vector<int> a;
         vector<int> b;
         cin>>n>>k;
         z = n;
         while (z--)
         {
            cin>>foo;
            a.push_back(foo);
         }
         sort(a.begin(),a.end());
         vector<int>::iterator it = a.begin();
         vector<int>::iterator bt = a.begin();
         while (bt != a.end())
         {
            bt = bt + (k-1);
            foo = *bt - *it;
            b.push_back(foo);
            it++;
         }
         sort(b.begin(),b.end());
         cout<<b[0]<<"\n";
    }
    return 0;
}

此代码接受测试用例的数量,然后接受两个数字,然后获取数字的总数,并对它们进行排序,根据k获取它们的差异并对它们进行排序,复制到新的矢量并对它们进行排序并输出一个新元素。

上面的代码给出了分段错误。

1 个答案:

答案 0 :(得分:2)

您正在循环的每次迭代中btk - 1

bt = bt + (k-1);

bt的初始值为a.begin(),周期延续条件为bt != a.end()。如果a的大小(即n)不能被k - 1整除,bt将永远不会等于a.end(),并且循环永远不会正确终止。它会将bt推出有效范围。

此时行为将是未定义的。代码通常会崩溃。