试图计算fibonacci(n)的变量“f”周围的堆栈损坏

Stack corruption around variable `f` trying to calculate fibonacci(n)

本文关键字:周围 损坏 堆栈 变量 fibonacci 计算      更新时间:2023-10-16

我正试图让我的程序打印第n个fibonacci数
不过,我得到了一个堆栈损坏断言:

int f[] = { 1, 1 };
int i = 0;
if (n <= 2) {
    cout << "F(" << n << ") = 1" << endl;
    return 0;
}
if (n>2) {
    i = 2;
    while (i < n) {
        cout << "i =" << i << endl;
        cout << f[i - 1] << endl;
        cout << f[i - 2] << endl;
        f[i] = f[i - 1] + f[i - 2];
        i++;
    }
    cout << "F(" << n << ") = " << f[i-1] << endl;
    return 0;
}

原始数组不会按需增长,当sie不包括在类型中时,初始化器用于静态调整它们的大小
这两者是等价的,都定义了一个由两个元素组成的数组:

int f[] = { 1, 1 };
int f[2] = { 1, 1 };

您要使用的是std::vector或手动动态重新分配(使用mallocreallocfreenew[]delete[]std::copy)。

另一个(优选的)选项是观察这样一个事实,即您只需要前两个值来计算下一个值,并且只保存这些值。

int f[] = {1, 1};

创建一个正好可以容纳两个整数的数组。因此,对于i > 1,您无法写入或读取(甚至无法形成)f[i]。虽然您可以使用std::vector来保护递归的所有值,但这样计算级数会更有效:

int f[3] = {1, 1, 0};
for (int i = 1; i < n; ++i){
    f[2] = f[0] + f[1];
    f[0] = f[1];
    f[1] = f[2];
}

重用不再需要的值的空间。