c++ - que - punteros a cadenas
Diferencia entre puntero NULL de desreferenciación y puntero no inicializado (3)
En el primer código, ya que no estamos configurando el puntero, está tomando una dirección de valor aleatorio ... que puede tener algún valor de basura. Pero en el segundo caso, el puntero no apunta a ninguna dirección, así que obviamente fallará
En bloques de código (C ++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int *p;
cout<<*p;
}
produce valor de basura, mientras que
#include<bits/stdc++.h>
using namespace std;
int main(){
int *p=NULL;
cout<<*p;
}
da como resultado un error de tiempo de ejecución. Esperaba un error de tiempo de ejecución para ambos (ideone produce un error de tiempo de ejecución para ambos) porque ambos son malos punteros. ¿Cómo puede uno explicar esto?
Su expectativa de un error de tiempo de ejecución es defectuosa.
La desreferenciación de un puntero no inicializado / no válido con un valor arbitrario puede hacer cualquier cosa .
Eso significa que los síntomas potenciales van desde:
- no pasa nada
- algo pasa
- se produce un error de tiempo de ejecución
- su código fuente se edita espontáneamente para usar encabezados estándar adecuados en lugar de piratear incorrectamente los "bits" de implementación
- tu actitud en la sección de comentarios mejora mágicamente
- tu gato es asesinado
- tu gato no es asesinado
- tu gato es asesinado y no asesinado
- tu gato se asesina a sí mismo
- un agujero negro se abre dentro de tu gato
- un gato se abre dentro de un agujero negro
y así.
Esto también se aplica a la desreferenciación de NULL, pero el hardware básico moderno tiende a tratar las desreferencias NULL especialmente, lo que generalmente garantiza un error de segmentación para ayudar en el diagnóstico. Obviamente, una CPU no puede hacer eso para valores de punteros arbitrarios, ¡porque pueden ser válidos hasta donde sabe!
Tu primer ejemplo,
int *p;
cout << *p;
está tomando un puntero salvaje e intenta desreferenciarlo. ¿Qué hay al otro lado de ese puntero? ¿Es una ubicación del sistema que causará un error de tiempo de ejecución? ¿Es la dirección de x
, otra variable en tu programa? ¿Es una pieza de memoria que está usando su navegador web? Intentar desreferenciar y leer o escribir en este lugar es un comportamiento indefinido , no hay garantía de lo que sucederá (el viaje en el tiempo se ha informado en casos extremos).
Sin embargo, anular la referencia de un puntero nulo (un puntero a la dirección 0
) tampoco está definido , pero es probable que dé como resultado un error de segmentación, un error de tiempo de ejecución.