#include <stdio.h>
#include <stdlib.h>
void m3_delete (int ***const Zd, size_t const n)
{
size_t i;
for (i = 0; i < n; i++)
{
size_t j;
for (j = 0; j < n; j++)
{
free (Zd[i][j]), Zd[i][j] = NULL;
}
free (Zd[i]), Zd[i] = NULL;
}
free (Zd);
}
int ***m3_create (size_t const n)
{
/* allocate the arrays of pointers (x) */
int ***Zd = malloc (n * sizeof *Zd);
if (Zd != NULL)
{
size_t i;
/* clean the array of pointers (x) */
for (i = 0; i < n; i++)
{
Zd[i] = NULL;
}
for (i = 0; Zd != NULL && i < n; i++)
{
/* allocate the arrays of pointers (y) */
Zd[i] = malloc (n * sizeof *Zd[i]);
if (Zd[i] != NULL)
{
size_t j;
/* clean the array of pointers (y) */
for (j = 0; j < n; j++)
{
Zd[i][j] = NULL;
}
for (j = 0; j < n; j++)
{
Zd[i][j] = malloc (n * sizeof *Zd[i][j]);
if (Zd[i][j] != NULL)
{
size_t k;
/* fill the data with its linear index */
for (k = 0; k < n; k++)
{
Zd[i][j][k] = (n * n * i) + (n * j) + k;
}
}
else
{
m3_delete (Zd, n), Zd = NULL;
break;
}
}
}
else
{
m3_delete (Zd, n), Zd = NULL;
}
}
}
return Zd;
}
void m3_print (int **const *const Zd, size_t const n)
{
size_t i;
for (i = 0; i < n; i++)
{
size_t j;
for (j = 0; j < n; j++)
{
size_t k;
printf ("[" );
for (k = 0; k < n; k++)
{
printf ("%3d ", Zd[i][j][k]);
}
printf ("]\n" );
}
printf ("\n" );
}
}
int main (void)
{
size_t const n = 4;
int ***m = m3_create (n);
if (m != NULL)
{
m3_print (m, n);
m3_delete (m, n), m = NULL;
}
return 0;
}
|