我无法在我的 C++ 代码中找到导致分段错误的原因
I'm not able to find what is causing the segmentation error in my C++ code
我有一个 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 的网站上提交代码时,其编译器抛出一个分段错误 (SIGSEGV)。
数组必须有确定的大小
一些编译器接受您的代码,但其他编译器不接受
所以尝试改用指针
这个
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
行
copy(a,a+x,b);
没有做你想做的事。它将 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);
问题 2
行
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+(n-x), a+n, b);
我有一个 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 的网站上提交代码时,其编译器抛出一个分段错误 (SIGSEGV)。
数组必须有确定的大小 一些编译器接受您的代码,但其他编译器不接受 所以尝试改用指针
这个
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
行
copy(a,a+x,b);
没有做你想做的事。它将 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);
问题 2
行
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+(n-x), a+n, b);