C语言中char-getgrouplist的返回链

C语言中char-getgrouplist的返回链,c,arrays,linux,pointers,char,C,Arrays,Linux,Pointers,Char,我对返回的字符有问题。我知道如果标签是字符串,我必须分配内存并分配给它,但它是一个字符。我不知道该往哪边走:创建双数组字符*选项卡[字符数][字数]或尝试串联。函数必须返回字符链 例如:[用户、根用户、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 * t

我对返回的字符有问题。我知道如果标签是字符串,我必须分配内存并分配给它,但它是一个字符。我不知道该往哪边走:创建双数组字符*选项卡[字符数][字数]或尝试串联。函数必须返回字符链 例如:[用户、根用户、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;
        }   

}选项卡是一个字符数组。如果您想要一个字符串数组一个字符数组,如在[user,root,sudo]中,您可以使用

char **tab = (char **) malloc(sizeof(char *) * ngroups));
还要注意,malloc现在使用sizeofchar*而不是sizeofchar

后来:

tab[i] = gr->gr_name;    
其中,我假设gr_name是指向组名的指针,并且在函数之后仍然可以访问

现在我可能误解了你的问题,因为它不是很清楚。 无论哪种方式,如果返回tab,您都希望返回指向它的指针,而不是取消引用它:

return tab;

如果返回*tab,将返回tab指向的第一个字符。

int ngroups=0;char*tab=malloc sizeof char*n组不分配任何内存。撇开;缺少。对于开始,ngroups具有0,但由于getgrouplist,ngroups具有新值。我注意到;缺少,这不是本文的重点…是的,但是您没有为tab重新分配内存,而是使用tab[i]=gr->gr\u name对其进行索引;关于;我把它描述为一个旁白。即使ngroups最终得到一个非零值,你也不应该调用malloc0。另外,在初始化ngroups后,您不会重试malloc,因此不会为tab分配内存。我忘记添加~gr->gr_name`返回字符*。如果我返回*tab,则我拥有数组的最后一个字符。如果我更改为return tab,我将使用null。tab是指向字符的指针*tab是指针指向的第一个字符。实际上,*tab与tab[0]完全相同,因为编译器总是将[i]转换为*A+i。若tab返回null,则将其分配给null。在使用malloc时,您应该始终通过验证malloc没有返回null来检查malloc是否工作。由于要返回字符数组,因此需要返回指向该字符数组的指针。