#include <pwd.h>
#include <stdio.h>
struct passwd* Getpwnam_(const char* name)
{
static struct passwd* passwd;
while((passwd=getpwent())!=NULL) /* get pw entry line by line */
{
if(strcmp(passwd->pw_name, name)==0) /* find the same name */
return passwd;
}
if(passwd==NULL) /* there is no matching name */
return NULL;
}
int
main(void)
{
printf("%ld %ld\n", (long)(Getpwnam_("root")->pw_uid), (long)(Getpwnam_("cho")->pw_uid));
}
在上面的代码中,当我使用以下主要功能时:
printf("%ld\n", (long)(Getpwnam_("root")->pw_uid));
printf("%ld\n", (long)(Getpwnam_("cho")->pw_uid));
它运转良好。但是,当我使用一个
printf()
和两个Getpwnam_()
作为参数时,就会出现分段错误。我认为我的代码操作没有问题。但是,为什么这会给我一个分割错误呢??
最佳答案
您需要在调用setpwent()
之间用Getpwnam_()
倒带密码数据库。
假设您的应用程序首先调用Getpwnam_("cho")
。如果数据库中的"root"
早于"cho"
,则在搜索中的一个点getpwent()
将返回"root"
,但您的搜索将放弃它,因为它与"cho"
不同。稍后getpwent()
将返回"cho"
这是有效的结果。
如果下一次应用程序调用Getpwnam_("root")
,getpwent()
将从上次调用时留下的点开始返回条目,这在数据库中超出了"root"
和"cho"
的范围。由于"root"
将不再返回,搜索将不会得到结果,您将得到一个空指针,从而导致程序崩溃。
关于c - 使用静态变量时的分割错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37043815/