<p>In <code>C</code> can I <strong>pass a multidimensional array</strong> to a function <strong>as a single argument</strong> when I don't know what the dimensions of the array are going to be?</p>

<p>Besides, my multidimensional array may contain types other than strings.</p>

You can do this with any data type. Simply make it a pointer-to-pointer:
```
```
typedef struct {
  int myint;
  char* mystring;
} data;

data** array;
```
```
But don't forget you still have to malloc the variable, and it does get a bit complex:
```
```
//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring, "w00t");
  }
}
```
```
The code to deallocate the structure looks similar - don't forget to call free() on everything you malloced! (Also, in robust applications you should
check the return of malloc()
.)
Now let's say you want to pass this to a function. You can still use the double pointer, because you probably want to do manipulations on the data structure, not the pointer to pointers of data structures:
```
```
int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}
```
```
Call this function with:
```
```
printf("My int is %d.\n", whatsMyInt(array, 2, 4));
```
```
Output:
```
```
My int is 6.
```
```