Проблема обсуждается (с примерами) в SEI CERT C Coding Standard
. Действительно, это очень крайний случай языка.
Я не копирую код здесь - достаточно ссылки на ссылку.
Идея состоит в том, что в C99 в момент, когда функция возвращает структуру, содержащую массив, нельзя обращаться к массиву или изменять его, пока не закончится полное выражение, содержащее функцию, возвращающую структуру. В C11 действительно сделать это напрямую.
Например, он действителен в C11, но недействителен в C99:
++(st().arr)[0] // try to mutate before the full expression ends.
x=st().arr // access array from a temporary returned structure
// before the sequence point at the end of full expression