#include <stdio.h>
#include <stdlib.h>
#include <mem.h>
#include <conio.h>

int X_DIM=16;
int Y_DIM=8;
int Z_DIM=4;

int main(void)
{
 char ***space;
 char ***Arr3D;
 int x, y, z;
 ptrdiff_t diff;

 /* first we set aside space for the array itself */

 space = malloc(X_DIM * Y_DIM * Z_DIM * sizeof(char));

 /* next we allocate space of an array of pointers, each
    to eventually point to the first element of a
    2 dimensional array of pointers to pointers */

 Arr3D = malloc(Z_DIM * sizeof(char **));

 /* and for each of these we assign a pointer to a newly
    allocated array of pointers to a row */

 for(z = 0; z < Z_DIM; z++)
 {
    Arr3D[z] = malloc(Y_DIM * sizeof(char *));

    /* and for each space in this array we put a pointer to
       the first element of each row in the array space
       originally allocated */

    for(y = 0; y < Y_DIM; y++)
    {
      Arr3D[z][y] = ((char *)space + (z*(X_DIM * Y_DIM) + y*X_DIM));
    }
 }

 /* And, now we check each address in our 3D array to see if
    the indexing of the Arr3d pointer leads through in a
    continuous manner */

 for(z = 0; z < Z_DIM; z++)
 {
   printf("Location of array %d is %p\n", z, *Arr3D[z]);
   for( y = 0; y < Y_DIM; y++)
   {
      printf("  Array %d and Row %d starts at %p", z, y, Arr3D[z][y]);
      diff = Arr3D[z][y] - (char *)space;
      printf("    diff = %d  ",diff);
      printf(" z = %d  y = %d\n", z, y);
   }
   getch();
 }
 return 0;
}