Code Fix

上級

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->xa.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->pricei.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->valuen.value にします。

この問題を解いてみる →

よくある誤解

構造体変数とその構造体へのポインタは似た場面で使われますが、メンバへのアクセス方法は別です。変数そのものなら.、ポインタ経由ならアロー->を使います。ポインタをデリファレンスしてから.でアクセスする(*p).xという書き方はp->xと完全に同じ意味です。

まとめ

error: invalid type argument of '->'は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)