Arrays I';我无法在我的C+中找到导致分段错误的原因+;密码 我有一个C++程序,我必须根据给定的元素数顺时针旋转数组(x)。例如,如果输入数组是 [1,2,3,4,5]
假设2个元素(表示为x)必须旋转 输出数组应该是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
[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++编程很新,请给我连接一个演示程序,如何使用向量。