C언어

[C언어] void 포인터

코딩 메모장 2024. 11. 23. 23:11
728x90

C 언어에서 void 포인터는 데이터 타입이 정해지지 않은 포인터를 의미합니다. 이 포인터는 유연성과 확장성이 뛰어나지만, 잘못 사용하면 오류가 발생할 수 있어 주의가 필요합니다.

1. void 포인터란?

void 포인터는 **"타입이 없는 포인터"**입니다. 즉, 어떤 데이터 타입의 주소든 저장할 수 있는 일반 포인터입니다.
그러나 역참조(dereference) 할 때는 적절한 타입으로 변환해야 합니다.

예제

#include <stdio.h>

int main() {
    int a = 10;
    float b = 5.5;
    void *ptr;

    // 어떤 데이터 타입이든 void 포인터에 저장 가능
    ptr = &a;  
    printf("Integer value: %d\n", *(int *)ptr);

    ptr = &b;  
    printf("Float value: %.2f\n", *(float *)ptr);

    return 0;
}

 

출력 결과

Integer value: 10
Float value: 5.50

2. void 포인터의 특징

  1. 유연성
    • 하나의 void 포인터로 다양한 데이터 타입을 가리킬 수 있습니다.
  2. 역참조 불가
    • void 포인터는 타입 정보가 없기 때문에 직접 역참조할 수 없습니다.
      반드시 **명시적 형 변환(explicit cast)**이 필요합니다.
  3. 포인터 연산 불가
    • void 포인터는 타입 크기를 알 수 없으므로 ptr++과 같은 연산이 불가능합니다.

3. void 포인터의 활용 사례

1) 범용 함수 구현

void 포인터는 데이터 타입에 독립적인 함수를 작성할 때 유용합니다.

예제: 범용 메모리 복사 함수

#include <string.h>

void copyMemory(void *dest, const void *src, size_t size) {
    char *d = (char *)dest;
    const char *s = (const char *)src;

    for (size_t i = 0; i < size; i++) {
        d[i] = s[i];
    }
}

이 함수는 어떤 타입의 데이터를 복사할지 미리 알 수 없을 때 사용할 수 있습니다.

2) 동적 메모리 할당과 타입 변환

malloc 함수는 반환 타입이 void *로, 반환된 메모리를 원하는 타입으로 캐스팅해야 합니다.

예제: 동적 메모리 사용

#include <stdlib.h>
#include <stdio.h>

int main() {
    int *arr = (int *)malloc(5 * sizeof(int));

    for (int i = 0; i < 5; i++) {
        arr[i] = i * 10;
        printf("%d ", arr[i]);
    }

    free(arr);
    return 0;
}

3) 함수 포인터와 콜백 함수

void 포인터는 함수 포인터를 이용해 데이터 타입에 상관없이 콜백을 전달할 때 유용합니다.

예제: 콜백 함수

#include <stdio.h>

void executeCallback(void (*callback)(void *), void *data) {
    callback(data);
}

void printInt(void *data) {
    printf("Integer: %d\n", *(int *)data);
}

int main() {
    int num = 42;
    executeCallback(printInt, &num);
    return 0;
}

4. 주의할 점

  1. 역참조 시 타입 변환 필수
    • void 포인터는 반드시 올바른 타입으로 변환 후 사용해야 합니다.
      잘못된 형 변환은 정의되지 않은 동작(Undefined Behavior)을 유발합니다.
  2. 포인터 연산 불가
    • void 포인터는 데이터 크기를 알 수 없으므로 산술 연산(+, -)에 사용할 수 없습니다.
  3. 가독성 저하
    • 지나치게 사용하면 코드의 가독성이 떨어질 수 있으므로, 적절한 경우에만 사용해야 합니다.

5. 요약

  • void 포인터의 장점: 유연성과 범용성.
  • void 포인터의 단점: 타입 정보 부족으로 인한 주의 필요.
  • 활용 사례: 동적 메모리 할당, 범용 함수, 함수 포인터 등.

void 포인터는 효율적인 코드 작성을 도와주는 강력한 도구지만, 정확히 이해하고 적절히 사용하는 것이 중요합니다.

 

728x90