Funkcja Alloca 3 C

Funkcja Alloca 3 C
Przestrzeń, która jest okresowo uwalniana, jest przydzielana z poleceniem alloca. Rama stosu dzwoniącego jest przydzielana bajty długości pamięci metodą alloca (). Gdy kod, który wywołał Alloca (), powróci do swojego dzwoniącego, ta pamięć tymczasowa zostanie natychmiast zwolniona. W ramach tego przewodnika będziemy omawiać użycie Alloca (), aby przypisać przestrzeń pamięci do zmiennej bez uwalniania w końcu:
  • #włączać
  • void *alloca (size_t rozmiar);

Wartość zwracana

Odniesienie do punktu początkowego przypisanego regionu jest zwracane metodą alloca (). Skrypt zachowuje się w sposób nieokreślony, jeśli przypisanie powoduje przepełnienie stosu.

Niektóre potwierdzenia

POSIX.1-2001 nie podaje tej metody. Wiadomo, że metoda alloca () była obecna w 32 V, 3BSD, PWB, PWB.2 i 4BSD. Jest udokumentowany w 4.Manualna strona 3BSD. Wariant GNU jest używany przez Linux.

Wyjaśnienie

Funkcja alloca () zależy od programu kompilacji, a także od systemu docelowego. W przeciwieństwie do korzystania z Malloc (3) plus bezpłatne, jego użycie może uczynić go bardziej wydajnym w niektórych scenariuszach (3). W niektórych okolicznościach może również ułatwić rozlecenie przestrzeni w programach, które wykorzystują Longjmp (3) lub siglongjmp (3). Jednak nie polega na tym, aby go spożywać.

Załóżmy, że pamięć przydzielona przez alloca () jest zarezerwowana w ramce stosu. Jeśli w jakiś sposób powrót metody zostanie pomijany przez wywołanie funkcji do Longjmp (3) lub siglongjmp, pamięć jest natychmiastowa uwalniana (3). Nie należy podjąć bezpłatnej (3) pamięci alloca ()! Połączenia alloca () są często tłumaczone przy użyciu skryptu wbudowanego przez GCC (1).

Błędy

Jeśli rama stosu może nie zostać rozszerzona, wydaje się, że nie ma wiadomości o usterce. Chociaż, jeśli aplikacja próbuje użyć niezasponowanej pamięci po jednym nieudanym umieszczeniu, kwalifikuje się do uzyskania sygnału SIGSEGV. Ponieważ ta pamięć stosu przydzielona przez alloca () może wyświetlić na stosie wewnątrz środkowego regionu dla parametrów metody na kilku platformach, alloca () nie może być używany na liście parametrów wywołania metody.

Przykład 01

Zacznijmy od naszych pierwszych przykładów korzystania z funkcji alloca () C. Najpierw musimy utworzyć plik C za pomocą instrukcji dotyku w bieżącym katalogu roboczym systemu Kali Linux. Następnie możesz spróbować otworzyć go w dowolnym wybranym edytorze, aby dodać w nim skrypt C. Używamy edytora VIM do otwarcia „allocex.plik C ”.


W pustym pliku dodaliśmy następujący kod. Ten kod rozpoczął się od „stdio.H ”nagłówek do wykorzystania standardowego strumienia wejściowego i wyjściowego w programie. „Alloca.Nagłówek H ”został użyty do korzystania z funkcji alloC () c w tym kodzie. Ten kod zawiera pojedynczą funkcję main (), która inicjowała zmienną liczbową o nazwie „Numer” przydzielona pamięci rozmiaru 4.

Pętla „dla” została zainicjowana i wykorzystana do zwiększenia wartości zmiennej „liczba” przez 1 przy każdym indeksie. Następna pętla „for” została użyta do wyświetlania każdej wartości indeksu liczby zmiennej za pomocą instrukcji funkcji printf (). Ten kod został ukończony tutaj. Zapisaliśmy go i jest gotowy do kompilacji.


Teraz opracowaliśmy ten plik C z kompilatorem GCC i utworzyliśmy jego plik obiektu o nazwie „Allocex.out ”w tym samym katalogu roboczym, ja.mi., "Pracuje".


Następnie wykonaliśmy nowo wykonany plik obiektowy tego kodu w ramach „./”Instrukcja. Wyjście wyświetla łącznie 4 wartości dla konkretnej zmiennej, i.mi., Rozmiar 4 Przydział pamięci do liczby zmiennej.


Zmieńmy numer iteracji w pętli „for”, i.mi., Zmień 4 na 5. Poniższy kod został zaktualizowany. Zapiszmy go przed skompilowaniem.


Skompilowaliśmy zmodyfikowany kod z kompilatorem GCC, aby zastąpić jego plik obiektu,.


Po wykonaniu mamy usterkę segmentacji. To dlatego, że inicjowujemy zmienną rozmiar do 5 i używaliśmy „<” sign to iterate the variable “Number” up to 5 which are a total of 6 memory locations, i.e., should be a total of 5.

Przykład 02

Weźmy kolejny przykład przypisania okresowo uwolnionej pamięci do stosu wskaźnika. Używamy tych samych nagłówków z dodaniem „stdlib.H ”nagłówek. Metoda main () została skonfigurowana z deklaracją niektórych zmiennych i wskaźnikiem. Instrukcje printf i scanf są używane do wyświetlania i uzyskania numeru wejściowego od użytkownika, podczas gdy funkcja alloca () przydzieli pamięć do zmiennej wskaźnika „Numer” przy użyciu tego konkretnego numeru dodanego przez użytkownika. Jeśli pamięć przypisana do zmiennej „Numer jest null”, i.mi., Brak przydzielonej pamięci, wówczas printf () wyświetli powiązane z nim komunikat o błędzie. Plus funkcja wyjścia (0) zakończy ten program.

Pętla „dla” używa funkcji printF do wyświetlania bieżącego numeru indeksu i prosi o wprowadzenie wartości dla konkretnego indeksu za pomocą funkcji scanf. Niezależnie od dodanej wartości, zostanie ona zwiększona o numer indeksu i zapisany do zmiennej „suma” funkcja printf () będzie wyświetlana „suma” wszystkich iteracji.


Skompilowaliśmy go i utworzyliśmy jego plik obiektowy.


Wykonał plik obiektu i prosi o rozmiar alokacji pamięci, i.mi., 4. Użytkownik dodano w sumie 4 wartości i podsumowane przez program i wyświetlone poniżej:

Wniosek

Chodzi o użycie funkcji alloca () do przypisania przestrzeni zwolnienia do określonej zmiennej, zwłaszcza niektórych stosów. Możesz zobaczyć, że nie użyliśmy funkcji „free ()”, aby zwolnić przydzieloną przestrzeń, jak zwykle w funkcji Malloc ().