¿Por qué los literales compuestos en C son modificables?
Uno suele asociar 'no modificable' con el término literal
char* str = "Hello World!";
*str = 'B'; // Bus Error!
Sin embargo, cuando uso literales compuestos, descubrí rápidamente que son completamente modificables (y bloqueando el código de máquina generado, verá que se insertan en la pila):
char* str = (char[]){"Hello World"};
*str = 'B'; // A-Okay!
Estoy compilando conclang-703.0.29
. ¿No deberían esos dos ejemplos generar exactamente el mismo código de máquina? ¿Es un literal compuesto realmente un literal, si es modificable?
EDITAR: Un ejemplo aún más corto sería:
"Hello World"[0] = 'B'; // Bus Error!
(char[]){"Hello World"}[0] = 'B'; // Okay!