我有一个名为allloggedin.c
的程序,其目的是显示所有已登录的用户。
每当我尝试在终端上运行它(使用gcc)时,它会给出错误 "分段错误(核心转储)"。
#include<stdio.h>
#include<sys/utsname.h>
#include<utmp.h>
int main(void)
{
struct utmp *n;
char *a;
int i;
setutent();
n=getutent();
while(n!=NULL)
{
if(n->ut_type==7)
{
printf("%9s",n->ut_user);
printf("%12s",n->ut_line);
printf(" ");
for(i=4;i<16;i++)
printf("%c",a[i]);
printf(" (");
printf("%s10",n->ut_host);
printf(")");
printf("\n");
}
n=getutent();
}
}
有人能解释一下这个程序吗?
答案 0 :(得分:2)
你得到的分段错误是由于行:
printf("%c",a[i]);
由于您没有初始化指针a
,因此它可以指向任何地址,当您取消引用它时可能会导致分段错误。
我不确定你要在for循环中打印什么,所以我完全从代码中删除了它。
这是代码的清理版本:
#include<stdio.h>
#include<sys/utsname.h>
#include<utmp.h>
int main(void)
{
struct utmp *n;
setutent();
n=getutent();
while(n) {
if(n->ut_type==USER_PROCESS) {
printf("%9s%12s (%s)\n", n->ut_user, n->ut_line, n->ut_host);
}
n=getutent();
}
return 0;
}
我用适当的宏USER_PROCESS
替换了数字7。此外,您可以将所有打印件放在一个printf
调用中。
所以程序基本上做的是为每个用户获取utmp结构并以一种奇特的方式打印它。
有关所用函数和utmp结构的更多信息,您可以查看utmp.h参考。