¿Qué son los punteros salvajes en C y cómo podemos evitarlos?

¿Qué son los punteros salvajes en C y cómo podemos evitarlos?

¿Qué son los punteros salvajes en C?

Los punteros no inicializados se conocen como punteros salvajes. El comportamiento de los punteros no inicializados no está definido porque apuntan a alguna ubicación de memoria arbitraria. Los punteros salvajes pueden hacer que un programa se bloquee o se comporte mal.

Nota: Generalmente, los compiladores advierten sobre el puntero salvaje.

int *ptr; //ptr is wild pointer

Veamos un programa para entender el puntero salvaje.

#include<stdio.h>

int main()
{
    //ptr pointing some unknown memory location
    int *ptr; /* wild pointer */

    //Assigning value
    *ptr = 12;

    printf("%d\n",*ptr);

    return 0;
}

Salida:

Comportamiento indefinido.

Explicación: En el programa mencionado, ptr no se inicializa con una memoria válida. Por lo tanto, podría apuntar a una ubicación desconocida cuando acceda a la ubicación desconocida. El comportamiento del programa no estará definido.

¿Cómo podemos evitar los punteros salvajes?

Podemos evitar fácilmente la creación del puntero salvaje en nuestro programa. Debemos inicializar el puntero con alguna memoria válida en el momento de la declaración del puntero. Veamos un ejemplo de programa C,

#include<stdio.h>

int main()
{
    int data = 27;

    //Now pointer pointing valid memory
    int *ptr = &data; /* no more wild pointer */

    //Assigning value
    *ptr = 12;

    printf("%d\n",*ptr);

    return 0;
}

Salida:

12

Explicación: ptr apunta a datos, por lo que ahora ptr no es un puntero salvaje.

Si no tiene una variable, puede usar las funciones de administración de memoria (malloc, calloc, etc.) para asignar una memoria válida. Veamos un ejemplo,

#include<stdio.h>
#include<stdlib.h>

int main()
{
    //Now pointer pointing valid memory
    int *ptr = malloc(sizeof(int)); /* no more wild pointer */

    if(ptr == NULL)
    {
        return -1;
    }
    //Assigning value
    *ptr = 12;

    printf("%d\n",*ptr);

    free(ptr); //free allocated memory

    return 0;
}

Salida;

12

finalmente, si no desea asignar memoria al puntero en el momento de la declaración. Debe inicializar el puntero con NULL (puntero nulo). El comportamiento del puntero nulo está definido por el estándar C y debe validar el puntero antes de su uso.

#include<stdio.h>
#include<stdlib.h>

int main()
{

    int *ptr = NULL; /* no more wild pointer */

    if(ptr == NULL)
    {
        ptr = malloc(sizeof(int));
        if(ptr == NULL)
        {
            return -1;
        }
        //Assigning value
        *ptr = 26;

        printf("%d\n",*ptr);

        free(ptr); //free allocated memory
    }

    return 0;
}

Salida;

26

Artículos recomendados para ti:

  • Puntero colgante, vacío, nulo y salvaje
  • Preguntas de entrevista Pointer en C/C++.
  • Puntero de función en c, una guía detallada
  • ¿Cómo crear una matriz dinámica en C?
  • 15 errores comunes con la asignación de memoria.
  • ¿Cómo acceder a la matriz 2D en C?
  • Una breve descripción del puntero en C.
  • ¿Cómo usar la estructura del puntero de función en lenguaje C?
  • Preguntas de la entrevista de 100 C, su entrevistador podría preguntar.
  • Diseño de memoria en C.
  • Preguntas de entrevista de Python con respuesta.
  • Manejo de archivos en C.
  • Puntero de función en la estructura.
  • puntero vacío en C, una discusión detallada.
  • Manejo de archivos en C.
  • Especificadores de formato C.