Я пытаюсь расшифровать записку, которая привела к изменению между C99 и C11. Изменения, предложенные в этой записке, закончились в C11 6.2.4: 8, а именно:
Выражение без значения со структурой или типом объединения, где структура или объединение содержит элемент с типом массива (включая, рекурсивно, элементы всех содержащихся структур и объединений), относится к объекту с автоматическим хранением и временным временем жизни. Его время жизни начинается, когда выражение вычисляется, и его начальное значение является значением выражения. Его время жизни заканчивается, когда заканчивается оценка содержащего полного выражения или полного декларатора. Любая попытка изменить объект с временным временем жизни приводит к неопределенному поведению.
Я понимаю, почему это изменение было необходимо (некоторые обсуждения можно найти здесь. Обратите внимание, что обсуждение продолжается до C11). Однако чего я не понимаю, так это побочного замечания, которое Кларк Нельсон сделал в своем письме:
Обратите внимание, что этот подход дополнительно объявляет пример, подобный этому, который соответствовал C99, как несоответствующий:
struct X { int a[5]; } f();
int *p = f().a;
printf("%p\n", p);
Я понимаю, почему этот пример не соответствует C11. Что я конкретно не понимаю, так это то, как это соответствует C99. И, если он определен в C99, что он должен делать, однозначно вывести значение висящего указателя?