오...~~
답변 정말 감사드립니다.
정말 가볍게 넘어갈 부분이 없네요...
큰 도움이 되었습니다.
ㅁ 님이 쓰신 글 :
: 갈라파고스인 님이 쓰신 글 :
: : 아래 그림과 같은 내용이요...
: :
: : *dptr이 왜 바뀌는 건가요???
: : 그냥 책만 보면 ptr이 *dptr과 같아야 할것 같은데요...
: :
: : 정말 정말 궁금하네요... 물론 얕은 지식이라.... 모르는 것으로 보입니다만...
: :
: :
: :
: :
:
: printf("ptr:%9p ptr:%lf dptr:%9p *dptr:%9p"); 로 해야 합니다.
: 다른 printf에서도 num, *ptr, **dptr은 모두 double 값이므로 %lf로 해야 합니다.
: 즉, printf의 포맷문자열에서 double 값에 대한 형식을 잘못 지정하셨습니다.
:
: printf 함수를 호출할 때는 매개변수들을 스택에 차례대로 저장합니다.
: 스택에 저장할 때 앞의 매개변수를 낮은 번지에 저장하며 매개변수가 차지하는 메모리 공간은 호출시 지정한 매개변수들의 형을 보고 판단하는데 double 형은 8바이트고 포인터는 4바이트입니다.
: 그렇게 저장한 후 printf 함수로 실행점이 옮겨가면 함수 내에서는 포맷문자열을 앞에서부터 분석해가며 스택에 저장된 매개변수들을 가져다 쓰는데 가져올 때 매개변수의 크기는 포맷문자열에 지정한 형식을 기준으로 판단합니다. %p는 4바이트이고 %lf는 8바이트입니다.
: 호출 직전에 스택에 저장할 때의 매개변수 크기와 가져다 쓰는 매개변수 크기가 다르면 그 뒤의 매개변수들은 그 다른 차이만큼 밀리거나 당겨진 잘못된 위치에서 가져오게 되는 문제가 발생합니다.
:
: 위에서 자료형 자료형에 따른 크기는 32bit 환경에서입니다.
|