我无法在我的 C++ 代码中找到导致分段错误的原因

I'm not able to find what is causing the segmentation error in my C++ code

我有一个 C++ 程序,我必须根据给定的要旋转的元素数 (x) 顺时针旋转数组。例如,如果输入数组是

[1,2,3,4,5]

鉴于必须旋转 2 个元素(表示为 x)。

输出数组应该是

[3,4,5,1,2]

代码:

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

int main()
{ 
   int t;
   cin>>t;
   while(t--){
       int n,x;
       cin>>n>>x;
       int a[n],b[x];
       for(int i=0;i<n;i++){
           cin>>a[i];
       }
      copy(a,a+x,b);
      copy(b,b+x,a+n);
      n=n+x;
      for(int i=x;i<n;i++){
          cout<<a[i]<<" ";
      }
   }
    return 0;
}

我在这里所做的是将给定数量的元素复制到一个新数组中。稍后将它们复制回从 'n' 开始的原始数组。所以我的数组看起来像 [1,2,3,4,5,1,2].

稍后我打印出从索引 'x' 开始的数组。这样我的数组看起来像 [3,4,5,1,2].

我能够编译程序并得到输出。但是在一个名为 GeekforGeeks 的网站上提交代码时,其编译器抛出一个分段错误 (SIGSEGV)。

数组必须有确定的大小 一些编译器接受您的代码,但其他编译器不接受 所以尝试改用指针

这个

int a[n],b[x];

不是标准的 c++。有关详细信息,请参见此处:Why aren't variable-length arrays part of the C++ standard?。对动态数组使用 std::vector

然后这里:

copy(a,a+x,b);

您使用 x,但您用于 a 的尺寸是 n 而不是 x。根据您的输入,这可能会越界访问数组。

接下来,这里:

copy(b,b+x,a+n);

您尝试复制到 a+n,但 a+n 已经超出了 a 的最后一个元素。数组具有固定大小,n=n+x; 也无助于更改它。

要旋转数组元素(或 std::vector),您可以使用 std::rotate.

问题 1

  copy(a,a+x,b);

没有做你想做的事。它将 a 的前 x 个元素复制到 b,没有偏移量。如果 x 为 2,则相当于:

 b[0] = a[0];
 b[1] = b[1];

你需要一些可以做的事情:

 b[0+x] = a[0];
 b[1+x] = a[1];

 ...

 b[n] = a[n-x-1];

为此,您需要使用:

 std::copy(a, a+(n-x), b+x);

问题 2

copy(b,b+x,a+n);

不对。

  1. 您想从 a 复制到 b,而不是从 b 复制到 a

  2. 使用 a+n 会立即导致使用越界索引访问数组,这会导致未定义的行为。

  3. 该调用中使用的偏移量根本没有意义。

执行完 std::copy 的第一行后,您需要执行以下操作:

 b[0] = a[n-x];
 b[1] = a[n-x+1];

 ...

 b[x-1] = a[n-1];

为此,您需要使用:

 std::copy(a+(n-x), a+n, b);