1 00:00:00,000 --> 00:00:11,242 >> [Odtwarzanie muzyki] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN: Dobra to CS50 i jest to początek pięciu tygodni. 3 00:00:16,630 --> 00:00:21,480 Tak więc dzisiaj, pod swoimi siedzisk, nie znajdziesz nic. 4 00:00:21,480 --> 00:00:24,790 Ale wyżej, należy znaleźć te, mały znak naszej wdzięczności za 5 00:00:24,790 --> 00:00:26,970 wszystkie prace, które można umieścić Zespół Piętnastki. 6 00:00:26,970 --> 00:00:30,290 Wystarczy usunąć mały okrąg na bottom na grę na 7 00:00:30,290 --> 00:00:31,680 Pozostała część klasy. 8 00:00:31,680 --> 00:00:38,930 >> Więc przypomnieć, lub wiedzieć, że zestaw problemu cztery, który wyszedł w ten weekend, 9 00:00:38,930 --> 00:00:40,340 polega na piśmie inną grę. 10 00:00:40,340 --> 00:00:43,740 Ale tym razem polega na wykorzystaniu Rzeczywista graficzny interfejs użytkownika, nie 11 00:00:43,740 --> 00:00:46,310 Interfejs jak tekstowo Gra Piętnastki było. 12 00:00:46,310 --> 00:00:50,210 A gra, która jest przed wami, jeśli nie zostały jeszcze widziałem to następny, 13 00:00:50,210 --> 00:00:52,310 wygląda trochę coś takiego. 14 00:00:52,310 --> 00:00:55,170 Mam zamiar iść do mojego terminalu Okno tutaj w GDB. 15 00:00:55,170 --> 00:00:58,600 I zamierzam iść do przodu i uruchamiania Rozwiązanie personel, który można uzyskać dostęp 16 00:00:58,600 --> 00:01:01,010 po uruchomieniu aktualizacji 50, jak zwykle. 17 00:01:01,010 --> 00:01:04,090 >> Ale mam zamiar umieścić go w trochę secret mode, trochę Easter egg, 18 00:01:04,090 --> 00:01:08,480 tzw. tryb Bóg, przez oddanie Bogu w argv1. 19 00:01:08,480 --> 00:01:12,920 I muszę przestrzegać własne kierunki, działa to w moim 20 00:01:12,920 --> 00:01:14,220 Problem ustawić katalog. 21 00:01:14,220 --> 00:01:19,190 Więc teraz można zobaczyć pełną wersję gry w Breakout. 22 00:01:19,190 --> 00:01:21,090 W rzeczywistości jest to nie-hands mode. 23 00:01:21,090 --> 00:01:24,850 Więc to jest naprawdę - 24 00:01:24,850 --> 00:01:26,470 zachwycił, choć może być - 25 00:01:26,470 --> 00:01:30,850 dość trywialny do wdrożenia trybu Boga w Breakout, w przeciwieństwie do gry Piętnastki, 26 00:01:30,850 --> 00:01:33,590 co niektórzy z was mógłby zająć do edycji hakerów. 27 00:01:33,590 --> 00:01:37,890 >> W Breakout wystarczy w Boga Tryb po prostu robić to, co, 28 00:01:37,890 --> 00:01:41,220 intuicyjnie z wiosłem? 29 00:01:41,220 --> 00:01:45,630 Po prostu zrób to równa co Pozycja pozioma jest w spotkaniu. 30 00:01:45,630 --> 00:01:49,220 I tak długo, jak to zrobić w lockstep z piłkę w ruchu tej grze 31 00:01:49,220 --> 00:01:53,100 Nigdy, nigdy, nigdy się nie trafić w piłkę i wygrasz za każdym razem. 32 00:01:53,100 --> 00:01:55,430 >> Ale w tym tygodniu wydaniu hakerów jest czymś więcej niż tylko tryb Boga. 33 00:01:55,430 --> 00:01:56,720 Istnieje szereg innych funkcji. 34 00:01:56,720 --> 00:01:58,140 Wśród nich, lasery. 35 00:01:58,140 --> 00:02:01,070 Tak, że jeśli naprawdę się niecierpliwić ty może rozpocząć zestrzelenie cegły 36 00:02:01,070 --> 00:02:02,120 i kilka innych. 37 00:02:02,120 --> 00:02:04,560 A dla tych z was, którzy chcieliby kalibracji standardu kontra hacker 38 00:02:04,560 --> 00:02:08,750 edition, widzę, że w tym tygodniu-tych edition haker celowo jest 39 00:02:08,750 --> 00:02:12,830 trochę bardziej wykonalne, powiedzmy, od Boga tryb był z gry Piętnastki. 40 00:02:12,830 --> 00:02:15,300 >> Więc jeśli szukasz odcinku i szukasz jakiejś dodatkowej zabawy 41 00:02:15,300 --> 00:02:18,400 funkcje oferuje nurkowania w przypadku zainteresowania. 42 00:02:18,400 --> 00:02:21,280 Teraz bardziej praktycznie, pozwolę sobie powiedzieć, z jednej rzeczy, jak również. 43 00:02:21,280 --> 00:02:24,780 GDB, które niektórzy z was mogą nie mieć jeszcze dotknęła osobiście, co jest w porządku. 44 00:02:24,780 --> 00:02:28,530 Ale teraz to naprawdę czas, aby przyzwyczaić do tego i wygodne z tego narzędzia 45 00:02:28,530 --> 00:02:31,510 ponieważ uczyni twoje życie o wiele łatwiej, naprawdę. 46 00:02:31,510 --> 00:02:34,900 >> Per wykładu Roba na GDB para tygodni temu, pamiętam 47 00:02:34,900 --> 00:02:36,810 że GDB to debugger. 48 00:02:36,810 --> 00:02:41,230 Jest to narzędzie, które pozwala uruchomić swoje program, ale to prowadzi krok po kroku, zgodnie 49 00:02:41,230 --> 00:02:45,680 po linii, tak aby można było grzebać, tak, że można zobaczyć, co dzieje się, tak 50 00:02:45,680 --> 00:02:47,310 które można wydrukować wartości zmiennych. 51 00:02:47,310 --> 00:02:50,580 W skrócie, to daje dużo więcej energii niż printDef robi. 52 00:02:50,580 --> 00:02:52,900 >> Teraz prawda, interfejs jest dość tajemnicze. 53 00:02:52,900 --> 00:02:55,180 Czarno-biały interfejs tekstowy w większości przypadków. 54 00:02:55,180 --> 00:02:57,400 Polecenia są nieco trudne pamiętać w pierwszej kolejności. 55 00:02:57,400 --> 00:03:01,230 Ale nawet jeśli to może cię pół godziny, godziny, aby umieścić ten z góry 56 00:03:01,230 --> 00:03:02,940 inwestycja czasu w to, uwierz mi. 57 00:03:02,940 --> 00:03:06,440 Oczywiście przez semestru końcu będzie to zaoszczędzić Ci rząd wielkości więcej 58 00:03:06,440 --> 00:03:07,600 czasu niż to. 59 00:03:07,600 --> 00:03:09,200 >> Więc na początku nurkowania tygodnie w. 60 00:03:09,200 --> 00:03:13,200 I pod względem Breakout, wiem, że jesteś Można to zrobić tak długo, jak masz 61 00:03:13,200 --> 00:03:18,230 Kod dystrybucja lub własny kod w toku w Twoim Pst4 katalogu. 62 00:03:18,230 --> 00:03:21,680 Wiesz, że można uruchomić gdb. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> To będzie otwarcie okno jak poniżej. 64 00:03:23,490 --> 00:03:25,530 Pozwól mi dać sobie więcej z oknie terminala. 65 00:03:25,530 --> 00:03:27,770 A potem to, co mam zamiar iść do przodu i nie, nie jest to po prostu go uruchomić. 66 00:03:27,770 --> 00:03:30,690 Mam zamiar najpierw ustawić punkt załamania Przypomnijmy, który pozwala zatrzymać 67 00:03:30,690 --> 00:03:32,500 wykonanie w określonym miejscu. 68 00:03:32,500 --> 00:03:35,750 >> Wystarczy zachować rzeczy proste, mam zamiar złamać w pierwszej linii po prostu przez wpisanie 69 00:03:35,750 --> 00:03:37,000 numer jeden. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Pozwól, że w rzeczywistości ponownie otworzyć okno bo robi się 72 00:03:43,250 --> 00:03:45,700 trochę małe tam. 73 00:03:45,700 --> 00:03:53,270 Więc co mam teraz zrobić tutaj jest jeśli otworzyć moje okno terminala. 74 00:03:53,270 --> 00:03:53,910 Chodź, nie idziemy. 75 00:03:53,910 --> 00:03:59,850 >> Więc teraz, jeśli wrócę do Dropbox, Pst4 i uruchomić gdb. / breakout wprowadzić, zawiadomienia 76 00:03:59,850 --> 00:04:02,600 Mam zamiar złamać jeden ustawić punkt przerwa w linii pierwszej. 77 00:04:02,600 --> 00:04:04,840 A teraz mam zamiar iść przed i typ uruchomienia. 78 00:04:04,840 --> 00:04:07,370 I kiedy ja, nic nie zauważył wydaje się zdarzyć. 79 00:04:07,370 --> 00:04:08,120 >> Nie ma się pop. 80 00:04:08,120 --> 00:04:09,790 Nie ma graficzny interfejs użytkownika jeszcze. 81 00:04:09,790 --> 00:04:13,340 Ale to zrozumiałe, bo jestem dosłownie na linii jeden w moim programie. 82 00:04:13,340 --> 00:04:17,110 I zauważył, że mam szybko przekazywane, szczególnie teraz w 62, ponieważ wszystkie 83 00:04:17,110 --> 00:04:20,600 stuff na górze tego pliku jest rzeczy takie jak komentarze i stałych i 84 00:04:20,600 --> 00:04:22,460 nieciekawe rzeczy na teraz. 85 00:04:22,460 --> 00:04:25,840 >> Więc teraz jestem w środku głównej, Wydaje się, że na linii 62. 86 00:04:25,840 --> 00:04:27,960 I to jest właśnie dystrybucja Kod, recall. 87 00:04:27,960 --> 00:04:33,810 Jeśli otworzyć to przez dzieje, podobnie, do mojego katalogu skrzynki spadek do Pst4, 88 00:04:33,810 --> 00:04:35,450 do breakout.c. 89 00:04:35,450 --> 00:04:40,670 A jeśli przewijać w dół iw dół iw dół, i pozwól mi iść dalej i włączyć 90 00:04:40,670 --> 00:04:44,990 moje numery linii. 91 00:04:44,990 --> 00:04:50,300 >> Co zobaczę, jeśli przejść do linia 62, jest dokładnie linia 92 00:04:50,300 --> 00:04:50,910 my przerwał na. 93 00:04:50,910 --> 00:04:53,720 Tak więc ta linia tutaj, 62, jest gdzie mamy zamiar być. 94 00:04:53,720 --> 00:04:57,470 Więc teraz w GDB, jeśli pójdę dalej i wpisz teraz następne wpisz to będzie 95 00:04:57,470 --> 00:04:58,450 wykonanie tej linii. 96 00:04:58,450 --> 00:05:00,610 I voila, mamy tak zwane okno g. 97 00:05:00,610 --> 00:05:02,800 Jeżeli znają co GWindow jest, nie martw się. 98 00:05:02,800 --> 00:05:05,740 Spec będzie wprowadzenie do niej, jak oraz wielu filmów przeglądowych 99 00:05:05,740 --> 00:05:06,830 osadzone w spec. 100 00:05:06,830 --> 00:05:08,610 >> Ale teraz zróbmy to trochę bardziej interesująca. 101 00:05:08,610 --> 00:05:10,960 Pozwól przenieść okno na z boku trochę. 102 00:05:10,960 --> 00:05:13,480 Pozwól mi przez okno trochę większe, więc można zobaczyć więcej. 103 00:05:13,480 --> 00:05:16,140 >> A teraz pozwól mi iść do przodu i zrobić ponownie. 104 00:05:16,140 --> 00:05:17,550 I tam są moje cegły. 105 00:05:17,550 --> 00:05:20,490 Gdybym ponownie wpisz obok teraz widzę piłkę. 106 00:05:20,490 --> 00:05:23,520 A jeśli napiszę następny raz teraz widzę wiosło. 107 00:05:23,520 --> 00:05:26,690 >> I na szczęście nie jest to gedit naprawdę współpracuje pokazując mnie 108 00:05:26,690 --> 00:05:27,660 wszystko, co chcę. 109 00:05:27,660 --> 00:05:30,820 Ale teraz, jeśli zrobić jeszcze raz, następny ponownie, jestem po prostu 110 00:05:30,820 --> 00:05:32,260 uznające niektóre zmienne. 111 00:05:32,260 --> 00:05:34,750 I mogę wydrukować dowolny z tych facetów. 112 00:05:34,750 --> 00:05:37,170 Cegły Drukuj, druki życiu. 113 00:05:37,170 --> 00:05:39,910 >> A teraz, jeśli nadal robić Następnie zauważył, że będę 114 00:05:39,910 --> 00:05:40,870 wewnątrz tej pętli. 115 00:05:40,870 --> 00:05:43,380 Ale kod ma wykonać dokładnie tak, jak oczekuję. 116 00:05:43,380 --> 00:05:45,810 Kiedy więc hit tej funkcji Wait dla Click, to będzie zrobić 117 00:05:45,810 --> 00:05:46,830 dosłownie, że. 118 00:05:46,830 --> 00:05:48,870 Tak więc wydawało się, że stracił kontrolę całego programu. 119 00:05:48,870 --> 00:05:50,480 >> GDB nie daje mi innego polecenia. 120 00:05:50,480 --> 00:05:51,500 Ale nie martw się. 121 00:05:51,500 --> 00:05:53,720 Idź do mojej gry, kliknij gdzieś. 122 00:05:53,720 --> 00:05:56,270 >> I voila, teraz przechodzi do linii 86. 123 00:05:56,270 --> 00:05:59,460 Więc jeszcze raz, to jest bezcenne, ostatecznie, problemów diagnostyki. 124 00:05:59,460 --> 00:06:03,050 Ponieważ można dosłownie krok po kroku Twój kod, wszystko wydrukować i wiele, 125 00:06:03,050 --> 00:06:03,640 dużo, więcej. 126 00:06:03,640 --> 00:06:07,210 Ale teraz te same narzędzia powinno cię dość daleko. 127 00:06:07,210 --> 00:06:10,050 >> Więc jesteśmy, oczywiście, spojrzenia na Graphics teraz, nagle. 128 00:06:10,050 --> 00:06:12,350 A teraz nasz świat staje się trochę bardziej interesujące. 129 00:06:12,350 --> 00:06:15,680 I wiesz, być może, z niektórych filmy online, że mamy te 130 00:06:15,680 --> 00:06:18,280 szorty, że już oglądać jako część zestawów problemów. 131 00:06:18,280 --> 00:06:20,460 >> A oni już strzał, celowo, na białym tle. 132 00:06:20,460 --> 00:06:23,380 A niektóre z nich mają nauczanie Fellows rysunek tekst na 133 00:06:23,380 --> 00:06:25,490 Ekran, który jest nałożony na stronie nich. 134 00:06:25,490 --> 00:06:27,760 Ale, oczywiście, nie jest to, że wszystkie ciekawe w świecie rzeczywistym. 135 00:06:27,760 --> 00:06:30,520 To tylko z sali wykładowej duży biały ekran i tło. 136 00:06:30,520 --> 00:06:33,330 A nasz zespół produkcyjny niesamowity sort z sprawia, że ​​wszystko wygląda pięknie 137 00:06:33,330 --> 00:06:36,620 po tym, przez przycinanie się lub nakładanie czegokolwiek 138 00:06:36,620 --> 00:06:37,840 robimy lub nie chcą. 139 00:06:37,840 --> 00:06:41,560 >> Teraz tylko motywować w tym tygodniu i Naprawdę, gdzie można iść, ostatecznie, 140 00:06:41,560 --> 00:06:42,560 z informatyki. 141 00:06:42,560 --> 00:06:44,260 Nie tylko po problemu ustawić cztery. 142 00:06:44,260 --> 00:06:48,240 Ale po innym kursie lub całego Program to niesamowite, co można 143 00:06:48,240 --> 00:06:51,090 robić te dni w kategoriach Grafika w szczególności. 144 00:06:51,090 --> 00:06:53,440 >> Niektórzy z was mogą nie widziałem tego opływając w Internecie. 145 00:06:53,440 --> 00:06:56,240 Ale pomyślałem, że pokażę, na tak Kilka minut, spojrzenie na to, co 146 00:06:56,240 --> 00:07:01,890 technologia komputerowa i co CGI, grafika komputerowa może zrobić te dni 147 00:07:01,890 --> 00:07:04,510 z znają piosenki a może film. 148 00:07:04,510 --> 00:07:05,760 >> MUSIC [- LANA DEL RAY, "Młoda i piękna] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: To jest tylko trochę niesamowite, być może, po prostu, jak 151 00:10:52,470 --> 00:10:52,857 wszechobecna - 152 00:10:52,857 --> 00:10:57,040 >> [APPLAUSE] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Właśnie ściągnąłem. 154 00:10:59,230 --> 00:11:02,920 Ale to jest naprawdę niesamowite, myślę, że po prostu jak wszechobecna i oprogramowania oraz kod 155 00:11:02,920 --> 00:11:04,230 narzędzia, takie jak to naprawdę jest. 156 00:11:04,230 --> 00:11:07,685 Więc to jest smak kierunku , w którym można przejść. 157 00:11:07,685 --> 00:11:10,620 Oh, nie więcej Appliance dziś. 158 00:11:10,620 --> 00:11:14,640 Cóż, to rzeczywiście tragiczny czas biorąc pod uwagę punkt prostu próbowałem zrobić. 159 00:11:14,640 --> 00:11:18,670 >> W porządku, więc niech to uruchomić Fusion ponownie. 160 00:11:18,670 --> 00:11:20,800 Przypomnij mi później. 161 00:11:20,800 --> 00:11:24,190 Dobra, i powinien masz napisz jak na bok, jeśli nie dostać 162 00:11:24,190 --> 00:11:25,460 zawiadomienia takiego. 163 00:11:25,460 --> 00:11:29,940 W porządku, więc przypomnieć, że w zeszłym tygodniu zaczęliśmy odwinąć ten 164 00:11:29,940 --> 00:11:31,380 później znany jako ciąg. 165 00:11:31,380 --> 00:11:34,700 >> ciąg przypomina typ danych, który jest zadeklarowanych w CS50 biblioteki. 166 00:11:34,700 --> 00:11:37,740 I to jest część kółka że zacznie się do startu. 167 00:11:37,740 --> 00:11:41,280 To był pożyteczny pomysł na początku. 168 00:11:41,280 --> 00:11:43,750 Ale teraz to się dzieje, aby uzyskać więcej ciekawe i bardziej wydajne, aby 169 00:11:43,750 --> 00:11:48,330 faktycznie zobaczyć, że pod maską, ciąg jest tylko to, co, nie mówiliśmy? 170 00:11:48,330 --> 00:11:50,500 >> Tak, więc jest to tzw char *. 171 00:11:50,500 --> 00:11:53,860 I * nie oznacza, że ​​nie jakiś adres zaangażowany. 172 00:11:53,860 --> 00:11:58,690 I tak, kiedy mówisz char * po prostu na myśli Zmienna, której typ danych jest 173 00:11:58,690 --> 00:11:59,290 Wskaźnik teraz. 174 00:11:59,290 --> 00:12:01,770 Fakt, że jest tam gwiazda oznacza po prostu, że jesteś deklarując 175 00:12:01,770 --> 00:12:03,020 tzw. wskaźnik. 176 00:12:03,020 --> 00:12:06,220 I że wskaźnik ma podobno zapisać adres, z 177 00:12:06,220 --> 00:12:07,810 Oczywiście, char. 178 00:12:07,810 --> 00:12:08,960 >> Teraz, dlaczego to ma sens? 179 00:12:08,960 --> 00:12:11,200 Cóż, to, co jest ciąg pod maską? 180 00:12:11,200 --> 00:12:15,130 No cóż, na jakiś czas, który został nam mówią że napis pod maską jest 181 00:12:15,130 --> 00:12:18,460 tylko h-E-L-P-O, na przykład. 182 00:12:18,460 --> 00:12:21,585 >> Ale rozmawialiśmy o tym, jak jest w istocie, array. 183 00:12:21,585 --> 00:12:25,410 A tablica wtedy wyglądać trochę więcej w ten sposób, każdy z tych 184 00:12:25,410 --> 00:12:26,460 podejmowania kęs. 185 00:12:26,460 --> 00:12:28,710 I wtedy mówiliśmy, że jest tu coś wyjątkowego, 186 00:12:28,710 --> 00:12:31,270 backslash 0 lub null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Więc cały ten czas, to tutaj jest ciąg. 188 00:12:35,230 --> 00:12:38,320 Ale tak naprawdę, ciąg jest faktycznie adres. 189 00:12:38,320 --> 00:12:43,210 I adresy, jak zobaczymy, jest często z prefiksem 0x umownie. 190 00:12:43,210 --> 00:12:44,540 Co 0x oznacza? 191 00:12:44,540 --> 00:12:45,970 Czy ktoś wie? 192 00:12:45,970 --> 00:12:47,320 >> Więc to po prostu oznacza, szesnastkowym. 193 00:12:47,320 --> 00:12:52,360 Więc można przypomnieć, faktycznie, z PST 1, moim zdaniem, jedna z rozgrzewki 194 00:12:52,360 --> 00:12:55,740 faktycznie poprosił o pytania szesnastkowym oprócz 195 00:12:55,740 --> 00:12:57,100 binarne i dziesiętne. 196 00:12:57,100 --> 00:13:00,460 I tu jest to, że motywacja w systemie szesnastkowym masz 16 197 00:13:00,460 --> 00:13:01,770 cyfry do Państwa dyspozycji. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a następnie przez A, B, C, D, E, F. 199 00:13:07,900 --> 00:13:10,430 >> A jeśli liczyć wszystkie te górę, masz w sumie 16. 200 00:13:10,430 --> 00:13:13,200 Jest to więc w przeciwieństwie dziesiętny, gdzie mamy 10 201 00:13:13,200 --> 00:13:14,690 cyfr 0 do dziewięciu. 202 00:13:14,690 --> 00:13:17,750 Jest to w przeciwieństwie do dwójkowy gdzie mamy tylko 0 i 1. 203 00:13:17,750 --> 00:13:21,450 >> Ale na koniec dnia, w którym można po prostu reprezentują te same numery, ale 204 00:13:21,450 --> 00:13:22,500 nieco inaczej. 205 00:13:22,500 --> 00:13:25,840 I szesnastkowy jest powszechny, ponieważ jako Okazuje się - i zobaczymy, to 206 00:13:25,840 --> 00:13:28,790 później w trakcie - nawet wtedy, gdy mamy do programowania WWW w kontekście 207 00:13:28,790 --> 00:13:32,100 HTML i kody kolorów, szesnastkowy jest ładne. 208 00:13:32,100 --> 00:13:36,390 Ponieważ każda cyfra, okazuje się, reprezentuje cztery bity idealnie. 209 00:13:36,390 --> 00:13:39,280 Więc to po prostu rodzaj linii ładnie jak będzie w końcu zobaczyć. 210 00:13:39,280 --> 00:13:44,720 Więc może to być Ox123 lub coś tak, oznaczający 123 adres 211 00:13:44,720 --> 00:13:47,050 gdzieś wewnątrz mego pamięci komputera. 212 00:13:47,050 --> 00:13:50,600 >> Oczywiście, niektóre problemy pojawiają z tego powodu bazowego 213 00:13:50,600 --> 00:13:51,520 realizacja. 214 00:13:51,520 --> 00:13:55,930 I przypominają, że wziąłem ukłucie w realizacji funkcji takich jak ta - 215 00:13:55,930 --> 00:14:00,260 porównanie rozdzielczą 0 dot c w zeszłym tygodniu, że mimo, że wyglądał jak to było 216 00:14:00,260 --> 00:14:04,270 Dobrze, że po prostu nie porównać dwa ciągi poprawnie. 217 00:14:04,270 --> 00:14:07,470 >> Mam wyrzucić główny, a ja rzucona dala komentarze po prostu skupić się na 218 00:14:07,470 --> 00:14:08,970 Kod, który jest przedmiotem zainteresowania tutaj. 219 00:14:08,970 --> 00:14:10,660 I to jest na czerwono, bo to buggy. 220 00:14:10,660 --> 00:14:11,670 Z jakiego powodu? 221 00:14:11,670 --> 00:14:15,890 >> Cóż, na górze tam, kiedy oświadczył, łańcuch, co się naprawdę dzieje 222 00:14:15,890 --> 00:14:17,260 pod maską? 223 00:14:17,260 --> 00:14:19,530 Cóż, pozwól mi przejść do ekranizować tutaj i wyciągnąć to. 224 00:14:19,530 --> 00:14:23,230 So I oświadczył, znowu, String s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Więc mam zamiar iść do przodu i teraz narysować s, co to naprawdę jest. 226 00:14:26,640 --> 00:14:28,590 To będzie plac tutaj. 227 00:14:28,590 --> 00:14:30,490 I zamierzam zastrzeżenia że to jest 32 bitów. 228 00:14:30,490 --> 00:14:32,890 Przynajmniej to zwykle bywa, przynajmniej na CS50 229 00:14:32,890 --> 00:14:34,520 Urządzenie w wielu komputerach. 230 00:14:34,520 --> 00:14:35,980 Mam zamiar nazwać ów. 231 00:14:35,980 --> 00:14:39,070 >> Ale teraz przypomnieć, że nazywa GetString. 232 00:14:39,070 --> 00:14:41,430 Więc GetString powraca, Oczywiście ciąg. 233 00:14:41,430 --> 00:14:45,790 Jeśli użytkownik wpisze w H-e-l-l-o wprowadzić Ciąg cześć zostanie zwrócone. 234 00:14:45,790 --> 00:14:51,010 I to ciąg, jak właśnie powiedział, kończy się gdzieś w pamięci komputera 235 00:14:51,010 --> 00:14:53,240 z 0 odwrotny ukośnik na końcu. 236 00:14:53,240 --> 00:14:56,650 Będę rysować to jak tablicy - lub ciągłego bloku znaków - 237 00:14:56,650 --> 00:14:58,330 , że jest w rzeczywistości. 238 00:14:58,330 --> 00:15:01,790 >> A teraz, co jest GetString faktycznie powrocie? 239 00:15:01,790 --> 00:15:04,340 Co GetString powróciła cały ten czas? 240 00:15:04,340 --> 00:15:07,520 No, powiedzmy, na tydzień przed, zwraca ciąg. 241 00:15:07,520 --> 00:15:10,250 Ale bardziej technicznie, co robi GetString powrót podobno? 242 00:15:10,250 --> 00:15:11,610 >> PUBLICZNOŚCI: adres. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: adres. 244 00:15:12,600 --> 00:15:16,630 W szczególności zwraca adres Pierwszy kęs, cokolwiek to jest. 245 00:15:16,630 --> 00:15:18,830 I po prostu zachować przy użyciu jednego, dwa, trzy , ponieważ jest to wygodne. 246 00:15:18,830 --> 00:15:21,380 >> Zwraca adres pierwszy znak w ciągu. 247 00:15:21,380 --> 00:15:23,510 A my powiedział w zeszłym tygodniu, że które jest wystarczające. 248 00:15:23,510 --> 00:15:26,710 Ponieważ zawsze możemy dowiedzieć się, gdzie Koniec łańcucha prostu 249 00:15:26,710 --> 00:15:30,150 iteracji nad nim, być może, z za pętli lub pętla czy coś 250 00:15:30,150 --> 00:15:34,990 że, po prostu patrząc na "backslash 0", Szczególny charakter sentinel. 251 00:15:34,990 --> 00:15:37,220 >> I wtedy wiemy, że ciąg dzieje się z długości - 252 00:15:37,220 --> 00:15:37,980 w tym przypadku - 253 00:15:37,980 --> 00:15:38,670 pięć. 254 00:15:38,670 --> 00:15:43,800 Więc technicznie, co GetString robi to zwraca Ox123 w tym przypadku. 255 00:15:43,800 --> 00:15:53,670 I technicznie, co wtedy się dzieje, , które przechowujemy, wewnątrz s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Na koniec dnia, chociaż jest nowa koncepcja, wskaźniki, są 257 00:15:56,460 --> 00:15:57,350 tylko zmienne. 258 00:15:57,350 --> 00:16:00,440 Ale oni się do przechowywania bitów, które łącznie stanowią adres. 259 00:16:00,440 --> 00:16:03,700 Więc technicznie wszystko co dostaje przechowywane w s jest Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Ale my jako ludzie - 261 00:16:04,680 --> 00:16:06,020 w tym naprzód dziś - 262 00:16:06,020 --> 00:16:09,290 są naprawdę nie będzie obchodziło, zazwyczaj, co rzeczywiste adres 263 00:16:09,290 --> 00:16:10,520 jakiegoś fragmentu pamięci. 264 00:16:10,520 --> 00:16:14,040 To jest tylko do niskiego poziomu szczegółowości być intelektualnie interesujące. 265 00:16:14,040 --> 00:16:15,440 Więc idę do tego cofnąć. 266 00:16:15,440 --> 00:16:19,810 I zamiast, bardziej wysoki poziom, po prostu powiedzieć , że kiedy mówimy o wskaźniki 267 00:16:19,810 --> 00:16:22,170 Zamierzam po prostu wyciągnąć więcej przyjazny dla użytkownika, który przenosi strzałka 268 00:16:22,170 --> 00:16:26,060 sama idea i abstrakty oddalony szczegółowe dane o tym, co rzeczywiste 269 00:16:26,060 --> 00:16:27,700 bazowy adres. 270 00:16:27,700 --> 00:16:33,290 >> Teraz, gdy wracamy do kodu, co stało się w zeszłym tygodniu, jeśli mamy ciąg t 271 00:16:33,290 --> 00:16:34,510 równa GetString? 272 00:16:34,510 --> 00:16:38,630 Cóż, gdybym ponownie wpisz komentarzy tym razem mam zamiar dostać 273 00:16:38,630 --> 00:16:40,460 kolejny kawałek pamięci. 274 00:16:40,460 --> 00:16:44,820 g-e-l-l-O 0 odwróconej. 275 00:16:44,820 --> 00:16:48,320 >> Ale dlatego, że nazywa GetString drugi raz - 276 00:16:48,320 --> 00:16:51,100 i wiem, że to od patrzenia na Kod źródłowy GetString - nawet 277 00:16:51,100 --> 00:16:54,350 choć jest to przypadek, że cześć była wpisane dwa razy, GetString nie jest 278 00:16:54,350 --> 00:16:55,890 zamiar spróbować zoptymalizować i być sprytny. 279 00:16:55,890 --> 00:16:58,550 To po prostu się dostać inny kawałek pamięci z komputera, który jest 280 00:16:58,550 --> 00:16:59,640 będzie na inny adres. 281 00:16:59,640 --> 00:17:02,330 Załóżmy arbitralnie tylko powiedzieć 456. 282 00:17:02,330 --> 00:17:04,079 >> I co to będzie powrót? 283 00:17:04,079 --> 00:17:08,030 To będzie powrót 456 i przechowywać go w t.. 284 00:17:08,030 --> 00:17:12,010 Więc to, co naprawdę się dzieje, na lewa strona to mam inny kawałek 285 00:17:12,010 --> 00:17:14,260 pamięci, 32 bity zazwyczaj. 286 00:17:14,260 --> 00:17:16,720 I nie będzie go Ox456. 287 00:17:16,720 --> 00:17:20,140 Ale znowu, nie jestem zainteresowany tymi poszczególne numery już. 288 00:17:20,140 --> 00:17:23,069 Idę do abstrakcyjnie wyciągnąć go jak strzała. 289 00:17:23,069 --> 00:17:25,202 >> Więc to jest teraz nowa wyjaśnienie. 290 00:17:25,202 --> 00:17:28,735 Ale to jest dokładnie taki sam pomysł, że to dzieje się cały ten czas. 291 00:17:28,735 --> 00:17:33,150 A więc powód to, że ten pierwszy porównywana była wersja buggy 292 00:17:33,150 --> 00:17:34,480 w zeszłym tygodniu to dlaczego? 293 00:17:34,480 --> 00:17:38,000 Gdy to zrobisz, jeśli s jest równa jest równa t, co są naprawdę 294 00:17:38,000 --> 00:17:40,550 Pod maską porównanie? 295 00:17:40,550 --> 00:17:41,910 >> Jesteś porównywanie adresów. 296 00:17:41,910 --> 00:17:47,950 I tylko intuicyjnie, wyraźnie, Ox123 nie zamierza równego Ox456. 297 00:17:47,950 --> 00:17:49,380 Te liczby, te bity są po prostu inne. 298 00:17:49,380 --> 00:17:53,220 >> I tak konsekwentnie, w zeszłym tygodniu powiedział wpisać różne rzeczy, nawet jeśli 299 00:17:53,220 --> 00:17:55,360 Słowa były dosłownie same. 300 00:17:55,360 --> 00:17:58,770 Więc możemy to naprawić. 301 00:17:58,770 --> 00:18:00,120 W laika, co było fix? 302 00:18:00,120 --> 00:18:02,110 >> PUBLICZNOŚCI: Użyj funkcji. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Użyj funkcji. 304 00:18:02,870 --> 00:18:05,190 A gwiazdy są zdecydowanie zaangażowane, ale użyć funkcji do czego? 305 00:18:05,190 --> 00:18:05,962 >> PUBLICZNOŚCI: Aby porównać ciągi. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Aby porównać ciągi. 307 00:18:07,390 --> 00:18:11,030 Tak więc podstawowym problemem było że właśnie rozważa 308 00:18:11,030 --> 00:18:15,870 Jakość strun, które zostaną określone przez Porównanie ich adresy. 309 00:18:15,870 --> 00:18:18,540 I oczywiście, że jest po prostu głupi, teraz po raz rozumiesz, co się dzieje 310 00:18:18,540 --> 00:18:19,510 pod maską. 311 00:18:19,510 --> 00:18:23,270 Aby w pełni porównać ciągi czy są równe w sposób ludzki 312 00:18:23,270 --> 00:18:26,680 by rozważyć dwa ciągi równa musimy je porównać charakter dla 313 00:18:26,680 --> 00:18:28,070 znaków dla znaku. 314 00:18:28,070 --> 00:18:30,020 >> Teraz mogłem zrobić to bardzo mozolnie. 315 00:18:30,020 --> 00:18:32,240 Ale swojsko, jesteśmy za pomocą pętli for. 316 00:18:32,240 --> 00:18:36,050 A wystarczy porównać wspornik s i przed wspornik T i. 317 00:18:36,050 --> 00:18:39,590 s uchwyt i Plus 1 przeciw t wspornika I oraz 1, i tak dalej, w środku 318 00:18:39,590 --> 00:18:40,580 pewnego rodzaju pętli. 319 00:18:40,580 --> 00:18:44,950 A jeśli zauważysz, że żadne dwa znaki różnią, czy zdaję sobie sprawę, że och, s jest 320 00:18:44,950 --> 00:18:48,410 krótszy niż t lub dłuższy niż t. Mogę od razu powiedzieć, fałszywe, 321 00:18:48,410 --> 00:18:49,390 że nie są same. 322 00:18:49,390 --> 00:18:55,370 >> Ale jeśli dostanę przez s i t i powiedzieć sam, sam, sam, sam, sam, koniec 323 00:18:55,370 --> 00:18:58,520 oba ciągi, mogę powiedzieć, prawda, są one równe. 324 00:18:58,520 --> 00:19:01,040 Cóż, na szczęście, rok temu ktoś napisał, że kod dla nas. 325 00:19:01,040 --> 00:19:03,790 >> I nazwali go StrComp na ciąg porównania. 326 00:19:03,790 --> 00:19:11,900 I choć jest to trochę sprzeczne intuicyjna, StrComp zwraca 0, jeśli te 327 00:19:11,900 --> 00:19:14,520 dwa łańcuchy, S i T są takie same. 328 00:19:14,520 --> 00:19:18,090 Ale zwraca wartość ujemną, jeśli s powinno się przed t alfabetycznie lub 329 00:19:18,090 --> 00:19:20,610 Wartość dodatnia czy powinien przyjść po t alfabetycznie. 330 00:19:20,610 --> 00:19:24,030 >> Więc jeśli kiedykolwiek chcemy ułożyć coś, Okazuje się, że StrComp jest przydatna. 331 00:19:24,030 --> 00:19:26,660 Bo to nie tylko powiedzieć, tak lub nie, jest równa lub nie. 332 00:19:26,660 --> 00:19:30,440 To daje poczucie zamawiania niczym potęgę słownika. 333 00:19:30,440 --> 00:19:33,770 Więc StrComp, s t równa przecinkami równa 0 oznacza, że 334 00:19:33,770 --> 00:19:35,200 Struny są naprawdę równe. 335 00:19:35,200 --> 00:19:38,680 Bo ten, kto napisał tę funkcję lat temu prawdopodobnie wykorzystywane do pętli 336 00:19:38,680 --> 00:19:42,840 lub pętla czy coś takiego zintegrować ciągu znaków ponownie 337 00:19:42,840 --> 00:19:45,270 i znowu i znowu. 338 00:19:45,270 --> 00:19:47,300 >> Ale dwa problem powstał tutaj. 339 00:19:47,300 --> 00:19:48,750 To był copy0.c. 340 00:19:48,750 --> 00:19:51,680 I dwa w kolorze czerwonym jest bo jest błędna. 341 00:19:51,680 --> 00:19:52,800 I co tu robimy? 342 00:19:52,800 --> 00:19:54,310 Cóż, najpierw zadzwoniłem GetString. 343 00:19:54,310 --> 00:19:56,255 I przechowywać wartości zwracanej w s. 344 00:19:56,255 --> 00:20:00,260 Więc to jest niemal tak samo, jak ta górna część obrazu. 345 00:20:00,260 --> 00:20:01,490 >> Ale to, co jest potem? 346 00:20:01,490 --> 00:20:04,980 Cóż, pozwól mi iść dalej i pozbyć z całą masę tego. 347 00:20:04,980 --> 00:20:09,650 Będziemy cofnąć się w czasie do miejsca, gdzie po prostu mają S, który jest teraz zgodne z 348 00:20:09,650 --> 00:20:10,940 linia jeden tam. 349 00:20:10,940 --> 00:20:11,400 >> I sprawdzić. 350 00:20:11,400 --> 00:20:13,450 Jeśli s jest równa jest równa 0. 351 00:20:13,450 --> 00:20:18,670 Teraz szybkie dygresja, gdy może GetString powrócić 0? 352 00:20:18,670 --> 00:20:19,580 Za mało pamięci, jest. 353 00:20:19,580 --> 00:20:19,880 Prawda? 354 00:20:19,880 --> 00:20:22,310 >> To rzadkie, że to się stanie, na pewno na komputerze, który jest 355 00:20:22,310 --> 00:20:24,740 dostaje setki megabajtów lub nawet koncerty pamięci RAM. 356 00:20:24,740 --> 00:20:27,080 Ale może to, w teorii, powrót 0, zwłaszcza jeśli 357 00:20:27,080 --> 00:20:28,080 użytkownik nie współpracuje. 358 00:20:28,080 --> 00:20:31,640 Nie ma sposobów, aby udawać, że nie ma wprowadzonym wszystko i Sztuką 359 00:20:31,640 --> 00:20:34,100 GetString do powrotu 0 skutecznie. 360 00:20:34,100 --> 00:20:35,470 >> Tak to się dzieje, aby sprawdzić, że. 361 00:20:35,470 --> 00:20:39,430 Bo jeśli ktoś z was zaczęli dostać, już, błędy segmentacji - 362 00:20:39,430 --> 00:20:42,280 który prawdopodobnie był źródłem jakiejś frustracji - 363 00:20:42,280 --> 00:20:46,150 te są prawie zawsze wynik z błędów związanych z pamięcią. 364 00:20:46,150 --> 00:20:50,440 Jakoś zawiedli w odniesieniu do wskaźnik, nawet jeśli nie zdawali sobie sprawy, 365 00:20:50,440 --> 00:20:51,530 był wskaźnik. 366 00:20:51,530 --> 00:20:55,260 Więc może skłoniły segmentacji błędy jak na początku jako jeden tydzień przy użyciu 367 00:20:55,260 --> 00:21:02,100 coś dla pętli lub podczas pętla i tablicą przez zbyt daleko idące 368 00:21:02,100 --> 00:21:05,900 przeszłości granice jakiejś tablicy, która Ci oświadczył w drugim tygodniu w 369 00:21:05,900 --> 00:21:06,690 szczególności. 370 00:21:06,690 --> 00:21:09,220 >> Możecie to zrobić nawet w problemie zestaw czterech z Breakout. 371 00:21:09,220 --> 00:21:12,910 Chociaż prawdopodobnie nie widziałeś jakieś gwiazdy w kodzie dystrybucji dla 372 00:21:12,910 --> 00:21:17,410 Breakout, okazuje się, że te GRect i GOval i inne takie rzeczy, 373 00:21:17,410 --> 00:21:19,650 Wskaźniki te są w rzeczywistości pod maską. 374 00:21:19,650 --> 00:21:23,430 >> Ale Stanford, podobnie jak my, rodzaju skóry które szczegółowo przynajmniej dla bibliotek 375 00:21:23,430 --> 00:21:26,540 celów, podobnie jak my dla łańcucha i char *. 376 00:21:26,540 --> 00:21:30,060 Ale GRect i GOval i wszystkich tych, rzeczy, chłopaki są lub będą używać 377 00:21:30,060 --> 00:21:32,630 w tym tygodniu są ostatecznie adresy pamięci. 378 00:21:32,630 --> 00:21:33,650 Po prostu nie wiem. 379 00:21:33,650 --> 00:21:37,240 >> Więc to nie jest zaskakujące to, być może, że może potknąć się niektóre 380 00:21:37,240 --> 00:21:38,580 wady segmentacji. 381 00:21:38,580 --> 00:21:41,290 Ale co ciekawe, tutaj, teraz, jeśli po tym sprawdzić 0 robimy 382 00:21:41,290 --> 00:21:43,460 ciąg t dostaje s. 383 00:21:43,460 --> 00:21:44,690 Cóż, pozwól mi oświadczyć, t. 384 00:21:44,690 --> 00:21:47,730 Mam zamiar wyciągnąć go jako kwadrat, 32 bitów, nazywamy to t. 385 00:21:47,730 --> 00:21:49,740 A potem mam zamiar zrobić, dostaje s.. 386 00:21:49,740 --> 00:21:51,130 >> No, co to oznacza? 387 00:21:51,130 --> 00:21:53,280 Cóż, to trochę trudno myśleć o to wyobrazić mądry. 388 00:21:53,280 --> 00:21:55,025 Ale pomyślmy o co jest w środku od x? 389 00:21:55,025 --> 00:21:59,430 Co znajduje się dosłownie w środku tej zmiennej? 390 00:21:59,430 --> 00:22:01,500 Ox123 wartość. 391 00:22:01,500 --> 00:22:05,815 >> Więc kiedy mówię ciąg t dostaje S, które po prostu oznacza dosłownie wziąć numer 392 00:22:05,815 --> 00:22:10,070 w S, który jest Ox123 i umieścić go Ox123. 393 00:22:10,070 --> 00:22:13,740 Albo obrazowo, jeśli rodzaj abstract od tego szczegółowo ma 394 00:22:13,740 --> 00:22:16,600 Efekt dosłownie robi To, a także. 395 00:22:16,600 --> 00:22:22,110 >> Więc teraz, że powrót do ostatniego tygodnia, kiedy przystąpiliśmy do kapitalistycznej T. I 396 00:22:22,110 --> 00:22:23,800 A wspornik T 0. 397 00:22:23,800 --> 00:22:27,150 Cóż, wspornik T 0, mimo że jest wskaźnik, można traktować go tak, jakby 398 00:22:27,150 --> 00:22:29,220 to tablica, z placu Zapis wspornik. 399 00:22:29,220 --> 00:22:31,550 >> Więc gdzie jest T Wspornik 0? 400 00:22:31,550 --> 00:22:32,990 Cóż, h. 401 00:22:32,990 --> 00:22:36,800 I tak, gdy używamy tego wiersza kodu, dwa górne, które jest w tym c type.h 402 00:22:36,800 --> 00:22:38,460 plik nagłówka, to gdzie jest zadeklarowana. 403 00:22:38,460 --> 00:22:44,410 Jesteś kapitalizacji to H. Ale Oczywiście, że jest dokładnie taki sam h to 404 00:22:44,410 --> 00:22:46,540 wewnątrz s, że tak powiem. 405 00:22:46,540 --> 00:22:51,930 I tak teraz zmieniłeś lub kapitalizowane zarówno oryginalne i 406 00:22:51,930 --> 00:22:53,120 tzw. kopia. 407 00:22:53,120 --> 00:22:56,620 Ponieważ nie tworzenia kopii sposób, że człowiek będzie chciał go mieć. 408 00:22:56,620 --> 00:22:59,710 >> Więc co było fix tutaj, w copy1.c ostatnim tygodniu? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funkcje, więc może rzeczywiście skopiować ciąg. 411 00:23:05,580 --> 00:23:08,700 I zasadniczo, co trzeba zrobić, aby skopiować ciąg? 412 00:23:08,700 --> 00:23:12,070 >> Cóż, w tej zielonej wersji tutaj jestem zamiar zrobić to dość niski poziom. 413 00:23:12,070 --> 00:23:14,260 Tak naprawdę są funkcje mogą w tym pomóc. 414 00:23:14,260 --> 00:23:17,710 Jednak najbardziej podstawową, a najbardziej znajomy, przynajmniej, będzie wkrótce 415 00:23:17,710 --> 00:23:19,600 nam znane, jest następujące - 416 00:23:19,600 --> 00:23:21,910 Tak więc jednym z pierwszego wiersza kodu na zielono teraz. 417 00:23:21,910 --> 00:23:23,970 >> I właśnie przepisał s jako char *. 418 00:23:23,970 --> 00:23:25,250 Nie ma funkcjonalne różnica istnieje. 419 00:23:25,250 --> 00:23:28,790 I po prostu wyrzucił CS50 biblioteki i Wzywam go, co to jest, char *. 420 00:23:28,790 --> 00:23:31,640 >> Teraz kropka, kropka, kropka, ponieważ nie było sprawdzanie błędów, które nie jest 421 00:23:31,640 --> 00:23:33,200 ciekawe porozmawiać o ponownie. 422 00:23:33,200 --> 00:23:34,710 Więc teraz t jest zadeklarowany. 423 00:23:34,710 --> 00:23:35,780 To też jest char *. 424 00:23:35,780 --> 00:23:38,280 Więc zwrócił mały kwadrat ekran jak wcześniej. 425 00:23:38,280 --> 00:23:41,870 >> Ale z prawej strony, malloc, powiedzieliśmy, jest pamięć przeznaczyć. 426 00:23:41,870 --> 00:23:44,130 Tak więc przeznaczyć pewną ilość pamięci. 427 00:23:44,130 --> 00:23:48,830 A ile bajtów faktycznie zrobić chcą przeznaczyć, to wydaje? 428 00:23:48,830 --> 00:23:50,340 >> Cóż, długość ciąg s. 429 00:23:50,340 --> 00:23:52,310 Więc jeśli jest to cześć to będzie pięć. 430 00:23:52,310 --> 00:23:53,950 Powiemy, h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Więc pięć bajtów. 432 00:23:55,090 --> 00:23:57,960 >> Ale potem Plus 1, dlaczego 1? 433 00:23:57,960 --> 00:23:58,830 0 postaci. 434 00:23:58,830 --> 00:24:03,640 Jeśli nie zostawić miejsce na tego faceta, że może stworzyć sytuację, przypadkowo 435 00:24:03,640 --> 00:24:05,600 gdzie ciąg jest h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 A potem następne GetString czas jest nazwie i wpisać, na przykład, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, komputer będzie myśleć, że s jest rzeczywiście 438 00:24:14,020 --> 00:24:18,900 g-e-l-l-O-D-A-V-I-D, ponieważ jest bez przerwy w między tymi słowami. 439 00:24:18,900 --> 00:24:19,810 >> Więc musimy, że przerwę. 440 00:24:19,810 --> 00:24:20,720 Więc nie chcemy pięć. 441 00:24:20,720 --> 00:24:22,100 Chcemy sześć bajtów. 442 00:24:22,100 --> 00:24:23,110 >> I bajtów mówię. 443 00:24:23,110 --> 00:24:25,220 Ale to naprawdę czas, rozmiar char. 444 00:24:25,220 --> 00:24:28,040 Technicznie char jest prawie zawsze jeden bajt. 445 00:24:28,040 --> 00:24:31,030 >> Ale tak, aby nasz kod przenośny, że tak powiem, tak, że działa on 446 00:24:31,030 --> 00:24:33,750 różnych komputerach, nawet jeśli może nieco różnić się pod 447 00:24:33,750 --> 00:24:36,590 kaptur, idę do ogólnie powiedzieć rozmiar char aby 448 00:24:36,590 --> 00:24:37,660 mój kod zawsze działa. 449 00:24:37,660 --> 00:24:40,610 I nie trzeba go po prostu przebudować bo uaktualnić komputer lub użyć 450 00:24:40,610 --> 00:24:42,140 kilka różnych platform. 451 00:24:42,140 --> 00:24:45,300 >> Więc mam 6 razy większa od char, co dzieje się w 1. 452 00:24:45,300 --> 00:24:47,440 Tak, że środki mogłyby malloc daj mi sześć bajtów. 453 00:24:47,440 --> 00:24:49,140 Co to jest, że faktycznie robi? 454 00:24:49,140 --> 00:24:52,810 Cóż, pozwól mi cofnąć się w czasie o , gdzie jesteśmy w tej historii. 455 00:24:52,810 --> 00:24:57,620 >> Więc jeśli tu wracam, mam zadeklarowane char * nazywa t. 456 00:24:57,620 --> 00:25:00,280 Mam teraz nazywa malloc do sześciu bajtów. 457 00:25:00,280 --> 00:25:06,400 A teraz mam zamiar wyciągnąć tych sześciu bajtów, podobnie jak tablica wcześniej. 458 00:25:06,400 --> 00:25:10,570 Ale ja naprawdę nie wiem, co jest wewnątrz tej tablicy. 459 00:25:10,570 --> 00:25:14,640 >> Jeśli przydzielić pamięci okazuje się, że nie można ufać, że istnieje jakiś 460 00:25:14,640 --> 00:25:15,810 znana wartość istnieje. 461 00:25:15,810 --> 00:25:18,400 Może to być wykorzystane przez coś inny, inna funkcja, inna 462 00:25:18,400 --> 00:25:19,630 linii kodu, który napisałeś. 463 00:25:19,630 --> 00:25:22,870 Będziemy więc ogólnie nazywają te śmieci wartości i narysować je, być może, jak 464 00:25:22,870 --> 00:25:26,170 znaki zapytania, po prostu wskazując, że nie wiem, co tak naprawdę tam. 465 00:25:26,170 --> 00:25:30,390 I to nie jest wielka sprawa, tak długo, jak długo są na tyle sprytny, aby zastąpić tych, 466 00:25:30,390 --> 00:25:34,550 wartości śmieci z numerami lub znaki, że zależy. 467 00:25:34,550 --> 00:25:36,340 >> Więc w tym przypadku co ja mam zrobić? 468 00:25:36,340 --> 00:25:38,670 Cóż, mój wiersz kodu następny, mam cztery. 469 00:25:38,670 --> 00:25:41,350 int i dostać 0, n pobiera Długość ciąg s. 470 00:25:41,350 --> 00:25:42,750 Więc zna na pętli. 471 00:25:42,750 --> 00:25:45,875 I jest mniejsza lub równa N, co zwykle jest powyżej. 472 00:25:45,875 --> 00:25:47,500 >> Ale tym razem jest to celowe. 473 00:25:47,500 --> 00:25:51,890 I + +, a potem po prostu zrobić t uchwyt i dostaje s. 474 00:25:51,890 --> 00:25:56,320 Ponieważ mój obraz wygląda to na ten moment, przechowywane w t jest 475 00:25:56,320 --> 00:25:59,530 adres tej pamięci kawałka losowej których wartości są nieznane. 476 00:25:59,530 --> 00:26:03,030 Ale tak szybko, jak to zrobić t wspornik 0, że stawia mnie tutaj. 477 00:26:03,030 --> 00:26:07,430 >> A co kończy się coraz wyciągnąć tam? 478 00:26:07,430 --> 00:26:08,740 Kończymy wprowadzanie godziny. 479 00:26:08,740 --> 00:26:11,170 Bo to, co jest na s uchwytem 0. 480 00:26:11,170 --> 00:26:14,300 A potem to samo dla e, i ja, i ja, i wy. 481 00:26:14,300 --> 00:26:17,930 >> n, dlaczego idę w górę przez równa n? 482 00:26:17,930 --> 00:26:19,200 Ze względu na charakter 0. 483 00:26:19,200 --> 00:26:23,580 Tak właśnie stało się jasne, a następnie, jeśli rzeczywiście usunięcie wszystkich tych śmieci 484 00:26:23,580 --> 00:26:28,870 wartości, a następnie rzeczywiście przyciągnąć czego oczekuję, to s uchwyt 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, a także, że to końcowe nowy charakter. 486 00:26:32,440 --> 00:26:36,080 >> A więc teraz, jeśli nadal obok kropki, kropka, kropka w poprawnej wersji 487 00:26:36,080 --> 00:26:41,930 i kapitalizowane wspornik t 0 będzie, z Oczywiście, jest czerpanie tylko ten 488 00:26:41,930 --> 00:26:47,050 facet tutaj, które koncepcyjnie, był ostatecznie celem. 489 00:26:47,050 --> 00:26:48,040 Więc to wszystko wskaźnik jest. 490 00:26:48,040 --> 00:26:51,430 >> I już przy ich tydzień teraz w ramach ciągów. 491 00:26:51,430 --> 00:26:53,530 Ale pod maską są nieco bardziej skomplikowane. 492 00:26:53,530 --> 00:26:57,520 Ale jeśli myślisz o nich w tym obrazowym forma proponuję, że są 493 00:26:57,520 --> 00:27:01,720 Prawdopodobnie nie wszyscy tak straszne jak oni może najpierw wydawać na pierwszy rzut oka, 494 00:27:01,720 --> 00:27:04,730 zwłaszcza w takiej nowej składni. 495 00:27:04,730 --> 00:27:07,290 Wszelkie pytania na temat wskaźników, łańcuchy lub znakowe? 496 00:27:07,290 --> 00:27:07,580 Tak? 497 00:27:07,580 --> 00:27:09,252 >> Odbiorcy: Czy można cofnąć do [niesłyszalne]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Jasne. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> PUBLICZNOŚCI: Więc jak to się stało w zeszłym twój bardzo linii, nie ma wiersza * t 501 00:27:19,525 --> 00:27:21,513 i * s w wierszu? 502 00:27:21,513 --> 00:27:23,004 Nie masz odniesienie do - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ach, bardzo dobre pytanie. 504 00:27:24,640 --> 00:27:26,800 Dlaczego nie mam T * i * s? 505 00:27:26,800 --> 00:27:30,340 Ze względu na krótko, w zeszłym tygodniu, podobnie jak w naszym zamienić funkcję I powiedziałem, że kiedy 506 00:27:30,340 --> 00:27:33,350 masz wskaźnik rozumie przez które się tam jak my 507 00:27:33,350 --> 00:27:36,590 fizycznie na scenie, było w rzeczywistości użyć operatora gwiazdy. 508 00:27:36,590 --> 00:27:40,570 >> Okazuje się, że ten nawias kwadratowy Zapis jest to, co my nazywamy składniowe 509 00:27:40,570 --> 00:27:44,190 cukier, który jest po prostu sexy sposób mówiąc, że to skrót dla notacji 510 00:27:44,190 --> 00:27:45,950 dokładnie to, co opisujesz. 511 00:27:45,950 --> 00:27:49,385 Ale to jest trochę bardziej intuicyjne. 512 00:27:49,385 --> 00:27:53,510 I na ryzyko podejmowania tego wydaje się bardziej skomplikowane niż musi być 513 00:27:53,510 --> 00:27:56,990 to, co tak naprawdę dzieje się tutaj jest następujący - 514 00:27:56,990 --> 00:28:01,450 Jeśli powiem, t * to znaczy pójść do adres przechowywane w t.. 515 00:28:01,450 --> 00:28:04,350 >> Tak dosłownie, jeśli t jest przechowywanie adres tej godz 516 00:28:04,350 --> 00:28:07,300 początkowo, * oznacza t tutaj. 517 00:28:07,300 --> 00:28:10,730 Teraz, to co t Wspornik 0 oznacza? 518 00:28:10,730 --> 00:28:11,560 Samo dokładne. 519 00:28:11,560 --> 00:28:13,510 To tylko trochę więcej użytkownik przyjazny pisać. 520 00:28:13,510 --> 00:28:14,430 >> Ale ja nie skończyłem. 521 00:28:14,430 --> 00:28:17,800 I nie można po prostu powiedzieć, * t dostaje * S. 522 00:28:17,800 --> 00:28:19,440 Bo co będę robić potem? 523 00:28:19,440 --> 00:28:22,950 I byłoby wprowadzenie h, h, h, h, h w całej rzeczy. 524 00:28:22,950 --> 00:28:22,995 Prawda? 525 00:28:22,995 --> 00:28:26,020 >> Ponieważ * t jest go na adres w t.. 526 00:28:26,020 --> 00:28:27,580 Ale my jesteśmy wewnątrz pętli. 527 00:28:27,580 --> 00:28:32,150 I co ja mam zwiększanie wartości, Oczywiście, w każdej iteracji? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Ale jest szansa tutaj, prawda? 530 00:28:34,590 --> 00:28:37,870 Pomimo tego, że czuje się jak to się trochę bardziej wyrafinowane 531 00:28:37,870 --> 00:28:40,730 niż notacji kwadratowej wspornika używaliśmy przez jakiś czas - 532 00:28:40,730 --> 00:28:43,840 pozwól mi cofnąć moją zmianę h tam - 533 00:28:43,840 --> 00:28:48,870 choć jest to teraz się trochę hodowcy, idea, jeśli * t 534 00:28:48,870 --> 00:28:53,630 oznacza tu i * t jest tylko go na adres w t.. 535 00:28:53,630 --> 00:28:54,990 >> Ale to, co adres w t? 536 00:28:54,990 --> 00:28:56,850 Liczba trzymamy za pomocą? 537 00:28:56,850 --> 00:29:00,540 Jak Ox456, niech wprowadzą, że powrót po prostu ze względu na dyskusji. 538 00:29:00,540 --> 00:29:05,380 Cóż, jeśli chcę uzyskać w e w t ciąg, po prostu chcę, aby przejść do, 539 00:29:05,380 --> 00:29:06,460 zasadniczo, 456. 540 00:29:06,460 --> 00:29:09,230 >> Albo raczej, 457. 541 00:29:09,230 --> 00:29:10,590 Muszę tylko dodać. 542 00:29:10,590 --> 00:29:11,790 Ale można to zrobić, prawda? 543 00:29:11,790 --> 00:29:14,680 Ponieważ t, chociaż zachować rysunek teraz jak strzała, to tylko 544 00:29:14,680 --> 00:29:16,570 liczba, Ox456. 545 00:29:16,570 --> 00:29:21,400 A jeśli do tego dodać jeden lub więcej generalnie, jeśli dodać I do tego mogę 546 00:29:21,400 --> 00:29:24,350 rzeczywiście się dokładnie tam, gdzie chcę. 547 00:29:24,350 --> 00:29:26,260 Więc jeśli rzeczywiście to zrobić - 548 00:29:26,260 --> 00:29:28,970 i to jest to, co teraz nazywa arytmetyczna pointer - 549 00:29:28,970 --> 00:29:30,375 Można usunąć tę linię. 550 00:29:30,375 --> 00:29:33,550 Która jest, szczerze mówiąc, myślę, że jaśniejsze i trochę bardziej przyjazny dla użytkownika, aby przeczytać. 551 00:29:33,550 --> 00:29:35,970 Nie jest to jednak mniej poprawne. 552 00:29:35,970 --> 00:29:38,570 >> Ten wiersz kodu teraz używa arytmetyczna wskaźnika. 553 00:29:38,570 --> 00:29:40,920 To mówiąc, przejdź do adres po - 554 00:29:40,920 --> 00:29:44,670 niezależnie od początku T jest, która jest t oraz i, które początkowo 555 00:29:44,670 --> 00:29:45,730 jest 0, co jest wspaniałe. 556 00:29:45,730 --> 00:29:49,280 Ponieważ oznacza to początek T oraz 1, oraz 2, 3 oraz, i tak dalej. 557 00:29:49,280 --> 00:29:51,030 A same zajmują się s. 558 00:29:51,030 --> 00:29:52,750 >> Tak syntaktyczne cukru do tego. 559 00:29:52,750 --> 00:29:55,900 Ale zrozumienie tego, co się naprawdę dzieje pod maską, jestem zdania, 560 00:29:55,900 --> 00:29:57,410 jest rzeczywiście przydatne w sobie. 561 00:29:57,410 --> 00:30:00,620 Bo to oznacza, teraz nie ma tam znacznie więcej magii dzieje 562 00:30:00,620 --> 00:30:01,620 pod maską. 563 00:30:01,620 --> 00:30:03,920 Nie będą wiele więcej warstwy, które możemy odwinąć dla Ciebie. 564 00:30:03,920 --> 00:30:04,810 To jest c. 565 00:30:04,810 --> 00:30:06,410 I to jest programowanie. 566 00:30:06,410 --> 00:30:08,002 Bardzo dobre pytanie. 567 00:30:08,002 --> 00:30:11,570 >> W porządku, więc to było to, że buggy Program miałem na myśli wcześniej. 568 00:30:11,570 --> 00:30:12,650 Swap był wadliwy. 569 00:30:12,650 --> 00:30:14,070 Jeśli nie wydaje się do pracy. 570 00:30:14,070 --> 00:30:17,390 Przypomnijmy, że tak jak w przypadku mleka i sok pomarańczowy - który zacząłem 571 00:30:17,390 --> 00:30:18,660 picia dzisiejszą demonstrację. 572 00:30:18,660 --> 00:30:22,220 Tak jak z soku pomarańczowego i mleko, my musieliśmy korzystać 573 00:30:22,220 --> 00:30:26,200 zmienna tymczasowa, tmp, do przechowywania chwilowo tak, że mogliśmy wtedy 574 00:30:26,200 --> 00:30:28,820 zmienić jego wartość, a następnie zaktualizować b. 575 00:30:28,820 --> 00:30:32,870 >> Ale ta funkcja, powiedzieliśmy, czy to Program, w którym funkcja ta była 576 00:30:32,870 --> 00:30:35,670 napisane było złe i błędne, dlaczego? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Tak? 579 00:30:39,090 --> 00:30:42,471 >> PUBLICZNOŚCI: [niesłyszalne]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Dokładnie, kiedy nazywasz swap - 581 00:30:44,940 --> 00:30:47,820 lub, bardziej ogólnie, gdy zadzwoń najwięcej żadnej funkcji - 582 00:30:47,820 --> 00:30:51,210 jeśli argumenty do tej funkcji są prymitywne, że tak powiem, ints i znakowe 583 00:30:51,210 --> 00:30:56,740 i dwuosobowe i pływaków, rzeczy, bez gwiazdy, jesteś przejazdem w kopii 584 00:30:56,740 --> 00:30:57,540 argument. 585 00:30:57,540 --> 00:31:01,580 Tak więc, jeśli był 1 x i y wynosi 2, będzie się 1 i B będzie 2. 586 00:31:01,580 --> 00:31:05,250 Ale oni będą mieć różne kawałki bitów, kawałki różnych od 587 00:31:05,250 --> 00:31:07,540 pamięci, które stało się przechowywanie identyczne wartości. 588 00:31:07,540 --> 00:31:12,160 >> Więc ten kod jest super perfect na zamianę a i b. 589 00:31:12,160 --> 00:31:13,850 To nie jest dobry na zamianę - 590 00:31:13,850 --> 00:31:15,290 w zeszłym tygodniu przykład - 591 00:31:15,290 --> 00:31:16,390 x i y. 592 00:31:16,390 --> 00:31:18,780 Bo znowu, są w niewłaściwym zakresie. 593 00:31:18,780 --> 00:31:21,310 >> Teraz, jak myśmy go o ustaleniu tego? 594 00:31:21,310 --> 00:31:23,140 Musieliśmy funkcję wygląda trochę brzydsze. 595 00:31:23,140 --> 00:31:25,250 Ale znowu, za co oznacza to po prostu. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> I rzeczywiście, niech mnie, dla zachowania spójności, zmienić jedną rzecz, więc jest to identyczne 598 00:31:31,500 --> 00:31:33,200 co właśnie zrobiliśmy. 599 00:31:33,200 --> 00:31:35,690 Jak już wspomniałem w zeszłym tygodniu, to nie znaczenia, gdzie to idzie. 600 00:31:35,690 --> 00:31:38,120 W rzeczywistości, zwykle będzie można umieścić gwiazdka obok nazwy zmiennej. 601 00:31:38,120 --> 00:31:40,750 Ale myślę, że to będzie trochę łatwiej rozważyć * obok 602 00:31:40,750 --> 00:31:44,910 Typ danych w ten sposób, że jest to wskaźnik do int w tym przypadku. 603 00:31:44,910 --> 00:31:46,270 >> Więc co ja tu robię? 604 00:31:46,270 --> 00:31:49,590 Mówię, że nie dają mi int następnie innym int, 605 00:31:49,590 --> 00:31:50,810 nazywając je i b. 606 00:31:50,810 --> 00:31:52,460 Daj mi adres wew. 607 00:31:52,460 --> 00:31:53,960 Daj mi adres innego int. 608 00:31:53,960 --> 00:31:56,330 Zadzwoń do tych adresów a i b. 609 00:31:56,330 --> 00:32:00,860 >> A następnie za pomocą notacji * dół poniżej, przejdź do każdego z tych adresów 610 00:32:00,860 --> 00:32:05,290 w razie potrzeby albo dostać lub ustawić jego wartość. 611 00:32:05,290 --> 00:32:07,400 Ale jest tu wyjątkiem. 612 00:32:07,400 --> 00:32:11,130 Dlaczego nie mam * obok tmp? 613 00:32:11,130 --> 00:32:15,070 Dlaczego nie zrobić tego, na przykład? 614 00:32:15,070 --> 00:32:19,370 Czuje się jak należy po prostu pójść na całość out i poprawić całość. 615 00:32:19,370 --> 00:32:19,752 Tak? 616 00:32:19,752 --> 00:32:21,002 >> PUBLICZNOŚCI: [niesłyszalne]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: I nie zadeklarowały tmp jako ciąg. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Więc to ogłosi, w tym przypadku, tmp być adres wew. 621 00:32:34,950 --> 00:32:37,380 Ale to nie całkiem to, czego chcę, na kilka powodów. 622 00:32:37,380 --> 00:32:38,616 >> PUBLICZNOŚCI: Nie chcesz, aby zamienić je. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Dokładnie, ja nie chcę, aby zamienić Wszystko z tmp. tmp jest tylko 624 00:32:41,800 --> 00:32:42,790 tydzień jeden rzeczy. 625 00:32:42,790 --> 00:32:45,150 Wszystko czego chcę to zmienna do przechowywania numeru. 626 00:32:45,150 --> 00:32:47,330 I nawet nie obchodzi adresów w tym momencie. 627 00:32:47,330 --> 00:32:50,530 >> Muszę tylko 32 bitów lub więc przechowywać int. 628 00:32:50,530 --> 00:32:56,690 I chcę, aby umieścić w tych 32 bitach , co nie jest, że tak powiem, ale 629 00:32:56,690 --> 00:33:01,260 to, co jest, po prostu, aby być bardziej precyzyjnym. 630 00:33:01,260 --> 00:33:06,420 Bo jeśli jest adres, * oznacza tam i uzyskać wartość 1. 631 00:33:06,420 --> 00:33:10,560 Na przykład w ubiegłym tygodniu np. lub w przypadku b, uzyskać wartość 2. 632 00:33:10,560 --> 00:33:11,750 >> Więc co tak naprawdę chodzi? 633 00:33:11,750 --> 00:33:15,070 Pozwól mi narysować obrazek tutaj, które będą tylko odciąć część dzisiejszego. 634 00:33:15,070 --> 00:33:18,580 Ale to nadal będzie pojawiać już od jakiegoś czasu. 635 00:33:18,580 --> 00:33:22,430 >> To, jak twierdzą, jest to, co komputer-tych Pamięć wygląda po uruchomieniu 636 00:33:22,430 --> 00:33:24,060 Program, każdy program. 637 00:33:24,060 --> 00:33:28,340 Po uruchomieniu programu, na samym szczycie z pamięci komputera - tak myśleć 638 00:33:28,340 --> 00:33:33,530 ten prostokąt, naprawdę, jak twój pamięci RAM lub pamięci, wszystkie 101 639 00:33:33,530 --> 00:33:36,920 miliard bajtów, wszystko dwa miliardy bajtów, wszystkie dwóch gigabajtów nim, 640 00:33:36,920 --> 00:33:39,910 bez względu na ilość masz to, niech wyciągnąć go jako prostokąt. 641 00:33:39,910 --> 00:33:43,260 I twierdzą, że po uruchomieniu programu jak Microsoft Word czy Chrome 642 00:33:43,260 --> 00:33:49,220 lub coś w tym stylu, bity, że Microsoft lub Google napisał - 643 00:33:49,220 --> 00:33:50,910 w przypadku tych programów - 644 00:33:50,910 --> 00:33:54,490 są ładowane do pamięci komputera w którym mogą być wykonane więcej 645 00:33:54,490 --> 00:33:57,520 szybko i wprowadzanymi do procesora, który jest mózgiem komputera. 646 00:33:57,520 --> 00:34:00,940 >> I TAM są przechowywane w bardzo początku programu, że tak powiem. 647 00:34:00,940 --> 00:34:03,300 Innymi słowy, czy jest to fragment pamięci, po dwukrotnym kliknięciu na 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, bity pochodzą wyłączyć dysk twardy. 649 00:34:05,740 --> 00:34:06,680 Są one ładowane do pamięci RAM. 650 00:34:06,680 --> 00:34:10,330 I będziemy pchać je na samej górze tego prostokąta koncepcyjnie. 651 00:34:10,330 --> 00:34:13,010 >> Cóż, reszta pamięci jest wykorzystywane do różnych rzeczy. 652 00:34:13,010 --> 00:34:16,460 Na samej górze widać zainicjować danych i odinicjować danych. 653 00:34:16,460 --> 00:34:20,500 Wiąże się to, na ogół, z Stałe i zmienne globalne 654 00:34:20,500 --> 00:34:21,340 , które mają wartości. 655 00:34:21,340 --> 00:34:22,980 Ale o tym innym razem. 656 00:34:22,980 --> 00:34:25,150 >> Potem masz kupę, która wrócimy do. 657 00:34:25,150 --> 00:34:28,420 Ale na dole jest część, która znajduje się szczególnie Germane teraz. 658 00:34:28,420 --> 00:34:30,210 Jest to tak zwany stos. 659 00:34:30,210 --> 00:34:33,850 Więc tak jak w niemal każdej sali D tu na campus, masz te zasobniki, które 660 00:34:33,850 --> 00:34:37,210 tylko jedna na siebie na co można umieścić żywności i etażerka. 661 00:34:37,210 --> 00:34:40,139 Stosu w systemie komputerowym jest bardzo podobny. 662 00:34:40,139 --> 00:34:42,679 Poza natomiast tacy, jak używać w jadalnia, oczywiście, jest przeznaczona 663 00:34:42,679 --> 00:34:45,710 do przewozu rzeczy, tace lub ramki - 664 00:34:45,710 --> 00:34:49,469 jako nazwijmy je - w komputerze pamięci jest używana do przechowywania 665 00:34:49,469 --> 00:34:51,610 zmienne i wartości. 666 00:34:51,610 --> 00:34:53,929 >> Więc co tak naprawdę dzieje się pod maską? 667 00:34:53,929 --> 00:34:55,820 Cóż, pozwól mi odwrócić do tego ekranu. 668 00:34:55,820 --> 00:34:58,370 I skupmy się tylko na Dolna część na chwilę. 669 00:34:58,370 --> 00:35:02,770 Jeśli jest to dolna część mojej pamięci komputera okazuje się, kiedy 670 00:35:02,770 --> 00:35:05,350 wywołanie funkcji main - co się dzieje, szczerze mówiąc, 671 00:35:05,350 --> 00:35:06,950 automatycznie dla mnie - 672 00:35:06,950 --> 00:35:10,510 Mam kawałek pamięci na Dno mojej pamięci RAM, tak powiem. 673 00:35:10,510 --> 00:35:13,390 I to jest główny jest zmienne lokalne iść. 674 00:35:13,390 --> 00:35:16,770 To gdzie argc i argv może go, i wszelkie zmienne I 675 00:35:16,770 --> 00:35:18,170 Oświadczam wewnątrz main. 676 00:35:18,170 --> 00:35:20,260 Kończy się w dolnej części mojej pamięci RAM komputera. 677 00:35:20,260 --> 00:35:25,040 >> Teraz załóżmy, że główne połączenia funkcji jak wymiany, jak to było w zeszłym tygodniu? 678 00:35:25,040 --> 00:35:30,620 Cóż, w zasadzie umieścić nowy zasobnik, Nowa rama, na mój kawałek pamięci. 679 00:35:30,620 --> 00:35:34,160 I mam zamiar opisać to jako należące do funkcji swap. 680 00:35:34,160 --> 00:35:35,770 >> Teraz to, co jest w środku z wymiany? 681 00:35:35,770 --> 00:35:39,240 Cóż, na podstawie zeszłotygodniowej programu i jeden po prostu zobaczył fragment, 682 00:35:39,240 --> 00:35:46,590 wewnątrz swap w ramce lub na Swap tacy, to co zmienne? 683 00:35:46,590 --> 00:35:47,970 Cóż, ib. 684 00:35:47,970 --> 00:35:51,850 Ponieważ były to jej lokalne argumenty, oraz trzeci, TMP. 685 00:35:51,850 --> 00:35:54,470 Tak naprawdę, to mogę narysować trochę bardziej czysto. 686 00:35:54,470 --> 00:35:56,680 Pozwólcie mi iść do przodu i cofnąć etykietę. 687 00:35:56,680 --> 00:35:58,520 I pozwól mi twierdzić, że wiesz, co? 688 00:35:58,520 --> 00:36:00,560 >> prawdopodobnie będzie do końca się tutaj. 689 00:36:00,560 --> 00:36:02,160 B ma zakończyć się tutaj. 690 00:36:02,160 --> 00:36:03,810 I tmp skończy się tutaj. 691 00:36:03,810 --> 00:36:05,160 Teraz zamawiający może być nieco inna. 692 00:36:05,160 --> 00:36:06,840 Ale koncepcyjnie jest to pomysł. 693 00:36:06,840 --> 00:36:11,490 >> I tak wspólnie, to co zadzwonimy Swap rama, lub 694 00:36:11,490 --> 00:36:12,136 dining-hall tray. 695 00:36:12,136 --> 00:36:13,150 A sama umowa z głównym. 696 00:36:13,150 --> 00:36:14,040 Ale nie przerysować to. 697 00:36:14,040 --> 00:36:17,810 Ale to gdzie argc i argv i wszelkie swoich zmiennych lokalnych, takich jak X i Y 698 00:36:17,810 --> 00:36:18,940 mogą być również. 699 00:36:18,940 --> 00:36:22,170 >> Więc teraz zastanowić się, co się naprawdę dzieje gdy dzwonisz swapa. 700 00:36:22,170 --> 00:36:26,370 Po wywołaniu swapa, jak kod wykonujący ta, jesteś przekazując w 701 00:36:26,370 --> 00:36:30,670 wersja buggy, i b jako kopie x i y. 702 00:36:30,670 --> 00:36:34,300 Więc jeśli nie teraz zwrócić na to Na ekranie - 703 00:36:34,300 --> 00:36:36,700 dostał się lepiej na to - 704 00:36:36,700 --> 00:36:40,850 więc historia I mówił do siebie było w tym buggy wersji, kiedy 705 00:36:40,850 --> 00:36:46,130 zadzwoń zamienić przechodząc dosłownie i B jako liczby całkowite, co się naprawdę dzieje? 706 00:36:46,130 --> 00:36:48,250 >> Cóż, co się naprawdę dzieje, jest to. 707 00:36:48,250 --> 00:36:52,850 Pozwólcie mi iść do przodu i cofnąć tylko wyczyścić trochę miejsca tutaj. 708 00:36:52,850 --> 00:36:54,720 Więc to jest mój pamięci komputera. 709 00:36:54,720 --> 00:36:57,510 >> Więc jeśli mam na przykład - 710 00:36:57,510 --> 00:36:58,910 faktycznie zróbmy to w ten sposób - 711 00:36:58,910 --> 00:37:02,690 jeśli twierdzą, że jest to x, przechowywania wartość 1, tak jak w zeszłym tygodniu. 712 00:37:02,690 --> 00:37:05,930 I to jest y, przechowywania wartości 2, podobnie jak w zeszłym tygodniu. 713 00:37:05,930 --> 00:37:11,370 I to jest główny, gdy zgłoszę swapa, tym samym dając sobie dostęp do i 714 00:37:11,370 --> 00:37:15,150 b i tmp, zamierzam twierdzić, że To jest i to jest 1. 715 00:37:15,150 --> 00:37:16,080 >> To jest b. 716 00:37:16,080 --> 00:37:17,010 To jest 2. 717 00:37:17,010 --> 00:37:18,370 To jest nazywane TMP. 718 00:37:18,370 --> 00:37:23,360 >> I początkowo, to ma jakąś wartość śmieci aż rzeczywiście przechowywać w to, 719 00:37:23,360 --> 00:37:24,450 co jest 1. 720 00:37:24,450 --> 00:37:28,320 Potem idę dalej i zmienić za co? 721 00:37:28,320 --> 00:37:29,720 B w cenie. 722 00:37:29,720 --> 00:37:31,980 >> A więc teraz mam dwa tutaj. 723 00:37:31,980 --> 00:37:34,050 A potem powiedział: b dostaje tmp. 724 00:37:34,050 --> 00:37:37,670 Ponownie, tak jak zdrowy rozsądek sprawdzić, trzeci linii kodu tutaj jest po prostu to 725 00:37:37,670 --> 00:37:39,440 jeden, b dostaje tmp. 726 00:37:39,440 --> 00:37:41,730 >> I tak na koniec, co mam zrobić? 727 00:37:41,730 --> 00:37:46,800 I iść dalej i zmienić b być cokolwiek Wartość TMP, który jest 1. 728 00:37:46,800 --> 00:37:48,390 I nie dotykaj tmp ponownie. 729 00:37:48,390 --> 00:37:54,100 >> Ale teraz jest problem, jak tylko swapu powróci, ponieważ nie jest oddaniem 730 00:37:54,100 --> 00:37:57,540 kopii jakąś wartość, nie ma powrotu oświadczenie wyraźnie w nim. 731 00:37:57,540 --> 00:37:59,080 Co się właściwie dzieje? 732 00:37:59,080 --> 00:38:03,480 Cóż, w zasadzie wszystko to pamięć - 733 00:38:03,480 --> 00:38:07,410 OK, najwyraźniej gumka lubi tylko jeden palec na raz - 734 00:38:07,410 --> 00:38:08,180 po prostu znika. 735 00:38:08,180 --> 00:38:10,070 >> Teraz w rzeczywistości to nie jest nigdzie. 736 00:38:10,070 --> 00:38:11,810 Ale można myśleć teraz jako znaki zapytania. 737 00:38:11,810 --> 00:38:14,040 Bo to już nie faktycznie stosowane. 738 00:38:14,040 --> 00:38:17,470 I nic się nie dzieje z tymi wartościami. 739 00:38:17,470 --> 00:38:21,920 >> Tak więc w przypadku zielonej wersji ten kod, co zamiast tego jest 740 00:38:21,920 --> 00:38:24,640 przeszedł do wymiany? 741 00:38:24,640 --> 00:38:25,770 Więc rozwiązuje. 742 00:38:25,770 --> 00:38:28,520 Więc adres xi adres y. 743 00:38:28,520 --> 00:38:35,790 Jeśli więc ponownie opowiedzieć tę historię po raz ostatni czas, i faktycznie wyciągnąć swapa znowu 744 00:38:35,790 --> 00:38:44,620 ale ze wskaźnikami, co jest to jest b, a to tmp jest, to, co jest 745 00:38:44,620 --> 00:38:49,080 faktycznie przechowywane w tym zielony wersja mojego kodu, gdzie jestem przechodzącej 746 00:38:49,080 --> 00:38:52,110 w adresach? 747 00:38:52,110 --> 00:38:53,780 >> To będzie wskaźnikiem do x. 748 00:38:53,780 --> 00:38:54,890 Więc mogę narysować strzałkę. 749 00:38:54,890 --> 00:38:57,310 Ale użyjmy samo arbitralne Przykładem, jak wcześniej. 750 00:38:57,310 --> 00:39:01,220 Powiedzmy, że jest to coś jak Ox123. 751 00:39:01,220 --> 00:39:04,970 I to ma być Ox127 ponieważ to cztery bajty z dala, bo to 752 00:39:04,970 --> 00:39:07,370 int, więc Ox127. 753 00:39:07,370 --> 00:39:09,080 >> I znowu, biorę kilka wolności z numerami. 754 00:39:09,080 --> 00:39:11,430 Są one znacznie mniejsze niż oni faktycznie w innej kolejności. 755 00:39:11,430 --> 00:39:14,350 Ale to, jak obraz jest teraz inna. 756 00:39:14,350 --> 00:39:19,060 >> Ale kiedy używam ten zielony kod i mam int tmp uzyskać *. 757 00:39:19,060 --> 00:39:25,010 * Środkiem do wykonaj następujące czynności, podejmują rozwiązanie to jest w i przejdź do niego 758 00:39:25,010 --> 00:39:26,190 co jest 1. 759 00:39:26,190 --> 00:39:28,480 I to jest to, co ja wtedy umieścić w tmp. 760 00:39:28,480 --> 00:39:32,480 W tym samym czasie, w kolejnej linii kodu tutaj, * dostaje b, co to oznacza? 761 00:39:32,480 --> 00:39:36,910 >> Cóż, *, więc go tutaj dostaje * b, co oznacza, że ​​tam. 762 00:39:36,910 --> 00:39:39,310 A to oznacza, umieścić wartość tam. 763 00:39:39,310 --> 00:39:43,670 Wreszcie ostatnia linia kodu po prostu powiedział, * b dostaje tmp. 764 00:39:43,670 --> 00:39:48,900 >> Tak b mówi tam i zastąpić ją tmp, które, w tym przypadku, będzie 765 00:39:48,900 --> 00:39:51,520 się, ponownie, 1. 766 00:39:51,520 --> 00:39:54,920 I dlatego zielona wersja nasz kod działa, natomiast czerwony 767 00:39:54,920 --> 00:39:56,010 wersja nigdy nie zrobił. 768 00:39:56,010 --> 00:39:59,020 To wszystko to tylko sprowadza się do tego, jak Pamięć jest zarządzana i gdzie jest 769 00:39:59,020 --> 00:40:02,580 rzeczywiście umieszczone w pamięci RAM komputera. 770 00:40:02,580 --> 00:40:07,270 I teraz, że to jedna z tych rzeczy, że stos jest używany do. 771 00:40:07,270 --> 00:40:09,225 >> Pytania dotyczące układu? 772 00:40:09,225 --> 00:40:10,380 Na wskaźniki? 773 00:40:10,380 --> 00:40:11,630 Lub wymiany? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> W porządku, więc malloc, przypomnijmy, czy coś takiego. 776 00:40:17,043 --> 00:40:18,260 To był bardzo prosty przykład. 777 00:40:18,260 --> 00:40:20,550 I to było to, że Binky przedstawił nas, choć dość 778 00:40:20,550 --> 00:40:21,870 szybko, na końcu klasy. 779 00:40:21,870 --> 00:40:24,480 Cholera, to znowu my. 780 00:40:24,480 --> 00:40:28,780 >> Więc przypominam, że jest to przykład, że Binky przedstawił nas, choć 781 00:40:28,780 --> 00:40:30,360 dość szybko, na końcu klasy. 782 00:40:30,360 --> 00:40:33,640 I tu używane malloc naprawdę po raz drugi. 783 00:40:33,640 --> 00:40:37,330 , Ponieważ po raz pierwszy, że stosuje się go stworzenie wystarczającej ilości pamięci RAM, przydzielić wystarczającej ilości pamięci RAM 784 00:40:37,330 --> 00:40:38,340 do przechowywania łańcucha. 785 00:40:38,340 --> 00:40:40,250 >> Tym razem Binky przechowywane it simple. 786 00:40:40,250 --> 00:40:42,465 Więc to, aby przechowywać tylko int, najwyraźniej. 787 00:40:42,465 --> 00:40:43,510 I to jest całkowicie w porządku. 788 00:40:43,510 --> 00:40:46,560 To trochę dziwne, szczerze mówiąc, do użyć malloc przydzielić jeden int. 789 00:40:46,560 --> 00:40:50,650 Ale punktem claymation Nicka było naprawdę tylko opowiedzieć historię jakich 790 00:40:50,650 --> 00:40:53,830 się dzieje lub nie dzieje, gdy można znęcać pamięć. 791 00:40:53,830 --> 00:40:56,520 >> Tak więc, w tym przypadku, program zrobił kilka rzeczy. 792 00:40:56,520 --> 00:41:01,580 W pierwszym przypadku tutaj, deklaruje wskaźnik o nazwie x do int. 793 00:41:01,580 --> 00:41:04,480 Następnie deklaruje wskaźnik nazywa y do int. 794 00:41:04,480 --> 00:41:06,150 Następnie przechowuje w X, to co? 795 00:41:06,150 --> 00:41:07,110 Ktoś teraz. 796 00:41:07,110 --> 00:41:09,685 Co zostanie zapisane w zależności od x Trzecia linia tego programu? 797 00:41:09,685 --> 00:41:12,380 >> PUBLICZNOŚCI: [niesłyszalne]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: No, nie całkiem bajtów, na powiedzieć. 799 00:41:14,130 --> 00:41:16,760 Dokładniej teraz. 800 00:41:16,760 --> 00:41:18,325 Co zostanie zapisane w X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Adres, myślę, że to usłyszał. 803 00:41:22,060 --> 00:41:23,570 >> Więc co malloc powrócić? 804 00:41:23,570 --> 00:41:26,030 malloc behawioralnie przydziela fragment pamięci. 805 00:41:26,030 --> 00:41:27,850 Ale jak to daje dostęp do niego? 806 00:41:27,850 --> 00:41:29,460 Zwraca co? 807 00:41:29,460 --> 00:41:32,000 Adres pierwszego bajta w ilość pamięci. 808 00:41:32,000 --> 00:41:33,020 >> Teraz, jest to bardzo proste. 809 00:41:33,020 --> 00:41:35,380 To tylko jeden bajt, co oznacza, zajęcia wracamy jest 810 00:41:35,380 --> 00:41:37,300 adres całość. 811 00:41:37,300 --> 00:41:42,070 Tak przechowywane wx Następnie jest adres tego fragmentu pamięci. 812 00:41:42,070 --> 00:41:43,400 Tymczasem to, co dzieje się dalej? 813 00:41:43,400 --> 00:41:45,890 Więc rzeczywiście, idziemy do przodu i narysować to się naprawdę szybko. 814 00:41:45,890 --> 00:41:52,490 >> Jeśli więc przejść do ekranu tu i gramy na to int * x i int * y 815 00:41:52,490 --> 00:41:53,740 będzie robić to, co dla mnie? 816 00:41:53,740 --> 00:41:58,280 I twierdzą, że to po prostu zrobić coś takiego i nazywają to x, a 817 00:41:58,280 --> 00:42:00,010 to i nazywają to y. 818 00:42:00,010 --> 00:42:03,110 Tymczasem trzeci wiersz kodu zamierza przeznaczyć rozmiaru int, 819 00:42:03,110 --> 00:42:06,160 co zdarza się - przepraszam, jeśli powiedziałem jeden przed I oznaczało jedno int - 820 00:42:06,160 --> 00:42:08,280 cztery bajty na typowym komputerze. 821 00:42:08,280 --> 00:42:09,720 Przynajmniej z CS50 urządzenia. 822 00:42:09,720 --> 00:42:11,490 >> Więc to zamierza przeznaczyć to, kto wie? 823 00:42:11,490 --> 00:42:12,800 Gdzieś tutaj. 824 00:42:12,800 --> 00:42:15,780 I jest przechowywany w niektórych Ox adres, kto wie? 825 00:42:15,780 --> 00:42:18,330 Ale co się dzieje, aby wrócił jest to, że adres. 826 00:42:18,330 --> 00:42:22,270 Ale będziemy rysować to obrazowo jak tylko strzałka tak. 827 00:42:22,270 --> 00:42:25,430 >> Teraz w następnej linii * x ma 42. 828 00:42:25,430 --> 00:42:29,400 Co * x oznacza w laika? 829 00:42:29,400 --> 00:42:30,040 Właśnie tam. 830 00:42:30,040 --> 00:42:30,960 Przejdź do tego adresu. 831 00:42:30,960 --> 00:42:35,900 Innymi słowy, należy strzałka i umieścić 42 tam. 832 00:42:35,900 --> 00:42:38,140 Ale potem stało się coś złego, do Binky, prawda? 833 00:42:38,140 --> 00:42:43,950 >> Przypomnijmy, że linię pięć Tutaj * y dostaje 13, rzeczywiście pechowy numer, 834 00:42:43,950 --> 00:42:44,760 co zrobił dla nas? 835 00:42:44,760 --> 00:42:47,320 Cóż, * oznacza, y tam. 836 00:42:47,320 --> 00:42:50,460 Cóż, to nie została podana wartość jeszcze, prawda? 837 00:42:50,460 --> 00:42:54,090 Kod nie posiada y jest inicjowany do niczego. 838 00:42:54,090 --> 00:42:56,120 Mieliśmy x inicjowany do adresu. 839 00:42:56,120 --> 00:42:57,640 Ale r został ogłoszony na szczyt. 840 00:42:57,640 --> 00:43:00,250 Ale wtedy średnik, brak wartości faktycznie umieścić w nim. 841 00:43:00,250 --> 00:43:02,330 Więc śmiało nazwać wartość śmieci. 842 00:43:02,330 --> 00:43:03,430 Kto wie, co tam jest? 843 00:43:03,430 --> 00:43:07,160 To resztki bitów, które były używane przez jakiegoś poprzedniego wiersza kodu w 844 00:43:07,160 --> 00:43:08,300 mój program. 845 00:43:08,300 --> 00:43:13,250 >> Więc jeśli powiem, idź tam, to jest jak, Nie mam pojęcia, gdzie to jest strzałka 846 00:43:13,250 --> 00:43:14,490 skończy. 847 00:43:14,490 --> 00:43:17,720 I wtedy zazwyczaj uzyskać winy segmentacji. 848 00:43:17,720 --> 00:43:22,430 Jeśli przez przypadek nieprawidłowego, tak aby mówić, lub przejść do adresu, który nie znajduje się 849 00:43:22,430 --> 00:43:25,400 faktycznie uzasadnione adres, dzieją się złe rzeczy. 850 00:43:25,400 --> 00:43:27,550 >> I to jest dokładnie to, co się stało myśleć Binky. 851 00:43:27,550 --> 00:43:31,060 Tak więc przypomnieć, że historia, że ​​Nick był mówienie tutaj był sam pomysł jak to, co 852 00:43:31,060 --> 00:43:34,050 Mam wyciągnąć z iluzji kredy na tablicy tam. 853 00:43:34,050 --> 00:43:35,960 X i Y są zadeklarowane. 854 00:43:35,960 --> 00:43:39,690 >> Następnie przydzielono wielkość int i przechowywać go w x. 855 00:43:39,690 --> 00:43:42,130 Potem następna linia zrobiliśmy * x. 856 00:43:42,130 --> 00:43:46,070 To była magiczna różdżka Nicka z dereferencji. 857 00:43:46,070 --> 00:43:49,780 To umieścić 42 w pamięci wskazał x. 858 00:43:49,780 --> 00:43:51,600 >> Ale to jest, gdy wszystko poszło fatalnie. 859 00:43:51,600 --> 00:43:51,820 Prawda? 860 00:43:51,820 --> 00:43:53,550 Staramy się, aby y nieprawidłowego. 861 00:43:53,550 --> 00:43:55,620 Ale y miał jakieś fałszywe wartości, prawda? 862 00:43:55,620 --> 00:43:57,720 >> Że strzałka w lewym dolnym róg, nie jest 863 00:43:57,720 --> 00:43:58,950 faktycznie wskazuje na nic. 864 00:43:58,950 --> 00:44:01,520 To niby robi to, co ja A tutaj na forum. 865 00:44:01,520 --> 00:44:05,900 Tak złe rzeczy przytrafiają, segmentacja wina wina lub Binky, w tym przypadku. 866 00:44:05,900 --> 00:44:10,800 >> Ale jeśli to naprawić wykonując x ma y Jak zmiana historia? 867 00:44:10,800 --> 00:44:15,760 Cóż, jeśli mam zrobić X dostaje Y, który jest skutecznie same jak mówi 868 00:44:15,760 --> 00:44:19,235 cokolwiek to jest, Ox-coś będzie tutaj sama, 869 00:44:19,235 --> 00:44:20,080 Ox-coś. 870 00:44:20,080 --> 00:44:22,970 Albo obrazowo będziemy narysować strzałkę. 871 00:44:22,970 --> 00:44:25,530 >> Więc tutaj na pokładzie Binky, w następnym wierszu 872 00:44:25,530 --> 00:44:28,350 kod * y oznacza tam. 873 00:44:28,350 --> 00:44:29,400 Gdzie to jest? 874 00:44:29,400 --> 00:44:30,820 Oznacza to tutaj. 875 00:44:30,820 --> 00:44:36,050 >> A gdy aktualizujemy że być 13 to po prostu wymaga to przejścia i 876 00:44:36,050 --> 00:44:39,470 pisząc 13 tutaj. 877 00:44:39,470 --> 00:44:44,130 Więc być może nie w pełni proste na pierwszy rzut oka. 878 00:44:44,130 --> 00:44:47,740 Ale aby podsumować i korzystać z tego samego żargonu że Binky używał tutaj, więc 879 00:44:47,740 --> 00:44:50,485 Pierwsze dwa przydzielić wskaźników, x i y, ale nie pointees. 880 00:44:50,485 --> 00:44:54,750 I pointees nie jest powszechnie używane określenie. 881 00:44:54,750 --> 00:44:56,120 Ale wskaźnik absolutnie jest. 882 00:44:56,120 --> 00:44:59,200 Ale to, co jest wskazać co w nomenklaturze binky za. 883 00:44:59,200 --> 00:45:01,660 >> Ten następny wiersz, oczywiście, przydziela int pointee. 884 00:45:01,660 --> 00:45:04,840 Więc fragment pamięci - jak zwrócił na na prawa strona istnieje - a set 885 00:45:04,840 --> 00:45:06,470 x równa się wskazywać na to. 886 00:45:06,470 --> 00:45:11,350 Ten x dereferences do przechowywania 42 w pamięci, że to wskazuje na. 887 00:45:11,350 --> 00:45:13,380 , A następnie to, oczywiście, było złe. 888 00:45:13,380 --> 00:45:15,600 Bo y nie wskazując na nic jeszcze. 889 00:45:15,600 --> 00:45:16,530 To rozwiązuje go. 890 00:45:16,530 --> 00:45:18,240 Więc to jest nadal buggy programu. 891 00:45:18,240 --> 00:45:21,580 Tylko dlatego, że jesteśmy dmuchanie przez linia po linii i kod mówią, no cóż, 892 00:45:21,580 --> 00:45:22,690 pozwól mu upaść tam. 893 00:45:22,690 --> 00:45:23,420 To jest złe. 894 00:45:23,420 --> 00:45:26,790 Kursy są program jest po prostu będzie przerwać w ogóle na tej linii. 895 00:45:26,790 --> 00:45:30,550 Ale jeśli były do ​​usunięcia awarii linii i zastąpienie go dwóch ostatnich 896 00:45:30,550 --> 00:45:32,470 wierszy przypisywane - 897 00:45:32,470 --> 00:45:35,310 używając przypisanie wskaźnika - Y wskazać x jako punkt T. 898 00:45:35,310 --> 00:45:39,280 I wtedy nieprawidłowego y w sposób bardzo bezpieczny. 899 00:45:39,280 --> 00:45:41,520 >> Więc gdzie to nas? 900 00:45:41,520 --> 00:45:45,350 Cóż, okazuje się, że pod maską w CS50 biblioteki, wskaźniki są 901 00:45:45,350 --> 00:45:46,320 używane w całym. 902 00:45:46,320 --> 00:45:48,910 A my zacząć się łuszczyć z powrotem, że warstwa przed długi. 903 00:45:48,910 --> 00:45:51,740 Ale okazuje się też, Wyrażenie Niektórzy z was mogą znać, 904 00:45:51,740 --> 00:45:54,580 szczególnie tych bardziej komfortowe, jest w rzeczywistości, że z bardzo popularne 905 00:45:54,580 --> 00:45:56,390 strona www, lub przepełnienie stosu, te dni. 906 00:45:56,390 --> 00:45:58,720 >> Ale to faktycznie ma bardzo techniczne znaczenie. 907 00:45:58,720 --> 00:46:00,160 Teraz już wiemy, co stos jest. 908 00:46:00,160 --> 00:46:02,550 To jak stos tac wewnątrz sali jadalnej. 909 00:46:02,550 --> 00:46:05,140 >> Albo wewnątrz komputer tych pamięc te ramki 910 00:46:05,140 --> 00:46:06,900 , które są wykorzystywane przez funkcje. 911 00:46:06,900 --> 00:46:10,760 Cóż, okazuje się, że z tego powodu bardzo proste wdrożenie 912 00:46:10,760 --> 00:46:14,970 Pamięć i ramki na tzw stos, rzeczywiście można kontrolować 913 00:46:14,970 --> 00:46:17,050 systemu komputerowego stosunkowo łatwo. 914 00:46:17,050 --> 00:46:22,180 Można włamać się do systemu, jeśli ludzie jak my nie napisałem nasz kod 915 00:46:22,180 --> 00:46:23,300 szczególnie dobrze. 916 00:46:23,300 --> 00:46:26,670 >> Jeśli ludzie tacy jak my użyć kawałki z pamięci lub wykorzystanie tablic - 917 00:46:26,670 --> 00:46:27,810 nawet częściej - 918 00:46:27,810 --> 00:46:31,800 ale czasami zapomnij sprawdzić Granice naszej tablicy, jak może 919 00:46:31,800 --> 00:46:38,470 mają się czasami, i powtórzyć zbyt daleko poza koniec tablicy. 920 00:46:38,470 --> 00:46:40,520 W najlepszym przypadku, program może po prostu upaść. 921 00:46:40,520 --> 00:46:42,280 Segmentation fault, kind żenujące. 922 00:46:42,280 --> 00:46:45,480 Nie jest wspaniały, ale nie jest to koniecznie niezwykle złe. 923 00:46:45,480 --> 00:46:49,480 >> Ale jeśli program jest rzeczywiście na prawdziwe komputery użytkowników, czy to działa 924 00:46:49,480 --> 00:46:53,070 na stronie internetowej, że faktyczne przypadkowych ludzi w internecie są uderzenia, pozwalając 925 00:46:53,070 --> 00:46:56,690 osób wywoływać złych rzeczy na kodzie jest generalnie nie jest dobrą rzeczą, ponieważ 926 00:46:56,690 --> 00:46:59,930 oznacza to możliwość wzięcia sterowanie komputerem. 927 00:46:59,930 --> 00:47:01,350 I to będzie wyglądać trochę tajemnicze. 928 00:47:01,350 --> 00:47:04,570 Ale myślałem, że cię przestraszyć Ten ostatni przykład tutaj. 929 00:47:04,570 --> 00:47:05,650 >> Oto przykład kodu. 930 00:47:05,650 --> 00:47:07,370 I jest dobry Wikipedia artykuł, który idzie przez 931 00:47:07,370 --> 00:47:08,530 Ten bardziej szczegółowo. 932 00:47:08,530 --> 00:47:13,890 Mam głównym na dole dzwoniącej foo, przekazując argv z 1. 933 00:47:13,890 --> 00:47:15,750 I to jest tak, że można uruchom program i przekazać 934 00:47:15,750 --> 00:47:17,080 arbitralne wejście. 935 00:47:17,080 --> 00:47:20,180 >> I wtedy foo deklaruje się top jak przyjmowanie ciąg, lub więcej 936 00:47:20,180 --> 00:47:21,700 dokładnie, char *. 937 00:47:21,700 --> 00:47:23,860 Następnie deklaruje tablicę znaków. 938 00:47:23,860 --> 00:47:27,130 Nazywają to bufor, bardziej ogólnie, od wielkości 12. 939 00:47:27,130 --> 00:47:30,900 Tak 12 znaków może zmieścić tej tablicy o nazwie c. 940 00:47:30,900 --> 00:47:33,510 >> A następnie używa tej nowej funkcji, co jest nowe, ale nie trudno 941 00:47:33,510 --> 00:47:34,930 rozumiem, kopię pamięci. 942 00:47:34,930 --> 00:47:39,290 Program kopiuje pamięć z baru, który był Zmienna n przeszłości, bez względu 943 00:47:39,290 --> 00:47:42,080 użytkownik wpisze do argv 1 do C. 944 00:47:42,080 --> 00:47:43,090 Ile bajtów? 945 00:47:43,090 --> 00:47:44,260 Długość ciąg barze. 946 00:47:44,260 --> 00:47:48,380 >> Tak więc, innymi słowy, jeśli użytkownik wpisuje h-e-l-l-o enter, długość ciągu 947 00:47:48,380 --> 00:47:49,260 z komentarzy jest pięć. 948 00:47:49,260 --> 00:47:52,790 Więc pięć z tych bajtów dostanie kopiowane do tablicy o nazwie c, który 949 00:47:52,790 --> 00:47:54,110 ma wielkość 12. 950 00:47:54,110 --> 00:47:58,710 Ale to, co użytkownik wpisze w znacznie dłużej Słowo to jest 13 znaków lub 14 951 00:47:58,710 --> 00:48:01,250 znaków lub 100 znaków lub więcej? 952 00:48:01,250 --> 00:48:02,660 >> Gdzie oni pójdą? 953 00:48:02,660 --> 00:48:06,090 Dobrze, że ramka, że ​​tacy w dining-hall stosie, 954 00:48:06,090 --> 00:48:06,930 oni będą tam. 955 00:48:06,930 --> 00:48:10,080 I to właśnie zamierza rozpocząć nadpisywanie inne rzeczy, które już 956 00:48:10,080 --> 00:48:12,880 na tym stosie, przepełnione stos, że tak powiem. 957 00:48:12,880 --> 00:48:14,780 >> Tak obrazowo, myślę o tym w ten sposób. 958 00:48:14,780 --> 00:48:17,970 To jest po prostu kolorowe wersja obraz, który został nam rysunek. 959 00:48:17,970 --> 00:48:20,060 Na dole, powiedzmy, jest głównym. 960 00:48:20,060 --> 00:48:24,690 A na górze, co widzisz teraz jest ramka, kolorami teraz, 961 00:48:24,690 --> 00:48:26,090 Funkcja o nazwie foo. 962 00:48:26,090 --> 00:48:30,170 Ale co ciekawe, tutaj o foo jest to, że tutaj jest jego rama. 963 00:48:30,170 --> 00:48:32,860 Więc to wyciągnąć jak I A jednak w kolorze jasnoniebieskim. 964 00:48:32,860 --> 00:48:35,220 A teraz to, gdzie c wspornik 0 idzie. 965 00:48:35,220 --> 00:48:37,410 I to jest, gdy c wspornik 11 zamierza skończyć. 966 00:48:37,410 --> 00:48:39,670 >> Innymi słowy zdarza się, aby być reprezentowana jako kwadrat. 967 00:48:39,670 --> 00:48:42,320 Ale jeśli po prostu zachować plopping bajtów down - lub znaki - oni będą do końca 968 00:48:42,320 --> 00:48:46,070 się w położeniu 0 aż do góry do 11, bo to 0 indeksowane. 969 00:48:46,070 --> 00:48:49,170 >> Ale gdzie jest 13 znaków skończy? 970 00:48:49,170 --> 00:48:50,310 Gdzie jest 14.? 971 00:48:50,310 --> 00:48:52,430 Gdzie jest 50-znaków skończy? 972 00:48:52,430 --> 00:48:54,070 >> To się nie poddawać się w dół. 973 00:48:54,070 --> 00:48:57,350 Bo nawet jeśli mamy wyciągnąć obraz z stos rośnie, 974 00:48:57,350 --> 00:48:59,920 adresy, okazuje się, przejść od małe adresy, małe 975 00:48:59,920 --> 00:49:01,830 wskaźniki, do dużych adresów. 976 00:49:01,830 --> 00:49:03,540 Tak więc to właśnie tam dzieje się i up. 977 00:49:03,540 --> 00:49:05,660 >> Jeśli więc użytkownik wpisze w hello, to świetnie. 978 00:49:05,660 --> 00:49:08,650 Nie błąd, nie ma problemu, każdy jest bezpieczny. 979 00:49:08,650 --> 00:49:11,940 Ale jeśli użytkownik wpisze w to, co my będziemy wywołać nieprzyjazne kod, reprezentowany 980 00:49:11,940 --> 00:49:16,040 ogólnie jako, atak, atak, atak, atak, co może się zdarzyć? 981 00:49:16,040 --> 00:49:19,760 >> Dobrze, jeśli wszystkie wprowadzone przez użytkownika wpisany w nie tylko niektóre przyjazny 982 00:49:19,760 --> 00:49:21,540 lub obraźliwe ciąg znaków. 983 00:49:21,540 --> 00:49:24,050 W rzeczywistości jest to ciąg znaków że jeśli on skompilowany, 984 00:49:24,050 --> 00:49:26,050 faktycznie jest kod. 985 00:49:26,050 --> 00:49:29,570 Być może jest to kod, który usuwa wszystkie pliki na dysku twardym lub wysyła spam 986 00:49:29,570 --> 00:49:30,810 lub coś w tym stylu. 987 00:49:30,810 --> 00:49:35,110 Zauważ, że to, co jest kluczem do tego jest to, że jeśli zły facet ma szczęście 988 00:49:35,110 --> 00:49:37,830 zastąpić czerwony kawałek pamięci - 989 00:49:37,830 --> 00:49:41,080 co nie zwrócić na moim zdjęciu, ale ten obraz Wikipedia ma tu - 990 00:49:41,080 --> 00:49:42,890 jego tak zwany adres zwrotny. 991 00:49:42,890 --> 00:49:47,470 >> Kiedy wraca jedzenie, po powrocie swap, w jaki sposób komputer wie, aby przejść od 992 00:49:47,470 --> 00:49:49,790 tutaj na dole? 993 00:49:49,790 --> 00:49:52,920 Albo w tech segmencie się powyżej, jak to wiedzieć, aby przejść od swapu 994 00:49:52,920 --> 00:49:54,870 Kod - 0 i 1-tych że komponowanie swap - 995 00:49:54,870 --> 00:49:56,020 powrót na stronę główną? 996 00:49:56,020 --> 00:50:00,450 Jest tak zwany adres zwrotny przechowywane w tej samej ramce stosu, na 997 00:50:00,450 --> 00:50:02,140 same tray kawiarnia. 998 00:50:02,140 --> 00:50:06,080 >> Więc jeśli zły facet jest na tyle sprytny, aby umieścić kod ataku, kod atak, atak 999 00:50:06,080 --> 00:50:07,960 kod i uzyskać szczęście - 1000 00:50:07,960 --> 00:50:11,630 często metodą prób i błędów - do nadpisać ten czerwony adres zwrotny, 1001 00:50:11,630 --> 00:50:14,360 z adresem i ogłoszenia górze. 1002 00:50:14,360 --> 00:50:16,830 Wskazówka 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Jest napisany do góry do tyłu powodów będziemy być może zrewidować. 1004 00:50:20,650 --> 00:50:22,050 To, że liczba. 1005 00:50:22,050 --> 00:50:25,790 >> Więc jeśli bad guy dostaje szczęście lub jest na tyle sprytny, aby zastąpić czerwony 1006 00:50:25,790 --> 00:50:29,480 pas pamięci z adresem Kod, że on lub ona ma jakiś 1007 00:50:29,480 --> 00:50:34,980 wstrzykiwany do komputera, chyba, którego Kod ma być zwrócone 1008 00:50:34,980 --> 00:50:38,260 tak szybko, jak foo odbywa realizacji? 1009 00:50:38,260 --> 00:50:39,440 >> Zły facet kod. 1010 00:50:39,440 --> 00:50:43,610 Więc ten kod ataku, AAA, znowu, może rozsyłania spamu, może usunąć wszystkie pliki 1011 00:50:43,610 --> 00:50:44,500 na dysku twardym. 1012 00:50:44,500 --> 00:50:48,740 Ale to, co naprawdę przepełnienie stosu jest, lub przepełnienia buforu, lub 1013 00:50:48,740 --> 00:50:51,060 atak przepełnienia bufora. 1014 00:50:51,060 --> 00:50:54,400 >> I to jest bardzo, bardzo powszechne do tej pory z programów napisanych w 1015 00:50:54,400 --> 00:50:58,220 C, C + +, a nawet niektóre inne języki. 1016 00:50:58,220 --> 00:51:02,275 W tym przerażającym notatki, my będziemy kończy się żart. 1017 00:51:02,275 --> 00:51:03,230 >> [Śmiech] 1018 00:51:03,230 --> 00:51:04,550 >> Do zobaczenia w środę. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Na następnym CS50 - 1021 00:51:10,310 --> 00:51:15,920 Więc ja jestem z lamp na dysku, ale dzisiaj czekaj, beztłuszczowe mleko, pół telefon 1022 00:51:15,920 --> 00:51:17,850 Książka, sok pomarańczowy że wypiłem dziś. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Kabel USB, klucz. 1025 00:51:22,780 --> 00:51:24,800 >> [Odtwarzanie muzyki]