2014-10-01 3 views
0

현재 클래스에서 Linux 터미널 명령의 C 구현을 연구하고 있지만 다음 예제를 내 컴퓨터에서 실행할 수없는 것으로 보입니다. 우분투의 최신 배포판을 사용하고 있습니다. 그것은 컴파일되지만 경고와 함께. "할당은 캐스트가없는 정수에서 포인터를 만듭니다"라는 말은 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(); 
} 
} 
+7

컴파일러가'#include '을 가지고 있지 않다는 것을 알려주기 때문에'ctime()'은'char'가 아닌'int'를 반환한다고 가정합니다. 컴파일러 경고에주의를 기울이지 않기 때문에 모든 지옥은 느슨해집니다 (세그먼테이션 결함 등). C를 배우는 동안 컴파일러는 C보다 훨씬 많은 것을 알고 있음을 기억하십시오. 그것의 경고는주의를 기울여야한다. (C가 합리적으로 잘 알면, 컴파일러의 경고에도주의를 기울여야하며 경고없이 코드를 깔끔하게 컴파일해야한다. gcc -Wall -Wextra -Werror와 몇 가지 추가 옵션을 사용한다.) –

+0

정말 고마워! 그것은 작동하는 것처럼 보였다. – user3657834

+0

메모로서'printf' 형식 문자열에 익숙하지 않은 것 같습니다. 처음 세 개의'printf' 호출을'printf (% - 9s % -12s ", n -> ut_user, n> ut_line)'로 대체 할 수 있습니다 ('a'에 대한 할당은 이러한 호출을 유추하지 않습니다). 마지막 세개는'printf ("(% s) \ n", n -> ut_host)'이다. 어떤 문서를 보시오 – mafso

답변

2

전송 주석은 컴파일러는 당신이 그렇게 ctime()#include <time.h> 없어 한을 알려주하는 int 아니라 char *을 반환 가정

응답합니다. 컴파일러 경고에주의를 기울이지 않기 때문에 모든 지옥은 느슨해집니다 (세그먼테이션 결함 등).

C를 배우는 동안 컴파일러는 C보다 C에 대해 많이 알고 있음을 기억하십시오. 그것의 경고는주의를 기울여야한다. 컴파일러 경고에주의를 기울이고 경고없이 코드를 깔끔하게 컴파일하십시오. gcc -Wall -Wextra -Werror과 약간의 추가 옵션 — (대개 -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Wold-style-declaration)을 사용합니다. -Wshadow, -pedantic 및 경우에 따라 약간의 차이가 있습니다.

관련 문제