3次元配列をポインタで動的メモリ割り当てするのってこれであってる?

#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j;
int ***z;
z = (int ***)malloc( 3 * sizeof(int **));
z[0] = (int **)malloc( 4 * sizeof(int *));
z[0][0] = (int *)malloc( 3 * 4 * 5 * sizeof(int));

for(i=0;i<3;i++){
z[i] = z[0] + i * 4;
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
z[i][j] = z[0][0] + i * 5;
}
}

free(z);
return 0;
}