>> Read Reply from No. 0 article  
RE: RE: [질문]또 질문여.. 씨언어 관련!

등록 2001-02-12 19:03:00     조회 1
이름 yong    

		: : 	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 언어로 실제 자료가 들어가도록
 포인터를 선언할 때는 어떻게 해줘야 하나요?
  답변 또 주시면 더 고맙구요, 안 그러셔도 고맙습니다.--이 곳에 서명을 적어주십시오.
서명? ㅅ ㅓ ㅁ ㅕ
              ㅇ
이름
암호


>> 관련글
  답장 RE: [질문]또 질문여.. 씨언어 관련!  조준기  2001.02.12  ....
  답장 RE: RE: [질문]또 질문여.. 씨언어 관련!  yong  2001.02.12  ....
Register [ localhost 목록보기 윗글 아랫글
글쓰기
답장쓰기 수정 삭제
정규표현식 [ 상세 검색 ]
페이지로딩: [ 0.19 초 ] 작업시간: [ 0 초 ]

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved
[TOP]

적수네 동네
+
| 적수네 동네
| 공부방
| 리눅스 잡지 서고
| LSN 소스
| 링크 모음
+---+
게시판
+
| 떠들어보세!
| 질문과 답변
| 새소식과 정보
| 1원짜리 팁?
| 대화방
+---+
칼럼?
+
| 세하 훔쳐보기
| Welcome2nite
| 혜진의 염장판
+---+
리눅스 상표권
+
| 반대 서명란
| 토론 게시판
+---+
GNU
+
| GNU 선언문
| GNU GPL
| GNU 미러 목록
+---+
프로젝트?
+
| 리눅스카운터
| RC5DES
| 실질헌법 제작
+---+
커널 소식
+
| 안정 버젼: 2.4.14
+---+
테마 선택
+
LSN 방송국?
+
| OFF AIR
+---+
회원
+
| 로그인
+---+
[ 적수네 동네 ] [ 리눅스 상표권 독점 반대 ] [ 한글 리눅스 문서 프로젝트 ] [ KrLine ] [ 사랑넷 ] [ Valid HTML 4.0! ] [ SlashDot ] [ Freshmeat ]
Copyleft (C) 1998-2001 Byeong-Chan Kim . License
TIME: 1789627885
System by WYZsoft, HDD by I.O.Linux, Mizi Research, Embryo, WOWLINUX, Domain by SarangNet, Network by KrLine.