c++ - 这段 C++ 代码在给出段错误时有什么问题?

标签 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的基础上取它们的差值并排序,复制在一个新 vector 中并对它们进行排序并输出一个新元素。

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

最佳答案

在循环的每次迭代中,您将 bt 移动 k - 1

bt = bt + (k-1);

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

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

关于c++ - 这段 C++ 代码在给出段错误时有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26311553/

相关文章:

c++ - 如何推送字符数组?

c++ - 无法在 C++ 中调用派生类函数

c++ - 对 swscale 函数的 undefined reference

c++ - 如何告诉 Visual Studio 包含库的 .cpp 文件?

c++ - 是 *this = Ctor();清除对象状态合法有效?

c++ - 如何重载 printf 或 cout

c++ - 组合 std::forward、std::move 和 volatile 时的意外返回类型

c++ - 数组的引用

c# - 同一类的析构函数中的对象实例化和垃圾收集

c++ - 打印结构的结构数组会导致意外的执行错误?