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