user3657834
user3657834

Reputation: 259

What is causing Segmentation Fault in this code?

I am currently studying C implementations of Linux terminal commands in class but I can't seem to get the following example to run on my machine. I'm using the latest distro of Ubuntu. It will compile but with a warning. "assignment makes pointer from integer without a cast" it refers to the line with a=ctime(&n->ut_time); I found this code online. It is suppose to replicate the terminal command "Who" to display system users. I'm simply trying to study how it works but I cant seem to get it to run. Any help or explanations would be appreciated.

#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();
 }
}

Upvotes: 0

Views: 118

Answers (1)

Jonathan Leffler
Jonathan Leffler

Reputation: 753455

Transferring comment to answer

The compiler is telling you you've not got #include <time.h> so ctime() is assumed to return an int and not a char *. All hell breaks loose (segmentation faults, etc) because you are not paying attention to the compiler warnings.

Remember, while you're learning C, the compiler knows a lot more about C than you do. Its warnings should be heeded. (When you know C reasonably well, you still pay attention to the compiler warnings - and make the code compile cleanly without warnings. I use gcc -Wall -Wextra -Werror and some extra options — usually -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Wold-style-declaration; sometimes -Wshadow, -pedantic; and occasionally a few others.)

Upvotes: 2

Related Questions