You need to enable JavaScript to run this app. C++实现数组反转时出现segmentation fault段错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

C++实现数组反转时出现segmentation fault段错误如何解决?

问题排查与修复方案

核心问题

  • 未初始化变量定义变长数组导致内存越界:你在n还没有被输入赋值的情况下,就用int arr[n];定义数组。局部变量n定义时未初始化,存储的是内存中的随机垃圾值,此时数组的长度是不可控的随机值。后续输入的n如果超过了数组随机开辟的长度,写入数组元素时就会发生栈内存越界,直接触发段错误。

补充说明:变长数组(VLA)本身不是C标准语法,属于部分编译器的C语言兼容扩展,可移植性很差,天然不建议在C代码中使用。即便你调整代码顺序把数组定义放在cin>>n之后,变长数组分配在栈空间(通常只有几MB),如果输入的n过大,还是会触发栈溢出导致段错误。

  • 冗余代码问题:定义的int t没有任何使用,属于无效代码,虽然不会直接触发段错误,但属于代码冗余。

修复方案(C++标准写法,推荐)

使用标准库vector容器存储数组,自动管理内存,不会出现栈溢出问题:

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

int main() {
    int n;
    // 先读取n的值再初始化容器
    cin >> n;
    vector<int> arr(n);
    
    // 获取数组元素
    for(int i=0; i<n; i++)
    {
        cin >> arr[i];
    }
    
    // 反转输出,加空格分隔元素可读性更好,可按需调整
    for(int i = n-1; i >= 0; i--)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

原生数组兼容写法

如果一定要使用原生数组,需要在读取n之后动态申请堆内存,使用后记得释放:

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    // 动态申请堆内存,长度由读取后的n决定
    int *arr = new int[n];
    
    for(int i=0; i<n; i++)
    {
        cin >> arr[i];
    }
    
    for(int i = n-1; i >= 0; i--)
    {
        cout << arr[i] << " ";
    }
    // 释放内存避免泄漏
    delete[] arr;
    return 0;
}

内容的提问来源于stack exchange,提问作者Mehul Kunwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 05:12:03