Arrays I';我无法在我的C+中找到导致分段错误的原因+;密码 我有一个C++程序,我必须根据给定的元素数顺时针旋转数组(x)。例如,如果输入数组是 [1,2,3,4,5]

Arrays I';我无法在我的C+中找到导致分段错误的原因+;密码 我有一个C++程序,我必须根据给定的元素数顺时针旋转数组(x)。例如,如果输入数组是 [1,2,3,4,5],arrays,gcc,g++,Arrays,Gcc,G++,假设2个元素(表示为x)必须旋转 输出数组应该是 [3,4,5,1,2] 代码: #包括 #包括 使用名称空间std; int main() { int t; cin>>t; 而(t--){ int n,x; cin>>n>>x; int a[n],b[x]; 对于(int i=0;i>a[i]; } 副本(a、a+x、b); 副本(b、b+x、a+n); n=n+x; 对于(int i=x;i数组必须具有确定的大小 某些编译器接受您的代码,但其他编译器不接受 所以试着用指针代替这个 int

假设2个元素(表示为x)必须旋转

输出数组应该是

[3,4,5,1,2]
代码:

#包括
#包括
使用名称空间std;
int main()
{ 
int t;
cin>>t;
而(t--){
int n,x;
cin>>n>>x;
int a[n],b[x];
对于(int i=0;i>a[i];
}
副本(a、a+x、b);
副本(b、b+x、a+n);
n=n+x;

对于(int i=x;i数组必须具有确定的大小 某些编译器接受您的代码,但其他编译器不接受 所以试着用指针代替这个

int a[n],b[x];

不是标准C++。请参阅这里的详细信息:使用<代码> STD::向量>代码>动态数组。< /P> 那么这里:

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
),可以使用。

问题1 线路

  copy(a,a+x,b);
copy(b,b+x,a+n);
不执行您想要执行的操作。它将
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);
 std::copy(a+(n-x), a+n, b);
问题2 线路

  copy(a,a+x,b);
copy(b,b+x,a+n);
这是不对的

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

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

  • 该调用中使用的偏移量毫无意义

  • 在执行
    std::copy
    的第一行之后,您需要做些什么来执行以下操作:

     b[0] = a[n-x];
     b[1] = a[n-x+1];
    
     ...
    
     b[x-1] = a[n-1];
    
    要实现这一点,您需要使用:

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

    不是拷贝(b,b+x,a+n)
    要求在
    数组结束后复制数据?是的,这是tadmanHint:你认为当你在数组边界之外编写时会发生什么?你需要一个编译器环境,比如Visual Studio Express、Xcode,甚至Visual Studio code+GCC或Clang。有很多选项,这些只是常见的例子。耶s我用a的大小作为n..但在副本中我只需要数组a的起始2个元素。也就是说,y im使用a+x..x包含要旋转的元素数。如果是2。我将只复制数组“a”的起始2个元素@SaiDarshan不确定我是否理解你的意思。如果你参考我写的
    副本(a,a+x,b)
    然后我写了这个may访问数组超出范围,并不意味着它总是失败。但我永远不会写这样的代码,因为它看起来很无辜,但很容易失败并带来戏剧性的后果(未定义的行为)。无论如何,
    复制(b,b+x,a+n)
    绝对是越界访问,
    a
    n
    元素,不是更多是的,我同意副本(b,b+x,a+n)如果我首先增加数组大小然后做这个语句?@ SaiDarshan数组有固定的大小,这就是为什么我建议使用<代码> STD::向量< /代码> OK。我对C++编程很新,请给我连接一个演示程序,如何使用向量。