La norma dice que la aprobación de un puntero NULL
como argumento a una printf
con %s
especificador es un comportamiento indefinido (es decir, cualquier cosa puede suceder), por lo que ambos comportamientos son lícitas.
En el primer caso, la biblioteca estándar (en particular, el código printf
) te está haciendo un favor al imprimir (null)
.
En el segundo caso, el optimizador entiende que su printf
puede reemplazarse por un puts
(que es más eficiente) sin ningún cambio en el "comportamiento observable" del programa, por lo que lo reemplaza. Pero, puts
no contiene el código de comprobación NULL
del printf
, y por lo tanto se obtiene un error de segmentación.
C99, §7.19.6.1, ¶8:
el argumento será un puntero al primer elemento de un array de tipo carácter.
¶9:
Si algún argumento no es del tipo correcto para la especificación de conversión correspondiente, el comportamiento es indefinido.
Tumbes y en este último caso, debido a NULL
no es "un puntero al primer elemento de un array de tipo carácter.
' gcc' realiza varias funciones, tales optimizaciones. Véase la sección 2.3 y 3.1 en particular de http://www.ciselant.de/projects/gcc_printf/gcc_printf.html – FatalError
Consulte también este informe de error 'gcc' para obtener más información sobre por qué esto no se considera un error: http: //gcc.gnu. org/bugzilla/show_bug.cgi? id = 25609 – shf301
Una pregunta similar: [No obteniendo un error de segmentación en C] (http://stackoverflow.com/questions/8861833/not-getting-segmentation-fault-in-c) –