You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:07:29