>> [MUZYKI]
>> [ODTWARZANIE]
>> -On kłamie.
>> -O czym?
>> -Nie Wiem.
>> -Więc Co wiemy?
>> -To Na 9:15, Ray Santoya był na ATM.
-Tak.
Więc pytanie jest, co on robił na 9:16?
>> -Wykonywanie Na 9 milimetr na coś.
Może widział snajpera.
>> -lub Pracował z nim.
>> -wait.
Wróć jednym.
>> -Co widzisz?
>> -Bring Jego twarz się pełnym ekranie.
>> Okulary -Jego.
>> -Jest Odbiciem.
>> -To Drużyna baseballowa Nuevitas.
To ich logo.
>> -A On mówi do kto ma na sobie tą kurtkę.
>> [Zakończyć odtwarzanie]
>> DAVID MALAN: Wszystko w porządku.
Jest CS50, co jest nieco więcej z [niesłyszalne], z którym jesteś
dabbling z problemem ustawić cztery.
Dziś zaczynają wyglądać trochę bardziej głęboko na te rzeczy zwane wskaźniki,
które mimo że dość ezoteryczne temat,
okazuje się, że to będzie się środki, za pomocą których
może rozpocząć budowę i montaż o wiele bardziej zaawansowane programy.
Ale zrobiliśmy to na ostatnią środę w drodze pewnego claymation pierwszy.
Więc to, przypomnijmy, jest Binky a my go używane
aby spojrzeć na program, który tak naprawdę nie zrobić coś ciekawego,
ale to nie ujawnić kilka problemów.
Tak, aby rozpocząć dzisiaj, dlaczego nie idziemy szybko przez niektóre z tych etapów,
starają się destylować pod względem człowieka dokładnie to, co się tu dzieje
i dlaczego to jest złe, a następnie przejść i zacząć coś budowy
z tej techniki?
Więc to były pierwsze dwie linie w tym programie
i laika, co są te dwie linie robi?
Ktoś, kto rozsądnie wygodne z tym, co ogłosił na ekranie?
Co to są te dwie linie robi?
To nie wszystko, różni się od jednego tygodnia
ale jest jakiś nowy specjalny symbol.
Tak?
Powrót istnieje.
>> PUBLICZNOŚCI: Deklarowanie wskaźników?
DAVID MALAN: Powiedz jeszcze raz?
PUBLICZNOŚCI: Deklarowanie wskaźników?
DAVID MALAN: Deklarowanie wskaźniki i niech udoskonalić go trochę więcej.
PUBLICZNOŚCI: [niesłyszalne] Adres x i y.
DAVID MALAN: A potem zająć.
Tak konkretnie to, co robimy jest nam deklarując dwie zmienne.
Zmienne te jednak będą być typu int gwiazdy, które
Dokładniej oznacza idą do przechowywania
adres int, odpowiednio X i Y.
Teraz są jakieś wartości?
Czy są jakieś rzeczywiste adresy w nich dwie zmienne w tym momencie?
Nie.
To tylko tak zwane wartości śmieci.
Jeśli nie właściwie przypisać zmienna, co było w pamięci RAM
wcześniej zamierza wypełnić zerami i te, oba z tych zmiennych.
Ale jeszcze nie wiem czym one są i to jest
będzie kluczem do dlaczego Binky stracił głowę w zeszłym tygodniu.
>> Więc to był claymation wcielenie tego
w którym masz tylko dwie zmienne, małe okrągłe kawałki gliny,
która może przechowywać zmienne, ale owinięte się strzałki wskazują,
nie są one w rzeczywistości, wskazując do dowolnego miejsca znane.
Tak więc mieliśmy ten wiersz, a to był nowy w zeszłym tygodniu, malloc dla pamięci
alokacji, która jest tylko fantazyjny sposób informując system operacyjny, Linux
lub Mac OS lub Windows, hej, daj mi trochę pamięci,
i wszystko, co masz powiedzieć System operacyjny
jest to, co prosząc go do pamięci.
To nie będzie obchodziło, co masz zamiar z tym zrobić,
ale trzeba powiedzieć eksploatacji System, co w drodze malloc.
Tak?
>> PUBLICZNOŚCI: Jak dużo?
DAVID MALAN: Jak dużo?
Jak wiele bajtów, a więc ta znowu zmyślony przykład, jest po prostu mówiąc,
daj mi rozmiar wew.
Teraz, rozmiar int jest cztery bajty lub 32 bity.
Więc to jest tylko sposób mówiąc: hej, system operacyjny,
daj mi cztery bajtów pamięci że można używać do mojej dyspozycji,
a szczególnie co czyni malloc zwrotu w odniesieniu
do tego kawałka czterech bajtów?
PUBLICZNOŚCI: Adres?
DAVID MALAN: Adres.
Adres tego kawałka czterech bajtów.
Dokładnie.
A więc to, co jest zapisane w końcu w x i dlatego tak naprawdę nie
obchodzi, co liczba, że Adres jest, czy to OX1 lub OX2
lub jakiś tajemniczy adres szesnastkowym.
Właśnie obchodzi obrazowo że zmienna x jest teraz
wskazując na tym fragmencie pamięci.
Więc strzałka reprezentuje wskaźnik, lub W szczególności, adres pamięci.
Ale znowu, nie typowo obchodzi co te rzeczywiste adresy są.
Teraz, ta linia mówi co w laika?
Gwiazda x dostaje 42 średnik.
Co to znaczy?
Chcesz iść?
Nie rysuj szyi.
>> PUBLICZNOŚCI: Adres x jest na 42.
>> DAVID MALAN: Adres x jest na 42.
Nie bardzo.
Tak blisko, ale nie do końca, bo nie ma gwiazda, która jest poprzedzenie tego x.
Więc musimy podkręcić trochę.
Tak?
>> PUBLICZNOŚCI: Wartość, że wskaźnik x wskazuje na to 42.
DAVID MALAN: OK.
Wartość, że wskaźnik x jest wskazując na, powiedzmy, jest 42,
lub innymi słowy, gwiazdy x mówi, iść do jakiegokolwiek adresu
jest w x, czy to 1 Oxford Ulica lub 33 Oxford Street
lub OX1 lub OX33, cokolwiek że adres numeryczny jest,
gwiazda x jest wyłuskania x.
Więc idź na ten adres i następnie umieścić numer 42 nie.
Tak że byłoby równoważny sposób powiedzenia, że.
Więc to wszystko jest w porządku, a następnie chcemy reprezentować obraz
w następujący sposób, gdzie dodaliśmy 42 do tego kawałka czterech
bajty po stronie prawej, a ta linia była gdzie wszystko wyszło
i szef binky w trzasnął się w tym miejscu,
bo dzieją się złe rzeczy, kiedy Ci dereference wartości śmieci
lub nieprawidłowego nieważny wskaźniki, i mówię nieważny
bo w tym momencie historia, to, co jest wewnątrz y?
Jaka jest wartość y oparte na przestrzeni ostatnich kilku krokach?
Tak?
Co to?
>> PUBLICZNOŚCI: Adres.
DAVID MALAN: Adres.
Powinna ona być adres ale ja zainicjowany go?
Więc nie masz jeszcze.
Więc co na pewno jest w środku?
To tylko niektóre wartości śmieci.
Może to być dowolny adres od zera do 2 mld, jeśli masz dwóch gigabajtów pamięci RAM,
lub zero do 4 miliardów, jeśli masz dostał cztery gigabajty pamięci RAM.
To jakaś wartość śmieci, ale problem jest
że system operacyjny jeżeli nie zostało wam dane
że fragment pamięci specjalnie że starasz się udać,
to na ogół będzie powodować co widzieliśmy jako błąd segmentacji.
Tak więc w rzeczywistości każdy z was, którzy mają zmagał się problemów w godzinach pracy
lub problemów, które więcej na ogół z próbuje dowiedzieć się,
usterka segmentacji, które zwykle oznacza
jesteś dotykając segment pamięci, że nie powinno być.
Dotykasz pamięć system operacyjny nie ma
pozwalał dotknąć, czy to idąc za daleko w swojej tablicy
lub od zaraz, czy to dlatego, że dotyka
Pamięć, która po prostu jest jakaś wartość śmieci.
>> Czyniąc gwiazda x jest tu rodzaju zachowanie niezdefiniowane.
Nigdy nie powinno się zrobić, bo kursy są, program po prostu idzie do katastrofy,
bo mówisz, przejść pod ten adres
i nie masz pojęcia, gdzie że adres w rzeczywistości.
Więc system operacyjny może będzie crash programu
w wyniku I rzeczywiście, to co się stało tam Binky.
Więc ostatecznie, Binky stałe problem z tym.
Więc ten program sam w sobie nie była prawidłowa.
Ale jeśli rodzaj posunąć się naprzód i wykonać tę linię, a nie,
y jest równa x oznacza po prostu, bez względu na Adres jest x, a także umieścić go w r.
>> I tak obrazowo, mamy reprezentowane w tym z dwoma strzałkami
od x oraz y, wskazując w tym samym miejscu.
Więc semantycznie, x jest równa do y, ponieważ oba te
są przechowywane takie same adres, ergo, wskazując na 42,
a teraz, kiedy mówisz gwiazdę y, przejdź do adresu w y,
to ma ciekawy efekt uboczny.
Tak więc adres w y jest samo jak adres w x.
Więc jeśli mówisz go na adres w y i zmień wartość na 13,
kto jeszcze ma wpływ?
X, punkt D, że tak powiem, powinny wpływać również.
>> I rzeczywiście, jak Nick wyciągnął ten obraz w claymation było dokładnie to.
Mimo, że kierujemy się wskaźnik y, znaleźliśmy się w tym samym miejscu,
i tak, jakbyśmy byli do wydrukowania z X lub Y jest wskazywany,
to możemy zobaczyć wartość 13.
Teraz mówię wskazywany się spójne z obrazem.
Programiści, do mojego wiedzy, nigdy nie
wskazywanego powiedzieć słowo, to, co jest szpiczasty
na, ale dla spójności z video, uświadomić sobie,
to wszystko, co było rozumie się w tej sytuacji.
Więc wszelkie pytania dotyczące claymation lub wskaźniki lub malloc tylko jeszcze?
Nie?
W porządku.
>> Więc bez dalszego ado, rzućmy okiem
co, gdzie to ma właściwie stosuje się od pewnego czasu.
Więc mieliśmy tej biblioteki CS50 że ma wszystkie te funkcje.
Użyliśmy GetInt dużo, getString, Prawdopodobnie GetLongLong wcześniej
w moim pset jeden lub więcej, ale co się rzeczywiście dzieje?
Cóż, rzućmy okiem pod wyciągiem w programie, który
inspiruje Dlatego dajemy Ci CS50 biblioteka, a nawet, jak w zeszłym tygodniu,
zaczęliśmy biorąc te kółka off.
Więc to jest teraz posortowana z postmortem co
trwa już wewnątrz biblioteki CS50,
chociaż teraz będzie ruszyć z dala od niego dla większości programów.
>> Więc to jest program o nazwie scanf 0.
To bardzo krótki.
To ma tylko te linie, ale wprowadza funkcję o nazwie scanf
że jesteśmy rzeczywiście będzie zobaczyć w moment wewnątrz biblioteki CS50,
choć w nieco innej formie.
Więc ten program na linii 16 deklaruje zmienną x.
Więc daj mi cztery bajty na int.
To było mówienie użytkownikowi, Numer prosimy, a następnie
jest to interesująca linia rzeczywiście wiąże ze sobą w zeszłym tygodniu
i to.
Scanf, a następnie zauważyć, że trwa string format, podobnie jak printf,
% i oznacza, int, a potem trwa Drugi argument, który wygląda trochę
odjazdowe.
To znaku & x, i przypomnieć, my widzieliśmy tylko ten jeden raz w zeszłym tygodniu.
Co ampersand x reprezentują?
Co handlowe i zrobić w C?
Tak?
>> PUBLICZNOŚCI: Adres.
DAVID MALAN: Adres.
Więc to jest przeciwieństwem operatora gwiazdy,
podczas gdy operator gwiazda mówi, przejdź do ten adres, operator ampersand
mówi, dowiedzieć się adres tej zmiennej,
i tak to jest klucz, bo Celem scanf w życiu
jest skanowanie Na użytkowniku wejście z klawiatury,
w zależności od co on lub ona typy, a następnie odczytać wejście tego użytkownika
do zmiennej, ale widział w ciągu ostatnich dwóch tygodni
że swap, że Próbowaliśmy wysiłku w celu wdrożenia
po prostu uszkodzony.
Przypomnijmy, że z funkcją wymiany, jeśli po prostu oświadczył A i B, jak wskazówki,
my z powodzeniem zamienić dwie zmienne wewnątrz swapu
Podobnie jak w przypadku mleka i OJ, ale jak tylko wymiany powrócił,
jaki był wynik z tytułu do x i y, oryginalne wartości?
Nic.
Tak.
Nic się nie stało, że czas, ponieważ swapy zmienić tylko jego lokalne kopie,
to znaczy, wszystkie tym razem, gdy mamy
zostały przekazując argumenty do funkcji, jesteśmy
tylko przejazdem kopie tych argumentów.
Można z tym zrobić co chcesz z nimi,
ale nie będziemy mieć żadnego Wpływ na oryginalnych wartości.
Więc to jest problematyczne, jeśli Ciebie chcą mieć funkcji takich jak scanf
w życiu, którego celem jest skanowanie Wejście użytkownika z klawiatury
a następnie wypełnić puste pola, tak aby mówić, to znaczy daje się zmienną jak X
wartość, bo gdybym był po prostu przejść x do scanf,
jeśli wziąć pod uwagę logikę ostatnia Tydzień, może scanf robić, co chce
z kopią x, ale nie mógł stałe zmienić x chyba damy
scanf mapę skarbów, że tak powiem, gdzie x oznacza miejsce, w którym
mijamy na adres X, tak aby scanf może pójść tam i faktycznie zmiana
wartość x.
I tak rzeczywiście, wszystkie że ten program robi
jeśli zrobię scanf 0, w moim źródła Katalog 5m, aby scanf 0,
Dot slash scanf, numer prosimy o 50, dzięki za 50.
>> Więc to nie jest wszystko, co ciekawe, ale co się rzeczywiście dzieje
jest to, że tak szybko, jak zadzwonić scanf tutaj, wartość x
jest trwale zmieniło.
Teraz, to wydaje się dobre i dobre, aw rzeczywistości
Wygląda na to, że naprawdę nie trzeba biblioteka CS50 w ogóle już.
Na przykład, powiedzmy, uruchomić to jeszcze raz tutaj.
Pozwól, że ponownie go przez sekundę.
Spróbujmy numer i proszę zamiast mówić 50 jak poprzednio,
powiedzmy, że nie.
OK, to trochę dziwne.
OK.
I tylko niektóre bzdury tutaj.
Tak więc nie wydaje się, aby obsługi sytuacji błędnych.
Musimy więc minimalnie początek dodając trochę Sprawdzanie błędów
aby upewnić się, że użytkownik ma wpisane w rzeczywistej liczby jak 50,
bo podobno wpisując słowa nie jest wykrywany jako problematyczne
ale to chyba powinno być.
>> Przyjrzyjmy się tej wersji teraz to moja próba reimplement getString.
Jeśli scanf ma to wszystko funkcje wbudowane,
dlaczego mamy już dabbling z nich kółka jak getString?
Cóż, tutaj jest chyba moja własna prosta wersja getString
przy czym tydzień temu, mogę powiedzieć, daj mi łańcuch i nazywają to bufor.
Dzisiaj mam zamiar zacząć po prostu mówiąc gwiazdę char, który, przypomnijmy,
to jest po prostu synonimem.
To wygląda bardziej przerażające, ale to dokładnie to samo.
Więc daj mi bufor zmienną że będzie przechowywać ciąg,
powiedzieć ciąg użytkownika proszę, a następnie, podobnie jak poprzednio,
spróbujmy pożyczyć tę lekcję scanf % s tym razem, a następnie przekazać w buforze.
Teraz szybkie kontrola poprawności.
Dlaczego nie mówi handlowe i bufor ten czas?
Wywnioskować z poprzedniego przykładu.
PUBLICZNOŚCI: Char gwiazda jest wskaźnikiem.
DAVID MALAN: Dokładnie, bo tym razem, char
Gwiazda jest już wskaźnikiem, adres, z definicji tej gwiazdy razie nie.
A jeśli scanf oczekuje adres, wystarczy po prostu przekazać w buforze.
Nie muszę powiedzieć, bufor ampersand.
Dla ciekawskich, można zrobić coś takiego.
Musiałby inne znaczenie.
To daje wskaźnik do wskaźnika, który jest w rzeczywistości
ważna rzecz w C, ale dla Teraz, powiedzmy, keep it simple
i zachować historię spójne.
Jestem po prostu przejdzie w bufor i to jest prawidłowe.
Problemem jest jednak to.
Pozwólcie mi iść do przodu i uruchomić to Program po kompilacji go.
Bądź scanf 1.
Cholera, mój kompilator wzrok mój błąd.
Daj mi jedną sekundę.
Clang.
Powiedzmy scanf-1.C.
OK.
No to jedziemy.
Potrzebuję tego.
CS50 ID ma różne ustawienia konfiguracyjne
które chroni przed siebie.
Musiałem wyłączyć te przez prowadzenie szczęk ręcznie ten czas.
Tak więc ciąg proszę.
Mam zamiar iść do przodu i wpisz w moim ulubionym Hello World.
OK, null.
To nie to, co wpisałem.
Więc to wskazuje coś jest nie tak.
Pozwólcie mi iść do przodu i wpisz w bardzo długi ciąg.
Dzięki za nieważne i nie wiem jeśli będę w stanie go zawiesić.
Spróbujmy trochę kopię wklej i zobacz, czy to pomaga.
Wystarczy wkleić dużo tego.
To zdecydowanie większe Ciąg niż zwykle.
Miejmy tylko naprawdę pisać.
Nie.
Cholera.
Nie znaleziono polecenia.
Więc to jest niezwiązane.
To dlatego, że wklejony złe znaki,
ale to okazuje się nie będzie działać.
>> Spróbujmy jeszcze raz, bo to jest więcej zabawy, jeśli faktycznie rozbić go.
Załóżmy, wpisz to i teraz, jestem zamiar skopiować naprawdę długi ciąg
a teraz zobaczmy, czy mamy może zawiesić tę rzecz.
Zauważ, że pominięte przestrzenie i nowych linii i średniki
i wszystkie znaki ostry.
Wchodzić.
A teraz po prostu sieć jest wolna.
Trzymałem się Command-V zbyt długo, wyraźnie.
Cholera!
Nie znaleziono polecenia.
>> OK.
Cóż, chodzi o to, jednak następujące.
Więc, co się rzeczywiście dzieje na niniejszego oświadczenia
z char gwiazdkowy bufor na linii 16?
Więc co ja mam się kiedy zadeklarować wskaźnik?
Wszystko Dostaję jest wartością czterech bajtów zwany bufor, ale to, co jest w jej wnętrzu
w tym momencie?
To tylko niektóre wartości śmieci.
Ponieważ dowolnym czasie zadeklarować zmienną w C, to tylko niektóre wartości śmieci,
i zaczynamy podróż nad tą rzeczywistością.
Teraz, kiedy powiem, scanf, przejść pod ten adres
i umieścić bez względu na rodzaje użytkowników w.
Jeśli użytkownik wpisze w komentarzy świat, dobrze, gdzie mogę umieścić go?
Bufor jest wartością śmieci.
>> Więc to jest trochę jak strzała wskazując, że jest nie wiadomo gdzie.
Może to wskazuje tutaj, w mojej pamięci.
I tak, gdy użytkownik typy w Hello World,
program stara się umieścić Ciąg hello world backslash 0
w tym fragmencie pamięci.
Ale z dużym prawdopodobieństwem, ale oczywiście nie w 100% prawdopodobieństwo,
komputer będzie wtedy upaść Program, ponieważ nie jest
Pamięć należy pozwolić mi dotknąć.
Tak w skrócie, ten program jest wadliwy dokładnie z tego powodu.
Ja zasadniczo nie robi, co?
Jakie kroki mogę pominięte, podobnie jak pominęliśmy w pierwszym przykładzie binky jest?
Tak?
>> PUBLICZNOŚCI: alokacji pamięci?
>> DAVID MALAN: alokacji pamięci.
Nie właściwie przydzielone jakakolwiek pamięć do tego łańcucha.
Więc możemy to naprawić w kilka sposobów.
Jeden z nich, możemy keep it simple i faktycznie, teraz jesteś
zacznie widzieć zatarcia linii między tym, co
tablica jest, co ciąg jest, co gwiazda char to, co tablica znaków
jest.
Oto drugi przykład udziałem smyczków i uprzedzenia
wszystko robiłem na linii 16, zamiast mówić
że bufor będzie char gwiazda, wskaźnik do kawałka pamięci,
Będę bardzo aktywnie dać Sam bufor do 16 znaków,
i faktycznie, jeśli znasz z buforowania okresie,
chyba ze świata wideo, gdzie film jest buforowanie, buforowanie,
buforujące.
No i co tu jest połączenie?
Cóż, Wewnątrz YouTube i wewnątrz odtwarzaczy wideo
ogólnie jest tablicą to jest większy niż 16.
To może być tablica rozmiarów jednej megabajtowego może 10 megabajtów,
i do tej tablicy ma przeglądarkę pobrać całą masę bajtów,
cała masa megabajtów wideo i odtwarzacz wideo,
YouTube lub kto jest, zaczyna czytanie bajtów z tej tablicy,
i za każdym razem można zobaczyć Słowo buforowanie, buforowanie,
oznacza to, że gracz ma dostał się do końca tej tablicy.
Sieć jest tak wolno, że nie ma uzupełniane tablicę z większą liczbą bajtów
i tak jesteś na bitach aby wyświetlić użytkownikowi.
>> Więc bufor jest trafny termin tutaj, że to tylko tablica, kawał pamięci.
I to będzie to naprawić ponieważ okazuje
że można traktować tablic jakby są adresy, chociaż bufora
to tylko symbol, to Sekwencja postaci, buforem
to jest dla mnie przydatne, programista, można przekazać jej nazwę na całym
jakby to były wskaźnik, jakby to
byli adres klocek pamięci do 16 znaków.
Więc to znaczy, mogę przejść scanf dokładnie to słowo
i tak teraz, jeśli zrobię ten program, aby scanf 2, kropka ukośnik scanf 2,
i wpisz hello world, Wprowadź, że time--
>> Hmm, co się stało?
String proszę.
Co zrobiłem źle?
Witaj, świecie, bufor.
Witaj świecie.
Ach, wiem, co robi.
OK.
Więc to czyta się do pierwszej przestrzeni.
Warto więc oszukiwać na chwilę i Chciałem tylko powiedzieć, aby coś napisać
bardzo długo, jak to jest długa zdanie to jeden, dwa, trzy, cztery, pięć,
sześć, siedem, osiem, dziewięć, 10, 11, 12, 13, 14, 15, 16.
OK.
To jest rzeczywiście długa zdanie.
Więc to zdanie jest dłuższy niż 16 znaków
i tak, kiedy nacisnąć klawisz Enter, co się stanie?
No cóż, w tym przypadku z historia, I oświadczył, bufor
faktycznie jest tablicą z 16 znaków gotowy do pracy.
Tak jeden, dwa, trzy, cztery, pięć, sześć, siedem, osiem, dziewięć, 10, 11, 12, 13, 14,
15, 16.
Tak więc 16 znaków, a teraz, kiedy przeczytać w coś takiego jest długi
Zdanie to, co się wydarzy jest które mam zamiar przeczytać w tym jest długa
S-E-N-T-E-N-C-E zdanie.
>> Więc to jest celowo złe, że
zachować pisanie poza Granice mojej tablicy,
poza granice mojego bufora.
Mogłem mieć szczęście i program utrzyma się na prowadzeniu i nie obchodzi mnie,
ale ogólnie rzecz biorąc, rzeczywiście rozbić mój program,
i to jest błąd w moim kod moment I krok
poza granicami z tej tablicy, bo
nie wiem, czy jest to niekoniecznie będzie katastrofy
czy jestem po prostu będzie miał szczęście.
Więc to jest problematyczne, ponieważ w w tym przypadku, to nie wydaje się do pracy
i niech kusić losu tutaj, chociaż IDE wydaje się tolerować trochę
of--
>> No to jedziemy.
Wreszcie.
Więc jestem jedyną osobą, która może to zobaczyć.
Więc po prostu miałem dużo zabawy pisania się naprawdę długi rzeczywistej frazy
że to na pewno przekroczyła 16 bajtów, bo
wpisane w tym szalonym długi multi-line wyrażenie, a następnie zauważył, co się stało.
Program próbował wydrukowaniem a następnie dostał winy segmentacji
i błędy segmentacji jest, gdy dzieje się coś takiego
i system operacyjny mówi nie, nie można dotknąć, że pamięć.
Mamy zamiar zabić program w ogóle.
>> Tak więc wydaje się problematyczne.
Mam poprawiła programu, w którym przynajmniej mieć trochę pamięci,
ale to wydaje się ograniczyć funkcja GetString do uzyskania
ciągi jakiejś skończonej długości 16.
Więc jeśli chcesz wesprzeć dłużej zdania niż 16 znaków,
co robisz?
Cóż, można zwiększyć rozmiar bufora do 32
lub, że wydaje się trochę krótki.
Dlaczego nie możemy po prostu zrobić to 1000, ale odepchnąć.
Jaka jest odpowiedź intuicyjnie od tylko uniknąć tego problemu poprzez
mój bufor większy, podobnie jak 1000 znaków?
Poprzez wdrożenie getString ten sposób.
Co tu dobre, czy złe?
Tak?
PUBLICZNOŚCI: Jeśli zwiążesz się dużo miejsca i nie należy go używać,
to nie może przydzielić tego miejsca.
DAVID MALAN: Absolutnie.
Jest to marnotrawstwo, o ile jeśli nie rzeczywiście potrzeba 900 tych bajtów
i jeszcze prosisz 1000 w sumie tak,
jesteś po prostu zużywa więcej pamięci na komputer użytkownika niż trzeba,
A przecież, niektóre już napotkał
w życiu, że kiedy jesteś działa wiele programów
a oni zjadają dużo pamięci, to rzeczywiście może wpłynąć na wydajność
i doświadczenie użytkownika na komputerze.
Więc to jest trochę leniwy rozwiązaniem, na pewno, i odwrotnie,
to nie tylko marnotrawstwo, jaki problem nadal, nawet jeśli robię mój bufor
1000?
Tak?
>> PUBLICZNOŚCI: Łańcuch ma długość tysięcy jeden.
DAVID MALAN: Dokładnie.
Jeśli łańcuch jest długość 1001, masz dokładnie ten sam problem,
i przez mojego argumentu, że tak właśnie wtedy zrobić to 2000,
ale nie wiesz, w wcześniej, jak duże powinno być,
a jednak, muszę skompilować mój program przed najmu ludzie używają i pobierz
ono.
Więc to jest dokładnie ten rodzaj rzeczy, że stara biblioteka CS50
aby pomóc nam, a my tylko rzut oka na niektóre z realizacji bazowego
Tutaj jednak to CS50 dot C. jest plikiem, który był na CS50 IDE
wszystkie te tygodnie, które już korzystają.
Jest to skompilowane i masz używam go automatycznie
przez naturę z posiadania kreska L CS50 flagę z brzękiem,
ale jeśli mogę przewinąć w dół przez wszystkie te funkcje, oto getString,
i po prostu dać ci smak, co się dzieje,
rzućmy okiem na względną złożoność.
To nie jest bardzo długa funkcja, ale nie
wszyscy mają myśleć intensywnie o jak go o coraz sznurki.
>> Tak tu jest mój bufor i najwyraźniej zainicjować go na null.
To, oczywiście, jest samo, jak gwiazdy char,
ale zdecydowałem się wdrażanie biblioteki CS50
że jeśli mamy zamiar być całkowicie dynamiczny,
Nie wiem z wyprzedzeniem jak duży użytkowników smyczkowych będą chcieli dostać.
Więc mam zamiar zacząć tylko z pustym ciągiem znaków
i mam zamiar budować tyle Pamięć jak trzeba dopasować ciąg użytkownika
a jeśli nie mam tyle, mam zamiar zapytać
system operacyjny, aby uzyskać więcej pamięci.
Mam zamiar przenieść swój ciąg do większego kawałka pamięci
i mam zamiar zwolnić lub uwolnić wystarczająco duży fragment pamięci
a my po prostu się to zrobić iteracyjnie.
>> Tak szybki rzut oka, tutaj jest po prostu zmienna
z którym mam zamiar śledzić zdolności mojego bufora.
Ile bajtów mogę zmieścić?
Oto zmiennej n, które mam zamiar utrzymać
utwór o tym, jak wiele bajtów są rzeczywiście w bufor lub że użytkownik wpisał.
Jeśli nie widziałem tego wcześniej, ci Można określić, że zmienna jak int
jest niepodpisany, które jak sama nazwa wskazuje, Oznacza to nieujemna i dlaczego będzie
I nigdy nie chce niepokoić określające że nie tylko int int,
ale niepodpisany int?
To nieujemną int.
Co oznacza [niesłyszalne] oznacza?
>> PUBLICZNOŚCI: To opisujący ilość pamięci, która może być [niesłyszalne].
>> DAVID MALAN: Tak.
Więc jeśli powiem, bez znaku, to jest rzeczywiście co daje jeden trochę dodatkowej pamięci
i wydaje się trochę głupie, ale jeśli jeden trochę dodatkowej pamięci, że
oznacza, że ​​masz dwa razy tyle Wartości można reprezentują,
ponieważ może on być 0 lub 1.
Więc domyślnie, int może być mniej ujemna 2 mld na drodze
do pozytywnego 2 mld.
To są duże zakresy, ale to wciąż rodzaj marnotrawstwa
jeśli tylko o rozmiary, które po prostu intuicyjnie
powinna być ujemna lub dodatnie lub 0, a następnie,
dlaczego marnujesz 2 miliardy Możliwe wartości dla liczb ujemnych
jeśli nigdy nie będziemy z nich korzystać?
Więc mówiąc niepodpisany, teraz mój int może być pomiędzy 0 a około 4 mld.
>> Więc tutaj jest po prostu int C z powodów nie dostaniemy się właśnie teraz,
dlaczego jest to int zamiast z char, ale tutaj jest
istota tego, co się dzieje na, a niektórzy z was
może być używany, na przykład, fgetc funkcji nawet w pset czterech
lub później, będziemy go zobaczyć ponownie w problemu ustawić pięć,
fgetc jest dobre, bo jak nazwa rodzaj, rodzaj arcanely sugeruje,
jest to funkcja, która dostaje charakter i tak,
co zasadniczo różni o tym, co robimy w getString
jest nie używamy scanfa w taki sam sposób.
Jesteśmy po prostu pełzanie wraz krok po kroku przez co użytkownik wpisane,
ponieważ zawsze możemy przydzielić jeden char, i tak zawsze możemy bezpiecznie
wyglądają z jednej odbarwiającego w czasie, magia zaczyna się dziać tutaj.
Zamierzam przejść do środek tej funkcji
tylko pokrótce przedstawić tę funkcję.
Podobnie jak tam jest Funkcja malloc, nie
funkcja realloc gdzie realloc pozwala ci przydzielić kawałek pamięci
i sprawiają, że większe lub mniejsze.
Tak w wielkim skrócie i fala mojej strony na dzisiaj,
wiem, że to, co getString robi to jest coś w rodzaju
z magicznie rośnie lub kurczy się bufor, jak użytkownik
typy w jego ciąg.
>> Więc jeśli użytkownik wpisze krótki ciąg znaków, kod
tylko przydziela tyle Pamięć dopasować ciąg.
Jeśli użytkownik trzyma pisania jak ja go znowu i znowu
i znowu, dobrze, jeśli bufora początkowo ten wielki
, program realizuje, na Chwileczkę, jestem z przestrzeni,
to się podwoić rozmiar bufora
a następnie dwa razy rozmiar bufora i kod, który robi podwojenie,
jeśli spojrzymy na to tutaj, to tylko ten sprytny-liner.
Może nie widzieliście tej składni wcześniej, ale jeśli powiesz, że gwiazda jest równy,
to jest to samo, co mówiąc razy pojemności 2.
Więc to tylko trzyma podwajając Wydajność buforze
a następnie mówi realloc dać Sam, że o wiele więcej pamięci.
>> Teraz, na marginesie, nie są inne funkcje w tutaj
że nie będziemy patrzeć na jakiekolwiek szczegóły inne niż do wyświetlenia w GetInt,
używamy w GetInt getString.
Sprawdzimy, że nie jest null, która, przypomnijmy,
jest specjalna wartość, która oznacza coś poszło nie tak.
Jesteśmy pamięci.
Lepiej sprawdź to.
I wracamy wartości wskaźnikowych.
Ale będę odroczyć do uwag co do dlaczego, a potem użyć tego kuzyn scanf
nazywa sscanf i okazuje się, że scanf sscanf, lub ciąg znaków,
pozwala spojrzeć na linii, które wpisane przez użytkownika i niech cię w
analizować zasadniczo i co jestem tu robisz jest Mówię sscanf,
analizować, co użytkownik ma wpisane i upewnij% I,
nie jest liczbą całkowitą w nim, i nie będzie dostać się do dziś, dlaczego nie ma również
a% c tutaj, ale w skrócie pozwala nas, aby wykryć, czy użytkownik wpisał
w coś fałszywego po numerze.
Więc dlatego, że GetInt i GetString powiedzieć, aby ponowić próbę, ponownie, ponownie
Jest tak, ponieważ ze wszystkich że kod pisaliśmy,
To trochę patrząc na wejście użytkownika upewniając się, że to całkiem numeryczny
czy jest to rzeczywista zmiennoprzecinkowych Wartość punktu lub podobne,
W zależności od wartości funkcjonować używasz.
>> Ufff.
OK.
To był łyk ale chodzi o to,
że powodem mieliśmy te kółka na
Jest tak, ponieważ na najniższym poziomie Jest tak wiele rzeczy, które
może pójść nie tak, że chcieliśmy do zapobiegawczo obsługi
te rzeczy na pewno w Pierwsze tygodnie klasy,
ale teraz z pset cztery i pset pięć i poza widać, że jest to bardziej do
ty, ale również jesteś bardziej zdolny rozwiązywania tego rodzaju problemów
samodzielnie.
Wszelkie pytania dotyczące getString lub GetInt?
Tak?
>> PUBLICZNOŚCI: Dlaczego chcesz podwoić Wydajność buforze
a nie tylko zwiększenie to przez dokładnej kwoty?
>> DAVID MALAN: Dobre pytanie.
Dlaczego mielibyśmy podwojenie zdolności bufora zamiast
po prostu zwiększenie jej przez jakąś stałą wartość?
To była decyzja projektowa.
My po prostu uznał, że ponieważ ma tendencję do być trochę drogie, czas mądry zapytać
System operacyjny za pamięć, my nie
chcesz skończyć się w sytuacja dla dużych ciągów
które pytaliśmy znowu i znowu OS
i znowu i znowu w szybka sukcesja dla pamięci.
Więc po prostu zdecydował, nieco arbitralnie ale mamy nadzieję, rozsądnie,
że, wiesz co, niech postarać się przed siebie
i po prostu podwojenie go tak, że zminimalizować ilość razy
mamy zadzwonić malloc lub realloc, ale w sumie wyrok
zadzwonić w przypadku braku znajomości co użytkownicy mogą chcieć wpisać.
Oba sposoby mogą być dyskusyjne.
Prawdopodobnie dobre.
>> Warto więc przyjrzeć się kilku od innych skutków ubocznych pamięci
rzeczy, które mogą pójść źle i narzędzi, które można
używać do połowu tego rodzaju błędów.
Okazuje się, wszyscy z was, nawet jeśli check50 nie powiedział ci tyle,
pisali buggy Kod od tygodnia,
nawet jeśli wszystkie testy check50 są minął, a nawet jeśli ty i twój TF
są bardzo pewni, że Twój kod działa zgodnie z przeznaczeniem.
Twój kod jest wadliwy lub wadliwy, że wszyscy z was,
w korzystaniu z biblioteki CS50, zostały wyciek pamięci.
Byłaś prosi system operacyjny do pamięci w większości programów
napisałeś, ale masz nigdy nie podano go z powrotem.
Masz nazywa GetString i GetInt i GetFloat,
ale z getString, masz nigdy nie nazywa unGetString lub Give
String Powrót lub podobne, ale widzieliśmy że GetString nie przydzielić pamięci
w drodze malloc lub tego Funkcja realloc, który jest po prostu
bardzo podobne w duchu, a jednak, byliśmy
zwracając się do systemu operacyjnego dla pamięci i pamięci ponownie i ponownie
ale nigdy nie dając go z powrotem.
>> Teraz, na marginesie, to okazuje się, że gdy program kończy działanie, wszystkie pamięci
jest automatycznie usuwane.
Więc to nie był to ogromny problem.
To się nie złamać IDE lub spowolnić,
Ale kiedy programy zrobić ogólnie wyciek pamięci
i są one uruchomione przez długi czas.
Jeśli kiedykolwiek widział głupiego Malutki Piłka plażowa w Mac OS lub klepsydry
w systemie Windows, gdzie jest to rodzaj spowolnienie lub myśli i myślenie
lub po prostu naprawdę zaczyna spowolnić do indeksowania,
to bardzo prawdopodobne może być skutkiem nieszczelności pamięci.
Programiści, którzy pisali oprogramowanie używasz
zwrócić się do systemu operacyjnego dla pamięci co kilka minut, co godzinę.
Ale jeśli uruchamiając oprogramowanie, nawet jeśli jest to
zminimalizowane w komputerze przez kilka godzin lub dni, w celu
można prosić o więcej i więcej pamięci i nigdy nie korzystali z basenu
i tak kod może być, lub programy mogą być wyciek pamięci,
i jeśli zaczniesz wycieki pamięci, jest mniej pamięci dla innych programów,
a efekt jest spowolnić wszystko w dół.
>> Teraz, jest to zdecydowanie jeden z najbardziej okrutne programy
będziesz mieć możliwości do pracy w CS50 zakresie
a jego produkcja jest jeszcze bardziej ezoteryczny niż szczęk lub zrobić lub którykolwiek z polecenia
Linia jakie programy prowadzone wcześniej, ale na szczęście, osadzone w swojej produkcji
Jest kilka bardzo pomocnych wskazówek, które będą przydatne zarówno dla pset czterech
czy na pewno pset pięć.
Więc valgrind jest narzędziem który może być użyty do sprawdzenia
przecieków pamięci w programie.
Jest to stosunkowo prosty do uruchomienia.
Uruchomić valgrind a następnie, nawet choć jest to trochę rozwlekły,
Kontrola szczelności kreska kreska równa się pełna, a następnie kropka
slash i nazwa programu.
Więc valgrind następnie uruchomić program a na samym końcu programu
uruchomiony, zanim zostanie zamknięty i daje się kolejny monit,
to będzie analizować Program natomiast, że został uruchomiony
i powiedzieć, czy wyciek żadnej pamięci, a jeszcze lepiej,
nie dotykać pamięć nie należy do ciebie?
To nie może złapać wszystko, ale to całkiem dobry wzrok większość rzeczy.
>> Więc tutaj jest przykład z mojego mającego metę ten program, o run valgrind,
na program o nazwie Pamięć i idę
aby zaznaczyć linie, które są ostatecznie nas interesują.
Więc jest jeszcze więcej rozrywki że już usunięte z zjeżdżalnią.
Ale niech po prostu zobaczyć, co to Program jest w stanie powiedzieć nam.
Jest w stanie powiedzieć nam rzeczy jak niepoprawnego zapisu wielkości 4.
Innymi słowy, jeśli dotykać pamięci, konkretnie 4 bajty pamięci
że nie powinien mieć, valgrind mogę ci powiedzieć.
Nieprawidłowy zapis wielkości 4.
Dotknąłeś cztery bajty że nie powinien mieć.
Gdzie pan to zrobił?
To jest piękno.
Pamięć c kropka linia 21 jest tam, gdzie wkręca się i dlatego jest to pomocne.
Podobnie jak GDB, może pomóc punktu, w faktycznym błędem.
>> Teraz, ten jest trochę więcej gadatliwy, jeśli nie mylące.
40 bajtów 1 bloków są zdecydowanie utracone w rekordzie strat 1 z 1.
Co to znaczy?
Cóż, to po prostu oznacza, że ​​poprosił o 40 bajtów i nigdy nie oddał.
Nazwałeś malloc lub dzwoniłeś GetString i system operacyjny
dałem 40 bajtów, ale nigdy nie uwolnione lub udostępnione, że pamięć,
i żeby być w porządku, my nigdy nie pokazują Ci, jak oddać pamięć.
Okazuje się, że jest super Prosta funkcja nazywa darmo.
Przyjmuje jeden argument, na rzecz Aby zwolnić lub oddać,
ale 40 bajtów, najwyraźniej, w tym programie
zostały utracone na linii 20 pamięci dot c.
>> Zobaczmy więc, ten program.
To super bezużyteczne.
To tylko pokazuje, ten konkretny błąd.
Warto więc przyjrzeć.
Oto główne i najważniejsze, zawiadomienia, rozmowy funkcja o nazwie F, a następnie wraca.
Więc nie wszystko, co ciekawe.
Co f zrobić?
Zauważ, że nie przeszkadzało z prototypem.
Chciałem zachować kod możliwie jak najmniejszy.
Włożyłem więc f powyżej głównym i to jest w porządku, na pewno,
dla krótkich programów takich jak ten.
Więc f niczego nie wrócić i nie Nie ma nic, ale to nie to zrobić.
Deklaruje, podobnie jak na przykład binky,
wskaźnik o nazwie x, że będzie przechowywać adres int.
Więc to jest lewa strona.
W języku angielskim, co jest prawa strona robi?
Każdy, kto?
Co to robi dla nas?
Tak?
>> PUBLICZNOŚCI: [niesłyszalne] razy większe int
która jest 10 razy, że [niesłyszalne]
DAVID MALAN: Dobry i pozwól mi podsumować.
Więc przeznaczyć wystarczająco dużo miejsca dla 10 liczb całkowitych lub 10, co jest rozmiar int,
to cztery bajty, więc 10 razy 4 jest 40, tak, że po prawej stronie, że mam
Podświetlona jest mi dać 40 bajtów i przechowywać adres pierwszego bajtu
do x.
A teraz na koniec, a tu, gdzie ten program jest wadliwy, co jest
tak z linii 21 na podstawie tej logiki?
Co jest nie tak z linii 21?
Tak?
PUBLICZNOŚCI: Nie możesz Strona jest w x [niesłyszalne].
DAVID MALAN: Tak.
Nie powinienem indeks do x w tym stylu.
Więc składniowo, to jest OK.
Co miłe jest, podobnie jak Ciebie można traktować nazwę tablicy
jakby to wskaźnik, podobnie można traktować wskaźnik jakby to
tablica, i tak mogę składniowo Wspornik coś powiedzieć, x, x uchwyt i,
ale 10 jest problematyczne.
Czemu?
>> PUBLICZNOŚCI: Bo to nie jest w środku.
>> DAVID MALAN: Nie wewnątrz tego kawałka pamięci.
Jaka jest największa wartość Powinienem być wprowadzenie w tych nawiasach kwadratowych?
9, od 0 do 9.
Ze względu na zerowej indeksowania.
Więc od 0 do 9 będzie dobrze.
Wspornik 10 nie jest dobre, a ale, pamiętam jednak, za każdym razem,
Wydaje mi się, aby spróbować zrobić CS50 IDE Crash wpisując wartości fałszywych,
nie zawsze współpracują, i rzeczywiście, często
miał szczęście tylko dlatego, że System operacyjny nie działa
zauważysz, że zawsze tak lekko zdać jakiś fragment pamięci,
dlatego, że pozostał w technicznie Twój segmentu, ale o tym
w klasie systemów operacyjnych, i tak coś takiego
może bardzo łatwo przejść niezauważony.
Twój program nie będzie katastrofy konsekwentnie, ale być może raz na jakiś czas.
>> A więc spróbujmy valgrind na ten temat, a tu
gdzie będziemy się przytłoczony przez wyjście na chwilę.
Więc dokonać pamięci próbę szczelności valgrind równa pełnej pamięci kropka slash.
A oto dlaczego obiecuję to będzie przytłaczać.
Oto co valgrind, oto co programista, kilka lat temu-
zdecydował, że będzie to dobry pomysł na wyjście wyglądać.
Warto więc sensu w tym.
Tak więc przez całą drogę z lewej ręki boczne bez powodu
jest identyfikator procesu programu po prostu działać, niepowtarzalny identyfikator
programu po prostu uciekł.
Mamy usunięty, że od slajd, ale nie
jest kilka przydatnych informacji tutaj.
>> Miejmy przewijać się na sam szczyt.
Oto, gdzie zaczęliśmy.
Więc to nie jest aż tak dużo wyjście.
Oto, że nieważne zapisu wielkości 4 na linii 21.
Cóż, to, co było linii 21?
Linia 21 było dokładnie to i to ma sens
że jestem w ważnie pisanie 4 bajty, bo jestem
starają się umieścić tę liczbę całkowitą, co mogłoby być w ogóle,
to po prostu dzieje się zero, ale staram
umieścić go w miejscu które nie należą do mnie.
Co więcej, tu, 40 bajty w jednym Bloki są zdecydowanie stracił w rekordzie 1.
To dlatego, że gdy zgłoszę malloc tutaj, nigdy tak naprawdę zwolnić pamięć.
>> Więc jak można rozwiązać ten problem?
Pozwólcie mi iść do przodu i być trochę bezpieczniej i zrobić 9 nie i niech mnie tu bezpłatne x.
Jest to nowa funkcja na dzisiaj.
Jeśli teraz ponownie uruchomić dot memory ukośnik, niech na nim uruchomić valgrind ponownie
zmaksymalizować okno i naciśnij Enter.
Teraz, to jest dobre.
Pochować ich dobrą nowinę We wszystkich tego wyjścia.
Wszystkie bloki sterty były wolne.
Wrócimy do tego, co stercie jest, ale nie ma wycieków są możliwe.
Więc jest to tylko kolejny Narzędzie do zestawu narzędzi
z którym można zacząć znaleźć teraz błędów takich jak to.
>> Ale zobaczmy, co więcej może się nie udać się tutaj.
Miejmy przejście teraz właściwie rozwiązanie problemu.
Tak na marginesie, czy to będzie zwolnić Trochę zamieszania i napięcia,
teraz jest to śmieszne.
Tak.
To dość dobre.
Ponieważ wskaźniki są adresy i adresy
ogólnie przyjętą konwencją napisane szesnastkowym.
Ha, ha, to jest śmieszne.
Tak czy inaczej, więc niech teraz rzeczywiście rozwiązać problem.
To było bardzo, bardzo niski poziom tej pory,
i możemy faktycznie użyteczne rzeczy z tych szczegółów niskiego poziomu.
>> Więc wprowadziliśmy kilka tygodni temu pojęcie tablicy.
Tablica było miłe, bo trudno jest oczyścić nasz kod
bo jeśli chcemy napisać Program z wieloma studentami
lub wielu nazw i domy i akademików i uczelni i wszystko to,
możemy przechowywać wszystko więcej czysto w środku tablicy.
Ale proponuję jedną wadę tablicy tej pory.
Nawet jeśli wcześniej nie cierpiała go samodzielnie w programie, tylko instynktownie,
to, co jest złe o tablicy, być może?
Słyszę jakieś szepty.
PUBLICZNOŚCI: Trudno aby zmienić rozmiar.
DAVID MALAN: Trudno aby zmienić rozmiar.
Nie można zmienić rozmiaru tablicy, w rzeczywistości, per se
w C. Możesz przydzielić inną tablicę, przenieść wszystko od starego
na nowy, a teraz mają trochę wolnego miejsca,
ale to nie jest jak język jak Java czy Python
lub dowolne inne języki z których niektórzy z was
może znać gdzie może po prostu zachować dodając rzeczy
znudzenia do końca tablicy.
Gdy masz tablicę Rozmiar 6, które jest jego wielkość,
i tak dużo jak pomysł wcześniej bufor o określonej wielkości,
musisz zgadywać z bramy jaki rozmiar chcesz go mieć?
Jeśli chyba zbyt duże, marnujesz miejsca.
Jeśli chyba zbyt małe, Nie można przechowywać te dane, co najmniej
nie dużo więcej pracy.
>> Więc dzisiaj, dzięki wskazówek, możemy rozpocząć szycie wraz własny zwyczaj
struktury danych, a Fakt, jest tu coś
że wygląda trochę więcej tajemnicze na pierwszy rzut oka,
ale to jest to, co my nazywamy powiązane lista, a jego nazwa rodzaju podsumowanie
ono.
Jest to lista numerów, lub w tym przypadku, wykaz numerów,
ale może to być lista z niczego, ale to jest połączone ze sobą za pomocą strzałek,
i po prostu zgadywać z tego, co technika
będziemy w stanie zszyć razem,
coś jak popcorn z wątku, Listy wiązana prostokąty tutaj?
Jego numery?
Jaka jest funkcja język podstawowy?
>> PUBLICZNOŚCI: Wskaźnik.
>> DAVID MALAN: Wskaźnik.
Tak więc każdy z tych strzałek tutaj reprezentuje wskaźnik lub po prostu adres.
Więc innymi słowy, jeśli chcę do przechowywania listy numerów
Nie mogę po prostu zapisać go, jeśli chcę zdolność do wzrostu i kurczyć
moja struktura danych w tablicy.
Więc muszę mieć trochę więcej wyrafinowania,
ale zauważ, że ten obraz rodzaj sugeruje
że jeśli właśnie dostał małe wątki łączenia wszystkiego ze sobą,
Prawdopodobnie nie jest to, że trudno, aby zrobić miejsce między dwa z tych prostokątów
lub dwa z tych węzłów, jak zaczniemy nazywając je umieścić w nowym węźle,
a następnie z jakiegoś nowego wątku, po prostu rów trzy węzły razem,
pierwszy, ostatni i jeden że po prostu umiejscawia się w środku.
>> I rzeczywiście połączonej listy, w przeciwieństwie do tablicy, jest dynamiczny.
Może rosnąć, a to może kurczą się, a ty nie
trzeba znać lub opieki z góry how wiele danych idziesz do przechowywania,
ale okazuje się, że musimy być trochę Uważaj, jak zaimplementować to.
Więc najpierw rozważmy, jak wdrożyć jednego z tych małych prostokątów.
Jest to łatwe do wdrożenia int.
Wystarczy powiedzieć, int n, a następnie masz 4 bajty na int,
ale jak mogę int, nazywamy to n, a następnie wskaźnik, nazwijmy to w przyszłym.
Możemy nazwać je rzeczy, cokolwiek chcemy
ale muszę strukturę niestandardowych danych.
Tak?
>> PUBLICZNOŚCI: Ampersand [niesłyszalne].
>> DAVID MALAN: Tak handlowe i będziemy używać do uzyskać adres węzła potencjalnie.
Ale potrzebujemy innego cechą C w celu
dać mi możliwość tworzenia zwyczaj ten prostokąt, ten zwyczaj
jeśli będzie zmienna w pamięci.
PUBLICZNOŚCI: struct.
DAVID MALAN: struct.
Przypomnijmy, z ostatniego tygodnia, wprowadziliśmy struktura, to stosunkowo proste słowo kluczowe
który pozwala nam dokonać takich rzeczy.
C nie pochodzą z danych Struktura nazywa studenta.
Pochodzi z pływakiem i int i char i takie, ale nie pochodzi z uczniem,
ale możemy stworzyć typ danych student, struktura student, z tej składni
tutaj.
I zobaczysz to znowu i znowu.
Więc nie martw się o zapamiętywania słów kluczowych,
ale kluczowe jest to ważne jest, tylko fakt, że powiedział struct
i wtedy nazwał go ucznia i wewnątrz studenta była nazwa i dom
lub w akademiku lub podobne.
>> A więc teraz już, niech proponują.
Dodałem kilka słów, ale jeśli chcę do wdrożenia tego prostokąta, który jest
ma zarówno int i kolacja wskaźnik, wiesz co, jestem
zamiar oświadczyć struct nazwie węzła.
Jestem też, w jej wnętrzu, powie że węzeł ten prostokąt, ma int
a my go nazywamy n oraz ma kolejny wskaźnik.
I to jest trochę rozwlekły, ale jeśli myślisz o tym,
Strzałki, które były w obrazie przed chwilą to, jaki rodzaj danych?
Przy czym każdy z tych strzałek wskazuje jaki rodzaj struktury danych?
To nie jest skierowany tylko do int per se.
Jest skierowany do Cała prostokątna rzeczą
i że prostokątne rzeczą, powiedzieliśmy, jest nazywany węzłem.
A więc my niby trzeba rekurencyjnie zdefiniować to takie
że węzeł, powiedzmy, zawiera int nazwie n
i wskaźnik zwany obok i typ struktury danych, do której
że wskaźnik wskazuje jest najwyraźniej będzie struct node.
>> Więc to jest irytująco gadatliwy i po prostu być pedantyczny
dlatego nie możemy po prostu powiedzieć, że to, co szczerze mówiąc
wygląda o wiele bardziej czytelny, Jest tak, ponieważ Przypomnijmy, że C przeczytać
rzeczy, od góry do dołu, od lewej do prawej.
To nie jest aż dojdziemy średnik że węzeł kluczowe faktycznie istnieje.
Więc jeśli chcemy mieć tego rodzaju cykliczne odniesienia wewnątrz danych
Struktura, musimy to zrobić, gdzie mówimy węzeł struct na górze, która
daje nam dłuższą sposób opisywania tego rzeczą, następnie wewnątrz mówimy węzeł struct,
a następnie w ostatniej linii mówimy, wszystko w porządku, C, przy okazji,
zadzwoń ten cały cholerny rzeczą węzeł i zatrzymać
za pomocą słowa kluczowego struct całkowicie się.
Więc to jest po prostu coś w rodzaju składniowym Sztuką, która ostatecznie pozwala nam tworzyć
coś, co wygląda dokładnie tak.
>> Tak więc, jeśli założymy, teraz możemy wdrożyć tę rzecz w C,
W jaki sposób właściwie rozpocząć przejeżdżające?
Cóż, w rzeczywistości, wszystko co musisz zrobić, to iteracyjne od lewej do prawej i po prostu
rodzaj wstawić węzły lub usunąć węzły lub wyszukaj rzeczy, wszędzie tam, gdzie chcemy,
ale aby to zrobić, idziemy do przodu i zrobić rzeczy trochę bardziej realne, ponieważ
jest bardzo niski poziom tej pory.
Czy ktoś dosłownie lubią być pierwszy?
OK.
Chodź na górę.
Jak masz na imię?
>> DAVID: David.
DAVID MALAN: David.
Miło cię poznać.
Ja też.
W porządku.
A my potrzebujemy numer 9.
Nie tak dobry jak pierwszy, być może.
OK, numer 9.
Numer 17, proszę.
Pozwól mi wrócić trochę dalej.
Numer 22, proszę, i jak się dalej wstecz
jeśli widzę żadnych ręce ze wszystkimi świetle lub nie.
Ktoś jest na ochotnika tam.
Chcesz wymyślić?
Twój przedramienia jest siłą idzie w górę.
OK, 17.
. 22
26 idzie w dół.
Czy ktoś jeszcze chciał forcefully-- Chodź.
Rzeczywisty wolontariuszy.
>> Tak bardzo szybko, jeśli wam się zorganizować
się po prostu podoba węzły na ekranie.
Dziękuję.
I będziesz 26.
Wszystkie właściwe i szybkie wstępy.
Więc jestem Dawid i jesteś też?
DAVID: David.
DAVID MALAN: A ty jesteś?
JAKE: Jake.
Sue Sue.
ALEX: Alex.
RAPHAEL: Raphael.
TAYLOR: Taylor.
DAVID MALAN: Taylor.
Doskonałe.
To są nasi wolontariusze do dziś i iść do przodu
i przesunąć trochę w ten sposób, i po prostu iść dalej i utrzymać
trzymając swoje numery jak ty lub twoi Pierwszy znak i za pomocą lewej ręki,
śmiało i po prostu wdrożyć te strzały, po prostu
tak, że lewa ręka jest dosłownie wskazując na co należy zwrócić
w, i dać sobie trochę miejsca, tak aby możemy naocznie zobaczyć swoje ramiona rzeczywistości
wskazując, a może po prostu wskazać jakby na ziemi jest w porządku.
>> Więc tutaj mamy połączonej listy jednego, dwa, trzy, cztery, pięć węzłów początkowo,
i zauważyć, mamy ten specjalny wskaźnik na początku, kto jest
klucz, ponieważ mamy do śledzenia całej listy długość jakoś.
Ci faceci, nawet jeśli są one pozostawione do prawej, z powrotem do tyłu w pamięci,
mogą one być wszędzie w pamięci komputera.
Więc ci faceci mogą być stojąc w dowolnym miejscu na scenie
i to jest w porządku, tak długo, jak są one faktycznie, wskazując na siebie,
ale do przechowywania rzeczy czyste i proste, będziemy
wystarczy wyciągnąć je od lewej do prawej, jak to, ale nie może być ogromne luki
Pomiędzy tymi węzłami.
>> Teraz, jeśli chcę, aby faktycznie wprowadzić pewne nowa wartość, idziemy naprzód i to zrobić.
Mamy szansę teraz wybrać inny węzeł.
Powiedzieć, zacznijmy od z mallocing 55.
Czy ktoś przeszkadza malloc?
OK, chodź na górę.
Jak masz na imię?
RAINBOW: Rainbow.
DAVID MALAN: Rainbow?
W porządku.
Malloc Rainbow.
Chodź na górę.
Więc teraz musimy zadać sobie pytanie, algorytmicznie, gdzie możemy umieścić 55.
Tak więc każdy z nas wie, oczywiście, gdzie prawdopodobnie
należy, jeśli chcemy zachować to klasyfikowane
i jeśli wy może przyjąć jedną krok do tyłu, więc nie spaść
etap, że byłoby świetnie.
Tak naprawdę, Tęcza, rozpocząć tutaj ze mną,
bo jak komputer teraz może zobaczyć tylko jedną zmienną w czasie.
Tak więc, jeżeli jest to pierwszy węzeł.
Zauważ, że nie jest węzłem, on jest tylko wskaźnikiem,
i dlatego on wyciągnąć się tylko wielkość wskaźnika nie
jeden z tych pełnych prostokątów.
Tak więc mamy zamiar sprawdzić na siebie iteracja jest 55 mniej niż 9?
Nie.
Czy 55 mniej niż 17 lat?
Nie.
Mniej niż 22?
Mniej niż 26 lat?
Mniej niż 34?
A więc teraz, oczywiście Rainbow należy na końcu.
Więc być jasne, a co było na imię, Taylor?
>> TAYLOR: Taylor.
DAVID MALAN: Tak między Taylor lewa ręka i ręce Rainbow jest tutaj,
czyja ręka musi wskazywać na to, co w Aby wstawić 55 na tej liście?
Co trzeba zrobić?
Tak?
>> PUBLICZNOŚCI: ręka Taylora musi wskazać w lewo.
>> DAVID MALAN: Dokładnie.
Więc wstawienie węzła na koniec listy
Jest to bardzo proste, ponieważ Taylor po prostu ma wskazywać, zamiast w podłożu
lub nazwijmy to null null jest rodzaj nieobecności
od wskaźnika lub specjalny zerowy wskaźnik, że jesteś
będzie wskazywać z lewej Ręka w Rainbow a następnie Rainbow,
Gdzie lewej Prawdopodobnie ręcznie wskazać?
W dół.
To nie jest dobre, jeśli jej ręka jest rodzajem wskazując się tutaj lub rodzaj dowolny
która droga.
To byłoby uznane za wartość śmieci,
ale jeśli ona wskazuje na niektóre znana wartość, będziemy
Nazywamy to zero lub wartość null, to jest OK bo mamy termin w tym
i wiemy, że lista jest zakończona.
>> Więc co innego stosunkowo prosta sprawa?
Czy możemy malloc 5?
Chodź na górę.
Jak masz na imię?
TIFFANY: Tiffany.
DAVID MALAN: przepraszam?
TIFFANY: Tiffany.
DAVID MALAN: Tiffany.
W porządku.
Tiffany został malloced o wartości 5.
Chodź na górę.
Ten jest stosunkowo łatwa, ale rozważmy kolejność operacji teraz.
To było całkiem proste z Taylor na końcu.
Numer 5 jest oczywiście mniejszy niż 9, i tak mamy Dawida, mamy Tiffany,
a co masz na imię?
>> JAKE: Jake.
>> DAVID MALAN: Jake.
Tiffany, Jake i David.
Czyja ręka powinna być pierwszy zaktualizowany?
Co chcesz robić tutaj?
Istnieje kilka możliwych sposobów, ale tam również jeden lub więcej złe drogi.
>> PUBLICZNOŚCI: Zacznij skrajnej lewej.
>> DAVID MALAN: Zacznij od skrajnej lewej.
Kto jest tu najbardziej na lewo, a następnie?
PUBLICZNOŚCI: Po pierwsze.
>> DAVID MALAN: OK.
Tak rozpoczyna się pierwsza i gdzie chcesz zaktualizować ręce Dawida być?
PUBLICZNOŚCI: Pod 5.
DAVID MALAN: OK.
Dawid, punkt, w pięciu lub Tiffany tu i teraz?
>> PUBLICZNOŚCI: Tiffany wskazuje na 9?
DAVID MALAN: Perfect, z wyjątkiem Binky na szef po prostu rodzaj spadł, prawda?
Bo to, co się dzieje z ten obraz dosłownie?
PUBLICZNOŚCI: Nic nie wskazuje.
DAVID MALAN: Nic nie jest wskazując na Jake'a teraz.
Mamy dosłownie osierocone 9 i 17, i mamy dosłownie
wyciekała z tej pamięci, ponieważ przez aktualizowanie rękę Dawida pierwsze, to
w porządku, o ile jest prawidłowo wskazując na Tiffany teraz
ale jeśli nikt nie miał foresight wskazać na Jake'a,
potem straciliśmy Całość tej listy.
Warto więc cofnąć.
Więc to była dobra rzecz potknąć, ale niech poprawić teraz.
Co powinniśmy zrobić w pierwszej kolejności, a nie?
Tak?
>> PUBLICZNOŚCI: Tiffany powinien wskazywać na 9?
DAVID MALAN: nie mogę uzyskać tak blisko Ciebie.
Kto powinien wskazywać na 9?
>> PUBLICZNOŚCI: Tiffany.
>> DAVID MALAN: Wszystko w porządku.
Więc Tiffany powinien pierwszy punkt na 9.
Więc Tiffany powinny na identycznej wartości
do Dawida, który wydaje zbędne na chwilę,
ale to dobrze, bo teraz, druga krok, możemy aktualizować rękę Dawida
wskazać na Tiffany, a następnie, jeśli my po prostu rodzaj czyste rzeczy do góry
jako że jest to rodzaj wiosennej, teraz, że jest to prawidłowe wstawiania.
Tak doskonałe.
Więc teraz jesteśmy prawie na miejscu.
Miejmy wstawić jeden finał wartość jak wartość 20.
Gdybyśmy mogli malloc ostatnią wolontariuszem?
Chodź na górę.
Więc ten jeden to trochę bardziej skomplikowane.
Ale tak naprawdę, kod jesteśmy pisanie, choć werbalnie,
jest po prostu jak o kilka od tego, czy zostały spełnione warunki, prawda?
Mieliśmy stan sprawdzenie, czy należy
Na koniec, może początku.
Potrzebujemy pewnego rodzaju pętli do znaleźć miejsce w środku.
Więc zróbmy to, że z tego, co masz na imię?
>> ERIC: Eric.
>> DAVID MALAN: Eric?
Eric.
Miło cię poznać.
Mamy więc 20.
Mniej niż pięć?
Nie.
Mniej niż dziewięciu?
Nie.
Mniej niż 17 lat?
Nie.
OK.
On należy tu wasze imiona znów są?
Sue Sue.
DAVID MALAN: Sue.
ALEX: Alex.
DAVID MALAN: Sue, Alex, i?
ERIC: Eric.
DAVID MALAN: Eric.
Których ręce muszą uzyskać zaktualizowane pierwszy?
>> PUBLICZNOŚCI: Eric.
OK.
Więc Eric powinien wskazywać na to gdzie?
W 22.
Dobry.
A teraz co dalej?
Sue może to wskazywać na Erica a teraz, jeśli faceci po prostu
zrobić trochę miejsca, które jest w porządku wizualnie, teraz zrobiliśmy wprowadzenie.
Więc teraz rozważyć pytanie, ale dziękuję bardzo za naszych wolontariuszy.
Bardzo dobra robota.
Możesz zachować te, jeśli chcesz.
I mamy piękny pożegnalny prezent jeśli chcesz wziąć każdy lubi piłkę stres.
Pozwól mi tylko przejść to w dół.
Więc co jest na wynos z tego?
To wydaje się być niesamowite o ile mamy teraz
wprowadził alternatywa Tablica, która nie jest tak ograniczona
do tablicy pewnej ustalonej wielkości.
Mogą rozwijać się dynamicznie.
>> Ale tak jak widzieliśmy w tygodniach przeszłości, nigdy nie dostaniesz nic za darmo,
jak na pewno nie jest to kompromis tutaj.
Więc z upside wiązany lista, jest to dynamika?
Ta zdolność do wzrostu i szczerze mówiąc, mogliśmy zrobić kasowania
i mogliśmy kurczyć w miarę potrzeb.
Jaką cenę płacimy?
Dwa razy tyle miejsca, przede wszystkim.
Jeśli spojrzeć na zdjęcie, nie jestem przechowywania listę liczb całkowitych.
Jestem przechowywania listę całkowite plus wskaźniki.
Jestem więc podwojenie ilości miejsca.
Teraz, być może, że nie jest to takie wielkiego, 4 bajty, 8 bajtów,
ale z pewnością mogą dodać się dla dużych zbiorów danych.
Co znajduje się w innym minusem?
Tak?
>> PUBLICZNOŚCI: Musimy przemierzać je jeden po drugim.
DAVID MALAN: Tak.
Musimy przechodzić je jeden po drugim.
Wiesz co, daliśmy się tym super wygodna funkcja nawiasach kwadratowych
zapis, bardziej poprawnie znany jako losowego dostępu
gdzie możemy po prostu skoczyć do pojedynczego elementu
ale teraz, gdy miałem jeszcze tutaj moje wolontariuszy,
gdybym chciał znaleźć Numer 22, nie mogę po prostu
Uchwyt coś przeskoczyć do czegoś.
Muszę patrzeć na liście, o wiele jak nasze przykłady przeszukiwania liniowo,
znaleźć numer 22.
Tak więc wydaje się, że zapłacił nie cenę.
Ale możemy jednak rozwiązać inne problemy.
>> W rzeczywistości, pozwól mi przedstawić tylko kilka wizualizacji.
Więc jeśli już się do Sala jadalna Mather w ostatnim czasie,
przypomnijmy sobie, że ich stosy tacek takich jak ta,
pożyczyliśmy je od Annenberg przed klasą.
Więc ten stos tac, choć, jest przedstawicielem rzeczywiście
struktury danych informatycznej.
Jest struktura danych w informatyce
znany jako stos, który bardzo ładnie nadaje się do dokładnie tego wideo.
Tak więc, jeśli każdy z tych zasobników nie jest tacy, ale jak liczba i chciałem
do przechowywania numerów, ja może umieścić jeden tu,
i mogłem umieścić tu innego, i kontynuować układanie liczb
na jeden na drugim, a co potencjalnie pomocne na ten temat
jest to, że to, co jest implikacja tej struktury danych?
Jaki numer można wyciągnąć Pierwszy najwygodniej?
Ostatnio jeden umieścić tam.
>> Więc to jest to, co nazywamy w informatyka struktura danych LIFO.
Trwać, pierwsze wyszło.
Zobaczymy niebawem, dlaczego które mogą być przydatne, ale teraz,
tylko za nieruchomość.
I to jest głupie, jeśli myślisz o tym, jak jadalnia robi.
Za każdym razem, gdy czyste tace i umieścić najświeższych tych na górze,
Można mieć wcześniej czyste ale w końcu bardzo brudne i zakurzone
podajnik na samym dole Jeśli nigdy w rzeczywistości
dostać się do dołu, że stos, bo ciebie tylko
utrzymać wprowadzenie nowych i czyste te na wierzchu.
To samo może się zdarzyć w supermarkecie też.
Jeśli masz gablotę mleka i za każdym razem CVS
czy kto dostaje więcej mleka, po prostu wpakować się mleczka
masz już do tyłu i umieścić te nowe góry,
będziesz mieć trochę dość nieprzyjemny mleko w końcu struktury danych
bo to zawsze na dnie lub równoważnie, że zawsze z tyłu.
>> Ale istnieje inny sposób myślenia o w kolejce danych i na przykład, to.
Jeśli jesteś jednym z tych ludzi, którzy lubi w kolejce na zewnątrz sklepach Apple
gdy nowy produkt jest się, jesteś prawdopodobnie
nie przy użyciu danych stosu Struktura bo Ciebie
nie zrażać każdy, kto jest w kolejce, aby kupić jakąś nową zabawkę.
Raczej, prawdopodobnie za pomocą jaki rodzaj struktury danych
lub jaki rodzaj systemu w świecie rzeczywistym?
Mam nadzieję, że jest to linia, lub więcej Brytyjski prawidłowo lub bardziej podobny, kolejka.
I okazuje się, kolejka jest również Struktura danych w informatyce,
ale kolejka jest bardzo inna nieruchomość.
To nie LIFO.
Trwać, pierwsze wyszło.
Broń Boże.
To zamiast FIFO.
Pierwsze weszło, pierwsze wyszło.
I to jest dobra rzecz dla sprawiedliwości "dobra
pewnością, gdy jesteś w kolejce się bardzo wcześnie rano.
Jeśli się tam pierwsze, chcesz wyjść pierwsza, jak również.
>> A więc wszystkie te dane struktury, kolejki i stosy
i kiście innych, okazuje ci można myśleć o tym, jak tylko tablicy.
To jest tablica, może stały rozmiar 4, ale to, że
być miłe, czy może po prostu pali tace niemal nieskończenie wysokie gdybyśmy
mają, że wiele tace lub cyfry.
Więc może chcemy użyć połączonej listy tutaj,
ale kompromis będzie potencjalnie, że potrzebujemy więcej pamięci,
zajmuje trochę więcej czasu, ale nie ograniczają wysokość stosu
podobnie jak gablocie Mather w może ograniczyć rozmiar stosu,
i tak są to decyzje projektowe lub Opcje dostępne dla nas ostatecznie.
Więc z tych danych struktury, zaczęliśmy
widząc nowe górne granice potencjalnie na to, co wcześniej było super szybki
i gdzie zostawimy od dzisiaj i gdzie
my nadzieję, że dostać się do jest w środę, będziemy
zacząć patrzeć na dane struktura, która pozwala nam szukać
za pośrednictwem danych w czasie końca dziennika ponownie.
I widzieliśmy, że pamiętam, w tym tygodniu zerowym i jeden z wyszukiwaniem binarnym lub podziału
i podbić.
To wraca, a jeszcze lepiej, Święty Graal w tym środę
będzie pochodzić z struktura danych, która działa dobrze
i teoretycznie Stała czasowa, w której
to nie ma znaczenia, ile miliony lub miliardy rzeczy
mamy w strukturze danych, to będzie zabrać nam stały czas, być może jeden krok
lub dwa kroki lub 10 kroków, ale stałe numery etapów
przeszukiwać tej struktury danych.
Że rzeczywiście będzie święty graal ale o tym w środę.
Do zobaczenia potem.
>> [MUZYKI]