tipos - ¿Cuál es la diferencia entre str== NULL y str[0]== ''/ 0'' en C?
leer cadena de caracteres en c (10)
Quiero saber la diferencia entre str == NULL
y str[0] == ''/0''
:
int convert_to_float(char *str, double *num)
{
if ((str == NULL) || (str[0] == ''/0''))
return(-1);
*num = strtod(str, (char **)NULL);
return(0);
}
Estoy usando gcc en Linux.
1 -> str == NULL
determina si str es un puntero NULL 2 -> str[0] == ''/0''
determina si str es una cadena de estilo 0 length c
entonces en este if ((str == NULL) || (str[0] == ''/0''))
cortocircuito del operador OR entra en la imagen ya que asegura que cualquiera de las cadenas no está apuntando a nada o a una cadena vacía.
C # equivalente de esto es:
if (string.IsNullOrEmpty(str))
{
}
El significado simple es si la cadena es NULL o una cadena vacía.
Es importante recordar que str
no es realmente una "cadena", sino un puntero a la ubicación de la memoria donde se almacena un char
(una parte de una cadena).
Luego, tenemos que entender cómo el compilador ve todos estos elementos. Veamos sus tipos:
-
str
es de tipochar *
(literalmente, "puntero a unchar
") -
NULL
es una constante de puntero nulo (al menos en mi sistema, es((void*)0)
) -
''/0''
es una constante de caracteres (en realidad es de tipoint
, pero no se preocupe, generalmente se usa en un contexto que requiere un valor de caracteres)
Ver *
en char *
y void *
? Eso le dice al compilador que estos son tipos de punteros (lo cual es una manera elegante de decir que las variables de este tipo no tienen el valor, simplemente lo señalan). Entonces, cuando el compilador ve char *str
, sabe que puede pedir hacer algo como *str
o str[0]
(que hacen lo mismo). Volveremos sobre eso, más adelante.
Verá, cuando escribe str
en un programa C, el compilador sabe que una variable llamada "str" se almacena en una ubicación de memoria, por ejemplo 0x0001. El código que genera va a 0x0001 y recupera el valor. De esa forma, si haces algo como
str + 1
Entonces el compilador generará un código que se parece a algo así como:
fetch the value from where str is stored (0x0001)
add 1 to that value
Que es algo que estoy seguro que sabes. Entonces, ahora debería ser obvio lo que dice esta línea:
str == NULL
Como NULL
es una constante de puntero nulo, esa línea comprueba si str
es un puntero nulo (es decir, un puntero que no apunta a nada).
Entonces el compilador generalmente genera código como este:
fetch the value from where str is stored
check if that value is 0
Recuerde, por favor, que le dijimos al compilador que str
es realmente un tipo de puntero. Así que estamos autorizados a escribir esto:
*str
Y eso hace que el compilador genere esto:
fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there
Entonces, si str tuviera 0x0200, obtendríamos el valor de la dirección de memoria 0x0200. Tenga en cuenta que al compilador realmente no le importa si una cadena realmente está almacenada allí o no.
(Voy a suponer que sabes que str[0]
es lo mismo que *str
. Hace que sea más fácil explicar lo que está sucediendo).
¿Qué tal esto, entonces?
*str == ''/0''
Entonces esa línea es realmente, en efecto:
*str == (char) 0
Lo que hace que el compilador genere esto:
fetch the value from where str is stored
now use that value like a memory address and fetch the char that is stored there
check if the value of that fetched char is 0
Para resumir:
- Escribir
str == NULL
le dice si el punterostr
apunta a nada. - Escribir
*str == ''/0''
le indica si el punterostr
apunta a una cadena vacía (en realidad, apunta a una ubicación de memoria que contiene un cero).
(Una "cadena" es, por definición, "una secuencia contigua de caracteres terminada por e incluyendo el primer carácter nulo", por lo que si el primer carácter de una cadena es ''/0''
, entonces la cadena es una cadena vacía.)
Esencialmente
-
str == NULL
determina sistr
es un punteroNULL
-
str[0] == ''/0''
determina sistr
es una cadena de estilo 0 length c
Cuando los combina, está verificando si es NULO o está vacío. Esto permite que la función elimine ambas formas de datos vacíos al comienzo del método
str == NULL significa "str puntos para dirección de memoria cero" (o cualquier dirección es NULL en su sistema). Típicamente esto significa que no hay una cadena en absoluto.
str [0] == ''/ 0'' significa "el primer carácter de str es el carácter cero" (que marca el final de la cadena). Esto significa que hay una cadena, pero está vacía. Piense en una taza vacía versus ninguna copa en absoluto; la misma idea.
En otros idiomas, puede escribir str == null
vs str == ""
. Ellos significan dos cosas diferentes. Es especialmente importante entender la diferencia en C, ya que tratar de usar un puntero NULL bloqueará el programa.
str == NULL
comprobación str es NULL-puntero (puntero a la nada)
str[0] == ''/0''
(si no puntero NULL) verificando que el primer elemento str tenga 0-value (cadena sin caracteres solo con 0-terminados)
str == NULL
significa que la cadena que NO TIENE REFERENCIA de cadena, porque su puntero es Nulo (significa que la dirección de la cadena es nula).
str[0] == ''/0''
- significa cadena con longitud 0.
Por favor, avíseme si algo está mal en esta explicación o si aún tiene dudas.
str==NULL
le dice si el puntero es NULL.
str[0]==''/0''
te dice si la cadena es de longitud cero.
En ese código, la prueba:
if ((str == NULL) || (str[0] == ''/0''))
se usa para capturar el caso donde es NULL o tiene longitud cero.
Tenga en cuenta que el cortocircuito juega un papel clave aquí: el objetivo de la prueba es asegurarse de que str
sea una cadena válida con una longitud de al menos 1.
- La segunda prueba
str[0] == ''/0''
solo funcionará sistr
no es NULL. - Por lo tanto, la primera prueba
str == NULL
es necesaria para salir temprano cuandostr
es NULL.
str==NULL
le dice si la cadena es NULL
.
*str==''/0''
te dice si la cadena es de longitud cero.
Nota : Esta respuesta es una jugada de la respuesta de 15 segundos de Mystical que tenía str==''/0''
. Por supuesto, los cambios realizados en los primeros 3 o 4 minutos no se muestran y lo arregló ಠ_ಠ.
str == NULL
significa que str no está apuntando a ninguna dirección = el puntero está vacío.
y str[0] == ''/0''
str apunta a una dirección válida y esta línea verifica si el primer carácter (es decir, str [0]) es el dígito 0 (el valor ascii de ''/ 0'') lo que significa final de la cadena. entonces la cadena está vacía. (no hay ningún personaje en str: el primero es el personaje final)