c++ 访问矢量元素时出现分段错误

vxbzzdmp  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(138)

我正在学习如何在C++中创建引用变量,在使用int &res = f[k]res创建为引用向量f的给定分量的变量时遇到了一些麻烦。
在这段代码中,F(k)应该返回整数输入k的斐波那契数,该数是通过记忆向量f中的先前调用F(0)F(1)、... F(k-2)F(k-1)计算出来的,但我得到了一个Segmentation Fault,这让我认为我没有将res作为向量f的一个分量引用。
下面是我的代码:

#include <iostream>
#include <vector>
using namespace std;
const int UNDEF = -1;
vector<int> f;

int F(int k) {
  int &res = f[k];  // I get "res: 0x0000000000000004 and &res: ??" when debugging
  if (res != UNDEF) return res; // EXC_BAD_ACCESS (code=1, address=0x4)
  if (k <= 1) return 1;
  return res = F(k-1) + F(k-2);
}

int main() {
  int k;
  cin >> k;
  vector<int> f(k+1, UNDEF);
  cout << F(k) << endl;
}

我真的需要一些帮助!非常感谢:)
阿莱克斯

4ioopgfo

4ioopgfo1#

全局向量变量f * 没有元素 *。当您写入:

int &res = f[k];

您试图访问它的k元素,但该元素并不存在,这就是为什么您会在该点出现分段错误
注意在你的程序中有两个同名的向量变量f,其中一个是局部变量,另一个是全局变量。
当你写

int &res = f[k];

所选择的向量f是全局变量,并且由于全局向量f的大小为0(空向量),因此当您尝试访问其第k个元素时,它会给您分段错误(未定义行为),如here所示。

9fkzdhlc

9fkzdhlc2#

非常感谢!我得到了一个答案,后来被删除,但这是最简单的解决方案:

#include <iostream>
#include <vector>
using namespace std;
const int UNDEF = -1;

int F(int k, vector<int>& f) {
  int &res = f[k];  
  if (res != UNDEF) return res;
  if (k <= 1) return 1;
  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;
}

相关问题