Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Tablice statyczne i dynamiczne


Rekomendowane odpowiedzi

Opublikowano

O ile się nie mylę tablice statyczne to takie, które mają określoną wielkość. Czyli jeśli stworzymy tablicę statyczną o wielkości 10 podczas kompilowania z góry zostanie zarezerwowana dla niej pamięć.

 

Tablice dynamiczne to takie, który nie mają określonego rozmiaru, a pamięć dla nich rezerwowana jest "w locie" podczas dodawania/usuwania elementów tej tablicy.

Opublikowano

O ile się nie mylę tablice statyczne to takie, które mają określoną wielkość. Czyli jeśli stworzymy tablicę statyczną o wielkości 10 w sensie [10] podczas kompilowania z góry zostanie zarezerwowana dla niej pamięć, tak, aby pomieściła w sobie 11 elementów (bo tablice indeksujemy od 0).

 

Tablice dynamiczne to takie, który nie mają określonego rozmiaru, a pamięć dla nich rezerwowana jest "w locie" podczas dodawania/usuwania elementów tej tablicy.

O dzięki. W twoich 4 zdaniach zrozumiałem bardziej niż po paru artykułach. xD

 

Wróćmy do tej dynamicznej. Jeżeli stworzymy tablicę [2]x[2], to da się usunąć tylko element środkowy(tzn x=1, y=1)? 

Opublikowano

Nie do końca jest tak, że tworzysz tablicę [2]x[2]. Tablice wymiarowe (bo prawdopodobnie o to Ci chodzi) są to tablice osadzone w tablicach. Na przykładzie PHP

$array = [[1, 2], [3, 4]];

Wytłumaczę to najprościej obrazkiem, wyobraźmy sobie, że ta tablica to tak naprawdę pudełko zawierające inne pudełka

3815014534923831181804.jpeg

 

Bawienie się indexami tablicy to tak naprawdę wyciąganie pudełek.

 

$tablica[0] //z dużego pudełka wyciągasz mniejsze pudełko

$tablica[0][0] //Z dużego pudełka wyciągasz mniejsze w pudełk, w mniejszym pudełku na pierwszej pozycji mamy cyfrę 1

Opublikowano

Czyli jeśli stworzymy tablicę statyczną o wielkości 10 w sensie [10] podczas kompilowania z góry zostanie zarezerwowana dla niej pamięć, tak, aby pomieściła w sobie 11 elementów (bo tablice indeksujemy od 0).

g****o prawda, 10, od 0 do 9, nie wprowadzaj w błąd.

 

Tablice dynamiczne to takie, który nie mają określonego rozmiaru, a pamięć dla nich rezerwowana jest "w locie" podczas dodawania/usuwania elementów tej tablicy.

niekoniecznie, w C++ żeby zmienić rozmiar tablicy dynamicznej trzeba ją realokować, wyjściem pośrednim jest vector. W pozostałych językach sądzę że też to tak jest zrealizowane na poziomie runtime'a, ale z poziomu kodu wydaje się "w locie"

 

Wróćmy do tej dynamicznej. Jeżeli stworzymy tablicę [2]x[2], to da się usunąć tylko element środkowy(tzn x=1, y=1)?

da się usunąć każdy element, tyle że w przypadku elementów "w środku" tablicy wiąże się to z jej realokacją (przeniesieniem do innego miejsca w pamięci bez danego indeksu)
846331404756772371599.jpeg
Opublikowano

 

g****o prawda, 10, od 0 do 9, nie wprowadzaj w błąd.

Jak zrobisz tablicę o wielkości 10 (chodzi mi o przykład tablica[10], może źle się wysłowiłem) to możesz do niej wsadzić 11 elementów, także nie rozumiem gdzie wprowadzam go w błąd.

 

@Edit

Po przemyśleniu, faktycznie źle ubrałem to w słowa. Chodziło mi, że jeśli podczas tworzenia tablicy w indeksie wpiszemy liczbę 10 wtedy możemy w niej zapisać 11 elementów.

Opublikowano

