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

时间:2020-03-30 17:24:47

标签: arrays gcc g++

我有一个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的网站上提交代码时,其编译器抛出了Segmentation Fault(SIGSEGV)。

3 个答案:

答案 0 :(得分:3)

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 :(得分:0)

问题1

  copy(a,a+x,b);

不做您想做的事。它将x的前a个元素复制到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);

答案 2 :(得分:-1)

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