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

등록 2001-02-12 23:49:00     조회 2
이름 조준기    

		malloc명령이나 calloc명령을 사용해서 명시적으로 자료가 들어갈 메모리를
확보해 주시면 됩니다.
 yday = malloc(...) 이렇게 하는건데 자세한 문법은 저도 자주 쓰는게 아니
라 책 찾아봐야겠군요. man malloc 하시면 엄청 자세한 문서가 나올겁니다.
 위의 문장을 사용하면 적절히 메모리를 할당해서 시작 주소를 yday포인터에
넣어 줍니다. 나머지는 일사천리. 마지막에 free(yday) 해서 고생한 메모리
들을 휴가나 보내시면 됩니다.
 리눅스 C에서 처음 접해보셨듯이, 메모리의 직접적인 사용은 재미있기도 하
고, 강력하기도 하지만, 그만큼 위험하기도 합니다.(포인터-메모리의 경우라
면 꽁생원이라는 소리를 들어도 좋으니 법대로 하시기 바랍니다...)
 즐거운 C 코딩!
 : : : 	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: RE: [질문]또 질문여.. 씨언어 관련!  yong  2001.02.12  ....
  답장 RE: RE: RE: [질문]또 질문여.. 씨언어 관련!  조준기  2001.02.12  ....
Register [ localhost 목록보기 윗글 아랫글
글쓰기
답장쓰기 수정 삭제
정규표현식 [ 상세 검색 ]
페이지로딩: [ 1.19 초 ] 작업시간: [ 0.66 초 ]

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: 1789631670
System by WYZsoft, HDD by I.O.Linux, Mizi Research, Embryo, WOWLINUX, Domain by SarangNet, Network by KrLine.