error: invalid type argument of '->' の原因と直し方
構造体そのものの変数に対して->を使おうとしたときに出るエラーです。->は構造体へのポインタ専用の演算子です。
エラーメッセージの読み方
main.c:7:21: error: invalid type argument of '->' (have 'struct Point')
main.c- ファイル名
7- 行番号
21- 列番号 — この位置でgccが構文解析に失敗しました
invalid type argument of '->' (have 'struct Point')- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 #include <stdio.h> 2 3 struct Point { int x; }; 4 5 int main(void) { 6 struct Point a = {5}; 7 printf("%d\n", a->x); ^ 8 return 0; 9 }
main.c:7:21: error: invalid type argument of '->' (have 'struct Point')
aは構造体そのもの(ポインタではない)なので、メンバアクセスには.を使います。->は構造体へのポインタ専用です。
直し方: a->x を a.x にします。
広告
広告スロット(未設定)
パターン2
1 #include <stdio.h> 2 3 struct Item { int price; }; 4 5 int main(void) { 6 struct Item i = {100}; 7 printf("%d\n", i->price); ^ 8 return 0; 9 }
main.c:7:21: error: invalid type argument of '->' (have 'struct Item')
変数iは構造体の実体です。ポインタを経由していないので.でアクセスします。
直し方: i->price を i.price にします。
パターン3
1 #include <stdio.h> 2 3 struct Node { int value; }; 4 5 int main(void) { 6 struct Node n = {7}; 7 printf("%d\n", n->value); ^ 8 return 0; 9 }
main.c:7:21: error: invalid type argument of '->' (have 'struct Node')
構造体を指すポインタが登場する連結リストなどのコードに慣れてくると、実体に対しても->を使ってしまう混同が起こりやすくなります。
直し方: n->value を n.value にします。
よくある誤解
構造体変数とその構造体へのポインタは似た場面で使われますが、メンバへのアクセス方法は別です。変数そのものなら.、ポインタ経由ならアロー->を使います。ポインタをデリファレンスしてから.でアクセスする(*p).xという書き方はp->xと完全に同じ意味です。
まとめ
error: invalid type argument of '->'は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。