【发布时间】:2021-03-29 20:40:08
【问题描述】:
我正在尝试解决数组旋转的程序。我在代码中遇到分段错误。有人能告诉我这段代码的问题在哪里吗?
这是问题
给定一个大小为 N 的未排序数组 arr[],将其旋转 D 个元素(顺时针)。
输入的第一行包含 T 表示测试用例的数量。每个测试用例的第一行包含两个空格分隔的元素,N 表示数组的大小,整数 D 表示旋转的数字大小。后续行将是 N 个空格分隔的数组元素。
我已经用下面的代码解决了。
#include <iostream>
using namespace std;
int* rotate(int ar[],int n, int m)
{static int temp[100];
for(int i =0;i<m;i++)
{
temp[i]=ar[i];
}
for(int j =m;j<n;j++)
{
ar[j-m]=ar[j];
}
int x=0;
for(int k =n-m;k<n;k++)
{
ar[k]=temp[x];
x++;
}
return ar;
}
int main() {
//code
int t, n , m;
cin>>t;
while(t>0)
{
cin>>n>>m;
int arr[n];
int * ptr;
for(int i = 0 ;i<n;i++)
{
cin>>arr[i];
}
ptr=rotate(arr,n,m);
for(int j=0;j<n;j++)
cout<<ptr[j]<<" ";
cout<<endl;
t--;
}
return 0;
}
【问题讨论】:
-
这里有什么限制?你确定
n总是小于 100(temp 的大小)吗? -
int arr[n];= 应对具有潜在大型数据集的在线挑战的灾难秘诀。此外,VLA 不是 C++ 标准。不要使用它们。在rotate中使用std::vector<int> arr(n);同样用于temp。如果这真的是一个在线的东西,你不只是使用std::rotate有什么特别的原因吗?我认为这会将您的代码减少到该死的几乎没有。那个轮子是很久以前发明的。 -
旁注
static int temp[100];此处不要使用静态。这是不好的做法(引入全局状态) -
除了使用 VLA(无效的 C++)之外,最明显的解释是您的代码正在访问超出数组之一末尾的元素。对于您提供的任何输入,您都需要使用调试器单步执行。特别需要注意的是,在使用它来访问/修改数组元素之前,您需要检查每个索引。
-
您应该提供触发错误的输入。然后用调试输出编译代码,通过调试器运行崩溃代码并告诉我们它死在哪里。如果 n 太大,堆栈大小(例如 8k)将不足以容纳您的 arr 变量。此外,你应该通过格式化你的代码来帮助你自己和这里的人(例如,cout 在 for 语句之后应该缩进)。