함수에도 메모리 주소가 있다
C 또는 C++에서 변수는 메모리에 저장되기 때문에 해당 메모리 주소를 확인할 수 있습니다. 마찬가지로 함수 역시 컴파일된 후 메모리에 저장되므로 고유한 주소를 가집니다.
함수의 주소를 얻는 방법은 매우 간단합니다. 괄호(()) 없이 함수 이름만 사용하면 됩니다. 함수 이름은 곧 함수 코드가 시작되는 메모리 위치를 가리키는 포인터 역할을 하며, 이를 함수 포인터(function pointer)라고 부릅니다. 함수 포인터는 콜백 함수 구현이나 동적 함수 호출 등 다양한 상황에서 유용하게 활용됩니다.
예제 코드
아래 예제를 통해 함수 주소를 출력하는 방법을 확인해 보겠습니다.
#include <stdio.h>
void my_function() {
printf("Hello World");
}
int main() {
printf("my_function의 주소: %p\n", my_function);
printf("main의 주소: %p\n", main);
}
실행 결과
my_function의 주소: 0000000000401530
main의 주소: 000000000040154B
코드 설명
위 예제에서는 %p 서식 지정자를 사용하여 함수의 메모리 주소를 16진수 형태로 출력했습니다. 주목할 점은 my_function과 main 뒤에 괄호를 붙이지 않았다는 것입니다. 괄호를 붙이면 함수가 호출되지만, 괄호 없이 이름만 쓰면 함수 자체의 주소를 의미합니다.
출력되는 주소 값은 운영체제, 컴파일러, 실행 환경에 따라 매번 달라질 수 있습니다. 또한 함수 포인터는 아래와 같이 변수에 저장해 두고 나중에 호출하는 것도 가능합니다.
void (*fp)() = my_function; // 함수 포인터에 주소 저장
fp(); // 포인터를 통해 함수 호출