質問中に書いてある例の通りだとしたら、配列として書く以上は配列として扱いたいという意図の表れであると考えられます。 たとえば struct test
型のオブジェクト foo
があるときに foo.x[1]
としたら y
と z
をひとまとめにしたものが見えるかもしれません。
ただし、構造体の要素間には詰め物 (padding) が入る可能性があるなど、バイナリレベルでのレイアウトは言語仕様では定義されていません。
ハードウェアに近いプログラム (ファームウェアやデバイスドライバなど) で、なおかつコンパイラが構造体をどのようなレイアウトに配置するのか把握可能なときにはそういうことをしたいこともなくはないのでしょうが、普通のアプリケーションプログラムでそのようなことをするのはとても駄目なので真似しないでください。
構造体の最後のメンバを配列にしている場合は episteme さんが述べているように可変長の配列にするテクニックのひとつとしてよく知られていますが、現在の C では最後の要素に限って不完全型を許すことになっています。 すなわち、配列の大きさを書かないということが出来ます。
c
1struct test {
2 int size;
3 int data[];
4};
このとき、 sizeof(struct test)
は data
の大きさを 0
として大きさを計算するので、配列の大きさを 1
として定義した構造体よりは大きさの計算がやりやすく、また可変長を意図しているということがわかりやすいのでなるべくならこちらの方式を使った方が良いです。
ただし、 C++ では構造体の最後を不完全にするのは許されていません。 (一部の処理系は許容したりもするのですが……。) 古い C コンパイラしかないような場面や、 C と C++ でコンパイルできる必要がある場合などに苦肉の策として配列の大きさを 1
にするということはあるかもしれません。