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

Wskaźniki, dynamiczne alokowanie pamieci

Object Storage Arubacloud
0 głosów
753 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)
edycja 24 czerwca 2018 przez criss

Witam mam pytanie odnośnie dynamicznego alokowania pamięci. Otóż jaka jest różnica między tym zapisem, przy pomocy wskaźnika:
 

cin >> ile;
int *tablica;
tablica = new int [ile];
delete [] tablica;


a takim rezerwowaniem tablic:
 

int ile;
cin>>ile;
int y[ile];

 

5 odpowiedzi

+2 głosów
odpowiedź 24 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 24 czerwca 2018 przez criss
 
Najlepsza

Zapis pierwszy (z new), dokonuje alokacji pamięci na tablice w obszarze nazywanym dynamic storage w standardzie C++ który jest najczęściej mapowany na obszar sterty programu w systemie operacyjnym.

Zapis drugi (z użyciem zmiennej przekazywanej do wielkości tablicy), alokuje pamięć tablicy w obszarze stosu. Zapis taki (ze zmienną), nazywany jest VLA (ang. Variable Alocation Table) i jest właściwością języka C99 (bez plusów). Dostarczany jest wraz z kompilatorami także języka C++ i jest poza standardem C++. Stąd (z punktu widzenia standardu C++) zapis z VLA jest poza standardem. Z tego też powodu nie zaleca się jego użycia.

Co do działania, zapis pierwszy (z new), powoduje że wskaźnik na alokowane dane zachowuje swoją ważność do momentu dealokowania przez delete a więc także poza blokiem kodu w którym był tworzony. Zapis drugi powoduje zwolnienie przestrzeni pamięci po opuszczeniu bloku kodu. Dostępy realizowane są tak samo z użyciem indeksu. Poprawne działanie arytmetyki indeksów (a więc i wskaźników na pamięć), gwarantowane jest przez standard w zakresie od 0 do 1 elementu za tablicą.

+1 głos
odpowiedź 24 czerwca 2018 przez Secrus Nałogowiec (32,880 p.)
Różnica jest taka, że drugi zapis jest błędny. Kompilator nie powinien go przyjmować. Dokładnie dlaczego to muszą się wypowiedzieć koledzy C++'owcy, ale jest to błąd "językowy".
komentarz 24 czerwca 2018 przez MAXIM7 Obywatel (1,990 p.)
u mnie ten zapis działa :D
komentarz 24 czerwca 2018 przez RafalS VIP (122,820 p.)
Bo standard jezyka to jedno a to co zaimplementuja twórcy kompilatorow to drugie. Wedlug standardu C++ to nie powinno dzialac, ale tworcy gcc stwierdzili ze zrobia nam takie uproszczenie i ich kopilator to łyka. Ale co jesli inny kompilator tego nie lyknie bo bedzie sie ttrzymal standardu? Np w msvc to sie nie kompiluje. Dlatego jest to niepolecana praktyka. U Ciebie to sie kompiluje a ktoa inny uzywa msvc i u niego nie zadziala
+1 głos
odpowiedź 24 czerwca 2018 przez k222 Nałogowiec (30,150 p.)
Ten pierwszy zapis jest jak najbardziej ok, ten drugi działa, ale jest niezalecany, z obu tablic korzysta się dokładnie tak samo, główna różnica polega na tym, że w pierwszej opcji masz delete, więc ty decydujesz kiedy zwalniasz pamięć, w drugim czegoś takiego nie ma.
+1 głos
odpowiedź 24 czerwca 2018 przez criss Mędrzec (172,590 p.)
W pierwszym sposobie alokujesz pamięć na tzw. stercie czyli obszarze pamięci dynamicznie przydzielanym prcoesowi przez system operacyjny. Rozmiar tak przydzielonej pamięci jest ograniczony tylko przez faktyczną ilość pamięci.

Drugi sposób alokuje tablice na tzw. stosie. Stos jest obszarem pamięci na stałe przypisany procesowi i ma z góry określony rozmiar (niewielki; na Windowsie domyślnie jest to 1MB). Jednak działa tylko na gcc (być może jeszcze na jakimś kompilatorze, ale nie wiem..), bo pod tym względem nie jest zgodny ze standardem. Standard wymaga, żeby wielkość tworzonej na stosie tablicy była znana w czasie kompilacji.
+1 głos
odpowiedź 24 czerwca 2018 przez profesorek96 Szeryf (91,420 p.)

Od siebie dodam że zapis drugi gdzie masz zmienną w nawiasach kwadratowych jest błędny. Według standardu Cpp rozmiar tablicy to stała. Czyli albo piszesz:

const int ile=5;

Od tej chwili możesz tego używać do woli do deklaracji 5 elementowej tablicy i zapis:

int y[ile];

 jest jak najbardziej poprawny. Również według standardu zapis:

int y[5];

jest jak ok.

Podobne pytania

+1 głos
2 odpowiedzi 711 wizyt
0 głosów
2 odpowiedzi 313 wizyt
pytanie zadane 16 lutego 2019 w C i C++ przez niedzwiedz89 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 220 wizyt

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 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!

...