让我们先查看我的代码。
#include <stdio.h>
#include <grp.h>
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc, char** argv){
struct group *grp;
struct group *tmpGrp;
struct passwd *pw;
int n;
gid_t gid;
pw=getpwnam(argv[1]);
gid=pw->pw_gid;
printf(“%s”,pw->pw_name);
printf(“\n”);
grp = getgrgid(gid);
char *mainGrp = grp->grame;
printf(“out : %s\t”, mainGrp);
while((tmpGrp=getgrgent())!=NULL){
n=0;
printf(“in : %s\t”,mainGrp);
}
printf(“\n”);
return 0;
}
它的输出如下:
root
out : root in : root in : other in : bin in : sys ....
如您所见,当同时使用getgrnam()和getgrent()时,组名称会更改,即使是以字符串分配。
我想要像
这样的结果root
out : root in : root in : root in : root ....
代码例程getgrgent()就在分配到字符串之后,但为什么会这样呢?以及如何解决它?
测试操作系统:Solaris 10
测试编译器:GCC
答案 0 :(得分:2)
来自this (Linux) manual page for getgrent
:
返回值可能指向静态区域,可能会被后续调用
getgrent()
,getgrgid(3)
或getgrnam(3)
覆盖。
即使您使用相同的指针,也会得到不同的名称,因为这些函数返回的数据是单个静态和共享缓冲区。
the POSIX getgrent
reference specification也暗示了这一点。
如果您希望mainGrp
不更改,则需要复制实际内容。例如。将mainGrp
设为数组并使用strcpy
。