window에서는 tc 2.01로 잘만 되던 프로그램이 리눅스에서 gcc로 컴파일
한 후 실행하면 "Segmentation fault"라는 오류메세지가 나옵니다.
의문점은 이들이 컴파일 시에는 전혀 에러 메세지가 나오지 않다가 컴파일
된 파일을 실행시키면 나온다는 겁니다.
문제의 프로그램들은 다음과 같습니다.
먼저 이건 날짜를 넣으면 그 해에 지나간 날수를 출력하고
햇수와 지나간 날짜를 넣으면 거꾸로 날짜를 출력하는 프로그램임다.
문제의 'Segmentation fault'가 발생하는 부분은 [[,]]안의 부분입니다.
#include<stdio.h>
char *smonth[12]={"January","February","March","April","May","June","July","August","September","October","November",
"December"}; char daytab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
void day_of_year(int year,int month,int *day){
int i, leap;
leap= year%4==0&&year%100!=0||year%400==0;
for(i=1;i<month;i++) *day+=daytab[leap][i];
return *day;
}
void month_day(int year,int yearday,int *pmonth,int *pday){
int i,leap;
leap= year%4==0&&year%100!=0||year%400==0;
for(i=1;yearday>daytab[leap][i];i++) yearday-=daytab[leap][i];
*pmonth=i;
*pday=yearday;
}
main(){
int day,month,year,days,*yday;
int *pmonth,*pday;
char t;
printf("%s%s",*(smonth+1),*(smonth+2));
printf("If you want know days from date, type 'd',");
printf(" and date frem days, type 'm'.");
scanf("%c",&t);
switch(t){
case 'd': goto days;
case 'm': goto date;
default : printf("Error : Type d or m");exit(3);
}
days:
printf("Input year, month, and day :");
[[scanf("%d%d%d",&year,&month,yday);]] <-- 메세지 발생
day_of_year(year,month,yday);
printf("It is %dth day of year %d",*yday,year);
exit(0);
date:
printf("Input year and days :");
scanf("%d%d",&year,&days);
month_day(year,days,pmonth,pday);
printf("The Date is %s %d, %d",*(smonth+*pmonth-1),*pday,year);
exit(1);
}
따라서 'date:'이하부분, 즉 날수를 날짜로 바꾸는 부분은 정상적으로
돌아갑니다.
아시는 분은 답변 부탁드리겠습니다. 그럼~--이 곳에 서명을 적어주십시오.
서명? ㅅ ㅓ ㅁ ㅕ
ㅇ