Por que literais compostos em C são modificáveis
Geralmente, associa-se 'não modificável' ao termo literal
char* str = "Hello World!";
*str = 'B'; // Bus Error!
No entanto, ao usar literais compostos, descobri rapidamente que eles são completamente modificáveis (e bloqueando o código de máquina gerado, você vê que eles são colocados na pilha):
char* str = (char[]){"Hello World"};
*str = 'B'; // A-Okay!
Estou compilando comclang-703.0.29
. Esses dois exemplos não deveriam gerar exatamente o mesmo código de máquina? Um literal composto é realmente um literal, se é modificável?
EDIT: Um exemplo ainda mais curto seria:
"Hello World"[0] = 'B'; // Bus Error!
(char[]){"Hello World"}[0] = 'B'; // Okay!