C++中使用引用变量访问vector元素时触发段错误(Segmentation fault)的求助
问题分析与解决方案
嘿,我一眼就发现你代码里的问题啦——触发段错误的根源是全局变量和局部变量的名字冲突,导致你在F函数里访问的根本不是main中初始化好的那个vector!
具体问题拆解
你在代码顶部定义了一个全局的vector<int> f;,但在main函数里又重新定义了一个同名的局部vector<int> f(k+1, UNDEF);。这时候,F函数里的int &res = f[k];引用的是全局的空vector,而不是main中已经分配了k+1个元素的局部vector。
全局vector初始时是空的(size为0),当你尝试访问f[k]时,直接越界访问了不属于vector的内存区域,这就触发了EXC_BAD_ACCESS错误——也就是你看到的段错误。
修复方案
这里有两种简单的修复方式,推荐第一种(更符合代码规范,避免全局变量):
方案1:让F函数接收vector的引用作为参数
把全局的vector<int> f;删掉,修改F函数的参数列表,让它接收一个vector的引用,这样就能直接操作main中初始化好的vector了:
#include <iostream> #include <vector> using namespace std; const int UNDEF = -1; // 修改函数,接收vector的引用 int F(int k, vector<int>& f) { int &res = f[k]; if (res != UNDEF) return res; if (k <= 1) return res = 1; // 这里赋值给res,确保记忆化生效 return res = F(k-1, f) + F(k-2, f); } int main() { int k; cin >> k; vector<int> f(k+1, UNDEF); cout << F(k, f) << endl; }
方案2:使用全局vector,避免局部重定义
如果你坚持要用全局变量,那只需要把main里的局部vector定义改成给全局vector赋值,而不是重新定义:
#include <iostream> #include <vector> using namespace std; const int UNDEF = -1; vector<int> f; // 全局vector int F(int k) { int &res = f[k]; if (res != UNDEF) return res; if (k <= 1) return res = 1; return res = F(k-1) + F(k-2); } int main() { int k; cin >> k; // 给全局vector赋值,而非定义新的局部变量 f.assign(k+1, UNDEF); cout << F(k) << endl; }
额外提示
在方案1的修复中,我还修改了k<=1的分支——原来的代码直接return 1,没有把值赋值给res,这会导致后续再次调用F(0)或F(1)时,仍然会重新计算(因为f[0]和f[1]还是UNDEF),记忆化就失效了。现在改成return res = 1,就能把结果存入vector,真正实现记忆化优化。
内容的提问来源于stack exchange,提问作者MrChicano
相关产品推荐
相关产品推荐

