9

Below program (a toy program to pass around arrays to a function) doesn't compile. Please explain me, why is the compiler unable to compile(either because of technical reason or because of standard reason?)

I will also look at some book explaining pointers/multi dimensional arrays(as I am shaky on these), but any off-the-shelf pointers here should be useful.

void print2(int ** array,int n, int m);

main()
{
    int array[][4]={{1,2,3,4},{5,6,7,8}};
    int array2[][2]={{1,2},{3,4},{5,6},{7,8}};
    print2(array,2,4);
}

void print2(int ** array,int n,int m)
{
    int i,j;
    for(i=0;i<n;i++)
    {
       for(j=0;j<m;j++)
       printf("%d ",array[i][j]);

       printf("\n");
    }
}
xyz
  • 8,607
  • 16
  • 66
  • 90

3 Answers3

12

This (as usual) is explained in the c faq. In a nutshell, an array decays to a pointer only once (after it decayed, the resulting pointer won't further decay).

An array of arrays (i.e. a two-dimensional array in C) decays into a pointer to an array, not a pointer to a pointer.

Easiest way to solve it:

int **array; /* and then malloc */
cnicutar
  • 178,505
  • 25
  • 365
  • 392
  • http://stackoverflow.com/questions/16943909/manipulate-multidimensional-array-in-a-function – Dchris Jun 05 '13 at 16:02
5

In C99, as a simple rule for functions that receive "variable length arrays" declare the bounds first:

void print2(int n, int m, int array[n][m]);

and then your function should just work as you'd expect.

Edit: Generally you should have a look into the order in which the dimension are specified. (and me to :)

Jens Gustedt
  • 76,821
  • 6
  • 102
  • 177
0

In your code the double pointer is not suitable to access a 2D array because it does not know its hop size i.e. number of columns. A 2D array is a contiguous allotted memory.

The following typecast and 2D array pointer would solve the problem.

# define COLUMN_SIZE 4
void print2(int ** array,int n,int m)
{
    // Create a pointer to a 2D array
    int (*ptr)[COLUMN_SIZE];
    ptr = int(*)[COLUMN_SIZE]array;

    int i,j;
    for(i = 0; i < n; i++)
    {
       for(j = 0; j < m; j++)
       printf("%d ", ptr[i][j]);
       printf("\n");
    }
}
Vishal K
  • 1,164
  • 1
  • 10
  • 21