サイズ0については、C99で明確に使用可能となった。
C++でも出来た気がするが、処理系依存かもしれない(GCC等では、Cでも出来る)。

可変長構造体は、昔から使われているテクニック。
ファイルフォーマットがどうのというのは、本当のメリットではない。
(ヘッダとデータを別領域に置くやり方と大差ない)
本来は、例えば下のFAQの例において、namestrをポインタとして実体を別に持つことと比較して
mallocの呼び出しコストと管理領域(およびポインタ1つ分の領域)を節約するというのが
明らかなメリットを生かした使い方となる。

で、この可変長構造体と呼ばれるテクニックは、
C FAQにおいても、邪道ながら「全てのコンパイラで使える」と記されている。
http://www.kouno.jp/home/c_faq/c2.html#6
intのサイズを始め、ほとんどの「規格に明記されていない点」は
例外的な処理系をいくつも挙げているというのに。