2010-03-30 18 views
11
#include<cstdio> 
#include<stdlib.h> 

int main() 
{ 
    char* ptr=NULL; 
    printf("%s",ptr); 
    return 0; 
} 

Imprime (nulo) como salida. Lo anterior es un código de muestra. En el código real obtengo char * como devolución de una función y deseo imprimir la cadena de caracteres para el registro. Sin embargo, NULL también es un valor de retorno válido de esa función, por lo que me pregunto si se requiere una verificación nula antes de imprimir la cadena de caracteres.¿Es seguro el siguiente código C?

char* ptr=someFuncion(); 
// do i need the following if statement? 
if(ptr!=NULL) 
{ 
    printf("%s",ptr); 
} 

Sólo quiero estar seguro de que la salida sería misma es decir, si ptr = NULL entonces la salida debe ser (nulo) en todas las plataformas y los compiladores y el código anterior (sin sentencia if) no se estrellaría en cualquier Plataforma compatible con C estándar.

En resumen, ¿es compatible el código anterior (sin la instrucción if)?

Gracias por su ayuda y paciencia :)

Saludos

lali

+0

¿Cuál es el encabezado '' que proporciona su código? Su código invoca un comportamiento indefinido pasando un puntero nulo a una función que no espera uno. Puede suceder cualquier cosa, incluso podría funcionar accidentalmente, principalmente. –

+0

bien, lo tengo. Gracias a todos por su ayuda en "tiempo real" :)) – ghayalcoder

Respuesta

21

En resumen, es el código anterior (sin la sentencia if) compatible con la norma?

Nº ISO/IEC 9899: 1999 (documento C estándar) no hace ninguna declaración acerca de lo que debería suceder si ptr es nulo, por lo que el comportamiento es indefinido . La biblioteca que usaste simplemente fue lo suficientemente amigable como para darte un resultado útil ("(nulo)") en lugar de colisionar.

Incluya la comprobación explícita para NULL.

5

En caso de duda no se debe confiar en los detalles de implementación y realizar un adicional (ptr != NULL) - es también una buena práctica de codificación.

7

¿Te refieres a algo como esto?

 
    char* result = foo(); 
    printf ("result is %s\n", (result ? result : "NULL")); 
+0

me gustó este, gracias :) – ghayalcoder

1

Normalmente estarás limpio sin el enunciado if, en mi experiencia, aunque tiendo a evitar hacer lo que ilustraste por costumbre ... ha pasado mucho tiempo, pero los compiladores del IIRC Sol que utilicé trabajar con esto provocaría un colapso en todo o en parte si pasaras un carácter * NULL a printf(), por lo que es más fácil y seguro incluir el cheque ... Iba a incluir la nota sobre el uso del macro-forma, pero veo que me han golpeado como otras 3 personas en los 30 segundos desde que comencé a escribir esto :)

Cuestiones relacionadas