usar tipos lenguaje leer funciones declarar datos como caracteres cadenas cadena arreglo c pointers gcc cstring

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 tipo char * (literalmente, "puntero a un char ")
  • 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 tipo int , 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 puntero str apunta a nada.
  • Escribir *str == ''/0'' le indica si el puntero str 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 si str es un puntero NULL
  • str[0] == ''/0'' determina si str 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á si str no es NULL.
  • Por lo tanto, la primera prueba str == NULL es necesaria para salir temprano cuando str 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)