Witam i witam ponownie. W tym wykładzie chcę
zademonstrować
nasze poprzednie wyzwanie, które polegało na zrozumieniu, jak
dynamicznie alokować pamięć za pomocą malloc.
Zamierzamy po prostu odczytać z klawiatury, a następnie
wyświetlić ciąg, ale użyjemy go
z dynamicznie przydzielanymi wskaźnikami,
wskaźnikami znaków.
Przywołajmy więc bloki kodu, aby utworzyć nowy projekt.
Nazwijmy tylko ten przykład dynamicznej alokacji pamięci.
Pierwszą rzeczą, którą musisz zrobić, jeśli
zamierzasz korzystać z dynamicznej alokacji pamięci, jest upewnienie się, że dołączasz standardową bibliotekę lib.
Na szczęście, kiedy tworzysz projekt w blokach kodu, automatycznie
dołącza go on za Ciebie.
Ale powodem, dla którego musimy dołączyć standardową bibliotekę, jest to, że znajduje
się tam malloc, funkcja malloc. Pamiętaj, że malloc jest główną
funkcją alokacji pamięci. Masz również Calloc.
Calloc jest naprawdę ważny, ponieważ
calloc wykona przyjemne obliczenie liczby potrzebnych bajtów,
ponieważ to dwa parametry.
Ale naprawdę dobrą rzeczą w calloc jest to, że inicjalizuje wszystkie dane do
zer, jeśli są one intami i tak dalej, naprawdę fajna funkcja.
Masz realokację. Realloc rozszerzy pamięć, która została
już przydzielona. Więc przekazujesz to we wskaźniku.
Na podstawie tego wskaźnika określa, ile pamięci jest dla
niego przydzielone i kopiuje wszystko, co tam było, do nowej lokalizacji pamięci,
a następnie określasz również, o ile więcej bajtów
chcesz przydzielić, po prostu dodaje to do nowej lokalizacji pamięci, naprawdę fajna funkcja.
Pamiętaj jednak, że kiedy przydzielasz pamięć dla liczb całkowitych za pomocą
malloc, musisz określić, ile pamięci chcesz przydzielić bajtów, ale
zwykle chcesz użyć operatora sizeof.
A więc przejdźmy do tego.
W mojej głównej metodzie utworzę liczbę całkowitą i powiem tylko, że
będzie to po prostu rozmiar. wprowadzi rozmiar liczby bajtów, które
chcą przydzielić w czasie wykonywania, więc zapisze rozmiar.
Inną rzeczą, którą chcę stworzyć, jest utworzenie wskaźnika znaków, a to
będzie po prostu tekst. I mam zamiar zainicjować
to na zero, ponieważ nie wskazuje niczego od razu.
Teraz pierwszą rzeczą, którą chcę zrobić, jest poproszenie użytkownika o wprowadzenie rozmiaru.
Więc powiem
printf, powiem wprowadź limit tekstu.
I zamierzają wprowadzić liczbę określającą, ile bajtów ma być przydzielonych, tak
naprawdę będzie liczbą znaków.
A potem przeczytam to za pomocą scanf.
Scanf, pierwszy parametr to typ specyfikatora formatu dla typu danych.
To będzie procent d, ponieważ czytam liczbę całkowitą.
A potem pamiętaj, scanf bierze wskaźnik.
Teraz wiemy, że funkcje,
które pobierają wskaźniki, do przekazania potrzebny jest adres.
Więc jeśli mam przekazać rozmiar, rozmiar nie jest adresem, chyba że użyję adresu operatora.
Więc przechodzę do znaku ampersand i zamierzam
powiedzieć rozmiar, który będzie odczytany z liczby bajtów.
Gdy mam już liczbę bajtów, mogę teraz przydzielić do niej pamięć za pomocą funkcji malloc.
A malloc zwróci wskaźnik pustki.
Wskaźnik będzie pierwszym adresem dla tej
nowo przydzielonej pamięci. Możesz więc przypisać go bezpośrednio do tekstu.
Pamiętaj, że tekst jest wskaźnikiem.
Chcemy skierować tekst do tego nowego adresu, który jest zwracany.
Ponieważ malloc zwraca wskaźnik void, musimy go rzucić.
Typ danych, na które wskazujemy, to znak, więc chcemy powiedzieć char star,
a następnie możemy wywołać funkcję malloc.
Funkcja malloc pobiera liczbę bajtów.
A więc liczba bajtów, jeśli właśnie podałeś liczbę bajtów, przydzieli
tylko tyle bajtów. Ale w zależności od typu
danych, typ danych może mieć dwa lub cztery bajty.
Więc jeśli chcesz przydzielić 10 znaków,
upewnij się, że pomnożysz
10 znaków przez rozmiar znaku.
Więc teraz
powiemy n razy sizeof. Operator sizeof jest często używany w
funkcji malloc, ponieważ jest niezależny
od komputera i powie Ci, ile faktycznie musisz przydzielić.
Teraz jest to bardziej istotne, gdy masz liczby całkowite. Pamiętaj, liczby całkowite, w zależności
od używanego systemu, architektury, na której pracujesz, liczby całkowite
mogą być reprezentowane przez cztery bajty, dwa bajty, zwykle
dwa lub cztery bajty.
Gdybyś powiedział, że chcę przechowywać jedną liczbę całkowitą, więc
utworzę po prostu cztery bajty pamięci, cóż, może to nie być poprawne,
ponieważ co, jeśli są to dwa bajty.
Więc zawsze chcesz zrobić,
ile liczb całkowitych lub ile znaków chcesz utworzyć, a następnie pomnożyć to
przez rozmiar znaku w systemie. Operator Sizeof podaje liczbę bajtów
zajmowanych przez znak. Więc jeśli chcesz stworzyć 10
znaków, powiedz 10 razy rozmiar znaku. Jeśli chcesz utworzyć 10 liczb
całkowitych do przechowywania 10
liczb całkowitych, powiesz, że 10 razy rozmiar int, to naprawdę ważne.
Teraz dzięki funkcji calloc nie musisz tego robić. Calloc w
rzeczywistości przyjmuje dwa parametry. Myślę, że
pierwszym parametrem jest wskaźnik, a
drugim jest rozmiar bajtów.
Więc jeśli powiesz 24 int, to wszystko, co musisz zrobić, to przejść w
zaledwie 24 i automatycznie przydzielić za Ciebie.
Więc calloc jest naprawdę fajnym narzędziem w użyciu, ponieważ nie musisz robić tego mnożenia.
Tak więc w przypadku calloc pierwszym parametrem jest rozmiar.
Więc jeśli chcesz utworzyć 10 int, po prostu przekażesz 10.
A następnie drugim parametrem
jest rozmiar bajtu. Więc nie musisz wykonywać mnożenia. Oszczędza ci to trochę kroku.
Teraz, gdy przydzieliliśmy pamięć, chcesz
się upewnić, że tekst nie jest pusty, zanim spróbujesz usunąć odniesienie do tekstu.
Więc zawsze chcesz owinąć to wokół tekstu nie, a to powie, że nie
jest null lub możesz po prostu zrobić to wyraźnie i powiedzieć,
czy tekst nie jest równy null.
Zawsze chcę to robić, ponieważ próba usunięcia odniesienia
ze wskaźnika jest bardzo, bardzo niebezpieczna.
Wszystko może się zdarzyć. Możesz być w stanie zapisać w nim dane.
w tym. Po prostu zapisałby to gdzieś indziej w pamięci. Więc
spieprzyłoby twój program lub możesz mieć błąd segmentacji i program może się zawiesić.
Ale tak długo, jak naprawdę przydzielisz tę
pamięć, możesz teraz faktycznie wczytać niektóre dane.
Możesz użyć git s lub możesz użyć scanf tutaj.
Ale to, co chcesz
zrobić, to wydrukować, wprowadzić jakiś tekst,
a także chcemy dodać tutaj nowe wiersze, aby były łatwe do odczytania.
Będziemy używać scanf, ponieważ to jest to, co znamy.
A scanf będzie czytać tylko w
procentach.
Właściwie to pokażę ci sztuczkę.
Zamierzam użyć scanf do przeczytania następnego znaku, więc zatrzymuje
się, a następnie zamierzam użyć get s, aby przeczytać tekst.
A gets to po prostu kolejna funkcja, której zwykle można użyć funkcji f gets. Musisz tylko ustawić go na
strumień wejściowy.
Ale get będzie czytać ze standardowego strumienia wejściowego, którym domyślnie jest klawiatura.
I pobiera bierze wskaźnik. Więc wszystko, co musimy zrobić, to przekazać
tekst, ponieważ jest to już wskaźnik, nie musimy wpisywać adresu operatora.
A fajną rzeczą w przypadku zapytań get jest to, że możesz czytać wiele ciągów oddzielonych spacjami.
Kiedy już faktycznie przeczytamy, możemy
go po prostu wydrukować. Więc możemy powiedzieć, że wprowadzony
tekst to słowo z odwrotnym ukośnikiem n, a
następnie tekst z przecinkiem. Tekst jest wskaźnikiem.
Printf bierze wskaźnik. Nie musimy go usuwać.
Ponieważ jeśli wyświetlasz tylko
tekst, tekst będzie wyświetlał wartość wskaźnika, który ma być adresem.
W rzeczywistości chcemy wyświetlić wartość tego, na co wskazuje tekst.
A potem skończymy. O nie, zdecydowanie nie skończyliśmy. Chcemy zadzwonić do nas za darmo.
Chcemy uwolnić nasz wskaźnik.
Nawet jeśli wyjdziemy, pamięć będzie wolna. Nadal chcemy się upewnić, że
go zwolnimy, a potem prawdopodobnie również chcemy tylko dla bezpieczeństwa, chcemy ustawić tekst równy null.
Więc chodźmy dalej, zbudujmy to i zobaczmy, co się stanie.
I mam problem, bo nie czytam w
odpowiedniej zmiennej.
więc tutaj nie używam właściwej zmiennej. Chcę użyć rozmiaru i wygląda na
to,
że jest nam dobrze.
Więc zaczynamy, jedyną różnicą jest to, że nie musisz usuwać
odniesienia z tekstu, ponieważ tekst jest wskaźnikiem znaku.
Musisz tylko usunąć odniesienie, jeśli znajduje się we wskaźniku i tak dalej. Więc kiedy używasz
procentów s, automatycznie wie, aby usunąć odniesienie do
wskaźnika znaku.
To jedna różnica, gdy używasz wskaźników znaków w
porównaniu z innymi wskaźnikami. Inne wskaźniki, które musisz
usunąć, aby uzyskać wartość, ponieważ nie możesz w rzeczywistości skopiować
łańcuchów do tablic ciągów i tak dalej.
Nigdy nie byłbyś w stanie zrobić star
text równa się, musiałbyś zawsze używać str copy, jeśli chcesz skopiować tekst.
Ponieważ pamiętajcie z wykładów, w rzeczywistości nie
można przypisać danych do tablicy, a wskaźnik znakowy jest tablicą.
Więc tutaj wygląda to poprawnie. Nie ma powodu, aby go usunąć.
Chcemy to zbudować, a potem chcemy to uruchomić.
Zauważysz, że ograniczyliśmy tekst.
Powiedzmy, że wstawiliśmy 5, 6 dla jason i
wypisuje dane wejściowe jason.
Możesz bawić się tym programem. Ale znowu, wnioski z
tego obejmują standardową bibliotekę lib, gdy robisz malloc.
Zainicjuj wskaźniki postaci na null. Wykonaj scanf, użyj
znaku ampersand, ponieważ rozmiar nie jest wskaźnikiem.
Kiedy mallocujesz, malloc zwraca wskaźnik void, więc musisz rzucić.
Zawsze chcesz mieć w środku swoje malloc. Wykonaj operator sizeof
dla tego, do czego chcesz przydzielić. Times, ile rzeczywistych znaków lub
liczb całkowitych. Odnosi się to bardziej do liczb
całkowitych i pierwotnych typów danych technicznie dla znaków. Możesz po prostu zrobić rozmiar, to powinno działać dobrze.
Zawsze chcesz sprawdzić, czy nie ma wartości null, upewnij się, że nie jest to wartość null.
Kiedy idziesz użyć ciągu znaków.
A potem po prostu wpisujemy tekst, przechowywany w naszych pobieranych plikach i drukujemy go.
I wreszcie, co nie mniej ważne, zawsze chcemy uwolnić nasze wskazówki, abyśmy mogli je oddać
z powrotem na stos. Mam nadzieję że to pomoże. Dziękuję Ci.