­@`Wolen no bardzo ciekawe...

gB4FAiG.png

QZZJh6V.png

 

gdzie ty tu widzisz 11 elementów? teoretycznie 10 indeks tablicy jest ustawiony na 4, tak jak to zrobiliśmy, bo jest na stosie, a że mamy zwykłą tablicę to nam nie wywali out-of-range, tylko rozwali pamięć programu.

teraz rozumiesz?

846331404756772371599.jpeg
Opublikowano

Widzę właśnie, że tak to działa, a raczej nie działa :P. W życiu bym nie pomyślał, że przy przypisywaniu 11 elementu wyrzuci błąd, z racji, że głównie siedzę w webdev'ie to rzadko kiedy zdarzało mi się (o ile w ogóle) przypisywać tak wartość (w sumie też z tej racji, że jak już pracuje w innym języku to z przyzwyczajenia korzystam z dynamicznych tablic). Post już poprawiony :P!

 

 

 

Teraz to już woda z mózgu mi się robi. Kłóćcie się dalej. xD

Już poprawiłem swój post. Generalnie nasza dyskusja, bo raczej kłótnią bym tego nie nazwał, dotyczyła wątku pobocznego, sama różnica wskazana przeze mnie jest w większości poprawna, Phoenix jedynie dopełnił temat tablic dynamicznych.

Opublikowano

­Krótko i na temat: opiszę to na przykładzie C++

 

Tablica statyczna, tak zwany raw array - tablica z wstępnie określoną stałą wielkością. Nie ma tu nad czym się rozpisywać.

Tablica dynamiczna - tablica której wielkość może być ustalona przy jej tworzeniu w runtime (podczas działania programu). Jej wielkość może być zmieniana, ale w większości przypadków wiąże się to z jej realokacją w pamięci (czyli przeniesieniem do innego miejsca w pamięci, z pominięciem usuwanych indeksów, bądź też z większą ilością indeksów)

 

Są też różne inne dziwne typy pseudo-tablic, jak na przykład listy lub wektory, ale zazwyczaj są to po prostu ładnie owrapowane tablice dynamiczne.

 

@`Wolen webdev to trochę inna bajka niż pisanie zwykłych programów, tamte języki są baaaardzo uproszczone w porównaniu do C++ na przykład

846331404756772371599.jpeg
Opublikowano

Szybko się dołączę do tematu byś mógł sobie sam to przetestować.
 
Stworzenie tablicy statycznej:

const int rozmiar = 10;
int tablica[rozmiar];

Stworzenie tablicy dynamicznej z ustawianą wielkością przez użytkownika:
 

int tab1Size;

cout << "Podaj rozmiar tablicy: " << endl;
cin >> tab1Size;

int *tab1 = new int[tab1Size]; // tablica dynamiczna

sygna.jpg

Opublikowano

Jak zrobisz tablicę o wielkości 10 (chodzi mi o przykład tablica[10], może źle się wysłowiłem) to możesz do niej wsadzić 11 elementów, także nie rozumiem gdzie wprowadzam go w błąd.

 

@Edit

Po przemyśleniu, faktycznie źle ubrałem to w słowa. Chodziło mi, że jeśli podczas tworzenia tablicy w indeksie wpiszemy liczbę 10 wtedy możemy w niej zapisać 11 elementów.

 

 

 

No nie ziomuś, w c++ przynajmniej:

int x[10];

może pomieścić 10 elementów, od indeksu 0 do indeksu 9. Możesz pisać po indeksie 10, 11, 12 czy 13 ale wtedy nadpisujesz resztę kodu programu, i program się wywali albo system go zatrzyma.

space-core-o.gif

Opublikowano

Dynamiczna kontra statyczna, glowne roznice:

 

d) alokowana na stercie - musisz recznie zwolnic pamiec po jej uzyciu, inaczej memory leak

s) uzywa miejsca na stosie - jest zwolniona gdy wychodzi ze scope'a

 

d) mozesz podac rozmiar podczas runtime

s) rozmiar staly podczas kompilacji

Opublikowano

No nie ziomuś, w c++ przynajmniej:

int x[10];

