El valor del puntero nulo representa un "ningún lugar" bien definido; es un valor de puntero inválido que se garantiza que no se compara con ningún otro valor de puntero. Intentar desreferenciar un puntero nulo da como resultado un comportamiento indefinido y generalmente generará un error de tiempo de ejecución, por lo que debe asegurarse de que un puntero no sea NULL antes de intentar desreferenciarlo. Varias funciones de la biblioteca C y C ++ devolverán un puntero nulo para indicar una condición de error. Por ejemplo, la función de biblioteca malloc
devolverá un valor de puntero nulo si no puede asignar el número de bytes que se han solicitado, e intentar acceder a la memoria a través de ese puntero (generalmente) provocará un error de tiempo de ejecución:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Por lo tanto, debemos asegurarnos de que la malloc
llamada se realizó correctamente comprobando el valor de p
contra NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Ahora, agárrate a tus calcetines un minuto, esto se pondrá un poco irregular.
Hay un puntero nulo valor y un puntero nulo constante , y los dos no son necesariamente los mismos. El puntero nulo valor es cualquier valor que los usos arquitectura subyacente para representar "la nada". Este valor puede ser 0x00000000, 0xFFFFFFFF, 0xDEADBEEF o algo completamente diferente. No asuma que el puntero nulo valor es siempre 0.
La constante de puntero nulo , OTOH, es siempre una expresión integral con valor 0. En lo que respecta a su código fuente , 0 (o cualquier expresión integral que evalúe a 0) representa un puntero nulo. Tanto C como C ++ definen la macro NULL como la constante de puntero nulo. Cuando se compila su código, la constante de puntero nulo se reemplazará con el valor de puntero nulo apropiado en el código de máquina generado.
Además, tenga en cuenta que NULL es solo uno de los muchos valores de puntero inválidos posibles ; si declara una variable de puntero automático sin inicializarla explícitamente, como
int *p;
El valor inicialmente almacenado en la variable es indeterminado y puede no corresponder a una dirección de memoria válida o accesible. Desafortunadamente, no hay forma (portátil) de saber si un valor de puntero no NULL es válido o no antes de intentar usarlo. Entonces, si está tratando con punteros, generalmente es una buena idea inicializarlos explícitamente a NULL cuando los declara, y establecerlos en NULL cuando no apuntan activamente a nada.
Tenga en cuenta que esto es más un problema en C que en C ++; C ++ idiomático no debería usar punteros tanto.