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

[C언어][Error] 055. pointer type mismatch in conditional expression – 조건식 내 포인터 타입 불일치

by about_IT 2025. 4. 28.

이 오류는 C언어에서 조건 연산자(?:) 사용 시 두 피연산자의 타입이 서로 호환되지 않을 때 발생합니다.
C언어에서는 삼항 연산자의 두 결과 값이 동일하거나 변환 가능한 타입이어야 하며, 서로 호환되지 않는 경우 컴파일러는 타입 불일치로 오류를 발생시킵니다.

 

특히 포인터 타입이 다를 경우(예: int*와 char*), 또는 포인터와 다른 타입이 혼합될 경우 문제가 발생합니다.

 


● 오류 예제

#include <stdio.h>

int main() {
    int x = 1;
    int a = 10;
    char* msg = x ? (char*)&a : "error";  // 오류: int*를 char*로 변환 시도
    return 0;
}

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

error: pointer type mismatch in conditional expression

※ 참고: "error"는 char[6] 타입(배열)로 정의되지만, 삼항 연산자 사용 시 자동으로 char*로 변환(decay)되므로 문제는 없습니다. 문제는 &a가 int* 타입이라 호환되지 않는다는 점입니다.


● 해결 방법

조건 연산자 사용 시 결과로 나오는 두 타입을 일치시키거나, 명시적 형 변환을 통해 통일해야 합니다. 예를 들면 공통 기반 타입인 void*를 사용할 수 있습니다.

#include <stdio.h>

int main() {
    int x = 1;
    int a = 10;
    void* msg = x ? (void*)&a : (void*)"error";  // void*로 통일
    return 0;
}

출력은 없지만 위 코드는 타입이 일치하여 정상적으로 컴파일됩니다.

 

 

 


● 실전 팁

  • 조건 연산자 결과 타입은 반드시 동일하거나 호환 가능한 타입이어야 합니다.
  • 포인터 타입이 다를 경우 void* 같은 중립적인 타입으로 변환하세요.
  • 명시적 형변환은 오류 방지에는 도움이 되지만, 실제 메모리 해석 시 타입 일치 여부를 항상 주의해야 합니다.

 

C언어에서 삼항 연산자는 매우 편리하지만 타입 불일치에 민감합니다. 항상 두 결과 타입이 정확히 일치하도록 설계해야 안전하고 오류 없는 코드를 작성할 수 있습니다.