Почему составные литералы в 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!