tab - это массив символов. Если вы хотите иметь массив строк (массив массивов символов), как в ["user", "root", "sudo"], вы можете использовать
char **tab = (char **) malloc(sizeof(char *) * ngroups));
Обратите внимание, что malloc теперь использует sizeof (char *), а не sizeof (char).
А потом позже:
tab[i] = gr->gr_name;
Где я предполагаю, что gr_name является указателем на имя группы и по-прежнему доступен после функции.
Теперь я мог бы неправильно понять ваш вопрос, так как он не очень понятен.
В любом случае, если вы возвращаете вкладку, вы хотите вернуть указатель на нее, а не разыменовывать ее:
return tab;
Если вы вернете *tab
, вы вернете первый символ, на который указывает tab
.