2012-04-03 25 views
5

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?

+0

¿Qué? Hasta donde sé, los literales de cadena son' const char * ' ... –

+6

@ H2CO3: No en C. –

+1

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. –

Respuesta

13

Sí, no son modificables en C89.

(C90, 6.1.4) "Si el programa intenta modificar una cadena literal de una u otra forma, el comportamiento es indefinido"

Incluso en K & R 2ª edición, hay cotizaciones respecto la inmutabilidad de los literales de cadena.

(K & R2, 5,5) "El resultado es indefinido si intenta modificar los contenidos de la cadena"

(K & R2, Apéndice C) "Las cadenas ya no son modificables, y así puede haber colocado en memoria de sólo lectura"

en el ANSI C89 Justificación, hay una explicación de por qué es no modificable:

(ANSI C89 Rationa le, 3.1.4) "Los literales de cadena están especificados para ser no modificables. Esta especificación permite a las implementaciones compartir copias de cadenas con texto idéntico, colocar literales de cadena en la memoria de solo lectura y realizar ciertas optimizaciones. "

Cuestiones relacionadas