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

Pytanie do specjalisty


Ozzzj

Rekomendowane odpowiedzi

Opublikowano

Wytłumaczy mi ktoś pojęcie tablic o zmiennej długości w standardzie języka C (C99) ?

Najlepiej daj jakiś przykład.

Opublikowano

Innymi słowy: jest to tablica "dynamiczna", która alokowana jest na stosie (najczęściej, w standardzie o tym wzmianki nie ma) i zwalniana wraz z opuszczeniem bloku z deklaracją owej tablicy.

Jest to rozwiązanie na potrzeby alokowania tymczasowych tablic o zmiennym rozmiarze, które nie wychodzą poza dany zakres funkcji. Oszczędza się dzięki temu czas wykonania (alokacja na stercie oraz zwalnianie pochłania znacznie więcej czasu jak operacje na stosie) i pisania.

 

Nie jestem w stanie wymyślić dobrego przykładu ale mogę podać przykład użycia w ogóle:

void uglyArray(int arrSize) {
    int arr* = malloc(sizeof(int) * arrSize);
    //do smth...
    free(arr);
}

void niceArray(int arrSize) {
    int arr[arrSize];
    //do smth...
    //no free at all!
}

YOU MUST DIE

- Ganon, Koridai

Opublikowano

Tak jak normalna tablica, tylko po prostu wielkość nie musi być stałą. Przykład:

int size;
std::cin >> size;
int array[size];

Bez VLA tak się nie da, bo wielkość musi być stałą.

 

A jeśli chodzi o równoważnik tego zapisu, to nie malloc(jak napisał @mirraseq) tylko:

int size;
std::cin >> size;
int* array = alloca(size * sizeof(int));

Alloca przydziela ze stosu, a malloc ze sterty - więc to allokowanie z użyciem alloca(zwalniać nie trzeba, bo jest na stosie) jest równoważne VLA, a nie robienie tego malloc'iem.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...