Это также происходит, если вы пытаетесь получить доступ к экземпляру, когда у вас есть указатель, и наоборот:
struct foo
{
int x, y, z;
};
struct foo a, *b = &a;
b.x = 12; /* This will generate the error, should be b->x or (*b).x */
Как указано в комментарии, это можно сделать мучительным, если кто-то идет и typedef
s указатель, то есть включает *
в typedef, например, так:
typedef struct foo* Foo;
Потому что тогда вы получаете код, который выглядит как будто он имеет дело с экземплярами, тогда как на самом деле он имеет дело с указателями:
Foo a_foo = get_a_brand_new_foo();
a_foo->field = FANTASTIC_VALUE;
Обратите внимание, что вышеприведенное выглядит так, как будто оно должно быть записано a_foo.field
, но это не удастся, поскольку Foo
является указателем на struct. Я настоятельно рекомендую против typedef
: указатели ed в C. Указатели важны, не скрывайте звездочки. Пусть они сияют.