może pomieścić 10 elementów, od indeksu 0 do indeksu 9. Możesz pisać po indeksie 10, 11, 12 czy 13 ale wtedy nadpisujesz resztę kodu programu, i program się wywali albo system go zatrzyma.

nie nadpisujesz kodu programu, bo kod generalnie jest w innej sekcji pamieci, zawsze masz taki bufor bledu, te 1,2,3,4,10,20,60 elementow w zale\znosci od szczescia da ci sie nadpisac, ale przy n-tym elemencie ci wywali blad bo wyjdziesz poza dostepna pamiec albo zaczniesz wlasnie nadpisywac kod

jestem najlepszy

Opublikowano

iks de, iks dededede

 

Nie nadpiszesz kodu w ten sposob. Stos nie "wejdzie" w kod. Zapoznaj sie dokladnie z dzialaniem stosu w asm.

Opublikowano

iks de, iks dededede

 

Nie nadpiszesz kodu w ten sposob. Stos nie "wejdzie" w kod. Zapoznaj sie dokladnie z dzialaniem stosu w asm.

za to nadpiszesz gdzieś return address i pójdziesz do jakiegoś dziwnego miejsca w pamięci gdzie na pewno nie jest twój kod, jeśli program nie zdąży się wykrzyczaczyć po rozwaleniu mu wszystkich locali i argumentów

Skończ proszę się kompromitować. Jesteś nikim.

Opublikowano

iks de, iks dededede

 

Nie nadpiszesz kodu w ten sposob. Stos nie "wejdzie" w kod. Zapoznaj sie dokladnie z dzialaniem stosu w asm

stosu nie nadpiszesz, ale sterte tak, a na stercie mozesz miec kod, zmienne i mozesz robic co tylko chcesz z pamiecia tak zaalokowana

jestem najlepszy

Opublikowano

to się wyklucza, bo w praktyce stos musi być gdzieś na stercie

ale ty jestes meczydupa, z tablicy na stosie bez wylaczania runtime checkow nie wyjdziesz bo ci wywali out of range albo inny blad, ale jesli bedziesz miec buga w operacjach na dynamicznych tablicach na stercie to ci nic nie wywali bledu, nawet w tym gownianym c++ z checkami, do momentu az natrafisz na kod ktory nie bedzie mial flagi write, albo cos innego sie przytrafi i ci wywali program, polecam poczytac o stackguardzie

jestem najlepszy

Opublikowano

z tablicy na stosie bez wylaczania runtime checkow nie wyjdziesz bo ci wywali out of range albo inny blad

Tego przeważnie nawet domyślnie nie ma włączonego. I nie powinno być.

 

I nawet korzystając z tablicy ze stosu możesz nadpisać stertę jeśli dasz odpowiedni offset.

 

Ale w ogólnym przypadku to tak czy siak UB, więc wszystko się może stać. Może nawet nie być rozróżnienia na stos i sterte, standard tego nie definiuje. Może się dziać cokolwiek, więc nie można zakładać, że ten kod nie nadpisze gdzieś pamięci, bo wyskoczy błąd.

Opublikowano

Tego przeważnie nawet domyślnie nie ma włączonego. I nie powinno być.

 

I nawet korzystając z tablicy ze stosu możesz nadpisać stertę jeśli dasz odpowiedni offset.

 

Ale w ogólnym przypadku to tak czy siak UB, więc wszystko się może stać. Może nawet nie być rozróżnienia na stos i sterte, standard tego nie definiuje. Może się dziać cokolwiek, więc nie można zakładać, że ten kod nie nadpisze gdzieś pamięci, bo wyskoczy błąd.

to domyslnie jest wlaczone w kazdym wspolczesnym IDE - nie mowie o kompilatorach, bo tam to zalezy od switchy, ale jakiego IDE bys nie pobral to ci wyrzuci error gdy za daleko nadpiszesz, i to jest bardzo przydatne jesli chcesz sie ustrzec takich bledow, w visualu musialbys wywalic caly runtime zeby nadpisac tablice na stosie poprzez [] chyba ze mowimy o (tab+213123123) = 0 to calkiem cos innego

jestem najlepszy

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...