Search code examples
cimplicit-conversionreturn-typefunction-declarationvariable-length-array

How to return a 2D array?


I was searching for an efficient way to create a 2D array and return it, usually I make an array of pointers, allocate memory for each pointer, and return an **ptr. I was looking for another way to do it because then I have to free every single memory allocated.

I was reading online that you can allocate a 2D array like this: int (*arr)[n] = malloc( sizeof *arr * i ); In which ptr is a pointer, pointing to the adress of arr[n].

When I try to return arr, from the following function: int *array_of_smallest(int count);
I get: warning: assignment to ‘int *’ from incompatible pointer type ‘int (*)[n]’ [-Wincompatible-pointer-types]

If I initialise another pointer and point it to array, then return it, I'm only returning a 1D array.

I think I'm mixing diferent concepts and confusing myself.

With an array of pointers I don't have a problem, but I wanted a simplier way to create a 2D array, also easier to free, but I'm not being able to return that array from my function.


Solution

  • You declared a pointer of the variable modified type type int ( * )[n].

    int (*arr)[n] = malloc( sizeof *arr * i );
    

    That is the variable n used in the declarator is not an integer constant expression.

    In this case the function should have the return type void *. And it can be declared like

    void * array_of_smallest(int count)
    {
        int (*arr)[n] = malloc( sizeof *arr * i );
        //...
        return arr;
    } 
    

    In the caller you will write

    int ( *arr )[n] = array_of_smallest( count );
    

    In this declaration the value of n must be the same as used within the function.

    If to use an integer constant expression like

    int (*arr)[2] = malloc( sizeof *arr * 2 );
    

    then the function declaration will look like

    int ( * array_of_smallest(int count) )[2];
    

    Or you can introduce a typedef name before the function declaration like

    typedef int Array[2];
    

    and in this case the function will look like

    Array * array_of_smallest(int count);