¿Cuál es la diferencia entre NULL, ‘\0’ y 0?

6 minutos de lectura

avatar de usuario
gavi

En C, parece haber diferencias entre varios valores de cero: NULL, NUL y 0.

Sé que el carácter ASCII '0' evalúa a 48 o 0x30.

Él NULL puntero se define generalmente como:

#define NULL 0

O

#define NULL (void *)0

Además, está el NUL personaje '\0' que parece evaluar a 0 así como.

¿Hay momentos en que estos tres valores no pueden ser iguales?

¿Es esto también cierto en los sistemas de 64 bits?

  • Consulte stackoverflow.com/questions/176989/… para obtener más información sobre las diferencias entre 0 y NULL.

    – David Rodríguez – dribeas

    19 de agosto de 2009 a las 7:22

  • el identificador NUL no existe en el lenguaje o la biblioteca estándar de C (o en C++ hasta donde yo sé). El carácter nulo a veces se llama NUL, pero en C o C++ generalmente se lo conoce como '\0'.

    –Keith Thompson

    9 de julio de 2013 a las 2:09

avatar de usuario
amaterasu

Parece que algunas personas malinterpretan cuáles son las diferencias entre NULL, ‘\0’ y 0. Entonces, para explicar, y en un intento de evitar repetir lo dicho anteriormente:

Una expresión constante de tipo. int con el valor 0, o una expresión de este tipo, convertida a tipo void * es un constante de puntero nuloque si se convierte en un puntero se convierte en un puntero nulo. Está garantizado por el estándar para comparar desigual a cualquier puntero a cualquier objeto o función.

NULL es una macro, definida en como un constante de puntero nulo.

\0 es una construcción utilizada para representar el carácter nuloutilizado para terminar una cadena.

UN carácter nulo es un byte que tiene todos sus bits establecidos en 0.

  • Te lo perdiste 0.

    – Pacerier

    19 de julio de 2021 a las 10:06


  • No, '\0' es no un valor de 1 byte. Es un carácter literal, que es una expresión constante entera, por lo que si se puede decir que tiene un tamaño, entonces es el tamaño de un int (que tiene que tener al menos 2 bytes). Si no me crees, evalúa sizeof('\0') y ver por ti mismo. '\0', 0 y 0x0 son todos completamente equivalentes.

    – café

    19 de agosto de 2009 a las 1:06

  • @caf depende del idioma. Si no me crees, prueba sizeof('\0') en un compilador de C++.

    – Eugene Yokota

    19 de agosto de 2009 a las 14:30

  • debe usar “%zu” al imprimir tamaño de (algo)

    – Sin usar

    26 de febrero de 2015 a las 8:46


  • En C, es 4 en su computadora solo por la conversión automática, que es int por defecto. asigne ese valor sin reformular a un char, un int o un long long int y su tamaño cambiará en consecuencia. También el tamaño de ‘a’ es 4 de una variable.

    usuario17492848

    25 de diciembre de 2021 a las 0:22


avatar de usuario
nasko

Los tres definen el significado del cero en diferentes contextos.

  • contexto del puntero: se usa NULL y significa que el valor del puntero es 0, independientemente de si es de 32 bits o de 64 bits (un caso de 4 bytes y el otro de 8 bytes de ceros).
  • contexto de cadena: el carácter que representa el dígito cero tiene un valor hexadecimal de 0x30, mientras que el carácter NUL tiene un valor hexadecimal de 0x00 (utilizado para terminar cadenas).

Estos tres siempre son diferentes cuando miras la memoria:

NULL - 0x00000000 or 0x00000000'00000000 (32 vs 64 bit)
NUL - 0x00 or 0x0000 (ascii vs 2byte unicode)
'0' - 0x20

