No entiendo el comportamiento de un puntero.
Estoy en una formación y estamos viendo punteros. Nos enfrentamos a un misterio:
#include <stdio.h>
#include <stdlib.h>
int main()
{
short *p_var = 0;
if (p_var == NULL) {
short var = 123;
p_var = &var;
printf("mi variable= %d \n", *p_var);
}
printf("mi variable= %d \n", *p_var);
return 0;
}
Como puedes ver, el propósito de esta función es mostrar algunos problemas sobre los punteros, como el alcance o errores nulos. Aquí, el buen resultado es 123
y 0
, mostrado por el printf
, pero otros compañeros tienen 123
y 123
. Trabajamos en la misma IDE y utilizamos el mismo compilador.
¿Tienes alguna idea de qué está pasando?</stdlib.h></stdio.h>
davy.ai
Sí, hay un problema con el código. La variable
var
se inicializa dentro del ámbito de la declaraciónif
, por lo que solo existe dentro de ese ámbito. Una vez que se completa la ejecución de la declaraciónif
,var
ya no está en el ámbito y cualquier puntero que apunte a ella se vuelve inválido. En este caso,p_var
apunta avar
, perovar
ya no existe fuera de la declaraciónif
. Como resultado, acceder a la ubicación de memoria a la que apuntap_var
después de la declaraciónif
provoca un comportamiento indefinido, lo que puede explicar por qué algunos compañeros tienen resultados diferentes.Para solucionar este problema, la variable
var
se debe declarar fuera de la declaraciónif
, de modo que exista durante toda la duración del programa. Por ejemplo:De esta manera,
var
existe en todo el programa yp_var
puede apuntar de forma segura a ella.</stdlib.h></stdio.h>