2.15. Non-Lvalue Arrays May Have Subscripts

Subscripting is allowed on arrays that are not lvalues, even though the unary “&” operator is not. For example, this is valid in GNU C though not valid in other C dialects:

struct foo {int a[4];};
struct foo f();
bar (int index)
{
  return f().a[index];
}