使用vector实现右侧下一个更大元素的代码出现段错误,如何排查?
段错误原因分析与代码修复
错误根源
你的代码出现段错误的核心原因是未为结果vector分配内存空间就直接通过索引访问:
在solve函数中,vector<int> v;创建了一个空的vector,其初始大小为0。但你随后直接执行v[arr.size()-1] = -1;,试图访问一个超出vector当前范围的索引,这会触发内存越界,导致段错误。
修复方案
在solve函数中初始化结果vector时,指定其大小为输入数组的长度,确保所有索引都是合法的:
vector<int> v(arr.size());
修正后的完整代码
#include <iostream> #include <stack> #include <vector> using namespace std; void display(vector<int> a) { for(int i=0; i<a.size(); i++) { cout << a[i] << endl; } } vector<int> solve(vector<int> arr) { vector<int> v(arr.size()); // 初始化vector大小为输入数组长度 stack<int> st; st.push(arr[arr.size()-1]); v[arr.size()-1] = -1; for(int i=arr.size()-2; i>=0; i--) { while(!st.empty() && arr[i]>=st.top()) { st.pop(); } v[i] = st.empty() ? -1 : st.top(); st.push(arr[i]); } return v; } int main() { int n; cin >> n; vector<int> arr(n, 0); for(int i=0; i<n; i++) { cin >> arr[i]; } vector<int> nge(n, 0); nge = solve(arr); display(nge); return 0; }
额外优化建议(非错误点)
- 函数参数传递时使用
const vector<int>& arr代替vector<int> arr,避免不必要的数组拷贝,提升性能。 display函数也可以改为传引用,减少拷贝开销。
内容的提问来源于stack exchange,提问作者codosopher
相关产品推荐
相关产品推荐

