Search code examples
c++multidimensional-arrayfunction-parameter

Calling array with variable size as parameter


I was trying to make a program in which the user decides the dimensions of a 2-D array. I'm getting an error on the function definition while compiling. Why is this wrong and what would be the correct way to do it?

I'm using the Dev-C++ 5.7.1 compiler (if that's relevant).

#include<iostream>

using namespace std;

int R=0,C=0;                 

void func(int);

int main() {
    cin>>R>>C;
    int array[C][R];
                      // DO STUFF HERE
    func(array);
                      // DO SOME MORE STUFF
    return 0;
}

void func(int arr[][R]) {  
                     // DO STUFF HERE
}

Solution

  • ISO-C++ forbids VLAs. To dynamically allocate an array you'll either need to do some raw pointer tricks or use a vector of vectors.

    vector of vectors approach:

    std::cin >> R >> C;
    std::vector<std::vector<int>> array(R, std::vector<int>(C));
    

    The signature for func then becomes (const correctness may be different)

    void func(const std::vector<std::vector<int>>& v);
    

    The above is the easier, more maintainable, safer, shorter solution.


    With pointers and pointers to pointers you can do it but it becomes more complicated, and you need to delete everything that you new

    int R, C;
    std::cin >> R >> C;
    int **array = new int*[R]; // allocates space for R row pointers
    for (int i = 0; i < R; ++i) {
        array[i] = new int[C]; // for each row, allocate C columns
    }
    
    func(R, C, array);
    
    //then delete everything
    for (int i = 0; i < R; ++i) {
        delete [] array[i]; // delete all of the ints themselves
    }
    delete [] array; // delete the row pointers.
    

    with the signature for func being

    void func(int r, int c, int **arr);
    

    again, vector of vectors will be a lot easier on you.