Рубрики

Висячие, пустые, нулевые и дикие указатели

Свисающий указатель

Указатель, указывающий на область памяти, которая была удалена (или освобождена), называется висящим указателем. Есть три разных способа, где указатель действует как висячий указатель

  1. Распределение памяти

    // Распределение памяти, указанной по причинам ptr
    // свисающий указатель
    #include <stdlib.h>
    #include <stdio.h>

    int main()

    {

        int *ptr = (int *)malloc(sizeof(int));

      

        // После бесплатного звонка ptr становится

        // свисающий указатель

        free(ptr); 

          

        // Нет больше висящего указателя

        ptr = NULL;

    }

  2. Вызов функции

    // Указатель на локальную переменную становится
    // болтаться, когда локальная переменная не является статической.
    #include<stdio.h>

      

    int *fun()

    {

        // х локальная переменная и выходит из

        // область действия после выполнения fun ()

        // над.

        int x = 5;

      

        return &x;

    }

      
    // Код драйвера

    int main()

    {

        int *p = fun();

        fflush(stdin);

      

        // р указывает на то, что не

        // действует больше

        printf("%d", *p);

        return 0;

    }

    Выход:

    A garbage Address
    

    Вышеуказанная проблема не появляется (или p не становится висячей), если x является статической переменной.

    // Указатель на локальную переменную не
    // зависание, когда локальная переменная статична.
    #include<stdio.h>

      

    int *fun()

    {

        // х теперь имеет область действия по всей программе

        static int x = 5;

      

        return &x;

    }

      

    int main()

    {

        int *p = fun();

        fflush(stdin);

          

        // Не висящий указатель, как он указывает

        // к статической переменной.

        printf("%d",*p);

    }

    Выход:

     5
  3. Переменная выходит за рамки
    void main()
    {
       int *ptr;
       .....
       .....
       {
           int ch;
           ptr = &ch;
       } 
       .....   
       // Here ptr is dangling pointer
    }
    

Пустой указатель

Указатель Void — это определенный тип указателя — void * — указатель, который указывает на некоторое местоположение данных в хранилище, которое не имеет какого-либо определенного типа. Пустота относится к типу. В основном тип данных, на которые он указывает, может быть любым. Если мы присваиваем адрес типа данных char пустому указателю, он становится char Pointer, если тип данных int, то указатель int и так далее. Любой тип указателя может быть преобразован в пустой указатель, поэтому он может указывать на любое значение.
Важные моменты

  1. указатели void не могут быть разыменованы . Однако это можно сделать, используя приведение типов к пустому указателю.
  2. Арифметика указателей невозможна на указателях пустоты из-за отсутствия конкретного значения и, следовательно, размера.

Пример:

#include<stdlib.h>

  

int main()

{

    int x = 4;

    float y = 5.5;

      

    // Пустой указатель

    void *ptr;

    ptr = &x;

  

    // (int *) ptr - выполняет приведение типа к void

    // * ((int *) ptr) разыменовывает типизированное

    // переменная void указателя.

    printf("Integer variable is = %d", *( (int*) ptr) );

  

    // указатель void теперь float

    ptr = &y; 

    printf("\nFloat variable is= %f", *( (float*) ptr) );

  

    return 0;

}

Выход:

Integer variable is = 4
Float variable is= 5.500000

Обратитесь к статье void указатель для деталей.

Нулевой указатель

NULL Pointer — это указатель, который ни на что не указывает. В случае, если у нас нет адреса, который будет назначен указателю, тогда мы можем просто использовать NULL.

#include <stdio.h>

int main()

{

    // Нулевой указатель

    int *ptr = NULL;

      

    printf("The value of ptr is %p", ptr);

    return 0;

}

Выход :

The value of ptr is (nil)

Важные моменты

  1. NULL против неинициализированного указателя — неинициализированный указатель хранит неопределенное значение. Пустой указатель хранит определенное значение, но определенное средой, которое не является допустимым адресом для какого-либо члена или объекта.
  2. NULL vs Void Pointer — пустой указатель является значением, а пустой указатель является типом

Дикий указатель

Указатель, который не был инициализирован ни для чего (даже NULL), известен как дикий указатель. Указатель может быть инициализирован ненулевым значением мусора, которое может быть недопустимым адресом.

int main()

{

    int *p;  / * дикий указатель * /

  

    int x = 10;

  

    // p теперь не дикий указатель

    p = &x;

  

    return 0;

}

Эта статья предоставлена Spoorthi Arun . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Висячие, пустые, нулевые и дикие указатели

0.00 (0%) 0 votes