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
相关产品推荐
相关产品推荐

