Последний вариант не прокатат. =) Значение указателя изменится при выделении памяти и при выходе из ф-ции это значение потеряется.. Будет memory leak.Значит, двойные указатели спасут отца русской демократии... =)
Хороший пример был в реализации LString карманной библиотечки ITCGI для написания CGI скриптов... Там что-то типа-того
typedef char* Lstring;
void createString(LString *value){
*value = (LString) malloc(size);
}
Если уж хочешь возвращать, то тогда выделяем память динамически в ф-ции
char *initMem(void){
return (char *)malloc(size)
}
Когда будешь применять двумерные массивы, доюавишь циклы при выделении памяти и будет типа
typedef mytype *char
mytype *getTable(void){
mytype *ret = (mytype *) malloc (sizeX);
for (int i = 0; i < sizeX;i++)
ret[i] = (char *)malloc (sizeY);
return ret;
}