프로그래밍언어/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).age
는p->age
와 같습니다.
구조체 멤버 접근 연산자는 기본적인 문법이지만, 구조체 변수와 포인터의 개념을 명확히 이해하고 있어야 오류 없이 코드를 작성할 수 있습니다.
728x90