Причина вашей ошибки компилятора проста, но не ответ на то, что вы действительно хотите сделать. Вы заявляете, что функция возвращает символ *, а возвращает символ **.
Не зная подробностей того, что вы делаете, я предполагаю, что одна из двух вещей верна:
1) Назначение функции - создать и вернуть массив строк.
2) Функция выполняет некоторые операции с массивом строк.
Если # 1 верно, вам нужно несколько вызовов malloc для этой работы (это действительно можно сделать только с двумя, но для простоты я буду использовать несколько).
Если вы не знаете, какой должен быть массив, объявление вашей функции должно выглядеть так:
char ** allocateStrings ( int numberOfStrings, int strLength );
Причина этого в том, что вы, по сути, возвращаете указатель на массив указателей, и вам нужно знать, сколько строк и какова длина каждой строки.
char ** allocateStrings ( int numberOfStrings, int strLength )
{
int i;
//The first line is allocating an array of pointers to chars, not actually allocating any strings itself
char ** retVal = ( char ** ) malloc ( sizeof ( char * ) * numberOfStrings );
//For each string, we need to malloc strLength chars
for ( i = 0; i < numberOfStrings; i ++ )
{
//Allocate one extra char for the null pointer at the end
retVal [ i ] = ( char * ) malloc ( sizeof ( char ) * ( strLength + 1 ) );
}
return retVal;
}
Как заметил кто-то другой, лучше всего иметь то, что делает распределение, и делать освобождение. Поэтому необходима функция очистки.
void cleanupStrings ( char ** strArray, int numberOfStrings )
{
int i;
for ( i = 0; i < numberOfStrings; i ++ )
{
//Should be checking to see if this is a null pointer.
free ( strArray [ i ] );
}
//Once the strings themselves are freed, free the actual array itself.
free ( strArray );
}
Теперь имейте в виду, что после вызова функции очистки у вас больше нет доступа к массиву. Попытка использовать его, скорее всего, приведет к сбою приложения.
Если # 2 истинно, то вы хотите выделить строки, обработать строки и очистить их. Вы должны использовать две функции выше для распределения / освобождения ваших строк, а затем третью функцию, чтобы делать с ними что угодно.
void processStrings ( char ** strArray, int numberOfStrings, int strLength );