在此代码中导致分段错误的原因是什么?

时间:2014-10-01 23:33:31

标签: c

我目前正在课堂上学习Linux终端命令的C实现,但我似乎无法在我的机器上运行以下示例。我正在使用最新的Ubuntu发行版。它会编译但有警告。 "赋值使得整数指针不带强制转换"它指的是a = ctime(& n-> ut_time)的行;我在网上找到了这个代码。假设复制终端命令" Who"显示系统用户。我只是试图研究它是如何工作的,但我似乎无法让它运行起来。任何帮助或解释将不胜感激。

#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);
   a=ctime(&n->ut_time);
   printf(" ");
   for(i=4;i<16;i++)
   {
    printf("%c",a[i]);
   }
   printf(" (");
   printf("%s",n->ut_host);
   printf(")\n");
  }
  n=getutent();
 }
}

1 个答案:

答案 0 :(得分:2)

转移评论以回答

编译器告诉你,你没有#include <time.h>因此假定ctime()返回int而不是char *。所有的地狱都会破裂(分段错误等),因为你没有注意编译器的警告。

请记住,在您学习C的同时,编译器对C的了解远远超过您。应该注意它的警告。 (当你比较熟悉C时,你仍然会注意编译器警告 - 并使代码编译干净而没有警告。我使用gcc -Wall -Wextra -Werror和一些额外的选项 - 通常-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Wold-style-declaration;有时候{{1} },-Wshadow;偶尔还有其他一些。)