>> [Odtwarzanie muzyki]
>> DAVID J. MALAN: Dobra to CS50 i jest to początek pięciu tygodni.
Tak więc dzisiaj, pod swoimi siedzisk, nie znajdziesz nic.
Ale wyżej, należy znaleźć te, mały znak naszej wdzięczności za
wszystkie prace, które można umieścić Zespół Piętnastki.
Wystarczy usunąć mały okrąg na bottom na grę na
Pozostała część klasy.
>> Więc przypomnieć, lub wiedzieć, że zestaw problemu cztery, który wyszedł w ten weekend,
polega na piśmie inną grę.
Ale tym razem polega na wykorzystaniu Rzeczywista graficzny interfejs użytkownika, nie
Interfejs jak tekstowo Gra Piętnastki było.
A gra, która jest przed wami, jeśli nie zostały jeszcze widziałem to następny,
wygląda trochę coś takiego.
Mam zamiar iść do mojego terminalu Okno tutaj w GDB.
I zamierzam iść do przodu i uruchamiania Rozwiązanie personel, który można uzyskać dostęp
po uruchomieniu aktualizacji 50, jak zwykle.
>> Ale mam zamiar umieścić go w trochę secret mode, trochę Easter egg,
tzw. tryb Bóg, przez oddanie Bogu w argv1.
I muszę przestrzegać własne kierunki, działa to w moim
Problem ustawić katalog.
Więc teraz można zobaczyć pełną wersję gry w Breakout.
W rzeczywistości jest to nie-hands mode.
Więc to jest naprawdę -
zachwycił, choć może być -
dość trywialny do wdrożenia trybu Boga w Breakout, w przeciwieństwie do gry Piętnastki,
co niektórzy z was mógłby zająć do edycji hakerów.
>> W Breakout wystarczy w Boga Tryb po prostu robić to, co,
intuicyjnie z wiosłem?
Po prostu zrób to równa co Pozycja pozioma jest w spotkaniu.
I tak długo, jak to zrobić w lockstep z piłkę w ruchu tej grze
Nigdy, nigdy, nigdy się nie trafić w piłkę i wygrasz za każdym razem.
>> Ale w tym tygodniu wydaniu hakerów jest czymś więcej niż tylko tryb Boga.
Istnieje szereg innych funkcji.
Wśród nich, lasery.
Tak, że jeśli naprawdę się niecierpliwić ty może rozpocząć zestrzelenie cegły
i kilka innych.
A dla tych z was, którzy chcieliby kalibracji standardu kontra hacker
edition, widzę, że w tym tygodniu-tych edition haker celowo jest
trochę bardziej wykonalne, powiedzmy, od Boga tryb był z gry Piętnastki.
>> Więc jeśli szukasz odcinku i szukasz jakiejś dodatkowej zabawy
funkcje oferuje nurkowania w przypadku zainteresowania.
Teraz bardziej praktycznie, pozwolę sobie powiedzieć, z jednej rzeczy, jak również.
GDB, które niektórzy z was mogą nie mieć jeszcze dotknęła osobiście, co jest w porządku.
Ale teraz to naprawdę czas, aby przyzwyczaić do tego i wygodne z tego narzędzia
ponieważ uczyni twoje życie o wiele łatwiej, naprawdę.
>> Per wykładu Roba na GDB para tygodni temu, pamiętam
że GDB to debugger.
Jest to narzędzie, które pozwala uruchomić swoje program, ale to prowadzi krok po kroku, zgodnie
po linii, tak aby można było grzebać, tak, że można zobaczyć, co dzieje się, tak
które można wydrukować wartości zmiennych.
W skrócie, to daje dużo więcej energii niż printDef robi.
>> Teraz prawda, interfejs jest dość tajemnicze.
Czarno-biały interfejs tekstowy w większości przypadków.
Polecenia są nieco trudne pamiętać w pierwszej kolejności.
Ale nawet jeśli to może cię pół godziny, godziny, aby umieścić ten z góry
inwestycja czasu w to, uwierz mi.
Oczywiście przez semestru końcu będzie to zaoszczędzić Ci rząd wielkości więcej
czasu niż to.
>> Więc na początku nurkowania tygodnie w.
I pod względem Breakout, wiem, że jesteś Można to zrobić tak długo, jak masz
Kod dystrybucja lub własny kod w toku w Twoim Pst4 katalogu.
Wiesz, że można uruchomić gdb. / Breakout.
>> To będzie otwarcie okno jak poniżej.
Pozwól mi dać sobie więcej z oknie terminala.
A potem to, co mam zamiar iść do przodu i nie, nie jest to po prostu go uruchomić.
Mam zamiar najpierw ustawić punkt załamania Przypomnijmy, który pozwala zatrzymać
wykonanie w określonym miejscu.
>> Wystarczy zachować rzeczy proste, mam zamiar złamać w pierwszej linii po prostu przez wpisanie
numer jeden.
Pozwól, że w rzeczywistości ponownie otworzyć okno bo robi się
trochę małe tam.
Więc co mam teraz zrobić tutaj jest jeśli otworzyć moje okno terminala.
Chodź, nie idziemy.
>> Więc teraz, jeśli wrócę do Dropbox, Pst4 i uruchomić gdb. / breakout wprowadzić, zawiadomienia
Mam zamiar złamać jeden ustawić punkt przerwa w linii pierwszej.
A teraz mam zamiar iść przed i typ uruchomienia.
I kiedy ja, nic nie zauważył wydaje się zdarzyć.
>> Nie ma się pop.
Nie ma graficzny interfejs użytkownika jeszcze.
Ale to zrozumiałe, bo jestem dosłownie na linii jeden w moim programie.
I zauważył, że mam szybko przekazywane, szczególnie teraz w 62, ponieważ wszystkie
stuff na górze tego pliku jest rzeczy takie jak komentarze i stałych i
nieciekawe rzeczy na teraz.
>> Więc teraz jestem w środku głównej, Wydaje się, że na linii 62.
I to jest właśnie dystrybucja Kod, recall.
Jeśli otworzyć to przez dzieje, podobnie, do mojego katalogu skrzynki spadek do Pst4,
do breakout.c.
A jeśli przewijać w dół iw dół iw dół, i pozwól mi iść dalej i włączyć
moje numery linii.
>> Co zobaczę, jeśli przejść do linia 62, jest dokładnie linia
my przerwał na.
Tak więc ta linia tutaj, 62, jest gdzie mamy zamiar być.
Więc teraz w GDB, jeśli pójdę dalej i wpisz teraz następne wpisz to będzie
wykonanie tej linii.
I voila, mamy tak zwane okno g.
Jeżeli znają co GWindow jest, nie martw się.
Spec będzie wprowadzenie do niej, jak oraz wielu filmów przeglądowych
osadzone w spec.
>> Ale teraz zróbmy to trochę bardziej interesująca.
Pozwól przenieść okno na z boku trochę.
Pozwól mi przez okno trochę większe, więc można zobaczyć więcej.
>> A teraz pozwól mi iść do przodu i zrobić ponownie.
I tam są moje cegły.
Gdybym ponownie wpisz obok teraz widzę piłkę.
A jeśli napiszę następny raz teraz widzę wiosło.
>> I na szczęście nie jest to gedit naprawdę współpracuje pokazując mnie
wszystko, co chcę.
Ale teraz, jeśli zrobić jeszcze raz, następny ponownie, jestem po prostu
uznające niektóre zmienne.
I mogę wydrukować dowolny z tych facetów.
Cegły Drukuj, druki życiu.
>> A teraz, jeśli nadal robić Następnie zauważył, że będę
wewnątrz tej pętli.
Ale kod ma wykonać dokładnie tak, jak oczekuję.
Kiedy więc hit tej funkcji Wait dla Click, to będzie zrobić
dosłownie, że.
Tak więc wydawało się, że stracił kontrolę całego programu.
>> GDB nie daje mi innego polecenia.
Ale nie martw się.
Idź do mojej gry, kliknij gdzieś.
>> I voila, teraz przechodzi do linii 86.
Więc jeszcze raz, to jest bezcenne, ostatecznie, problemów diagnostyki.
Ponieważ można dosłownie krok po kroku Twój kod, wszystko wydrukować i wiele,
dużo, więcej.
Ale teraz te same narzędzia powinno cię dość daleko.
>> Więc jesteśmy, oczywiście, spojrzenia na Graphics teraz, nagle.
A teraz nasz świat staje się trochę bardziej interesujące.
I wiesz, być może, z niektórych filmy online, że mamy te
szorty, że już oglądać jako część zestawów problemów.
>> A oni już strzał, celowo, na białym tle.
A niektóre z nich mają nauczanie Fellows rysunek tekst na
Ekran, który jest nałożony na stronie nich.
Ale, oczywiście, nie jest to, że wszystkie ciekawe w świecie rzeczywistym.
To tylko z sali wykładowej duży biały ekran i tło.
A nasz zespół produkcyjny niesamowity sort z sprawia, że ​​wszystko wygląda pięknie
po tym, przez przycinanie się lub nakładanie czegokolwiek
robimy lub nie chcą.
>> Teraz tylko motywować w tym tygodniu i Naprawdę, gdzie można iść, ostatecznie,
z informatyki.
Nie tylko po problemu ustawić cztery.
Ale po innym kursie lub całego Program to niesamowite, co można
robić te dni w kategoriach Grafika w szczególności.
>> Niektórzy z was mogą nie widziałem tego opływając w Internecie.
Ale pomyślałem, że pokażę, na tak Kilka minut, spojrzenie na to, co
technologia komputerowa i co CGI, grafika komputerowa może zrobić te dni
z znają piosenki a może film.
>> MUSIC [- LANA DEL RAY, "Młoda i piękna]
>> SPEAKER 1: To jest tylko trochę niesamowite, być może, po prostu, jak
wszechobecna -
>> [APPLAUSE]
>> SPEAKER 1: Właśnie ściągnąłem.
Ale to jest naprawdę niesamowite, myślę, że po prostu jak wszechobecna i oprogramowania oraz kod
narzędzia, takie jak to naprawdę jest.
Więc to jest smak kierunku , w którym można przejść.
Oh, nie więcej Appliance dziś.
Cóż, to rzeczywiście tragiczny czas biorąc pod uwagę punkt prostu próbowałem zrobić.
>> W porządku, więc niech to uruchomić Fusion ponownie.
Przypomnij mi później.
Dobra, i powinien masz napisz jak na bok, jeśli nie dostać
zawiadomienia takiego.
W porządku, więc przypomnieć, że w zeszłym tygodniu zaczęliśmy odwinąć ten
później znany jako ciąg.
>> ciąg przypomina typ danych, który jest zadeklarowanych w CS50 biblioteki.
I to jest część kółka że zacznie się do startu.
To był pożyteczny pomysł na początku.
Ale teraz to się dzieje, aby uzyskać więcej ciekawe i bardziej wydajne, aby
faktycznie zobaczyć, że pod maską, ciąg jest tylko to, co, nie mówiliśmy?
>> Tak, więc jest to tzw char *.
I * nie oznacza, że ​​nie jakiś adres zaangażowany.
I tak, kiedy mówisz char * po prostu na myśli Zmienna, której typ danych jest
Wskaźnik teraz.
Fakt, że jest tam gwiazda oznacza po prostu, że jesteś deklarując
tzw. wskaźnik.
I że wskaźnik ma podobno zapisać adres, z
Oczywiście, char.
>> Teraz, dlaczego to ma sens?
Cóż, to, co jest ciąg pod maską?
No cóż, na jakiś czas, który został nam mówią że napis pod maską jest
tylko h-E-L-P-O, na przykład.
>> Ale rozmawialiśmy o tym, jak jest w istocie, array.
A tablica wtedy wyglądać trochę więcej w ten sposób, każdy z tych
podejmowania kęs.
I wtedy mówiliśmy, że jest tu coś wyjątkowego,
backslash 0 lub null terminator.
>> Więc cały ten czas, to tutaj jest ciąg.
Ale tak naprawdę, ciąg jest faktycznie adres.
I adresy, jak zobaczymy, jest często z prefiksem 0x umownie.
Co 0x oznacza?
Czy ktoś wie?
>> Więc to po prostu oznacza, szesnastkowym.
Więc można przypomnieć, faktycznie, z PST 1, moim zdaniem, jedna z rozgrzewki
faktycznie poprosił o pytania szesnastkowym oprócz
binarne i dziesiętne.
I tu jest to, że motywacja w systemie szesnastkowym masz 16
cyfry do Państwa dyspozycji.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a następnie przez A, B, C, D, E, F.
>> A jeśli liczyć wszystkie te górę, masz w sumie 16.
Jest to więc w przeciwieństwie dziesiętny, gdzie mamy 10
cyfr 0 do dziewięciu.
Jest to w przeciwieństwie do dwójkowy gdzie mamy tylko 0 i 1.
>> Ale na koniec dnia, w którym można po prostu reprezentują te same numery, ale
nieco inaczej.
I szesnastkowy jest powszechny, ponieważ jako Okazuje się - i zobaczymy, to
później w trakcie - nawet wtedy, gdy mamy do programowania WWW w kontekście
HTML i kody kolorów, szesnastkowy jest ładne.
Ponieważ każda cyfra, okazuje się, reprezentuje cztery bity idealnie.
Więc to po prostu rodzaj linii ładnie jak będzie w końcu zobaczyć.
Więc może to być Ox123 lub coś tak, oznaczający 123 adres
gdzieś wewnątrz mego pamięci komputera.
>> Oczywiście, niektóre problemy pojawiają z tego powodu bazowego
realizacja.
I przypominają, że wziąłem ukłucie w realizacji funkcji takich jak ta -
porównanie rozdzielczą 0 dot c w zeszłym tygodniu, że mimo, że wyglądał jak to było
Dobrze, że po prostu nie porównać dwa ciągi poprawnie.
>> Mam wyrzucić główny, a ja rzucona dala komentarze po prostu skupić się na
Kod, który jest przedmiotem zainteresowania tutaj.
I to jest na czerwono, bo to buggy.
Z jakiego powodu?
>> Cóż, na górze tam, kiedy oświadczył, łańcuch, co się naprawdę dzieje
pod maską?
Cóż, pozwól mi przejść do ekranizować tutaj i wyciągnąć to.
So I oświadczył, znowu, String s GetString.
>> Więc mam zamiar iść do przodu i teraz narysować s, co to naprawdę jest.
To będzie plac tutaj.
I zamierzam zastrzeżenia że to jest 32 bitów.
Przynajmniej to zwykle bywa, przynajmniej na CS50
Urządzenie w wielu komputerach.
Mam zamiar nazwać ów.
>> Ale teraz przypomnieć, że nazywa GetString.
Więc GetString powraca, Oczywiście ciąg.
Jeśli użytkownik wpisze w H-e-l-l-o wprowadzić Ciąg cześć zostanie zwrócone.
I to ciąg, jak właśnie powiedział, kończy się gdzieś w pamięci komputera
z 0 odwrotny ukośnik na końcu.
Będę rysować to jak tablicy - lub ciągłego bloku znaków -
, że jest w rzeczywistości.
>> A teraz, co jest GetString faktycznie powrocie?
Co GetString powróciła cały ten czas?
No, powiedzmy, na tydzień przed, zwraca ciąg.
Ale bardziej technicznie, co robi GetString powrót podobno?
>> PUBLICZNOŚCI: adres.
>> SPEAKER 1: adres.
W szczególności zwraca adres Pierwszy kęs, cokolwiek to jest.
I po prostu zachować przy użyciu jednego, dwa, trzy , ponieważ jest to wygodne.
>> Zwraca adres pierwszy znak w ciągu.
A my powiedział w zeszłym tygodniu, że które jest wystarczające.
Ponieważ zawsze możemy dowiedzieć się, gdzie Koniec łańcucha prostu
iteracji nad nim, być może, z za pętli lub pętla czy coś
że, po prostu patrząc na "backslash 0", Szczególny charakter sentinel.
>> I wtedy wiemy, że ciąg dzieje się z długości -
w tym przypadku -
pięć.
Więc technicznie, co GetString robi to zwraca Ox123 w tym przypadku.
I technicznie, co wtedy się dzieje, , które przechowujemy, wewnątrz s, Ox123.
Na koniec dnia, chociaż jest nowa koncepcja, wskaźniki, są
tylko zmienne.
Ale oni się do przechowywania bitów, które łącznie stanowią adres.
Więc technicznie wszystko co dostaje przechowywane w s jest Ox123.
>> Ale my jako ludzie -
w tym naprzód dziś -
są naprawdę nie będzie obchodziło, zazwyczaj, co rzeczywiste adres
jakiegoś fragmentu pamięci.
To jest tylko do niskiego poziomu szczegółowości być intelektualnie interesujące.
Więc idę do tego cofnąć.
I zamiast, bardziej wysoki poziom, po prostu powiedzieć , że kiedy mówimy o wskaźniki
Zamierzam po prostu wyciągnąć więcej przyjazny dla użytkownika, który przenosi strzałka
sama idea i abstrakty oddalony szczegółowe dane o tym, co rzeczywiste
bazowy adres.
>> Teraz, gdy wracamy do kodu, co stało się w zeszłym tygodniu, jeśli mamy ciąg t
równa GetString?
Cóż, gdybym ponownie wpisz komentarzy tym razem mam zamiar dostać
kolejny kawałek pamięci.
g-e-l-l-O 0 odwróconej.
>> Ale dlatego, że nazywa GetString drugi raz -
i wiem, że to od patrzenia na Kod źródłowy GetString - nawet
choć jest to przypadek, że cześć była wpisane dwa razy, GetString nie jest
zamiar spróbować zoptymalizować i być sprytny.
To po prostu się dostać inny kawałek pamięci z komputera, który jest
będzie na inny adres.
Załóżmy arbitralnie tylko powiedzieć 456.
>> I co to będzie powrót?
To będzie powrót 456 i przechowywać go w t..
Więc to, co naprawdę się dzieje, na lewa strona to mam inny kawałek
pamięci, 32 bity zazwyczaj.
I nie będzie go Ox456.
Ale znowu, nie jestem zainteresowany tymi poszczególne numery już.
Idę do abstrakcyjnie wyciągnąć go jak strzała.
>> Więc to jest teraz nowa wyjaśnienie.
Ale to jest dokładnie taki sam pomysł, że to dzieje się cały ten czas.
A więc powód to, że ten pierwszy porównywana była wersja buggy
w zeszłym tygodniu to dlaczego?
Gdy to zrobisz, jeśli s jest równa jest równa t, co są naprawdę
Pod maską porównanie?
>> Jesteś porównywanie adresów.
I tylko intuicyjnie, wyraźnie, Ox123 nie zamierza równego Ox456.
Te liczby, te bity są po prostu inne.
>> I tak konsekwentnie, w zeszłym tygodniu powiedział wpisać różne rzeczy, nawet jeśli
Słowa były dosłownie same.
Więc możemy to naprawić.
W laika, co było fix?
>> PUBLICZNOŚCI: Użyj funkcji.
>> SPEAKER 1: Użyj funkcji.
A gwiazdy są zdecydowanie zaangażowane, ale użyć funkcji do czego?
>> PUBLICZNOŚCI: Aby porównać ciągi.
>> SPEAKER 1: Aby porównać ciągi.
Tak więc podstawowym problemem było że właśnie rozważa
Jakość strun, które zostaną określone przez Porównanie ich adresy.
I oczywiście, że jest po prostu głupi, teraz po raz rozumiesz, co się dzieje
pod maską.
Aby w pełni porównać ciągi czy są równe w sposób ludzki
by rozważyć dwa ciągi równa musimy je porównać charakter dla
znaków dla znaku.
>> Teraz mogłem zrobić to bardzo mozolnie.
Ale swojsko, jesteśmy za pomocą pętli for.
A wystarczy porównać wspornik s i przed wspornik T i.
s uchwyt i Plus 1 przeciw t wspornika I oraz 1, i tak dalej, w środku
pewnego rodzaju pętli.
A jeśli zauważysz, że żadne dwa znaki różnią, czy zdaję sobie sprawę, że och, s jest
krótszy niż t lub dłuższy niż t. Mogę od razu powiedzieć, fałszywe,
że nie są same.
>> Ale jeśli dostanę przez s i t i powiedzieć sam, sam, sam, sam, sam, koniec
oba ciągi, mogę powiedzieć, prawda, są one równe.
Cóż, na szczęście, rok temu ktoś napisał, że kod dla nas.
>> I nazwali go StrComp na ciąg porównania.
I choć jest to trochę sprzeczne intuicyjna, StrComp zwraca 0, jeśli te
dwa łańcuchy, S i T są takie same.
Ale zwraca wartość ujemną, jeśli s powinno się przed t alfabetycznie lub
Wartość dodatnia czy powinien przyjść po t alfabetycznie.
>> Więc jeśli kiedykolwiek chcemy ułożyć coś, Okazuje się, że StrComp jest przydatna.
Bo to nie tylko powiedzieć, tak lub nie, jest równa lub nie.
To daje poczucie zamawiania niczym potęgę słownika.
Więc StrComp, s t równa przecinkami równa 0 oznacza, że
Struny są naprawdę równe.
Bo ten, kto napisał tę funkcję lat temu prawdopodobnie wykorzystywane do pętli
lub pętla czy coś takiego zintegrować ciągu znaków ponownie
i znowu i znowu.
>> Ale dwa problem powstał tutaj.
To był copy0.c.
I dwa w kolorze czerwonym jest bo jest błędna.
I co tu robimy?
Cóż, najpierw zadzwoniłem GetString.
I przechowywać wartości zwracanej w s.
Więc to jest niemal tak samo, jak ta górna część obrazu.
>> Ale to, co jest potem?
Cóż, pozwól mi iść dalej i pozbyć z całą masę tego.
Będziemy cofnąć się w czasie do miejsca, gdzie po prostu mają S, który jest teraz zgodne z
linia jeden tam.
>> I sprawdzić.
Jeśli s jest równa jest równa 0.
Teraz szybkie dygresja, gdy może GetString powrócić 0?
Za mało pamięci, jest.
Prawda?
>> To rzadkie, że to się stanie, na pewno na komputerze, który jest
dostaje setki megabajtów lub nawet koncerty pamięci RAM.
Ale może to, w teorii, powrót 0, zwłaszcza jeśli
użytkownik nie współpracuje.
Nie ma sposobów, aby udawać, że nie ma wprowadzonym wszystko i Sztuką
GetString do powrotu 0 skutecznie.
>> Tak to się dzieje, aby sprawdzić, że.
Bo jeśli ktoś z was zaczęli dostać, już, błędy segmentacji -
który prawdopodobnie był źródłem jakiejś frustracji -
te są prawie zawsze wynik z błędów związanych z pamięcią.
Jakoś zawiedli w odniesieniu do wskaźnik, nawet jeśli nie zdawali sobie sprawy,
był wskaźnik.
Więc może skłoniły segmentacji błędy jak na początku jako jeden tydzień przy użyciu
coś dla pętli lub podczas pętla i tablicą przez zbyt daleko idące
przeszłości granice jakiejś tablicy, która Ci oświadczył w drugim tygodniu w
szczególności.
>> Możecie to zrobić nawet w problemie zestaw czterech z Breakout.
Chociaż prawdopodobnie nie widziałeś jakieś gwiazdy w kodzie dystrybucji dla
Breakout, okazuje się, że te GRect i GOval i inne takie rzeczy,
Wskaźniki te są w rzeczywistości pod maską.
>> Ale Stanford, podobnie jak my, rodzaju skóry które szczegółowo przynajmniej dla bibliotek
celów, podobnie jak my dla łańcucha i char *.
Ale GRect i GOval i wszystkich tych, rzeczy, chłopaki są lub będą używać
w tym tygodniu są ostatecznie adresy pamięci.
Po prostu nie wiem.
>> Więc to nie jest zaskakujące to, być może, że może potknąć się niektóre
wady segmentacji.
Ale co ciekawe, tutaj, teraz, jeśli po tym sprawdzić 0 robimy
ciąg t dostaje s.
Cóż, pozwól mi oświadczyć, t.
Mam zamiar wyciągnąć go jako kwadrat, 32 bitów, nazywamy to t.
A potem mam zamiar zrobić, dostaje s..
>> No, co to oznacza?
Cóż, to trochę trudno myśleć o to wyobrazić mądry.
Ale pomyślmy o co jest w środku od x?
Co znajduje się dosłownie w środku tej zmiennej?
Ox123 wartość.
>> Więc kiedy mówię ciąg t dostaje S, które po prostu oznacza dosłownie wziąć numer
w S, który jest Ox123 i umieścić go Ox123.
Albo obrazowo, jeśli rodzaj abstract od tego szczegółowo ma
Efekt dosłownie robi To, a także.
>> Więc teraz, że powrót do ostatniego tygodnia, kiedy przystąpiliśmy do kapitalistycznej T. I
A wspornik T 0.
Cóż, wspornik T 0, mimo że jest wskaźnik, można traktować go tak, jakby
to tablica, z placu Zapis wspornik.
>> Więc gdzie jest T Wspornik 0?
Cóż, h.
I tak, gdy używamy tego wiersza kodu, dwa górne, które jest w tym c type.h
plik nagłówka, to gdzie jest zadeklarowana.
Jesteś kapitalizacji to H. Ale Oczywiście, że jest dokładnie taki sam h to
wewnątrz s, że tak powiem.
I tak teraz zmieniłeś lub kapitalizowane zarówno oryginalne i
tzw. kopia.
Ponieważ nie tworzenia kopii sposób, że człowiek będzie chciał go mieć.
>> Więc co było fix tutaj, w copy1.c ostatnim tygodniu?
Funkcje, więc może rzeczywiście skopiować ciąg.
I zasadniczo, co trzeba zrobić, aby skopiować ciąg?
>> Cóż, w tej zielonej wersji tutaj jestem zamiar zrobić to dość niski poziom.
Tak naprawdę są funkcje mogą w tym pomóc.
Jednak najbardziej podstawową, a najbardziej znajomy, przynajmniej, będzie wkrótce
nam znane, jest następujące -
Tak więc jednym z pierwszego wiersza kodu na zielono teraz.
>> I właśnie przepisał s jako char *.
Nie ma funkcjonalne różnica istnieje.
I po prostu wyrzucił CS50 biblioteki i Wzywam go, co to jest, char *.
>> Teraz kropka, kropka, kropka, ponieważ nie było sprawdzanie błędów, które nie jest
ciekawe porozmawiać o ponownie.
Więc teraz t jest zadeklarowany.
To też jest char *.
Więc zwrócił mały kwadrat ekran jak wcześniej.
>> Ale z prawej strony, malloc, powiedzieliśmy, jest pamięć przeznaczyć.
Tak więc przeznaczyć pewną ilość pamięci.
A ile bajtów faktycznie zrobić chcą przeznaczyć, to wydaje?
>> Cóż, długość ciąg s.
Więc jeśli jest to cześć to będzie pięć.
Powiemy, h-e-l-l-o.
Więc pięć bajtów.
>> Ale potem Plus 1, dlaczego 1?
0 postaci.
Jeśli nie zostawić miejsce na tego faceta, że może stworzyć sytuację, przypadkowo
gdzie ciąg jest h-e-l-l-o.
A potem następne GetString czas jest nazwie i wpisać, na przykład,
David, D-a-v-i-d, komputer będzie myśleć, że s jest rzeczywiście
g-e-l-l-O-D-A-V-I-D, ponieważ jest bez przerwy w między tymi słowami.
>> Więc musimy, że przerwę.
Więc nie chcemy pięć.
Chcemy sześć bajtów.
>> I bajtów mówię.
Ale to naprawdę czas, rozmiar char.
Technicznie char jest prawie zawsze jeden bajt.
>> Ale tak, aby nasz kod przenośny, że tak powiem, tak, że działa on
różnych komputerach, nawet jeśli może nieco różnić się pod
kaptur, idę do ogólnie powiedzieć rozmiar char aby
mój kod zawsze działa.
I nie trzeba go po prostu przebudować bo uaktualnić komputer lub użyć
kilka różnych platform.
>> Więc mam 6 razy większa od char, co dzieje się w 1.
Tak, że środki mogłyby malloc daj mi sześć bajtów.
Co to jest, że faktycznie robi?
Cóż, pozwól mi cofnąć się w czasie o , gdzie jesteśmy w tej historii.
>> Więc jeśli tu wracam, mam zadeklarowane char * nazywa t.
Mam teraz nazywa malloc do sześciu bajtów.
A teraz mam zamiar wyciągnąć tych sześciu bajtów, podobnie jak tablica wcześniej.
Ale ja naprawdę nie wiem, co jest wewnątrz tej tablicy.
>> Jeśli przydzielić pamięci okazuje się, że nie można ufać, że istnieje jakiś
znana wartość istnieje.
Może to być wykorzystane przez coś inny, inna funkcja, inna
linii kodu, który napisałeś.
Będziemy więc ogólnie nazywają te śmieci wartości i narysować je, być może, jak
znaki zapytania, po prostu wskazując, że nie wiem, co tak naprawdę tam.
I to nie jest wielka sprawa, tak długo, jak długo są na tyle sprytny, aby zastąpić tych,
wartości śmieci z numerami lub znaki, że zależy.
>> Więc w tym przypadku co ja mam zrobić?
Cóż, mój wiersz kodu następny, mam cztery.
int i dostać 0, n pobiera Długość ciąg s.
Więc zna na pętli.
I jest mniejsza lub równa N, co zwykle jest powyżej.
>> Ale tym razem jest to celowe.
I + +, a potem po prostu zrobić t uchwyt i dostaje s.
Ponieważ mój obraz wygląda to na ten moment, przechowywane w t jest
adres tej pamięci kawałka losowej których wartości są nieznane.
Ale tak szybko, jak to zrobić t wspornik 0, że stawia mnie tutaj.
>> A co kończy się coraz wyciągnąć tam?
Kończymy wprowadzanie godziny.
Bo to, co jest na s uchwytem 0.
A potem to samo dla e, i ja, i ja, i wy.
>> n, dlaczego idę w górę przez równa n?
Ze względu na charakter 0.
Tak właśnie stało się jasne, a następnie, jeśli rzeczywiście usunięcie wszystkich tych śmieci
wartości, a następnie rzeczywiście przyciągnąć czego oczekuję, to s uchwyt 1, 2,
3, 4, a także, że to końcowe nowy charakter.
>> A więc teraz, jeśli nadal obok kropki, kropka, kropka w poprawnej wersji
i kapitalizowane wspornik t 0 będzie, z Oczywiście, jest czerpanie tylko ten
facet tutaj, które koncepcyjnie, był ostatecznie celem.
Więc to wszystko wskaźnik jest.
>> I już przy ich tydzień teraz w ramach ciągów.
Ale pod maską są nieco bardziej skomplikowane.
Ale jeśli myślisz o nich w tym obrazowym forma proponuję, że są
Prawdopodobnie nie wszyscy tak straszne jak oni może najpierw wydawać na pierwszy rzut oka,
zwłaszcza w takiej nowej składni.
Wszelkie pytania na temat wskaźników, łańcuchy lub znakowe?
Tak?
>> Odbiorcy: Czy można cofnąć do [niesłyszalne]?
>> SPEAKER 1: Jasne.
>> PUBLICZNOŚCI: Więc jak to się stało w zeszłym twój bardzo linii, nie ma wiersza * t
i * s w wierszu?
Nie masz odniesienie do -
>> SPEAKER 1: Ach, bardzo dobre pytanie.
Dlaczego nie mam T * i * s?
Ze względu na krótko, w zeszłym tygodniu, podobnie jak w naszym zamienić funkcję I powiedziałem, że kiedy
masz wskaźnik rozumie przez które się tam jak my
fizycznie na scenie, było w rzeczywistości użyć operatora gwiazdy.
>> Okazuje się, że ten nawias kwadratowy Zapis jest to, co my nazywamy składniowe
cukier, który jest po prostu sexy sposób mówiąc, że to skrót dla notacji
dokładnie to, co opisujesz.
Ale to jest trochę bardziej intuicyjne.
I na ryzyko podejmowania tego wydaje się bardziej skomplikowane niż musi być
to, co tak naprawdę dzieje się tutaj jest następujący -
Jeśli powiem, t * to znaczy pójść do adres przechowywane w t..
>> Tak dosłownie, jeśli t jest przechowywanie adres tej godz
początkowo, * oznacza t tutaj.
Teraz, to co t Wspornik 0 oznacza?
Samo dokładne.
To tylko trochę więcej użytkownik przyjazny pisać.
>> Ale ja nie skończyłem.
I nie można po prostu powiedzieć, * t dostaje * S.
Bo co będę robić potem?
I byłoby wprowadzenie h, h, h, h, h w całej rzeczy.
Prawda?
>> Ponieważ * t jest go na adres w t..
Ale my jesteśmy wewnątrz pętli.
I co ja mam zwiększanie wartości, Oczywiście, w każdej iteracji?
i.
>> Ale jest szansa tutaj, prawda?
Pomimo tego, że czuje się jak to się trochę bardziej wyrafinowane
niż notacji kwadratowej wspornika używaliśmy przez jakiś czas -
pozwól mi cofnąć moją zmianę h tam -
choć jest to teraz się trochę hodowcy, idea, jeśli * t
oznacza tu i * t jest tylko go na adres w t..
>> Ale to, co adres w t?
Liczba trzymamy za pomocą?
Jak Ox456, niech wprowadzą, że powrót po prostu ze względu na dyskusji.
Cóż, jeśli chcę uzyskać w e w t ciąg, po prostu chcę, aby przejść do,
zasadniczo, 456.
>> Albo raczej, 457.
Muszę tylko dodać.
Ale można to zrobić, prawda?
Ponieważ t, chociaż zachować rysunek teraz jak strzała, to tylko
liczba, Ox456.
A jeśli do tego dodać jeden lub więcej generalnie, jeśli dodać I do tego mogę
rzeczywiście się dokładnie tam, gdzie chcę.
Więc jeśli rzeczywiście to zrobić -
i to jest to, co teraz nazywa arytmetyczna pointer -
Można usunąć tę linię.
Która jest, szczerze mówiąc, myślę, że jaśniejsze i trochę bardziej przyjazny dla użytkownika, aby przeczytać.
Nie jest to jednak mniej poprawne.
>> Ten wiersz kodu teraz używa arytmetyczna wskaźnika.
To mówiąc, przejdź do adres po -
niezależnie od początku T jest, która jest t oraz i, które początkowo
jest 0, co jest wspaniałe.
Ponieważ oznacza to początek T oraz 1, oraz 2, 3 oraz, i tak dalej.
A same zajmują się s.
>> Tak syntaktyczne cukru do tego.
Ale zrozumienie tego, co się naprawdę dzieje pod maską, jestem zdania,
jest rzeczywiście przydatne w sobie.
Bo to oznacza, teraz nie ma tam znacznie więcej magii dzieje
pod maską.
Nie będą wiele więcej warstwy, które możemy odwinąć dla Ciebie.
To jest c.
I to jest programowanie.
Bardzo dobre pytanie.
>> W porządku, więc to było to, że buggy Program miałem na myśli wcześniej.
Swap był wadliwy.
Jeśli nie wydaje się do pracy.
Przypomnijmy, że tak jak w przypadku mleka i sok pomarańczowy - który zacząłem
picia dzisiejszą demonstrację.
Tak jak z soku pomarańczowego i mleko, my musieliśmy korzystać
zmienna tymczasowa, tmp, do przechowywania chwilowo tak, że mogliśmy wtedy
zmienić jego wartość, a następnie zaktualizować b.
>> Ale ta funkcja, powiedzieliśmy, czy to Program, w którym funkcja ta była
napisane było złe i błędne, dlaczego?
Tak?
>> PUBLICZNOŚCI: [niesłyszalne].
>> SPEAKER 1: Dokładnie, kiedy nazywasz swap -
lub, bardziej ogólnie, gdy zadzwoń najwięcej żadnej funkcji -
jeśli argumenty do tej funkcji są prymitywne, że tak powiem, ints i znakowe
i dwuosobowe i pływaków, rzeczy, bez gwiazdy, jesteś przejazdem w kopii
argument.
Tak więc, jeśli był 1 x i y wynosi 2, będzie się 1 i B będzie 2.
Ale oni będą mieć różne kawałki bitów, kawałki różnych od
pamięci, które stało się przechowywanie identyczne wartości.
>> Więc ten kod jest super perfect na zamianę a i b.
To nie jest dobry na zamianę -
w zeszłym tygodniu przykład -
x i y.
Bo znowu, są w niewłaściwym zakresie.
>> Teraz, jak myśmy go o ustaleniu tego?
Musieliśmy funkcję wygląda trochę brzydsze.
Ale znowu, za co oznacza to po prostu.
>> I rzeczywiście, niech mnie, dla zachowania spójności, zmienić jedną rzecz, więc jest to identyczne
co właśnie zrobiliśmy.
Jak już wspomniałem w zeszłym tygodniu, to nie znaczenia, gdzie to idzie.
W rzeczywistości, zwykle będzie można umieścić gwiazdka obok nazwy zmiennej.
Ale myślę, że to będzie trochę łatwiej rozważyć * obok
Typ danych w ten sposób, że jest to wskaźnik do int w tym przypadku.
>> Więc co ja tu robię?
Mówię, że nie dają mi int następnie innym int,
nazywając je i b.
Daj mi adres wew.
Daj mi adres innego int.
Zadzwoń do tych adresów a i b.
>> A następnie za pomocą notacji * dół poniżej, przejdź do każdego z tych adresów
w razie potrzeby albo dostać lub ustawić jego wartość.
Ale jest tu wyjątkiem.
Dlaczego nie mam * obok tmp?
Dlaczego nie zrobić tego, na przykład?
Czuje się jak należy po prostu pójść na całość out i poprawić całość.
Tak?
>> PUBLICZNOŚCI: [niesłyszalne].
>> SPEAKER 1: I nie zadeklarowały tmp jako ciąg.
Więc to ogłosi, w tym przypadku, tmp być adres wew.
Ale to nie całkiem to, czego chcę, na kilka powodów.
>> PUBLICZNOŚCI: Nie chcesz, aby zamienić je.
>> SPEAKER 1: Dokładnie, ja nie chcę, aby zamienić Wszystko z tmp. tmp jest tylko
tydzień jeden rzeczy.
Wszystko czego chcę to zmienna do przechowywania numeru.
I nawet nie obchodzi adresów w tym momencie.
>> Muszę tylko 32 bitów lub więc przechowywać int.
I chcę, aby umieścić w tych 32 bitach , co nie jest, że tak powiem, ale
to, co jest, po prostu, aby być bardziej precyzyjnym.
Bo jeśli jest adres, * oznacza tam i uzyskać wartość 1.
Na przykład w ubiegłym tygodniu np. lub w przypadku b, uzyskać wartość 2.
>> Więc co tak naprawdę chodzi?
Pozwól mi narysować obrazek tutaj, które będą tylko odciąć część dzisiejszego.
Ale to nadal będzie pojawiać już od jakiegoś czasu.
>> To, jak twierdzą, jest to, co komputer-tych Pamięć wygląda po uruchomieniu
Program, każdy program.
Po uruchomieniu programu, na samym szczycie z pamięci komputera - tak myśleć
ten prostokąt, naprawdę, jak twój pamięci RAM lub pamięci, wszystkie 101
miliard bajtów, wszystko dwa miliardy bajtów, wszystkie dwóch gigabajtów nim,
bez względu na ilość masz to, niech wyciągnąć go jako prostokąt.
I twierdzą, że po uruchomieniu programu jak Microsoft Word czy Chrome
lub coś w tym stylu, bity, że Microsoft lub Google napisał -
w przypadku tych programów -
są ładowane do pamięci komputera w którym mogą być wykonane więcej
szybko i wprowadzanymi do procesora, który jest mózgiem komputera.
>> I TAM są przechowywane w bardzo początku programu, że tak powiem.
Innymi słowy, czy jest to fragment pamięci, po dwukrotnym kliknięciu na
Microsoft Word, bity pochodzą wyłączyć dysk twardy.
Są one ładowane do pamięci RAM.
I będziemy pchać je na samej górze tego prostokąta koncepcyjnie.
>> Cóż, reszta pamięci jest wykorzystywane do różnych rzeczy.
Na samej górze widać zainicjować danych i odinicjować danych.
Wiąże się to, na ogół, z Stałe i zmienne globalne
, które mają wartości.
Ale o tym innym razem.
>> Potem masz kupę, która wrócimy do.
Ale na dole jest część, która znajduje się szczególnie Germane teraz.
Jest to tak zwany stos.
Więc tak jak w niemal każdej sali D tu na campus, masz te zasobniki, które
tylko jedna na siebie na co można umieścić żywności i etażerka.
Stosu w systemie komputerowym jest bardzo podobny.
Poza natomiast tacy, jak używać w jadalnia, oczywiście, jest przeznaczona
do przewozu rzeczy, tace lub ramki -
jako nazwijmy je - w komputerze pamięci jest używana do przechowywania
zmienne i wartości.
>> Więc co tak naprawdę dzieje się pod maską?
Cóż, pozwól mi odwrócić do tego ekranu.
I skupmy się tylko na Dolna część na chwilę.
Jeśli jest to dolna część mojej pamięci komputera okazuje się, kiedy
wywołanie funkcji main - co się dzieje, szczerze mówiąc,
automatycznie dla mnie -
Mam kawałek pamięci na Dno mojej pamięci RAM, tak powiem.
I to jest główny jest zmienne lokalne iść.
To gdzie argc i argv może go, i wszelkie zmienne I
Oświadczam wewnątrz main.
Kończy się w dolnej części mojej pamięci RAM komputera.
>> Teraz załóżmy, że główne połączenia funkcji jak wymiany, jak to było w zeszłym tygodniu?
Cóż, w zasadzie umieścić nowy zasobnik, Nowa rama, na mój kawałek pamięci.
I mam zamiar opisać to jako należące do funkcji swap.
>> Teraz to, co jest w środku z wymiany?
Cóż, na podstawie zeszłotygodniowej programu i jeden po prostu zobaczył fragment,
wewnątrz swap w ramce lub na Swap tacy, to co zmienne?
Cóż, ib.
Ponieważ były to jej lokalne argumenty, oraz trzeci, TMP.
Tak naprawdę, to mogę narysować trochę bardziej czysto.
Pozwólcie mi iść do przodu i cofnąć etykietę.
I pozwól mi twierdzić, że wiesz, co?
>> prawdopodobnie będzie do końca się tutaj.
B ma zakończyć się tutaj.
I tmp skończy się tutaj.
Teraz zamawiający może być nieco inna.
Ale koncepcyjnie jest to pomysł.
>> I tak wspólnie, to co zadzwonimy Swap rama, lub
dining-hall tray.
A sama umowa z głównym.
Ale nie przerysować to.
Ale to gdzie argc i argv i wszelkie swoich zmiennych lokalnych, takich jak X i Y
mogą być również.
>> Więc teraz zastanowić się, co się naprawdę dzieje gdy dzwonisz swapa.
Po wywołaniu swapa, jak kod wykonujący ta, jesteś przekazując w
wersja buggy, i b jako kopie x i y.
Więc jeśli nie teraz zwrócić na to Na ekranie -
dostał się lepiej na to -
więc historia I mówił do siebie było w tym buggy wersji, kiedy
zadzwoń zamienić przechodząc dosłownie i B jako liczby całkowite, co się naprawdę dzieje?
>> Cóż, co się naprawdę dzieje, jest to.
Pozwólcie mi iść do przodu i cofnąć tylko wyczyścić trochę miejsca tutaj.
Więc to jest mój pamięci komputera.
>> Więc jeśli mam na przykład -
faktycznie zróbmy to w ten sposób -
jeśli twierdzą, że jest to x, przechowywania wartość 1, tak jak w zeszłym tygodniu.
I to jest y, przechowywania wartości 2, podobnie jak w zeszłym tygodniu.
I to jest główny, gdy zgłoszę swapa, tym samym dając sobie dostęp do i
b i tmp, zamierzam twierdzić, że To jest i to jest 1.
>> To jest b.
To jest 2.
To jest nazywane TMP.
>> I początkowo, to ma jakąś wartość śmieci aż rzeczywiście przechowywać w to,
co jest 1.
Potem idę dalej i zmienić za co?
B w cenie.
>> A więc teraz mam dwa tutaj.
A potem powiedział: b dostaje tmp.
Ponownie, tak jak zdrowy rozsądek sprawdzić, trzeci linii kodu tutaj jest po prostu to
jeden, b dostaje tmp.
>> I tak na koniec, co mam zrobić?
I iść dalej i zmienić b być cokolwiek Wartość TMP, który jest 1.
I nie dotykaj tmp ponownie.
>> Ale teraz jest problem, jak tylko swapu powróci, ponieważ nie jest oddaniem
kopii jakąś wartość, nie ma powrotu oświadczenie wyraźnie w nim.
Co się właściwie dzieje?
Cóż, w zasadzie wszystko to pamięć -
OK, najwyraźniej gumka lubi tylko jeden palec na raz -
po prostu znika.
>> Teraz w rzeczywistości to nie jest nigdzie.
Ale można myśleć teraz jako znaki zapytania.
Bo to już nie faktycznie stosowane.
I nic się nie dzieje z tymi wartościami.
>> Tak więc w przypadku zielonej wersji ten kod, co zamiast tego jest
przeszedł do wymiany?
Więc rozwiązuje.
Więc adres xi adres y.
Jeśli więc ponownie opowiedzieć tę historię po raz ostatni czas, i faktycznie wyciągnąć swapa znowu
ale ze wskaźnikami, co jest to jest b, a to tmp jest, to, co jest
faktycznie przechowywane w tym zielony wersja mojego kodu, gdzie jestem przechodzącej
w adresach?
>> To będzie wskaźnikiem do x.
Więc mogę narysować strzałkę.
Ale użyjmy samo arbitralne Przykładem, jak wcześniej.
Powiedzmy, że jest to coś jak Ox123.
I to ma być Ox127 ponieważ to cztery bajty z dala, bo to
int, więc Ox127.
>> I znowu, biorę kilka wolności z numerami.
Są one znacznie mniejsze niż oni faktycznie w innej kolejności.
Ale to, jak obraz jest teraz inna.
>> Ale kiedy używam ten zielony kod i mam int tmp uzyskać *.
* Środkiem do wykonaj następujące czynności, podejmują rozwiązanie to jest w i przejdź do niego
co jest 1.
I to jest to, co ja wtedy umieścić w tmp.
W tym samym czasie, w kolejnej linii kodu tutaj, * dostaje b, co to oznacza?
>> Cóż, *, więc go tutaj dostaje * b, co oznacza, że ​​tam.
A to oznacza, umieścić wartość tam.
Wreszcie ostatnia linia kodu po prostu powiedział, * b dostaje tmp.
>> Tak b mówi tam i zastąpić ją tmp, które, w tym przypadku, będzie
się, ponownie, 1.
I dlatego zielona wersja nasz kod działa, natomiast czerwony
wersja nigdy nie zrobił.
To wszystko to tylko sprowadza się do tego, jak Pamięć jest zarządzana i gdzie jest
rzeczywiście umieszczone w pamięci RAM komputera.
I teraz, że to jedna z tych rzeczy, że stos jest używany do.
>> Pytania dotyczące układu?
Na wskaźniki?
Lub wymiany?
>> W porządku, więc malloc, przypomnijmy, czy coś takiego.
To był bardzo prosty przykład.
I to było to, że Binky przedstawił nas, choć dość
szybko, na końcu klasy.
Cholera, to znowu my.
>> Więc przypominam, że jest to przykład, że Binky przedstawił nas, choć
dość szybko, na końcu klasy.
I tu używane malloc naprawdę po raz drugi.
, Ponieważ po raz pierwszy, że stosuje się go stworzenie wystarczającej ilości pamięci RAM, przydzielić wystarczającej ilości pamięci RAM
do przechowywania łańcucha.
>> Tym razem Binky przechowywane it simple.
Więc to, aby przechowywać tylko int, najwyraźniej.
I to jest całkowicie w porządku.
To trochę dziwne, szczerze mówiąc, do użyć malloc przydzielić jeden int.
Ale punktem claymation Nicka było naprawdę tylko opowiedzieć historię jakich
się dzieje lub nie dzieje, gdy można znęcać pamięć.
>> Tak więc, w tym przypadku, program zrobił kilka rzeczy.
W pierwszym przypadku tutaj, deklaruje wskaźnik o nazwie x do int.
Następnie deklaruje wskaźnik nazywa y do int.
Następnie przechowuje w X, to co?
Ktoś teraz.
Co zostanie zapisane w zależności od x Trzecia linia tego programu?
>> PUBLICZNOŚCI: [niesłyszalne].
>> SPEAKER 1: No, nie całkiem bajtów, na powiedzieć.
Dokładniej teraz.
Co zostanie zapisane w X?
Adres, myślę, że to usłyszał.
>> Więc co malloc powrócić?
malloc behawioralnie przydziela fragment pamięci.
Ale jak to daje dostęp do niego?
Zwraca co?
Adres pierwszego bajta w ilość pamięci.
>> Teraz, jest to bardzo proste.
To tylko jeden bajt, co oznacza, zajęcia wracamy jest
adres całość.
Tak przechowywane wx Następnie jest adres tego fragmentu pamięci.
Tymczasem to, co dzieje się dalej?
Więc rzeczywiście, idziemy do przodu i narysować to się naprawdę szybko.
>> Jeśli więc przejść do ekranu tu i gramy na to int * x i int * y
będzie robić to, co dla mnie?
I twierdzą, że to po prostu zrobić coś takiego i nazywają to x, a
to i nazywają to y.
Tymczasem trzeci wiersz kodu zamierza przeznaczyć rozmiaru int,
co zdarza się - przepraszam, jeśli powiedziałem jeden przed I oznaczało jedno int -
cztery bajty na typowym komputerze.
Przynajmniej z CS50 urządzenia.
>> Więc to zamierza przeznaczyć to, kto wie?
Gdzieś tutaj.
I jest przechowywany w niektórych Ox adres, kto wie?
Ale co się dzieje, aby wrócił jest to, że adres.
Ale będziemy rysować to obrazowo jak tylko strzałka tak.
>> Teraz w następnej linii * x ma 42.
Co * x oznacza w laika?
Właśnie tam.
Przejdź do tego adresu.
Innymi słowy, należy strzałka i umieścić 42 tam.
Ale potem stało się coś złego, do Binky, prawda?
>> Przypomnijmy, że linię pięć Tutaj * y dostaje 13, rzeczywiście pechowy numer,
co zrobił dla nas?
Cóż, * oznacza, y tam.
Cóż, to nie została podana wartość jeszcze, prawda?
Kod nie posiada y jest inicjowany do niczego.
Mieliśmy x inicjowany do adresu.
Ale r został ogłoszony na szczyt.
Ale wtedy średnik, brak wartości faktycznie umieścić w nim.
Więc śmiało nazwać wartość śmieci.
Kto wie, co tam jest?
To resztki bitów, które były używane przez jakiegoś poprzedniego wiersza kodu w
mój program.
>> Więc jeśli powiem, idź tam, to jest jak, Nie mam pojęcia, gdzie to jest strzałka
skończy.
I wtedy zazwyczaj uzyskać winy segmentacji.
Jeśli przez przypadek nieprawidłowego, tak aby mówić, lub przejść do adresu, który nie znajduje się
faktycznie uzasadnione adres, dzieją się złe rzeczy.
>> I to jest dokładnie to, co się stało myśleć Binky.
Tak więc przypomnieć, że historia, że ​​Nick był mówienie tutaj był sam pomysł jak to, co
Mam wyciągnąć z iluzji kredy na tablicy tam.
X i Y są zadeklarowane.
>> Następnie przydzielono wielkość int i przechowywać go w x.
Potem następna linia zrobiliśmy * x.
To była magiczna różdżka Nicka z dereferencji.
To umieścić 42 w pamięci wskazał x.
>> Ale to jest, gdy wszystko poszło fatalnie.
Prawda?
Staramy się, aby y nieprawidłowego.
Ale y miał jakieś fałszywe wartości, prawda?
>> Że strzałka w lewym dolnym róg, nie jest
faktycznie wskazuje na nic.
To niby robi to, co ja A tutaj na forum.
Tak złe rzeczy przytrafiają, segmentacja wina wina lub Binky, w tym przypadku.
>> Ale jeśli to naprawić wykonując x ma y Jak zmiana historia?
Cóż, jeśli mam zrobić X dostaje Y, który jest skutecznie same jak mówi
cokolwiek to jest, Ox-coś będzie tutaj sama,
Ox-coś.
Albo obrazowo będziemy narysować strzałkę.
>> Więc tutaj na pokładzie Binky, w następnym wierszu
kod * y oznacza tam.
Gdzie to jest?
Oznacza to tutaj.
>> A gdy aktualizujemy że być 13 to po prostu wymaga to przejścia i
pisząc 13 tutaj.
Więc być może nie w pełni proste na pierwszy rzut oka.
Ale aby podsumować i korzystać z tego samego żargonu że Binky używał tutaj, więc
Pierwsze dwa przydzielić wskaźników, x i y, ale nie pointees.
I pointees nie jest powszechnie używane określenie.
Ale wskaźnik absolutnie jest.
Ale to, co jest wskazać co w nomenklaturze binky za.
>> Ten następny wiersz, oczywiście, przydziela int pointee.
Więc fragment pamięci - jak zwrócił na na prawa strona istnieje - a set
x równa się wskazywać na to.
Ten x dereferences do przechowywania 42 w pamięci, że to wskazuje na.
, A następnie to, oczywiście, było złe.
Bo y nie wskazując na nic jeszcze.
To rozwiązuje go.
Więc to jest nadal buggy programu.
Tylko dlatego, że jesteśmy dmuchanie przez linia po linii i kod mówią, no cóż,
pozwól mu upaść tam.
To jest złe.
Kursy są program jest po prostu będzie przerwać w ogóle na tej linii.
Ale jeśli były do ​​usunięcia awarii linii i zastąpienie go dwóch ostatnich
wierszy przypisywane -
używając przypisanie wskaźnika - Y wskazać x jako punkt T.
I wtedy nieprawidłowego y w sposób bardzo bezpieczny.
>> Więc gdzie to nas?
Cóż, okazuje się, że pod maską w CS50 biblioteki, wskaźniki są
używane w całym.
A my zacząć się łuszczyć z powrotem, że warstwa przed długi.
Ale okazuje się też, Wyrażenie Niektórzy z was mogą znać,
szczególnie tych bardziej komfortowe, jest w rzeczywistości, że z bardzo popularne
strona www, lub przepełnienie stosu, te dni.
>> Ale to faktycznie ma bardzo techniczne znaczenie.
Teraz już wiemy, co stos jest.
To jak stos tac wewnątrz sali jadalnej.
>> Albo wewnątrz komputer tych pamięc te ramki
, które są wykorzystywane przez funkcje.
Cóż, okazuje się, że z tego powodu bardzo proste wdrożenie
Pamięć i ramki na tzw stos, rzeczywiście można kontrolować
systemu komputerowego stosunkowo łatwo.
Można włamać się do systemu, jeśli ludzie jak my nie napisałem nasz kod
szczególnie dobrze.
>> Jeśli ludzie tacy jak my użyć kawałki z pamięci lub wykorzystanie tablic -
nawet częściej -
ale czasami zapomnij sprawdzić Granice naszej tablicy, jak może
mają się czasami, i powtórzyć zbyt daleko poza koniec tablicy.
W najlepszym przypadku, program może po prostu upaść.
Segmentation fault, kind żenujące.
Nie jest wspaniały, ale nie jest to koniecznie niezwykle złe.
>> Ale jeśli program jest rzeczywiście na prawdziwe komputery użytkowników, czy to działa
na stronie internetowej, że faktyczne przypadkowych ludzi w internecie są uderzenia, pozwalając
osób wywoływać złych rzeczy na kodzie jest generalnie nie jest dobrą rzeczą, ponieważ
oznacza to możliwość wzięcia sterowanie komputerem.
I to będzie wyglądać trochę tajemnicze.
Ale myślałem, że cię przestraszyć Ten ostatni przykład tutaj.
>> Oto przykład kodu.
I jest dobry Wikipedia artykuł, który idzie przez
Ten bardziej szczegółowo.
Mam głównym na dole dzwoniącej foo, przekazując argv z 1.
I to jest tak, że można uruchom program i przekazać
arbitralne wejście.
>> I wtedy foo deklaruje się top jak przyjmowanie ciąg, lub więcej
dokładnie, char *.
Następnie deklaruje tablicę znaków.
Nazywają to bufor, bardziej ogólnie, od wielkości 12.
Tak 12 znaków może zmieścić tej tablicy o nazwie c.
>> A następnie używa tej nowej funkcji, co jest nowe, ale nie trudno
rozumiem, kopię pamięci.
Program kopiuje pamięć z baru, który był Zmienna n przeszłości, bez względu
użytkownik wpisze do argv 1 do C.
Ile bajtów?
Długość ciąg barze.
>> Tak więc, innymi słowy, jeśli użytkownik wpisuje h-e-l-l-o enter, długość ciągu
z komentarzy jest pięć.
Więc pięć z tych bajtów dostanie kopiowane do tablicy o nazwie c, który
ma wielkość 12.
Ale to, co użytkownik wpisze w znacznie dłużej Słowo to jest 13 znaków lub 14
znaków lub 100 znaków lub więcej?
>> Gdzie oni pójdą?
Dobrze, że ramka, że ​​tacy w dining-hall stosie,
oni będą tam.
I to właśnie zamierza rozpocząć nadpisywanie inne rzeczy, które już
na tym stosie, przepełnione stos, że tak powiem.
>> Tak obrazowo, myślę o tym w ten sposób.
To jest po prostu kolorowe wersja obraz, który został nam rysunek.
Na dole, powiedzmy, jest głównym.
A na górze, co widzisz teraz jest ramka, kolorami teraz,
Funkcja o nazwie foo.
Ale co ciekawe, tutaj o foo jest to, że tutaj jest jego rama.
Więc to wyciągnąć jak I A jednak w kolorze jasnoniebieskim.
A teraz to, gdzie c wspornik 0 idzie.
I to jest, gdy c wspornik 11 zamierza skończyć.
>> Innymi słowy zdarza się, aby być reprezentowana jako kwadrat.
Ale jeśli po prostu zachować plopping bajtów down - lub znaki - oni będą do końca
się w położeniu 0 aż do góry do 11, bo to 0 indeksowane.
>> Ale gdzie jest 13 znaków skończy?
Gdzie jest 14.?
Gdzie jest 50-znaków skończy?
>> To się nie poddawać się w dół.
Bo nawet jeśli mamy wyciągnąć obraz z stos rośnie,
adresy, okazuje się, przejść od małe adresy, małe
wskaźniki, do dużych adresów.
Tak więc to właśnie tam dzieje się i up.
>> Jeśli więc użytkownik wpisze w hello, to świetnie.
Nie błąd, nie ma problemu, każdy jest bezpieczny.
Ale jeśli użytkownik wpisze w to, co my będziemy wywołać nieprzyjazne kod, reprezentowany
ogólnie jako, atak, atak, atak, atak, co może się zdarzyć?
>> Dobrze, jeśli wszystkie wprowadzone przez użytkownika wpisany w nie tylko niektóre przyjazny
lub obraźliwe ciąg znaków.
W rzeczywistości jest to ciąg znaków że jeśli on skompilowany,
faktycznie jest kod.
Być może jest to kod, który usuwa wszystkie pliki na dysku twardym lub wysyła spam
lub coś w tym stylu.
Zauważ, że to, co jest kluczem do tego jest to, że jeśli zły facet ma szczęście
zastąpić czerwony kawałek pamięci -
co nie zwrócić na moim zdjęciu, ale ten obraz Wikipedia ma tu -
jego tak zwany adres zwrotny.
>> Kiedy wraca jedzenie, po powrocie swap, w jaki sposób komputer wie, aby przejść od
tutaj na dole?
Albo w tech segmencie się powyżej, jak to wiedzieć, aby przejść od swapu
Kod - 0 i 1-tych że komponowanie swap -
powrót na stronę główną?
Jest tak zwany adres zwrotny przechowywane w tej samej ramce stosu, na
same tray kawiarnia.
>> Więc jeśli zły facet jest na tyle sprytny, aby umieścić kod ataku, kod atak, atak
kod i uzyskać szczęście -
często metodą prób i błędów - do nadpisać ten czerwony adres zwrotny,
z adresem i ogłoszenia górze.
Wskazówka 0835C080.
Jest napisany do góry do tyłu powodów będziemy być może zrewidować.
To, że liczba.
>> Więc jeśli bad guy dostaje szczęście lub jest na tyle sprytny, aby zastąpić czerwony
pas pamięci z adresem Kod, że on lub ona ma jakiś
wstrzykiwany do komputera, chyba, którego Kod ma być zwrócone
tak szybko, jak foo odbywa realizacji?
>> Zły facet kod.
Więc ten kod ataku, AAA, znowu, może rozsyłania spamu, może usunąć wszystkie pliki
na dysku twardym.
Ale to, co naprawdę przepełnienie stosu jest, lub przepełnienia buforu, lub
atak przepełnienia bufora.
>> I to jest bardzo, bardzo powszechne do tej pory z programów napisanych w
C, C + +, a nawet niektóre inne języki.
W tym przerażającym notatki, my będziemy kończy się żart.
>> [Śmiech]
>> Do zobaczenia w środę.
Na następnym CS50 -
Więc ja jestem z lamp na dysku, ale dzisiaj czekaj, beztłuszczowe mleko, pół telefon
Książka, sok pomarańczowy że wypiłem dziś.
Kabel USB, klucz.
>> [Odtwarzanie muzyki]