2012-04-26 25 views
10

El título puede ser un poco inapropiado ... solo porque no estoy seguro de si mi puntero de char apunta a NULL, o si solo apunta a una matriz de caracteres de tamaño 0.¿Cómo puedo verificar si un puntero apunta a NULL?

Así que tengo

char* data = getenv("QUERY_STRING"); 

Y quiero comprobar si los datos es nulo (o longitud es < 1). He intentado:

if(strlen(data)<1) 

pero me da un error:

==24945== Invalid read of size 1 
==24945== at 0x8048BF9: main (in /cpp.cgi) 
==24945== Address 0x1 is not stack'd, malloc'd or (recently) free'd 

También he intentado

if(data == NULL) 

pero con el mismo resultado.

¿Qué está pasando aquí? Ya he intentado cout con los datos, y eso funciona bien. Parece que no puedo verificar si es nulo o está vacío.

Me doy cuenta de que son dos cosas diferentes (nulas y vacías). Quiero saber qué datos estarán aquí y cómo verificar si son nulos/vacíos.

+2

Nota al margen: debe usar 'const char *', no 'char *'. De [los documentos (C++)] (http://www.cplusplus.com/reference/clibrary/cstdlib/getenv/): 'La cadena apuntada por el puntero devuelto por esta función no será modificada por el programa. – Cameron

Respuesta

21

¡Con getenv, tiene que manejar ambos casos! (¡Sí!) Si la variable de entorno no está configurada, la función devuelve NULL. Si está configurado, obtendrá un puntero al valor que está configurado, que puede estar vacío. Por lo tanto:

const char* data = getenv("QUERY_STRING"); 
if (data != NULL && data[0] != '\0') { 
    // Variable is set to value with length > 0 
    // ... 
} 

Obviamente, es necesario comprobar si es NULL antes intentar determinar su longitud o leer cualquiera de los personajes que lo han generado - es por eso que las dos condiciones en el anterior if se ordenó la como son

+3

Esto se puede reducir en gran medida a 'if (data && * data) {...}' – Philip

+5

@Philip: Sí, sí podría. ¿Pero cuál es más legible? Esa es una cuestión de opinión. ¡Usa lo que más te gusta! Mi preferencia personal sería 'if (data && data [0]! = '\ 0')'. Agregué el '! = NULL' para aclarar mi respuesta. – Cameron

+0

@Cameron: algunas personas en SO afirman que hay plataformas donde NULL! = 0. Por otro lado * "Un valor cero, valor de puntero nulo o valor de puntero de miembro nulo se convierte en falso;" *. Lo que significa que ambas formas de verificación son válidas. – SigTerm

4

En general, usted verifica con algo como esto. La primera parte comprueba si el puntero es nulo, el segundo busca una cadena vacía al verificar el primer carácter para el terminador nulo al final de cada cadena.

if (data == NULL || data[0] == 0) 

Su problema parece una cierta interacción específica entre getenvstrlen y que no es estándar.

+0

'getenv' devuelve un puntero a una serie C terminada en nulo normal. 'strlen' está diseñado para ese tipo de cadenas. – Cameron

+0

@ Cameron: ¿Te imaginas una C-string de longitud cero que no comienza con '\ 0'? – SigTerm

+0

@SigTerm: No. ¿Puede usted? – Cameron

Cuestiones relacionadas