Question

I'm brushing up on some beginner's algorithms as I familiarize myself with C++. There are already some bugs I have no idea where to start fixing.

1) The following gives me seg faults around the time when the fib() function returns its results. EDIT: with inputs >= 9

#include <iostream>

using namespace std;

int fib(int n) {
    int fibs[] = {1, 1};    // dynamic array
    int i = 2;              // start at 3rd element
    while(i < n) {
        fibs[i] = fibs[i-2] + fibs[i-1];
        cout << "DEBUG: fibs[" << i << "] = " << fibs[i] << endl;
        i = i+1;
    }
    cout << "about to return to main()" << endl;
    return fibs[n-1];
}

int main() {
    cout << "\n================= Hello cruel world =================" << endl;
    cout << "Enter a number:  ";
    int x;
    cin >> x;
    cout << "fib(" << x << ") = " << fib(x) << endl;
    cout << "================ Goodbye cruel world ================\n" << endl;
    return 0;
}

Otherwise, the code works just fine, the numbers are found correctly. But 2) when I change the function to support long integers, it starts acting weird:

#include <iostream>

using namespace std;

long fib(int n) {
    long fibs[] = {1L, 1L};    // dynamic array
    int i = 2;                 // start at 3rd element
    while(i < n) {
        fibs[i] = fibs[i-2] + fibs[i-1];
        cout << "DEBUG: fibs[" << i << "] = " << fibs[i] << endl;
        i = i+1;
    }
    cout << "about to return to main()" << endl;
    return fibs[n-1];
}

int main() {
    cout << "\n================= Hello cruel world =================" << endl;
    cout << "Enter a number:  ";
    int x;
    cin >> x;
    cout << "fib(" << x << ") = " << fib(x) << endl;
    cout << "================ Goodbye cruel world ================\n" << endl;
    return 0;
}

Output:

================= Hello cruel world =================
Enter a number:  7
DEBUG: fibs[2] = 2
DEBUG: fibs[0] = 1
DEBUG: fibs[1] = 30071067265
DEBUG: fibs[2] = 30071067266
DEBUG: fibs[14] = 0
about to return to main()
fib(7) = 140733637791872
================ Goodbye cruel world ================

It doesn't make any sense to me. Thanks for any help.

Was it helpful?

Solution

int fibs[] = {1, 1};  

is equivalent to:

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

In another word, the array fibs(in both programs) has only two elements, it's illegal to access fibs[n] if n is bigger than 1.

OTHER TIPS

In

long fibs[] = {1L, 1L};

the [] does not mean "as big as it needs to be", it means "count the number of initializers". It's the same as

long fibs[2] = { 1L, 1L };

And the comment

// dynamic array

is just plain WRONG.

The other answers explain what's wrong. To fix it, you can declare fibs as a vector instead:

vector<int> fibs(n, 1);

which will construct a vector of n integers and initialize them all to 1. Replacing that single line of code should be all you need!

Yes it will fail because fibs[2] doesn't exist!

This is not dynamic array by any mean. Its array of 2 long

long fibs[] = {1L, 1L};    // dynamic array
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top