1

I am new to C and during my learning I want to return a two dimensional array from a function, so that I can use it in my main program. Can anyone explain me the same with example. Thanks in advance.

user537670
  • 821
  • 6
  • 21
  • 42

3 Answers3

1

It depends how it is implemented. You can either work with just a one-dimensional array where you know the length of each (row) and the next row begins immediately after the previous one. OR, you can have an array of pointers to arrays. The extra cost though is you need to de-reference two pointers to get to one element of data.

// 2D array of data, with just one array
char* get_2d_ex1(int rows, int cols) {
    int r, c, idx;
    char* p = malloc(rows*cols);

    for (r=0; r<rows; r++) {
        for (c=0; c<cols; c++) {
            idx = r*cols + c;   // this is key
            p[idx] = c;         // put the col# in its place, for example.
        }
     }
     return p;
}
Jonathon Reinhart
  • 132,704
  • 33
  • 254
  • 328
1

Declare your function as returning a pointer to a pointer. If we use int as an example:

int **samplefunction() {
    int** retval = new int*[100];
    for (int i = 1; i < 100; i++) {
        retval[i] = new int[100];
    }
    // do stuff here to retval[i][j]
    return retval;
}
Dan
  • 10,531
  • 2
  • 36
  • 55
  • I plead guilty on that one ;) – Dan Nov 11 '11 at 03:24
  • Also... wouldn't this be a mission for someone to clean up if they did not know how many elements were in each array? – dreamlax Nov 11 '11 at 03:26
  • It would also be a mission for someone to /use/ if they didn't know how many elements were in each array. Just like...arrays... – Dan Nov 11 '11 at 04:24
1

Here's an example of how you might create, manipulate and free a "2d array":

#include <stdlib.h>

#define ROWS   5
#define COLS   10

int **create_2d_array(size_t rows, size_t cols)
{
   size_t i;   
   int **array = (int**)malloc(rows * sizeof(int*));
   for (i = 0; i < rows; i++)
      array[i] = (int*)malloc(cols * sizeof(int));

   return array;
}

void free_2d_array(int **array, size_t rows, size_t cols)
{
   size_t i;
   for (i = 0; i < rows; i++)
      free(array[i]);

   free(array);
}

int main(void)
{
   int **array2d = create_2d_array(ROWS, COLS);
   /* ... */
   array2d[3][4] = 5;
   /* ... */
   free_2d_array(array2d, ROWS, COLS);

   return 0;
}

To create a "2d array"/matrix, all you have to do is create a dynamic array of pointers (in this case int*) of the size of the rows/width:

int **array = (int**)malloc(rows * sizeof(int*));

Then you set each of those pointers to point to a dynamic array of int of the size of the columns/height:

array[i] = (int*)malloc(cols * sizeof(int));

Note that the casts on malloc aren't required, it's just a habit I have.

AusCBloke
  • 18,014
  • 6
  • 40
  • 44