Возврат цепочки char - getgrouplist в C - PullRequest
0 голосов
/ 09 марта 2019

У меня проблема с возвращенным символом.Я знаю, что мне нужно было выделить память и назначить вкладке, если это была строка. Но это символ.Я не знаю, на чьей стороне мне идти: создать двойной массив (char * tab [число символов] [количество слов]) или попробовать объединение.Функция должна возвращать цепочку символов (например: [user, root, sudo]).

Вот моя функция:

char * groupsName(char *ut ){ //ut it's a user nick
struct group *gr;
int i;
struct passwd *pw;
gid_t *groups;
int ngroups=0;
char * tab= malloc ( sizeof (char) * ngroups)
        pw =getpwnam(ut);
        if(getgrouplist(ut, pw->pw_gid, groups, &ngroups)<0){
            groups=malloc(ngroups *sizeof(gid_t));
            getgrouplist(ut, pw->pw_gid, groups, &ngroups);

           for(i=0;i<ngroups;i++){
                gr=getgrgid(groups[i]);
                if(gr!= NULL)  tab[i] = gr->gr_name; 
            }
        return *tab;
        }   

}

1 Ответ

0 голосов
/ 09 марта 2019

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.

...