es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay un problema con el código. La variable var se inicializa dentro del ámbito de la declaración if, por lo que solo existe dentro de ese ámbito. Una vez que se completa la ejecución de la declaración if, var ya no está en el ámbito y cualquier puntero que apunte a ella se vuelve inválido. En este caso, p_var apunta a var, pero var ya no existe fuera de la declaración if. Como resultado, acceder a la ubicación de memoria a la que apunta p_var después de la declaración if 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ón if, de modo que exista durante toda la duración del programa. Por ejemplo:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        short var = 0;
        short *p_var = &var;
    
        if (p_var == NULL) {
            var = 123;
            printf("ma variable= %d \n", *p_var);
        }
        printf("ma variable= %d \n", *p_var);
    
        return 0;
    }
    

    De esta manera, var existe en todo el programa y p_var puede apuntar de forma segura a ella.</stdlib.h></stdio.h>

Comments are closed.