>> Edit article
이름
제목
패스워드
: : int day,month,year,days,*yday; : ^^^^^^ ==> 이놈이 문제! : : [[scanf("%d%d%d",&year,&month,yday);]] <-- 메세지 발생 : : year, month는 잘 읽어올 겁니다. 읽어온 값이 저장될 메모리가 잡혀 있 : 으니까요. 그런데 yday는 조금 상황이 틀립니다. 이것은 특정 메모리번지를 : 가리키는 포인터일 뿐, 실제 자료가 저장될 장소를 확보하지 않습니다. : 선언문에 보면 yday가 가리키는 메모리에 자료를 넣을 건데, 자료형이 정수 : 형이라고 말한 거죠. 또 포인터가 초기화되어 있지도 않네요. 이를테면 포 : 인터가 0x00000000번지를 가리키고 있고, 공교롭게도 그 번지는 님께서 짜 : 신 프로그램이 제어할 수 있는 범위가 아닐 경우라면 리눅스 커널이 강제로 : 해당 프로그램을 죽여서 전체적인 시스템이 망가지는걸 막게 됩니다. : 따라서 int *yday 와 같이 포인터로 선언한 것을 int yday와 같이 일반 정 : 수형 변수로 선언하시고, 프로그램 내부의 해당되는 부분(yday를 다루는 부 : 분 전부)를 적절히 고치시면 될겁니다. : : Turbo C에서 컴파일하고 실행했을때 에러가 안 난건 C컴파일러가 이상해 : 서 그런건 아니고, DOS 계열의 O/S는 애초에 멀티태스킹이 별로 고려되어 : 있지 않는 관계로 메모리관리가 엄격하지 않아서 그런겁니다. : : : : window에서는 tc 2.01로 잘만 되던 프로그램이 리눅스에서 gcc로 컴파일 : : : : 한 후 실행하면 "Segmentation fault"라는 오류메세지가 나옵니다. : : : : 의문점은 이들이 컴파일 시에는 전혀 에러 메세지가 나오지 않다가 컴파일 : : : : 된 파일을 실행시키면 나온다는 겁니다. : : : : 문제의 프로그램들은 다음과 같습니다. : : : : : : 먼저 이건 날짜를 넣으면 그 해에 지나간 날수를 출력하고 : : : : 햇수와 지나간 날짜를 넣으면 거꾸로 날짜를 출력하는 프로그램임다. : : : : 문제의 'Segmentation fault'가 발생하는 부분은 [[,]]안의 부분입니다. : : : : : : : : #include<stdio.h> : : : : char *smonth[12]= : {"January","February","March","April","May","June","July","August","Sep : tember","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:'이하부분, 즉 날수를 날짜로 바꾸는 부분은 정상적으로 : : : : 돌아갑니다. : : : : 아시는 분은 답변 부탁드리겠습니다. 그럼~ : : : : -- 답변 정말 감사드립니다. 그런데 리눅스에서 ANSI-C 언어로 실제 자료가 들어가도록 포인터를 선언할 때는 어떻게 해줘야 하나요? 답변 또 주시면 더 고맙구요, 안 그러셔도 고맙습니다.--이 곳에 서명을 적어주십시오. 서명? ㅅ ㅓ ㅁ ㅕ ㅇ
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved