You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组顺时针旋转代码出现Segmentation Error,请求问题定位

排查数组旋转代码中的段错误问题

嘿,我来帮你分析下这段代码触发Segmentation Error的几个核心问题,以及对应的修复方法:

问题1:静态数组temp大小硬编码,超出范围直接越界

你在rotate函数里定义了static int temp[100];,这个数组的大小固定死是100。如果测试用例里的旋转次数m(也就是题目里的D)超过100,第一个循环for(int i =0;i<m;i++) temp[i]=ar[i];就会往temp的内存范围外写数据,破坏程序的静态存储区,直接触发段错误。这应该是你当前遇到问题的最主要原因。

问题2:C++中不标准的变长数组(VLA)

main函数里的int arr[n];是C语言的特性,C++标准里根本没有这个语法。虽然部分编译器(比如GCC)会兼容支持,但它是在栈上分配内存的——栈的空间本来就很小,如果n的数值比较大,很容易出现栈溢出,这也是段错误的常见诱因。

问题3:未处理m > n的潜在风险

题目要求旋转D个元素,当D大于数组长度N时,其实等价于旋转D%N个元素(比如数组长度5,旋转7次和旋转2次效果完全一样)。如果不做这个处理,当m > n时,后续的数组下标计算会出现负数或者超出范围的情况,同样可能触发段错误。


修复后的代码

针对上面的问题,我给你两种修复方案,一种是更符合C++风格的vector写法,另一种是基于指针和动态内存的写法:

方案1:使用std::vector(推荐)

vector会自动管理内存,避免手动分配释放的麻烦,也更安全:

#include <iostream>
#include <vector>
using namespace std;

vector<int> rotate(vector<int> ar, int n, int m) {
    // 处理旋转次数大于数组长度的情况
    m = m % n;
    // 直接用vector截取前m个元素作为临时存储
    vector<int> temp(ar.begin(), ar.begin() + m);
    
    // 将后面的元素向前移动m位
    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() {
    int t, n , m;
    cin >> t;
    while(t > 0) {
        cin >> n >> m;
        vector<int> arr(n);
        for(int i = 0 ; i < n; i++) {
            cin >> arr[i];
        }
        vector<int> result = rotate(arr, n, m);
        for(int num : result)
            cout << num << " ";
        cout << endl;
        t--;
    }
    return 0;
}

方案2:使用动态内存分配(如果你更习惯指针写法)

这种写法需要手动管理内存,记得用完后释放:

#include <iostream>
#include <cstdlib>
using namespace std;

int* rotate(int ar[], int n, int m) {
    // 处理旋转次数超出数组长度的情况
    m = m % n;
    // 动态分配对应大小的临时数组
    int* temp = (int*)malloc(m * sizeof(int));
    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++;
    }
    free(temp); // 必须释放动态分配的内存,避免泄漏
    return ar;
}

int main() {
    int t, n , m;
    cin >> t;
    while(t > 0) {
        cin >> n >> m;
        // 动态分配数组,代替变长数组
        int* arr = (int*)malloc(n * sizeof(int));
        for(int i = 0 ; i < n; i++) {
            cin >> arr[i];
        }
        int* ptr = rotate(arr, n, m);
        for(int j = 0; j < n; j++)
            cout << ptr[j] << " ";
        cout << endl;
        free(arr); // 释放数组内存
        t--;
    }
    return 0;
}

额外提示

  • 优先用std::vector,它是C标准库的容器,比手动管理内存更可靠,也更符合现代C的写法。
  • 不管用哪种方式,处理m % n都是必要的,它能避免很多越界问题。
  • 静态数组的大小永远不要硬编码成固定值,否则遇到超出范围的输入就会出问题。

内容的提问来源于stack exchange,提问作者Prerna Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:05:37