2014-06-15 4 views
0

혼란스러워! 다음의 printf가 모두 함수 주소를 인쇄하는 올바른 방법입니까? 혼란에 대해서도 이야기하겠습니다. 매번 내가 출력에 내가 02D4 02D4 02D4 얻을, 이들의 printf의 (즉, 첫번째 printf와, 제 2의 printf와 3의 printf이다)을 모두 실행하지만 난 제거하거나 1 차 및 2 차의 printf의 코멘트, 내가 출력 로 folowing 얻을 내가 세 번째의 printf 문을 제거 할 때, 내가 출력 02D0 나는이 세 가지의 모든 주석을 제거하면 다시, 내가받을 다음 02BA 을 얻고있다 : 02D4 02D4 왜 하나 개의 문장이 다른 printf와 라인의 출력에 영향을 미치는 02D4 ? 사실 이것은 함수의 주소가 아닌가요? s와 &은 주소와 같은 값을 제공한다고 들었습니다 (배열과 마찬가지로). 하지만 여기서 나는 왜 s와 & s가 b를 인쇄하려고 할 때 영향을 받는지 혼란 스럽다. 여기서 b = s 또는 &이다.c의 기능 주소와 혼동

#include<stdio.h> 
#include<conio.h> 
int s(int); 
void main() 
{ 
int a=10,*b; 
clrscr(); 
b=s(a++); 
b=&s; 
printf("%p\n",s);  // 1st printf 
printf("%p\n",&s);  //2nd printf 
printf("%p\n",b);  //3rd printf 
getch(); 
} 
int s(int x) 
{ 
return x; 
} 
+2

변수 포인터에 함수 포인터를 넣으면 안됩니다 (동일한 크기가 아닌 것은 보장 할 수 있지만). C 언어의 특별한 경우는'& '가없는 함수 이름이 암시 적으로 (개인적으로 항상 명시 적으로 선호하는 것을 선호합니다) – Dave

+2

을 얻는 것입니다 (단, 같은 방식으로 함수 포인터를 변수 포인터를 사용하는 경우'% p' 형식의 포인터를 사용하면 안됩니다. 함수 포인터를 인쇄하는 안전한 방법은이 답변을 참조하십시오 : http://stackoverflow.com/a/2741896/1180785) – Dave

+1

주소 변경, 그것은 당신이 스크립트를 다시 컴파일하기 때문입니다! 코드를 전혀 변경하지 않아도 컴파일간에 매우 다를 수 있습니다. 덕분에 – Dave

답변

2

컴파일러와 운영 체제가 모두 끝나는 위치에 영향을 줄 수 있으므로 변수 또는 함수의 주소는 사용자가 신뢰할 수있는 것이 아닙니다.

그러나 운영 체제가 항상 동일한 주소에서 실행 코드를로드한다고 가정하면 main() 함수의 코드 길이를 변경하면 s() 함수의 시작 주소에 영향을 줄 수 있습니다. 결과적으로 다른 결과를 얻게됩니다.

+0

감사합니다 @DrWatson, 알겠습니다. – gj1103