Espero que esto lo aclare.

  • Nasko: evaluar sizeof('\0') y sorpréndete.

    – café

    19 de agosto de 2009 a las 0:58

  • @Nasko: Me sorprendió mucho: con gcc, en C: sizeof(‘\0’) == sizeof(‘a’) == 4, mientras que con g++, en C++: sizeof(‘\0’) == sizeof (‘a’) == 1

    – David Rodríguez – dribeas

    19 de agosto de 2009 a las 7:51

  • @Nasko: del estándar C (borrador, n1124): ‘Una constante de carácter entero tiene tipo int’, por lo tanto, ‘\ 0’ es en realidad de tipo int en C, y por lo tanto sizeof (‘\ 0’) es 4 en mi arquitectura (Linux, 32 bits)

    – David Rodríguez – dribeas

    19 de agosto de 2009 a las 8:02

  • @dribeas: no lo describí como una constante, sino como lo que verías como parte de la cadena. Definitivamente podría haberlo hecho explícito. Gracias

    – Nasko

    19 de agosto de 2009 a las 15:27

  • @DavidRodríguez-dribeas Deshizo la edición “Corregido el valor ASCII ‘0’ a 0x20 (32 de diciembre)”

    – chux – Reincorporar a Monica

    22/09/2017 a las 19:28

avatar de usuario
Explorador intraestelar

Una buena pieza que me ayuda cuando empiezo con C (tomado de Programación Experta en C de Linden)

El Uno ‘l’ nulo y el Dos ‘l’ nulo

Memoriza esta pequeña rima para recordar la terminología correcta para los punteros y el cero ASCII:

The one "l" NUL ends an ASCII string,

The two "l" NULL points to no thing.

Apologies to Ogden Nash, but the three "l" nulll means check your spelling. 
  • El carácter ASCII con el patrón de bits de cero se denomina “NUL”.
  • El valor de puntero especial que significa que el puntero no apunta a ninguna parte es “NULL”.
  • Los dos términos no son intercambiables en significado.

  • Nasko: evaluar sizeof('\0') y sorpréndete.

    – café

    19 de agosto de 2009 a las 0:58

  • @Nasko: Me sorprendió mucho: con gcc, en C: sizeof(‘\0’) == sizeof(‘a’) == 4, mientras que con g++, en C++: sizeof(‘\0’) == sizeof (‘a’) == 1

    – David Rodríguez – dribeas

    19 de agosto de 2009 a las 7:51

  • @Nasko: del estándar C (borrador, n1124): ‘Una constante de carácter entero tiene tipo int’, por lo tanto, ‘\ 0’ es en realidad de tipo int en C, y por lo tanto sizeof (‘\ 0’) es 4 en mi arquitectura (Linux, 32 bits)

    – David Rodríguez – dribeas

    19 de agosto de 2009 a las 8:02

  • @dribeas: no lo describí como una constante, sino como lo que verías como parte de la cadena. Definitivamente podría haberlo hecho explícito. Gracias

    – Nasko

    19 de agosto de 2009 a las 15:27

  • @DavidRodríguez-dribeas Deshizo la edición “Corregido el valor ASCII ‘0’ a 0x20 (32 de diciembre)”

    – chux – Reincorporar a Monica

    22/09/2017 a las 19:28

avatar de usuario
Sinan Ünür

Si NULL y 0 son equivalentes como constantes de puntero nulo, ¿cuál debo usar? en la lista de preguntas frecuentes de C también aborda este problema:

Los programadores de C deben entender que
NULL y 0 son intercambiables en contextos de puntero, y que un cast 0
es perfectamente aceptable. Cualquier uso de NULL (a diferencia de 0) debe considerarse un suave recordatorio de que se trata de un puntero; los programadores no deberían depender de él (ya sea para su propia comprensión o la del compilador) para distinguir el puntero
0es de entero 0‘s.

Es solo en contextos de puntero que
NULL y 0 son equivalentes. NULL no debe usarse cuando otro tipo de 0 es obligatorio, aunque podría funcionar, porque hacerlo envía un mensaje estilístico incorrecto. (Además, ANSI permite la definición de NULL ser – estar
((void *)0)que no funcionará en absoluto en contextos que no sean de puntero). En particular, no use NULL cuando el carácter nulo ASCII (NUL) es deseado. Proporcione su propia definición

#define NUL '\0'

si debes.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad