갈라파고스인 님이 쓰신 글 :
: 아래 그림과 같은 내용이요...
:
: *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 환경에서입니다.
|