Один из способов сделать следующее:
char **arr = (char**) calloc(num_elements, sizeof(char*));
for ( i = 0; i < num_elements; i++ )
{
arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}
Довольно ясно, что здесь происходит - сначала вы инициализируете массив указателей, затем для каждого указателя в этом массиве вы выделяете массив символов.
Вы можете заключить это в функцию. Вам также понадобится free (), после использования, например:
for ( i = 0; i < num_elements; i++ )
{
free(arr[i]);
}
free(arr);
Я думаю, что это самый простой способ сделать то, что вам нужно.