본문 바로가기
프로그래밍언어/C언어[Error]

[C언어][Error] 070. invalid cast from type ‘void *’ to type ‘int’ – void 포인터를 int로 잘못 캐스팅

by about_IT 2025. 4. 29.

이 오류는 void* 타입의 포인터를 int형 변수에 직접 대입하려 할 때 발생합니다. C언어에서는 void*는 어떤 타입으로든 변환 가능한 일반 포인터이지만, 포인터를 정수형으로 변환할 때는 명시적인 캐스팅이 필요하며, 시스템에 따라 정의되지 않은 동작이 발생할 수 있습니다.


또한, void*를 정수로 변환하는 것은 권장되지 않으며, 주로 포인터 주소 값을 정수로 처리해야 하는 매우 제한적인 상황에서만 사용됩니다.



● 오류 예제

#include <stdio.h>

int main() {
    void* ptr = NULL;
    int val = ptr;  // 오류: void*를 int로 직접 대입
    return 0;
}

컴파일 시 다음과 같은 오류 메시지를 출력합니다.

error: invalid cast from type ‘void *’ to type ‘int’


● 해결 방법

포인터를 정수로 변환하려면 명시적인 캐스팅을 사용하되, 시스템 의존성과 메모리 주소 크기에 주의해야 합니다. 가능한 경우 해당 방식은 피하는 것이 좋습니다.

#include <stdio.h>
#include <stdint.h>

int main() {
    void* ptr = (void*)0x1234;
    uintptr_t val = (uintptr_t)ptr;  // 안전한 정수형으로 캐스팅
    printf("%lx\n", val);
    return 0;
}

출력 결과:

1234


● 실전 팁

  • 포인터를 정수로 캐스팅할 때는 uintptr_t 같은 표준 타입을 사용하는 것이 안전합니다.
  • void* → int는 직접 변환하지 말고, 포인터 크기를 고려한 타입으로 처리하세요.
  • 가능하면 포인터 주소를 정수로 변환하지 말고, 포인터 연산 내에서 처리하도록 하세요.

C언어에서 포인터와 정수는 서로 다르며, 무분별한 타입 변환은 심각한 오류를 유발할 수 있습니다. 반드시 명시적이고 안전한 방식으로 캐스팅하고, 그 필요성을 충분히 검토한 뒤 사용해야 합니다.