LinuxSir.cn,穿越时空的Linuxsir!

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

刚入门的菜鸟 想问个不太能理解的问题

[复制链接]
发表于 2006-4-9 22:46:18 | 显示全部楼层 |阅读模式
源代码如下:

#include <stdio.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>

#define SHOWHOST

void show_info(struct utmp *utbufp);

int main()
{
        struct utmp current_record;
        int utmpfd;
        int reclen=sizeof(current_record);
       
        if((utmpfd=open(UTMP_FILE,O_RDONLY))==-1){
                perror(UTMP_FILE);
                exit(1);
        }
       
        while(read(utmpfd,&current_record,reclen)==reclen)
                show_info(&current_record);
        close(utmpfd);
        return 0;
}

void show_info(struct utmp *utbufp)
{
        printf("%-8.8s",utbufp->ut_name);       
        printf(" ");
        printf("%-8.8s",utbufp->ut_line);
        printf(" ");
        printf("%-8.8s",utbufp->ut_time);
        printf(" ");
#ifdef SHOWHOST
        printf("(%s)",utbufp->ut_host);
#endif
        printf("\n");
}

gcc的调试结果是这样的:
Segmentation fault

请问各位可有知道这是什么原因造成的
我的系统是RedHat 9.0
用的gcc是系统自带的版本

在此谢谢了
发表于 2006-4-10 02:09:37 | 显示全部楼层
printf("%-8.8s",utbufp->ut_time);
这句错了
看了看/usr/include/bits/utmp.h中的定义,utbufp->ut_time实际上是utbufp类型的成员ut_tv的tv_sec成员,该类型为int32_t,它不是指针,所以你printf是妄图输出值为该整数的地址处的一段字符串,所以segment fault,那段地址不知道在哪里。
改成printf ("%d", utbufp->ut_time);或者是其他你希望的数值格式都可以。

btw:你搞的这段代码不像是菜鸟搞的东东啊;)
回复 支持 反对

使用道具 举报

发表于 2006-4-10 02:10:43 | 显示全部楼层
这玩艺一般光看是看不出来的,得搬出工具来。
编译的时候用-g选项,用gdb调试一下就出来了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-10 09:06:13 | 显示全部楼层
谢谢littlepig兄! 我接触linux才几个月,写代码也是最近的事情,这段代码是人家写好的,我拿来调试着看的,所以菜鸟是肯定的了.不过经过你一提醒我才想起来,我居然连gdb都没用就上来提问题,实在是灰常滴可耻.....谢谢小猪如此有耐心回答
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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