Почему составные литералы в C модифицируются

Каждый обычно ассоциирует «немодифицируемый» с термином буквальный

char* str = "Hello World!";
*str = 'B';  // Bus Error!

Однако при использовании составных литералов я быстро обнаружил, что они полностью модифицируемы (и, блокируя созданный машинный код, вы видите, что они помещаются в стек):

char* str = (char[]){"Hello World"};
*str = 'B';  // A-Okay!

Я собираю сclang-703.0.29, Разве эти два примера не должны генерировать точно такой же машинный код? Составной литерал действительно литерал, если он модифицируем?

РЕДАКТИРОВАТЬ: еще более короткий пример будет:

"Hello World"[0] = 'B';  // Bus Error!
(char[]){"Hello World"}[0] = 'B';  // Okay!

Ответы на вопрос(1)

Ваш ответ на вопрос