Diferencia entre puntero no inicializado y nulo.

¿Hay alguna diferencia entre el puntero nulo y el puntero no inicializado? Esta pregunta se hizo en una de las entrevistas. ¿Podrías explicar la diferencia que tienen?

Tome un puntero sin inicializar:

int* ptr;//points to any location in memory 

Tome un puntero nulo:

 int* ptr = NULL;//normally points to 0x0 (0) 

Ambos causarían un comportamiento indefinido si no se referencian. NULL a menudo se define como 0.

Bueno, la diferencia es exactamente eso. El puntero nulo se inicializa a nulo y, como tal, tiene un significado definido. Puede verificarlo en nulo, y al anularlo (en todas las plataformas que conozco), un progtwig se bloqueará con diagnósticos significativos. También puedes usar punteros nulos en algunos hacks específicos. Por otro lado, los punteros unitinializados son aleatorios y deben evitarse.

Un puntero sin inicializar almacena un valor indefinido.

Un puntero nulo almacena un valor definido, pero uno que está definido por el entorno para que no sea una dirección válida para ningún miembro u objeto.

Ok … lo busqué en Google para usted, aquí está el enlace: puntero nulo vs puntero no inicializado

La diferencia básica es que un puntero no iniciado tiene un valor indeterminado, mientras que un puntero NULL tiene un valor definido que es NULL .

Con respecto al puntero NULL, de C11 , capítulo §6.3.2.3

Una expresión de constante entera con el valor 0, o una expresión de este tipo convertida en tipo void * , se denomina constante de puntero nula. Si una constante de puntero nulo se convierte en un tipo de puntero, se garantiza que el puntero resultante, llamado puntero nulo, comparará desigual a un puntero con cualquier objeto o función.

FWIW, la macro NULL se define en , como una constante de puntero nula.

Sí. Hay una diferencia en no inicializado y un puntero nulo. Un puntero no inicializado puede apuntar a cualquier ubicación de memoria (desconocida). Un puntero nulo inicializado con NULL ; Constante puntero nulo definido por la implementación.

Después de aceptar respuesta

 void foo(void) { void *uninitialized_pointer; void *null_pointer = null_pointer_generator(); ... } 

uninitialized_pointer in uninitialized . Puede tener un valor de puntero válido en él. Puede tener un valor que se compara con NULL . Puede que no tenga ningún valor de puntero. C no tiene un método definido para copiar o imprimir su valor.

  // These are undefined behavior. void *another_pointer = uninitialized_pointer; unsigned x = uninitialized_pointer*0; printf("%p\n", uninitialized_pointer); 

El código puede asignar un uninitialized_pointer , calcular su tamaño o pasar su dirección.

  // These are defined behavior. uninitialized_pointer = malloc(1); uninitialized_pointer = NULL; printf("%zu\n", sizeof uninitialized_pointer); foo(&uninitialized_pointer); 

La variable null_pointer tiene un valor que se compara igualmente con la constante del puntero nulo (ver más abajo) y, por lo tanto, en un puntero nulo . Un puntero nulo puede ser un patrón de bits único o puede haber muchos de ellos en un sistema. Todos se comparan por igual con la constante de puntero nulo y entre sí. Un puntero nulo puede o no ser una dirección válida en el sistema, aunque no se comparará por igual con ningún objeto, variable, miembro, función en su progtwig.

Intentar desreferenciar un puntero nulo es un comportamiento indefinido: puede causar una falla de seg. – puede que no.


NULL es la constante del puntero nulo . Cuando se asigna a un puntero, ese puntero es un puntero nulo . Cuando se asigna 0 a un puntero, ese puntero es un puntero nulo . Estos pueden / no ser diferentes punteros nulos . Se compararán por igual entre sí.

  void *null_pointer1 = NULL; void *null_pointer2 = 0; // The 2 pointer may/may not have the same bit pattern. printf("%p\n%p\n", null_pointer1, null_pointer2); // They will always compare as equal. printf("%d\n", null_pointer1 == null_pointer2); // Always compare as unequal. int x; printf("%d\n", null_pointer1 == &x);