Как-то так по моему. Не проверял.
void counter_of_all_word(int count, int max, char**mass_of_all_word,int *mass)
{
char **empty_mass = (char**)calloc(count, sizeof(char*));
int *count_mass = (int*)calloc(count, sizeof(int));
int i, j, k;
for (i = 0; i < count; i++)
{
for(j=i;j<count;++j)
{
// Ищем в mass_of_all_word строку не существующую в empty_mass
for(k=0;k<i;++k)
if(strcmp(empty_mass[k], mass_of_all_word[j])
break;
// Строка найдена - mass_of_all_word[j]
if(k == i)
{
empty_mass[i] = mass_of_all_word[j];
count_mass[i] = 1;
break;
}
}
// Не существующие строки кончились
if(j == count)
break;
// Теперь считаем количество новых строк
++j;
if(j < count)
for (; j < count; j++)
if(strcmp(empty_mass[i], mass_of_all_word[j])
++count_mass[i];
}
/*
На выходе из цикла в empty_mass уникальные слова. Количество уникальных строк в i. В count_mass количество каждого уникального слова в mass_of_all_word.
Осталось придумать как всю эту красоту вернуть вызывающей функции.
Здесь я не копирую строки, а просто присваиваю указатель строки из mass_of_all_word в empty_mass. Если нужно копировать строки в empty_mass, то нужно выделить память под строку, затем функцией strcpy или memcpy скопировать строку.
*/
}
Сначала пытался разобрать ваши ошибки, но потом плюнул - проще написать код.
И разберитесь с указателями и строками в Си, вы явно не понимаете как с ними работать.
На счет возврата значений - послушайтесь совета
Павел Каптур определите структуру с двумя полями - указатель на строку и счетчик количества и работайте с массивом структур. Тогда просто будете возвращать этот массив структур. При этом память под массив структур можно выделять по максимальному количеству (count) либо отдельно под каждую найденную строку (тогда нужно выделять память под массив указателей на структуры размером в count и отдельно под каждую структуру), либо делать связный список :-) В общем задачка вроде простая, но из нее легко сделать довольно сложную.
И не забудьте потом всю эту память освободить.