#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if 0

int func(int a1_row, int a1_col, int a2_row, int a2_col, int a3_row, int a3_col, double ***a1_dst, int ***a2_dst, float ***a3_dst)
{
    double **a1;
	int **a2;
	float ** a3;
	int i;

	a1 = (double **)malloc(sizeof(double *) * a1_row);
	for(i = 0; i < a1_row; ++i)
		a1[i] = (double *)malloc(sizeof(double) * a1_col);

	a2 = (int **)malloc(sizeof(int *) * a2_row);
	for(i = 0; i < a2_row; ++i)
		a2[i] = (int *)malloc(sizeof(int) * a2_col);

	a3 = (float **)malloc(sizeof(float *) * a3_row);
	for(i = 0; i < a3_row; ++i)
		a3[i] = (float *)malloc(sizeof(float) * a3_col);

	*a1_dst = a1;
	*a2_dst = a2;
	*a3_dst = a3;
	return 1;
}

#else

int func(int a1_row, int a1_col, int a2_row, int a2_col, int a3_row, int a3_col, double ***a1_dst, int ***a2_dst, float ***a3_dst)
{
	double **a1 = NULL;
	int **a2 = NULL;
	float **a3 = NULL;
	int i;
	int suceeded = 1;

	a1 = (double **)malloc(sizeof(double *) * a1_row);
	suceeded = (int)a1;
	if(suceeded)
	{
		memset(a1, 0, sizeof(double *) * a1_row);
	}
	for(i = 0; i < a1_row && suceeded; ++i)
	{
		a1[i] = (double *)malloc(sizeof(double) * a1_col);
		suceeded = (int)a1[i];
	}

	if(suceeded)
	{
		a2 = (int **)malloc(sizeof(int *) * a2_row);
		suceeded = (int)a2;
	}
	if(suceeded)
	{
		memset(a2, 0, sizeof(int *) * a2_row);
	}
	for(i = 0; i < a2_row && suceeded; ++i)
	{
		a2[i] = (int *)malloc(sizeof(int) * a2_col);
		suceeded = (int)a2[i];
	}

	if(suceeded)
	{
		a3 = (float **)malloc(sizeof(float *) * a3_row);
		suceeded = (int)a3;
	}
	if(suceeded)
	{
		memset(a3, 0, sizeof(float *) * a3_row);
	}
	for(i = 0; i < a3_row && suceeded; ++i)
	{
		a3[i] = (float *)malloc(sizeof(float) * a3_col);
		suceeded = (int)a3[i];
	}

	if(suceeded)
	{
		*a1_dst = a1;
		*a2_dst = a2;
		*a3_dst = a3;
	}
	else
	{
		if(a3)
		{
			for(i = a3_row - 1; i >= 0; --i)
			{
				if(a3[i])
					free(a3[i]);
			}
			free(a3);
		}
		if(a2)
		{
			for(i = a2_row - 1; i >= 0; --i)
			{
				if(a2[i])
					free(a2[i]);
			}
			free(a2);
		}
		if(a1)
		{
			for(i = a1_row - 1; i >= 0; --i)
			{
				if(a1[i])
					free(a1[i]);
			}
			free(a1);
		}
	}
	return suceeded? 1: 0;
}

#endif

#define A1_ROW (1000)
#define A1_COL (2000)
#define A2_ROW (3000)
#define A2_COL (4000)
#define A3_ROW (5000)
#define A3_COL (6000)

int main(void)
{
	double **a1 = NULL;
	int **a2 = NULL;
	float **a3 = NULL;
	int result = func(A1_ROW, A1_COL, A2_ROW, A2_COL, A3_ROW, A3_COL, &a1, &a2, &a3);

	printf("result = %d\n", result);

	if(result)
	{
		int i;
		for(i = A3_ROW - 1; i >= 0; --i)
		{

			free(a3[i]);
		}
		free(a3);

		for(i = A2_ROW - 1; i >= 0; --i)
		{
			free(a2[i]);
		}
		free(a2);

		for(i = A1_ROW - 1; i >= 0; --i)
		{
			free(a1[i]);
		}
		free(a1);
	}

	return 0;
}