反转数组代码出现Segmentation fault问题,如何解决?
问题分析与修复方案
原代码的核心问题
- 数组定义逻辑错误:在读取
n之前就用int arr[n];声明数组,此时n是未初始化的垃圾值,数组大小完全随机。而且C++标准并不支持这种变长数组(VLA),属于编译器非标准扩展,兼容性极差。 - 下标越界访问:反转输出的循环从
i = n+1开始,数组的合法下标范围是0到n-1,访问arr[n]、arr[n+1]属于越界操作,直接触发段错误(Segmentation fault)。
修复后的代码
推荐使用C++标准容器vector来存储数组,既安全又符合标准:
#include <iostream> #include <vector> using namespace std; int main(){ int n; cin >> n; vector<int> arr(n); // 先读n,再创建大小为n的vector for (int j = 0; j < n; j++) { cin >> arr[j]; } // 从最后一个元素开始遍历到第一个元素 for (int i = n-1; i >= 0; i--) { cout << arr[i] << " "; } return 0; }
如果一定要用原生数组,可以用动态内存分配(注意要手动释放内存):
#include <iostream> using namespace std; int main(){ int n; cin >> n; int* arr = new int[n]; // 动态分配数组 for (int j = 0; j < n; j++) { cin >> arr[j]; } for (int i = n-1; i >= 0; i--) { cout << arr[i] << " "; } delete[] arr; // 释放动态分配的内存 return 0; }
额外说明
- 用
vector无需手动管理内存,是C++中处理动态大小数组的首选方式。 - 循环遍历反转数组时,必须严格遵守下标范围:数组的第一个元素下标是
0,最后一个是n-1,越界访问会直接导致内存错误。
内容的提问来源于stack exchange,提问作者Alisha Kabeer
相关产品推荐
相关产品推荐

