Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[3187] Re:*argv[] 를 argv[]로 바꿀 수 없는건가요?
Starlet [starlet5] 1518 읽음    2004-01-26 06:45
실행파일이 실행되려면 메모리로 실행파일을 읽어들여야겠죠? 메모리로 실행파일을 읽어들일때 도스는 일종의 헤더로 실행파일이 로드될 메모리 제일 앞에 PSP(Program Segment Prefix) 라는 부분을 만듭니다. 여기에는 코드세크먼트, 데이터세그먼트 정보, 실행파일을 실행했을때 파라미터로 준 값 등이 기록됩니다. main에 *argv[]가 있으면 내부적으로 setargv라는 함수가 호출됩니다. 이 setargv 함수가 PSP에서 파라미터 부분을 읽어와 main 호출전에 파라미터를 정리한 후 이 문자열의 주소를 차례대로 스택에 push합니다.(정리가 필요한 이유는 PSP에 저장되는것은 "test 45" 이렇게 그대로 저장되며 argv로 따로따로 읽으려면 각 문자열을 띄어쓰기 단위로 끊어줘야 하기 떄문이죠) *argv[] 가 가리키는 위치가 바로 이 스택의 위치입니다. 만약 char *argv[]라 쓰지 않고 char argv[]라고 쓰면 argv[]가 char형인 1byte가 되며 첫번째 파라미터는 제대로 출력되어도 (첫번째 파라미터의 위치가 0xFFFF이기 때문에 0xFF가 int형으로 바뀌어도 똑같이 0xFFFF가 됩니다.) argv[1]이 제대로 출력되지 않습니다.(*가 붙으면 주소로 인식해 *char는 메모리상에서 int크기를 가집니다.) 그래서 이것을 차라리 int argv[]로 쓰면 char *argv[]와 같은 결과를 볼수 있습니다.

설명이 꽤 복잡해졌는데 결론은 char *argv[]를 char argv[]로 쓸수 없으며 char argv[]로 썼을때 argv에 들어가는 값은 스택의 첫번째 위치입니다.
제 생각에는 argv가 이런일을 하니 그냥 쓰자 하는것보다 이렇게 하면 어떻게 될까 궁금해하는 모습이 더 보기 좋은것 같습니다. 나중에 기회가 되시면 printf나 다른 이미 구현된 함수들도 한번 직접 구현해 보시는것도 좋을듯 합니다.


김병주 님이 쓰신 글 :
: #include <stdio.h>
: void main(int argc, char *argv[])
: {
:         printf("%d%s", argc,argv[1]);
: }
:
: 하고서 test.exe 파일로 만들고서
:
: test 45라고 실행시키면 결과값으로
:
: 245가 나옵니다.
:
: 여기서 *argv[]부분을 argv[]라고 바꾸면 argv[]에 입력되는 값이 무엇이 되는건가요?
:
: 공부하다 보니 엉뚱한 것에 자꾸 의문이 생기네요 ^^;;
:
:

+ -

관련 글 리스트
3184 *argv[] 를 argv[]로 바꿀 수 없는건가요? 김병주 1305 2004/01/23
4346     Re:*argv[] 를 argv[]로 바꿀 수 없는건가요? 김병주 1287 2004/01/25
3187     Re:*argv[] 를 argv[]로 바꿀 수 없는건가요? Starlet 1518 2004/01/26
4345         Re:Re:*argv[] 를 argv[]로 바꿀 수 없는건가요? 김병주 1184 2004/01/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.