Wednesday, March 19, 2008

함수 포인터 그리고 (*(void(*)())0)();

(*(void(*)())0)();

자,. 이게 무슨 얘기일까. 일단 함수 포인터에 대한 이해가 있어야 한다. int *f(); 는 int *를 리턴하는 함수를 의미한다. 하지만 int (*f)(); 는 정수를 리턴하는 함수에 대한 포인터 이다. 같은 식으로 void (*f)()는 리턴이 void인 함수의 포인터이다. 그럼 이런 함수 포인터로 캐스팅하려면? (void (*)()) 처럼 쓰면된다. 그래서 주소0을 반환 값이 void인 함수의 포인터로 캐스팅 하면 (void(*)())0 이 된다. 포인터 p의 실제 값은 *p가 되듯이 이 함수 포인터를 통해 실제 함수를 호출하려면 마찬가지로 (*(void(*)())0)(); 하면 된다.

결국 이 얘기는 주소0에 있는 코드를 반환값이 없는 함수의 포인터로 캐스팅 후에 그 함수를 호출한다는 얘기다. 임베디드 시스템에서 부팅 후 제일 처음 수행되는 루틴을 C로 짜게되는 경우 위와같은 코드가 나오게 된다. 흐,. 괴물같다.

No comments:

Post a Comment