无法在我的C ++代码中找到导致分段错误的原因,有人可以帮我吗

问题描述 投票:-1回答:1

我有一个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++
1个回答
1
投票

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。根据您的输入,这可能会超出阵列的边界。


0
投票

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


0
投票

[使用您给a = {1,2,3,4,5}n = 5x = 2的示例来看看您在细节上写的内容。

第一个语句是copy(a,a+2,b);,即将a的前两个元素复制到b的开头,所以我们有

b={1,2,?,?,?}

问号表示b中的此时未知。请注意,尽管还没有崩溃,但我们错了。 1和2尚未旋转

第二条语句是copy(b,b+2,a+5);,即,将b的前两个元素复制到从第五个元素开始的a。现在a的大小为5,因此它将复制到不存在的元素,因此会崩溃。

您显然还不了解copy的工作原理。

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