3 / 4
Oct 2021

Czy mógłby mi ktoś wytłumaczyć czym jest wartość zwracana przez “w” w tym kodzie?

  • created

    Oct '21
  • last reply

    Oct '21
  • 3

    replies

  • 567

    views

  • 3

    users

  • 5

    likes

  • 2

    links


Deklaracja wskaznika na typ int

int * w;

Czyli utworzenie zmiennej, która w sobie może przechowywać adres zmiennej typu int w pamięci.
Po takiej deklaracji wartość jest niezdefiniowana, czyli w ma w sobie jakiś przypadkowy adres,
nie wolno go używać.


Zaalokowanie tablicy z elementami typu int, rozmiar tej tablicy to ile elementów.
Adres zerowego elementu w tej tablicy zapisany zostanie we wskaźniku w.

w = new int [ile];

W tym przypadku ile ma wartość 10, czyli w pamięci zostanie zarezerwowanych 10 elementów typu int:

        +---- na ta komorke [0] w pamieci wskazuje wskaźnik w
        |     (w tym przykładzie jest to wartość: 94669150871184)
       \|/
        :     (rozmiar jednej komórki w tej tablicy to rozmiar int = 4 bajty)
        :
        :    ...... ta komórka [1] ma adres: 94669150871188
        :    :
....----+----+----+----+----+----+----+----+----+----+----+----....
....    |    |    |    |    |    |    |    |    |    |    |    ....
....----+----+----+----+----+----+----+----+----+----+----+----....
          [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]

Wypisanie wartości wskaźnika w (czyli adresu):

cout<<(long long)w<<endl;

Wykorzystano tutaj rzutowanie na typ long long, jednak rzutowanie wskaźnika na typ całkowity nie zawsze zadziała, nie powinno się tego robić, nie jest to po prostu przenośne.


Zwiekszenie wskażnika w o jeden element:

w++;

Typem, na który wskazuje w jest int, czyli wartość zostanie zwiękoszona o jeden element typu int, czyli o 4 bajty.


Podsumowując program wyświetla adresy wszystkich komórek w zaalokowanej tablicy.


UWAGA: Program wykonuje niedozwoloną operację w linii 22:

delete []w;

W tym momencie w ma wartość: adres końca tablicy (w tym przykładzie: 94669150871224).
delete musi otrzymać dokładnie tą samą wartość, jaka została zwrócona przy alokacji, czyli w tym przypadku wartość: 94669150871184.
To jest krytyczny błąd w tym programie, takie coś może zdestabilizować działanie niektórych systemów operacyjnych.

O kurde jaka potężna odpowiedz wystarczyła by informacja o tym, że jest to przypadkowy adres, ale dodatkowa wiedza zawsze się przyda dzięki wielkie.