LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 790|回复: 7

段错误问题

[复制链接]
发表于 2004-11-19 12:39:54 | 显示全部楼层 |阅读模式
我编了一个显示用户信息的c程序,没有语法错误,结果执行时出现如下错误:
代码:
/*   getname.c -Get login names   */

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<pwd.h>

int main(void)
{
   char    *login;
   struct  passwd *pentry;

   /* Get the login name */
   if((login=getlogin())==NULL) {
     perror("getlogin");
     exit(EXIT_FAILURE);
   }

   /* Display the password entry for login */
   if((pentry=getpwnam(login))==NULL)  {
      perror("getpwnam");
      exit(EXIT_FAILURE);
}

   /* Display the password entry */
   printf("user name: %s\n", pentry->pw_name);
   printf("UID      : %s\n", pentry->pw_uid);
   printf("GID      : %s\n", pentry->pw_gid);
   printf("home dir : %s\n", pentry->pw_dir);

      exit(EXIT_SUCCESS);
}


执行结果:
user name: chenchenfedora
段错误

请问是什么原因呢?
发表于 2004-11-19 13:11:09 | 显示全部楼层
  1. struct passwd {
  2.                     char    *pw_name;      /* user name */
  3.                     char    *pw_passwd;    /* user password */
  4.                     uid_t   pw_uid;        /* user id */
  5.                     gid_t   pw_gid;        /* group id */
  6.                     char    *pw_gecos;     /* real name */
  7.                     char    *pw_dir;       /* home directory */
  8.                     char    *pw_shell;     /* shell program */
  9.               };
复制代码
 楼主| 发表于 2004-11-19 13:20:21 | 显示全部楼层
谢谢,我明白了
发表于 2004-11-22 11:16:29 | 显示全部楼层
没看懂,小弟是菜鸟,高手解释一下。是不是uid_t和char不是放在同一个段(数据段)里,所以才会出现段错误?
发表于 2004-11-22 12:06:35 | 显示全部楼层
最初由 xd1198 发表
没看懂,小弟是菜鸟,高手解释一下。是不是uid_t和char不是放在同一个段(数据段)里,所以才会出现段错误?

是因为没有先申请放passwd这个结构的内村
 楼主| 发表于 2004-11-22 12:14:41 | 显示全部楼层
pw_uid 是uid_t类型,
pw_pid是pid_t类型,
pid_t和uid_t都是经过typdef定义的int类型,所以应该用%d,而不是%s
发表于 2004-11-22 14:25:24 | 显示全部楼层
最初由 chenchenlinux 发表
pw_uid 是uid_t类型,
pw_pid是pid_t类型,
pid_t和uid_t都是经过typdef定义的int类型,所以应该用%d,而不是%s

经过试验, chenchenlinux 兄说的是对的。对于passwd结构,应该是系统里已经存在的吧,而不是像lucifer兄所说的那样要给passwd结构分配内存。因为我们并没有生成一个新的节点。
发表于 2004-11-22 14:38:57 | 显示全部楼层
又看了一下,确实不需要自己分配,因为getpwnam的实现是在内部分配自己分配的。不过这样的话,这个内存还是需要用户自己来释放的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表