【问题标题】:The output of this question is correct but i am getting a segmentation error这个问题的输出是正确的,但我得到一个分段错误
【发布时间】: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&lt;int&gt; arr(n); 同样用于temp。如果这真的是一个在线的东西,你不只是使用 std::rotate 有什么特别的原因吗?我认为这会将您的代码减少到该死的几乎没有。那个轮子是很久以前发明的。
  • 旁注static int temp[100]; 此处不要使用静态。这是不好的做法(引入全局状态)
  • 除了使用 VLA(无效的 C++)之外,最明显的解释是您的代码正在访问超出数组之一末尾的元素。对于您提供的任何输入,您都需要使用调试器单步执行。特别需要注意的是,在使用它来访问/修改数组元素之前,您需要检查每个索引。
  • 您应该提供触发错误的输入。然后用调试输出编译代码,通过调试器运行崩溃代码并告诉我们它死在哪里。如果 n 太大,堆栈大小(例如 8k)将不足以容纳您的 arr 变量。此外,你应该通过格式化你的代码来帮助你自己和这里的人(例如,cout 在 for 语句之后应该缩进)。

标签: c++ segmentation-fault


【解决方案1】:

如果 m > n 则当您索引超出 arr 末尾时,它会在第一个 for() 循环中崩溃。

如果 m

可能还有更多案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2020-10-21
    • 1970-01-01
    • 2019-06-24
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多