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

问题描述 投票:-2回答:3

我有一个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)。

arrays gcc g++
3个回答
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


0
投票

问题1

std::rotate

不做您想做的事。它将 copy(a,a+x,b); 的前x个元素复制到a,没有偏移量。如果b为2,则等效于:

x

您需要做的事情:

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

要实现这一点,您需要使用:

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

 ...

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

问题2

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

不正确。

  1. 您想从copy(b,b+x,a+n); 复制到a,而不是从b复制到b

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

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

a+n的第一行执行后,您需要执行以下操作:

std::copy

要实现这一点,您需要使用:

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

 ...

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

-1
投票

数组必须具有确定的大小一些编译器接受您的代码,而另一些则不接受因此,请尝试使用指针代替

© www.soinside.com 2019 - 2024. All rights reserved.