#define COLS 10
typedef int Row[COLS];
typedef Row* Matrix;
/* It's two pointers container */
typedef struct
{
int* arr1d; /* Pointer to 1D array of int */
Matrix arr2d; /* Pointer to 2D array of int */
/* array of int[COLS] arrays */
} DynArr;
/* Initialize the structure, allocate it if pdyn == 0 */
DynArr* InitDynArr(DynArr* pdyn, int n1d, int n2d)
{
int sz1d;
int sz2d;
int i, j;
sz1d = n1d*sizeof(int);
sz2d = n2d*sizeof(Row);
if (!pdyn) /* dynamic allocation */
{
pdyn = (DynArr*)malloc(sizeof(DynArr)); /*cast for C++*/
}
pdyn->arr1d = (int*)malloc(sz1d); /* cast for C++ */
pdyn->arr2d = (Matrix)malloc(sz2d); /* cast for C++ */
/* Initialization */
for (i = 0; i < n1d; ++i)
pdyn->arr1d[i] = 0;
for (i = 0; i < n2d; ++i)
for (j = 0; j < COLS; ++j)
pdyn->arr2d[i][j] = 0;
/* See (uncomment):
{
printf("Row:%u Matrix: %u Matrix*: %u %u %u\n",
sizeof(Row),sizeof(Matrix),sizeof(pdyn->arr2d[0],sz1d,sz2d);
int* pi;
Row* pp;
pi = &pdyn->arr2d[0][1];
pp = pdyn->arr2d;
printf("%p %p\n",pp,pi);
}
*/
return pdyn;
}
/* Free arrays, not a structure */
void ClearDynArr(DynArr* pdyn)
{
if (pdyn)
{
free(pdyn->arr1d);
pdyn->arr1d = 0;
free(pdyn->arr2d);
pdyn->arr2d = 0;
}
}
/* Free a structure with its contents */
void FreeDynArr(DynArr* pdyn)
{
if (pdyn)
{
ClearDynArr(pdyn);
free(pdyn);
}
}
int main()
{
DynArr* p;
DynArr local;
p = InitDynArr(0,10,10);
printf("%u\n",sizeof(DynArr));
InitDynArr(&local,100,100);
FreeDynArr(p);
ClearDynArr(&local);
return 0;
}