Search code examples
c++arraysmethod-signature

How to return an array from a function?


How can I return an array from a method, and how must I declare it?

int[] test(void); // ??

Solution

  • int* test();

    but it would be "more C++" to use vectors:

    std::vector< int > test();

    EDIT
    I'll clarify some point. Since you mentioned C++, I'll go with new[] and delete[] operators, but it's the same with malloc/free.

    In the first case, you'll write something like:

    int* test() {
        return new int[size_needed];
    }
    

    but it's not a nice idea because your function's client doesn't really know the size of the array you are returning, although the client can safely deallocate it with a call to delete[].

    int* theArray = test();
    for (size_t i; i < ???; ++i) { // I don't know what is the array size!
        // ...
    }
    delete[] theArray; // ok.
    

    A better signature would be this one:

    int* test(size_t& arraySize) {
        array_size = 10;
        return new int[array_size];
    }
    

    And your client code would now be:

    size_t theSize = 0;
    int* theArray = test(theSize);
    for (size_t i; i < theSize; ++i) { // now I can safely iterate the array
        // ...
    }
    delete[] theArray; // still ok.
    

    Since this is C++, std::vector<T> is a widely-used solution:

    std::vector<int> test() {
        std::vector<int> vector(10);
        return vector;
    }
    

    Now you don't have to call delete[], since it will be handled by the object, and you can safely iterate it with:

    std::vector<int> v = test();
    std::vector<int>::iterator it = v.begin();
    for (; it != v.end(); ++it) {
       // do your things
    }
    

    which is easier and safer.