C :: typedef으로 함수 포인터를…

Dll Injection으로 Brute Force를 하려고 공부하던 차에 함수 포인터를 활용하는 방법을 알게 되었습니다. 일반적으로 C 언어는 절차 지향 언어, 함수 지향 언어라고 알려져 있어서 C++의 클래스 구현이 안 된다고 배웁니다만, 이 함수 포인터를 이용하면 충분히 클래스를 구현할 수 있을 것 같습니다. 실제로 커널 등의 여러 소프트웨어에서 이 방법을 쓰는 것 같구요.

함수 포인터를 선언하려면 우선 typedef으로 함수의 형태를 만들어줘야 합니다.

typedef int (*STRCMP)(char*, char*);


위 코드를 예로 들어보겠습니다. 이미 눈치 채셨겠지만, 이것은 strcmp() 함수의 포인터형을 정의하는 코드입니다. 먼저 typedef 다음에 나오는 int는 함수의 반환값을 의미합니다. 이것을 char*로 고치면 이 함수의 반환값은 char* 형이라는 것이겠죠? 그리고 (*STRCMP)가 함수 포인터입니다. 앞 쪽의 *를 보시면 감 잡으시겠죠? 마지막으로 뒷 쪽의 (char*, char*)는 함수에 들어갈 인자값입니다.

STRCMP my_strcmp = (STRCMP)strcmp;


함수 포인터를 정의하는 방법은 일반적으로 포인터를 정의하는 것과 같습니다. 함수 포인터형을 기술하고 뒤에는 함수의 이름을, 그런 다음에 캐스팅을 하여서 원래의 함수의 포인터를 넘기는 것이죠. 저기서 strcmp 대신 실제 메모리 주소를 적어도 똑같이 동작합니다. 원래는 메모리 주소를 적는 것이겠지만, 컴파일러에 의해서 맵핑되는 것이니까요.

실제 코드를 작성해볼까요?

#include <stdio.h>
#include <string.h>

typedef int (*STRCMP)(char*, char*);

int main (void)
{
    STRCMP my_strcmp = (STRCMP)strcmp;
    int value = my_strcmp ("a", "b");
    printf ("return value: %d\n", value);
    return 0;
}


이런 코드를 만들어 작성해보았습니다. 주의해야 할 점은 typedef로 정의되는 함수 포인터형의 형태와 실제 함수의 형태가 같아야 한다는 것입니다. 내부야 어떻게 되어있는지 몰라도, 반환값과 인자값은 형태가 같아야 정상적으로 동작하죠.

위 코드의 결과가 어떻게 나올까요? 컴파일러는 제대로 될까요? 결과는 제대로 나올까요? 아래를 조시면 모든 게 정상적으로 되는 것을 확인할 수 있습니다.

사용자 삽입 이미지
이로서 C로도 객체 지향적인 설계가 가능하겠죠?

Similar Posts

  • GTK+ :: C언어의 간편한 GUI 툴킷

    누군가가 그러더군요. 언어는 단지 도구일 뿐이고, 필요에 의해 쓰일 뿐이다. 저 말처럼 C언어를 익히니까 GUI 툴킷도 배우고 싶어졌습니다. 그래서 시작한 게 GTK+입니다. GTK+는 C언어를 기반으로 하는 GUI 툴킷입니다. 알아보니까 많이 쓰인다는 QT는 C++를 배워야 한다고 해서요. 배우다 보니까 여러 가지로 신기합니다. 그리고 재미있구요. 위 그림같은 창 하나 달랑 띄우는데도 코드가 여러 줄입니다. 그래도 이 정도면…

  • 리눅스(우분투)에서 부경대학교 무선랜 접속하기

    이 글은 부경대학교 무선랜을 리눅스(Ubuntu 10.04 기준)에서 접속하는 방법에 대하여 작성되었습니다. 무선랜 활용 TIP :: http://www.pknu.ac.kr/files/wirelesslan/wirelesslan_guide.pdf자주하는 질문(FAQ) :: http://www.pknu.ac.kr/files/wirelesslan/wirelesslan_faq.pdf 단계 1 “시스템 -> 기본설정 -> 네트워크 연결” 실행 단계 2 “무선” 탭 선택 -> “추가” 버튼 클릭 단계 3 연결 이름에 “PKNU-WLAN” 입력 -> “무선” 탭에서 SSID 값에 “PKNU-WLAN” 입력 단계 4 “무선 보안” 탭에서…

  • C :: 컴퓨터와 가위바위보를 하자. – 설계편

    컴퓨터와 가위바위보를 하는 간단한 게임을 만들려고 합니다. 콘솔에서 동작할 겁니다. 그리고 지금까지와 마찬가지로 C언로 만들 것이고, 컴파일러는 gcc를 사용합니다. 뭐, 간단한 게임이니 gcc이든 다른 것이든 큰 차이는 없겠지요. IDE는 제가 요즘 애용하는 Code Blocks입니다. 이걸 정리하자면, OS: Ubuntu 8.10 x86 / GNOME Tool: gcc / Code Blocks GUI: 사용 안함. Console Application 그럼, 이제 설계를…

  • 초보 개발자의 Vim 개인 설정

    그동안 미루고 미루어 오다가 드디어 Vim 개인 설정을 마쳤습니다. 웹에 퍼져있는 여러 vimrc 파일들을 참조하고 Vim 영문매뉴얼도 뒤져 보았네요. 그리고 제 영어 실력이 어느 정도인지를 뼈져리게 깨달았습니다. OTL 플러그인 사용하는 플러그인은 아래와 같습니다. a.vim : C/C++ 헤더파일 생성/스위치 플러그인. c.vim : C/C++ 지원 플러그인. taglist : 함수, 메소드, 클래스 등의 목록을 별도의 창에 보여주는 플러그인….

  • 알고리즘 :: floor 함수로 반올림하기

    이 글에서 소개할 내용은 알 사람은 다들 알지만, 그래도 혹 (저처럼)모르는 분들을 위한 글입니다. 결국, 정리하자면 정리용 메모라는… C 표준 라이브러리에는 math.h 헤더파일이 있고, 그 안에는 floor 함수가 있습니다. 이 함수의 의미는 주어진 인수보다 크지 않은 최대 정수 입니다. 즉, 주어진 인수가 x라고 하면, x-1보다 크거나 같고 x보다 작은 정수를 뜻합니다. 위키피디어에서는 이를 아래와 같이…

  • 펜티엄 2에서의 작업환경

    이전 글에서 소개했듯이 제가 현재 사용중인 컴퓨터는 펜티엄 2입니다. 그런데 간혹 펜티엄 2에서는 (성능이 아닌 디스플레이를 따져서)작업하기가 너무 번거롭지 않냐라고 물어보는 사람이 있습니다. 아마 저사양 컴퓨터의 낮은 해상도를 생각한 모양입니다. 그래서 제 컴퓨터의 작업환경을 살짝 보여드릴까 합니다. 위 그림은 바탕화면을 찍은 것입니다. 해상도는 1440*900의 와이드입니다. 오잉? 펜티엄 2에서 저 해상도가 나와? 라고 하실 분이 계실…

0 Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다