#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/

10-09 03:23