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

Alokowanie pamięci - Problem

VPS Starter Arubacloud
0 głosów
180 wizyt
pytanie zadane 12 listopada 2015 w C i C++ przez Pixel040 Gaduła (3,100 p.)

Uczę się o wskaźnikach i jednego nie rozumiem. Przeczytałem że przed uruchomieniem programu (bez uzycia wskaźników) jest alokowana pewna pamieć.

ale jeśli zrobie tak to komputer nie bedzie wiedzial ile pamieci ma zaalokowac.

#include <iostream>

using namespace std;

int main()
{
    int ile;

    cin>>ile;
    int tab[ile];

    return 0;
}
 

3 odpowiedzi

+2 głosów
odpowiedź 12 listopada 2015 przez hit02 Nałogowiec (33,970 p.)
wybrane 14 listopada 2015 przez Pixel040
 
Najlepsza

Jak już inni napisali ten zapis jest niezbyt poprawny, a raczej nie zgodny ze standardami i nie do końca bezpieczny. Jeżeli wpiszesz zbyt dużą liczbę, to program najpewniej się wysypie.

Prawda jest taka, że ta pamięć będzie zaalokowana podczas działania programu. W komputerze istnieje specjalna struktura pamięci zwana stosem. Na stosie umieszczane są między innymi zmienne lokalne i argumenty funkcji. Jak pewnie wiesz istnieją również regiony pamięci, do których program nie ma dostępu.

Taka tablica zostanie umieszczona właśnie na stosie, ale pytasz skąd program będzie wiedział, ile pamięci zaalokować. Kompilator najpewniej umieści w kodzie procedurę 'dotykającą' pamięci, do której nie ma dostępu, ale która jest tuż nad szczytem stosu. Gdy program dotknie tej pamięci, to system operacyjny zrozumie, że to nie był jakiś błąd, ale że potrzeba więcej pamięci dla stosu i zaalokuje ci trochę dodatkowej pamięci w odpowiednim miejscu.

Dzięki temu będziesz miał miejsce w pamięci operacyjnej (konkretnie na stosie) na tablicę o nieznanej długości. smiley

+2 głosów
odpowiedź 12 listopada 2015 przez Radfler VIP (101,030 p.)
W tym przypadku wykorzystałeś VLA (Czyli tablica statyczna o nieznanym rozmiarze: https://en.wikipedia.org/wiki/Variable-length_array), co w C++ nie jest legalne (w C jest). GCC jednak wspiera takie praktyki. Tablica jest (powinna być) alokowana na stosie.
+1 głos
odpowiedź 12 listopada 2015 przez niezalogowany

Jest to niepoprawne, pomimo że skompiluje się. Rozmiar tablicy statycznej musi być znany w momencie kompilacji. Jeśli chcesz tak zrobić to muszisz użyć new i delete. Przykład

int n;
cin>>n;
int * tab = new int[n];
//jakieś operacje na tej tablicy dynamicznej
delete []  tab;

 

Podobne pytania

0 głosów
1 odpowiedź 180 wizyt
+2 głosów
3 odpowiedzi 3,071 wizyt
0 głosów
3 odpowiedzi 1,137 wizyt
pytanie zadane 29 maja 2016 w C i C++ przez 1naswiecie Początkujący (410 p.)

93,005 zapytań

141,970 odpowiedzi

321,249 komentarzy

62,341 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...