프로그래밍언어/C언어[Error]

[C언어][Error] 017. invalid type argument of ‘->’ – -> 연산자 사용 시 구조체 포인터가 아님

about_IT 2025. 4. 24. 19:24
728x90

이 오류는 구조체 멤버에 접근할 때 사용하는 -> 연산자를 구조체 포인터가 아닌 일반 구조체 변수에 사용했을 때 발생합니다. C언어에서는 구조체 변수에는 점(.) 연산자를 사용하고, 구조체 포인터에는 화살표(->) 연산자를 사용해야 합니다.


이 두 연산자는 혼용될 수 없으며, 상황에 맞는 연산자를 사용해야 올바르게 구조체의 멤버에 접근할 수 있습니다.



● 오류 예제

#include <stdio.h>

struct Person {
    int age;
};

int main() {
    struct Person p;
    p->age = 30;  // 오류: p는 구조체 변수이므로 -> 사용 불가
    return 0;
}

위 코드에서 p는 구조체 변수이며, 포인터가 아니므로 -> 연산자가 아닌 . 연산자를 사용해야 합니다. 컴파일 시 다음과 같은 오류가 발생합니다.

error: invalid type argument of ‘->’ (have ‘struct Person’)


● 해결 방법

구조체 포인터가 아닌 경우에는 . 연산자를 사용해야 하며, 구조체 포인터인 경우에만 -> 연산자를 사용할 수 있습니다.

#include <stdio.h>

struct Person {
    int age;
};

int main() {
    struct Person p;
    p.age = 30;  // 구조체 변수에 . 사용
    printf("%d\n", p.age);
    return 0;
}

출력 결과:

30

또는 구조체 포인터를 사용할 경우는 다음과 같습니다.

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

struct Person {
    int age;
};

int main() {
    struct Person *p = malloc(sizeof(struct Person));
    p->age = 25;  // 포인터이므로 -> 사용 가능
    printf("%d\n", p->age);
    free(p);
    return 0;
}

출력 결과:

25


● 실전 팁

  • 구조체 변수와 포인터를 구분하여 각각 . 또는 -> 연산자를 정확히 사용하세요.
  • 컴파일러 오류 메시지에 구조체 타입이 출력되면 어떤 연산자가 필요한지 유추할 수 있습니다.
  • 포인터를 역참조해서 멤버에 접근할 수도 있습니다: (*p).agep->age와 같습니다.

구조체 멤버 접근 연산자는 기본적인 문법이지만, 구조체 변수와 포인터의 개념을 명확히 이해하고 있어야 오류 없이 코드를 작성할 수 있습니다.

728x90