이 오류는 포인터 타입의 값을 정수형 변수에 직접 대입하려고 할 때 발생합니다. C언어에서 포인터는 메모리 주소를 담는 특별한 타입이며, 정수형 변수에 대입하려면 명시적인 형 변환(cast)이 필요합니다.
포인터는 일반적으로 4바이트 또는 8바이트 크기를 가지며, int와 같은 정수형과는 호환되지 않기 때문에 타입이 다르다는 이유로 컴파일러가 오류를 발생시킵니다.
아래는 오류가 발생하는 예시입니다.
#include <stdio.h>
int main() {
int *ptr;
int num;
ptr = #
int value = ptr; // 오류 발생: 포인터를 정수에 대입
printf("%d\n", value);
return 0;
}
컴파일 시 다음과 같은 오류 메시지가 출력됩니다.
error: assignment makes integer from pointer without a cast
포인터 값을 정수형으로 사용하려면 명시적 형 변환을 해야 하며, 이마저도 대부분의 경우 추천되지 않습니다.
#include <stdio.h>
int main() {
int num = 10;
int *ptr = #
int addr = (int)(uintptr_t)ptr; // 주소를 정수형으로 변환 (비추천)
printf("%d\n", addr);
return 0;
}
※ 주의: 주소를 정수로 저장하거나 조작하는 것은 시스템 의존적이며, 프로그램 안정성을 해칠 수 있습니다.
● 실전 팁
- 포인터는 정수와 다르므로, 직접 대입해서는 안 됩니다.
- 포인터 연산은 포인터끼리 하거나, 포인터와 정수 간의 산술 연산만 허용됩니다.
- 주소를 정수로 변환하는 것은 특별한 목적이 있는 경우에만 사용하세요.
포인터와 정수는 엄연히 다른 타입이라는 점을 인지하고, 목적이 분명하지 않은 경우 두 타입 간 변환은 피하는 것이 좋습니다.