Creo que en C99, la modificación de cadenas literales es un comportamiento indefinido. No tengo una copia de esa norma, pero tengo un proyecto de C1X (n1570) que establece en el párrafo 6.4.5 7:¿La modificación del comportamiento indefinido de literales de cadena de acuerdo con el estándar C89?
Es sin especificar si estos arreglos son distintos facilitado sus elementos tienen la valores apropiados Si el programa intenta modificar dicha matriz, el comportamiento es indefinido.
he encontrado un desbordamiento de pila question que toca este tema y contiene el siguiente comentario de Jonathan Leffler:
Originalmente, el estándar (C90) C89 no proscribió modificar literales porque no era demasiado mucho código escrito antes del estándar que sería roto por él.
Pero también he visto un montón de discusión de la tipo de literales de cadena y el hecho de que son char[N]
y no const char[N]
. Deduzco que esta decisión fue tomada para que el gran cuerpo del código existente no se rompa.
¿Alguien puede darme una respuesta definitiva. ¿La cadena es literal modificación UB en C89?
¿Qué? Hasta donde sé, los literales de cadena son' const char * ' ... –
@ H2CO3: No en C. –
Recuerdo haber visto un programa para el venerable [PDP-11] (https://en.wikipedia.org/wiki/PDP-11) que fusionaría cadenas idénticas en código de objeto para hacerlo más pequeño, por lo que modificar los literales de cadena era una mala idea incluso antes de C89. –