• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ operator new

Object Storage Arubacloud
0 głosów
525 wizyt
pytanie zadane 14 grudnia 2015 w C i C++ przez sofnir Gaduła (4,690 p.)

Hej, mógłby mi ktoś graficznie przedstawić jak zachowują się dane podczas alokowania pamięci operatorem new?

int *pd = new int;

Co się dzieje w pamięci komputera? Jak to graficznie wygląda? 

*pd = 1001;

I teraz co się dzieje? :) Bardzo chciałbym to zobaczyć graficznie, jeden obrazek jest wart więcej niż tysiąc słów.

Z góry bardzo dziękuję :)

2 odpowiedzi

+3 głosów
odpowiedź 14 grudnia 2015 przez Porcupine Nałogowiec (31,560 p.)
wybrane 15 grudnia 2015 przez sofnir
 
Najlepsza

Oglądałeś filmik Pana Mirosława na temat wskaźników? :)

https://www.youtube.com/watch?v=0DQl74alJzw

Ogólnie gdy tworzysz wskaźnik int *pd; w pamięci tworzysz taką "szufladkę" bodajże 4 / 8 bitową, która na początku ma nieokreśloną wartość w momencie przypisania do niej "new int" tworzysz drugą o wielkości odpowiadającej typowi danych (w tym przypadku int), a w tej pierwszej zapisuje się adres komórki numer dwa, czyli tak jakby pierwsza "wskazuje" na drugą. W drugiej komórce wartość jest jak na razie nieokreślona. No i ostatni moment "*pd = 1001" w komórce nr. 2, tam gdzie wcześniej było nie wiadomo co, zapisuje się wartość 1001.

Pozdrawiam,

komentarz 14 grudnia 2015 przez sofnir Gaduła (4,690 p.)

Okej, wiem jak działają wskaźniki, tylko to new int mnie zastanawiało, rozumiem to co piszesz. Zastanawia mnie taka kwestia:

Jeśli mam: 

int pd = 101;
int *wsk_pd = &pd; 

Wyświetlając &pd, wsk_pd, &wsk_pd mam taki sam wynik, wszystko leży w tej samej szufladce, a jak stosuję operator new np.

int  *pd = new int;
*pd = 1001;

Tutaj dla pd i &pd mam już inne szufladki? Why? :( Wydaje mi się, że dlatego, że pd wskazuje adres szufladki, w której jest moja "dynamiczna" zmienna, a &pd adres szufladki wskaźnika, ale w takim razie dlaczego w tym przypadku powyżej wsk_pd i &wsk_pd ma taki sam adres szufladki?

komentarz 15 grudnia 2015 przez Porcupine Nałogowiec (31,560 p.)
edycja 15 grudnia 2015 przez Porcupine
#include <iostream>
using namespace std;

int main()
{
    // przykład pierwszy:
    int A = 101;
    int * pointerA = &A;

    cout << "A: " << A << endl;     // wypisuje wartość A
    cout << "& A: " << &A << endl;    // wypisuje adres komórki "A"
    cout << "pointerA: " << pointerA << endl;    // wypisuje to na co wskazuje nasz wskaźnik (adres komórki "A")
    cout << "* pointerA: " << * pointerA << endl; // wypisuje wartość tego na co wskazuje nasz wskaźnik, czyli wartość komórki "A"
    cout << "& pointerA: " << & pointerA << endl; // wypisuje adres komórki, w której jest nasz wskaźnik

    // przykład drugi

    int * pointerB;
    cout << "pointerB: " << pointerB << endl;  // wskaźnik wskazuje na "losową" komórkę w pamięci, wypisuje adres tej komórki
    
    pointerB = new int;
   
    cout << "pointerB: " << pointerB << endl; // dokonana została rezerwacja konkretnej komórki pamięci i na nią wskazuje wskaźnik, wypisuje adres
    * pointerB = 1001;
    cout << "pointerB: " << pointerB << endl; // nie zmieni się od ostatniego razu, dalej ta sama komórka
    cout << "& pointerB: " << & pointerB << endl; // wypisze adres komórki wskaźnika
    cout << "* pointerB: " << * pointerB << endl; // wypisze wartość komórki, na ktorą wskazuje -> 1001

    return 0;
}


Nie do końca rozumiem... wsk_pd nie bedzie mieć tej samej wartości co &wsk_pd... ;) Zobacz powyżej.

komentarz 15 grudnia 2015 przez sofnir Gaduła (4,690 p.)
Ok masz rację, nie wiem czemu wcześniej jak kompilowałem program to myślałem, że pokazywany jest ten sam adres. Dzięki za pomoc
0 głosów
odpowiedź 14 grudnia 2015 przez Grzyboo Nałogowiec (28,860 p.)
Nie wiem co chcesz graficznie tutaj wiedzieć. Przyjmij do wiadomości, że new alokuje jakiś blok pamięci i ten blok pamięci przydzielony jest do wskaźnika tak długo jak nie użyjesz na wskaźniku delete.

Podobne pytania

0 głosów
1 odpowiedź 199 wizyt
0 głosów
1 odpowiedź 213 wizyt
pytanie zadane 5 lutego 2020 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 219 wizyt
pytanie zadane 3 listopada 2016 w C i C++ przez Tinsonu Początkujący (280 p.)

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,003 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...