|
푸른여우 님이 쓰신 글 :
: 제가 어제부터 C언어 공부를 시작했습니다..
:
: 늦게나마 관심이 생겨서요..^^
:
: 책에 있는 코딩을 그대로 따라하고 출력문이 나왔는데
:
: 에러는 없는데 이게 이상해서요..
:
: 다음은 코딩한거요..(책이랑 동일)
:
: #include <stdio.h>
:
: main()
:
: {
:
: int a=10, b=20, c=30, d=40;
:
: printf("a is %d b is %d c is %d d is %d\n",a,b,c,d);
:
: printf("a is %d b is %d c is %d d is %d\n",a,b,c,);
:
: printf("a is %d b is %d c is %d \n",a,b,c,d);
:
: printf("current directory is c:\\lang\\turboc\n");
:
: }
:
: 다음은 이렇게 코딩했을때 나오는 출력문..(책에 표시된것임)
:
: a is 10 b is 20 c is 30 d is 40
:
: a is 10 b is 20 c is 30 d is 56340
:
: a is 10 b is 20 c is 30
:
: current directory is c:\lang\turboc
:
: 다음은 제가 코딩한것 출력문
:
: a is 10 b is 20 c is 30 d is 40
:
: a is 10 b is 20 c is 30 d is 1340
:
: a is 10 b is 20 c is 30
:
: current directory is c:\\lang\\turboc
:
: 위에서 보셨다싶이 출력문이 다릅니다. 이 예문의 목적이 인수의 갯수만큼 %변환문자도 동일한 갯수가 있어야 한다인데..
:
: 그럼 두번째줄의 출력문 숫자가 다르게 나온것은 단순한 에러라고 보면 되는지요?
:
: 그리고 첫째줄이 올바른것이고 밑에 두줄이 틀린거라면 마지막줄의 a,b,c가 제대로 출력되는 이유는 무엇인지 궁금합니다..
:
: 답변 정말 부탁드립니다!!
: 메일로 답변주심 넘넘 감사하겠습니다!
: 이게 어려운데 쫌 재미있어서..ㅎㅎ
: 그리고 형편상 학원은 갈수없어서 그런데 독학하는 방법도 좀 가르쳐 주시면 감사하겠습니다!m(__)m
원리에 대한 것은 이제 시작하신 분에게는 상당히 복잡해서 좀 그렇군요.
일단 책에서 권장하는 바 대로 하는 게 좋습니다만 설명을 곁드리자면 아래와 같습니다.
int printf(const char *format, ...);
printf의 형 선언은 위와 같습니다.
두번째 매개변수 자리의 ...는 인수가 몇 개든 상관이 없다는 것입니다.
피호출 함수(printf) 내부에서 format에서 필요로 하는 인수들을 스택에서 꺼내 쓰게 됩니다.
1. 포맷에 지정된 것보다 실제 지정한 인수가 많을 경우에는 초과하는 것들은 단순히 무시되기 때문에 별 문제는 없습니다.
2. 1의 반대의 상황이 문제인데요, 모자란 것들은 모자라다는 것조차도 모른 채 계속 스택에서 꺼내 쓰게 됩니다.
이 경우는 바람직하지 않으므로 지양해야 합니다.
위의 예에서는 모르긴 해도 인수를 지정해주지 않은 d에 대한 값은 그대로 실제 d의 값(40)이 나오지 않을까 생각해봅니다.
main 함수의 시작부분에서 자동 변수들을 선언/정의하는데 그 것들은 스택에 생성이 됩니다. d가 가장 나중에 스택에 자리 잡고 그 위치는 스택의 가장 윗부분입니다. 따라서, 두번째 printf에서 모자란 인수 하나는 이 d의 메모리에 위치하는 것으로 계산이 됩니다.
|