1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [TYDZIEŃ 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [To jest CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Kobieta] On kłamie, o co, ja nie wiem. 5 00:00:17,780 --> 00:00:20,300 [Man] Więc co wiemy? 6 00:00:20,300 --> 00:00:24,120 [Kobieta] To w 9:15, Ray Santoya było w bankomacie. 7 00:00:24,120 --> 00:00:27,420 [Man] Więc pytanie jest, co on robi w 9:16? 8 00:00:27,420 --> 00:00:29,980 [Kobieta] Strzelanie z 9 mm na coś. 9 00:00:29,980 --> 00:00:31,900 Może widział snajpera. 10 00:00:31,900 --> 00:00:34,000 [Man] Albo pracował z nim. 11 00:00:34,000 --> 00:00:36,330 [Kobieta] Czekaj. Wróć jeden. 12 00:00:36,330 --> 00:00:38,330 [Man] Co widzisz? 13 00:00:38,330 --> 00:00:44,520 [♫ napięciu muzyka ♫] 14 00:00:44,520 --> 00:00:48,320 [Kobieta] Przynieś swoją twarz. Pełny ekran. 15 00:00:48,320 --> 00:00:51,230 [Człowiek] okulary. >> Jest odbiciem. 16 00:00:51,230 --> 00:01:00,810 [♫ napięciu muzyka ♫] 17 00:01:00,810 --> 00:01:03,580 [Man] To Nuevita zespół baseball. To jest ich logo. 18 00:01:03,580 --> 00:01:07,790 [Kobieta] A on mówi do każdego, kto ma na sobie tę kurtkę. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Tak, to jest CS50 tygodni 5, a dziś ruiny trochę telewizji i filmu dla Ciebie. 20 00:01:13,730 --> 00:01:16,170 Jeśli więc patrzysz pokaz jak ten tutaj, 21 00:01:16,170 --> 00:01:19,910 i policjanci mówią "można oczyścić, że do?" lub "Rozszerzony" 22 00:01:19,910 --> 00:01:21,900 nie zwiększyć w rzeczywistości. 23 00:01:21,900 --> 00:01:25,220 W rzeczywistości to, co naprawdę jest trochę coś takiego. 24 00:01:25,220 --> 00:01:27,570 Wcześniej zatrzymał się jedno ze zdjęć ze strony personelu. 25 00:01:27,570 --> 00:01:30,980 Jest to program o nazwie Photoshop. To jest 1 z 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 z 3 Bowdens rzeczywiście, dziś, bo mamy panią Bowden również tutaj, z Robem i Pawła. 27 00:01:36,300 --> 00:01:41,950 Ale tutaj jest Rob na ekranie i jeśli powiększyć na tym błyskiem, że zawsze miał na oku, 28 00:01:41,950 --> 00:01:47,600 co zobaczyć, że rzeczywiście jest to, że to, co widzisz, to co masz. 29 00:01:47,600 --> 00:01:51,690 To jest "wzmocniona", więc "CSI" ma to trochę nie tak. 30 00:01:51,690 --> 00:01:55,190 Jest jeszcze jeden klip, jeśli uda nam się wybrać na "CSI", tylko trochę dłużej. 31 00:01:55,190 --> 00:01:58,500 Ten jest ładny zdanie wypowiedzieć odtąd, jeśli chcesz 32 00:01:58,500 --> 00:02:10,280 gruntowne przeszkolenie techniczne ze swoimi znajomymi, kiedy naprawdę, mówisz absolutnie nic. 33 00:02:10,280 --> 00:02:12,970 >> [Man] Na tydzień byłem śledztwo Taksówkarz morderstw Zabójca 34 00:02:12,970 --> 00:02:15,360 z pewnym chorobliwej fascynacji. 35 00:02:15,360 --> 00:02:17,160 [Kobieta # 1] To jest w czasie rzeczywistym. 36 00:02:17,160 --> 00:02:22,930 [Kobieta # 2] Ja utworzyć interfejsu GUI w języku Visual Basic, czy można śledzić adres IP. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Więc dźwięk zsynchronizowany bok, tworząc interfejs GUI w języku Visual Basic 38 00:02:29,570 --> 00:02:31,820 śledzić adres IP jest kompletny nonsens. 39 00:02:31,820 --> 00:02:33,840 Te dni nie będziesz używać Visual Basic, 40 00:02:33,840 --> 00:02:38,920 nie ma potrzeby dla GUI, oraz adres IP był technicznie dokładny termin. 41 00:02:38,920 --> 00:02:41,730 Więc miej oko na nich, a jeden z moich ulubionych: 42 00:02:41,730 --> 00:02:45,070 Ten jest trochę bardziej ezoteryczne, ponieważ musisz wiedzieć, inny język. 43 00:02:45,070 --> 00:02:47,860 Jest to język o nazwie Objective-C, która jest rozszerzeniem C. 44 00:02:47,860 --> 00:02:51,960 Co oznacza, że ​​to C plus kilka dodatkowych funkcji, a wśród nich programowanie obiektowe. 45 00:02:51,960 --> 00:02:55,070 I to jest język, że Apple spopularyzował programowania iOS. 46 00:02:55,070 --> 00:02:58,760 I tak oto klip z innej wystawie w ogóle z "Numbers" 47 00:02:58,760 --> 00:03:02,450 że jeśli rzeczywiście uważnie na TiVo i pauzy w odpowiednim momencie, 48 00:03:02,450 --> 00:03:07,700 przekonasz się, że to, czego szukają na nie jest całkiem co jest opisane. 49 00:03:07,700 --> 00:03:11,170 I pozwól mi spróbować innego złącze audio tutaj i zobacz, czy nie możemy 50 00:03:11,170 --> 00:03:13,780 zachować audio w synchronizacji tym razem. 51 00:03:13,780 --> 00:03:20,530 Daję wam "Numbers". 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Jest to 32-bitowy adres IPv4. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, to jest Internet. >> Sieci prywatnej. Jest to prywatna sieć Anity. 54 00:03:38,930 --> 00:03:43,810 [Malan] Dobra. To jest Objective-C, a to jest dla jakiś dzieciak programu barwiące, 55 00:03:43,810 --> 00:03:51,140 jak można być może wywnioskować z nazwy zmiennej tam. 56 00:03:51,140 --> 00:03:54,410 Tak, że to, to "liczby." Więc dzisiaj, aw tym tygodniu przedstawiamy 57 00:03:54,410 --> 00:03:57,740 trochę świata kryminalistyki i kontekstu, w problemach dlatego. 58 00:03:57,740 --> 00:04:00,590 Dzisiaj będzie skrócona wykład bo jest szczególnym wydarzeniem w tutaj 59 00:04:00,590 --> 00:04:05,530 potem, więc będziemy zerknąć i drażnić zarówno studentów, jak i rodziców już dziś 60 00:04:05,530 --> 00:04:07,420 niektóre z rzeczy, które są na horyzoncie. 61 00:04:07,420 --> 00:04:12,240 Wśród nich, od poniedziałku, będzie jeszcze kilka kolegów. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard i MIT nowa inicjatywa online na otwartym szkoleniowych 63 00:04:16,050 --> 00:04:19,120 i więcej, jest uruchomienie na terenie kampusu Uniwersytetu Harvarda w poniedziałek. 64 00:04:19,120 --> 00:04:21,490 Co oznacza, że ​​pochodzą poniedziałek trzeba będzie - jak z ostatniego liczenia, 65 00:04:21,490 --> 00:04:26,210 86.000 dodatkowych koledzy będą śledzić razem z jego wykładów CS50 66 00:04:26,210 --> 00:04:29,170 i sekcje i solucje i zestawy problem. 67 00:04:29,170 --> 00:04:32,350 I jako część tego, staniecie się członkami klasy inauguracyjnym 68 00:04:32,350 --> 00:04:35,090 CS50 i teraz CS50x. 69 00:04:35,090 --> 00:04:39,310 >> W ramach tego, teraz sobie sprawę, że będzie kilka upsides również. 70 00:04:39,310 --> 00:04:43,790 Aby przygotować się do tego, do ogromnej liczby uczniów, 71 00:04:43,790 --> 00:04:47,180 wystarczy powiedzieć, że nawet jeśli mamy 108 TFS i CAS, 72 00:04:47,180 --> 00:04:50,790 nie dość najlepszy uczeń / nauczyciel Stosunek raz trafiliśmy 80.000 innych uczniów. 73 00:04:50,790 --> 00:04:52,850 Więc nie będzie tak wiele klasyfikacji problemu ustawia ręcznie. 74 00:04:52,850 --> 00:04:55,920 Tak przedstawił w tym tygodniu w zestawie problem zostanie CS50 Check, 75 00:04:55,920 --> 00:04:58,450 który będzie narzędzie linii poleceń wewnątrz urządzenia 76 00:04:58,450 --> 00:05:01,200 że dostaniesz po zaktualizowaniu go później w ten weekend, 77 00:05:01,200 --> 00:05:03,200 i będzie można uruchomić polecenie, sprawdzić 50, 78 00:05:03,200 --> 00:05:06,500 na własnym PSET, a otrzymasz informację zwrotną o tym, czy program jest 79 00:05:06,500 --> 00:05:11,160 poprawny lub według różnych specyfikacji projektowych, które podajemy. 80 00:05:11,160 --> 00:05:13,580 Więc więcej na które i specyfikacja zestawu problem i 81 00:05:13,580 --> 00:05:17,240 na CS50x koledzy będą korzystać to za dobrze. 82 00:05:17,240 --> 00:05:19,230 >> Więc zestaw Problem 4 jest o kryminalistyce. 83 00:05:19,230 --> 00:05:21,940 A ten kawałek był inspirowany przez niektóre rzeczy rzeczywistych, 84 00:05:21,940 --> 00:05:24,620 przy czym, gdy byłem na studiach, I internowany był przez pewien czas 85 00:05:24,620 --> 00:05:28,650 Kancelaria Middlesex County District Attorney robi ekspertyzy, 86 00:05:28,650 --> 00:05:31,650 ich główny badacz kryminalistycznych, a co ta wyniosła 87 00:05:31,650 --> 00:05:35,260 jest, myślę, że podały kilka tygodni w przeszłość, to masa policji państwowej lub inne 88 00:05:35,260 --> 00:05:39,000 przychodził, to oni zostawić rzeczy jak dyski twarde i płyty CD i dyskietki 89 00:05:39,000 --> 00:05:42,340 i tym podobne, a następnie celem Urzędu kryminalistycznych było stwierdzenie, czy 90 00:05:42,340 --> 00:05:44,600 był lub nie był dowód pewnego rodzaju. 91 00:05:44,600 --> 00:05:48,010 To było specjalne Dochodzenia, więc było umysłowych przestępczości, 92 00:05:48,010 --> 00:05:52,350 to było bardziej niepokojące rodzaju przestępstw, 93 00:05:52,350 --> 00:05:55,990 coś z udziałem jakiś mediów cyfrowych; okazuje się, że nie, że wiele osób 94 00:05:55,990 --> 00:05:59,370 napisać e-maila o treści "ja to zrobiłem". 95 00:05:59,370 --> 00:06:03,290 Więc dość często te kryminalistyki wyszukiwania nie pojawił się aż tak dużo owoców, 96 00:06:03,290 --> 00:06:05,850 ale czasem ludzie będą pisać takie maile. 97 00:06:05,850 --> 00:06:08,490 Więc czasami wysiłki zostały nagrodzone. 98 00:06:08,490 --> 00:06:14,420 >> Ale żeby doprowadzić do tego kryminalistycznych PSET, będziemy wprowadzenie w Pset 4 bitowej grafiki. 99 00:06:14,420 --> 00:06:18,260 Więc prawdopodobnie wziąć te rzeczy za oczywiste, JPEG, GIF i jak w tych dniach, 100 00:06:18,260 --> 00:06:21,640 ale jeśli naprawdę myślisz o tym, obraz, podobnie jak twarz Roba, 101 00:06:21,640 --> 00:06:24,430 mogą być modelowane jako sekwencja kropek lub pikseli. 102 00:06:24,430 --> 00:06:26,680 Obecnie, w przypadku powierzchni Roba, nie wszystkie rodzaje kolorów 103 00:06:26,680 --> 00:06:29,940 i zaczęliśmy zobaczyć poszczególne kropki, otherwide zwanych pikselami, 104 00:06:29,940 --> 00:06:31,610 raz zaczęliśmy, aby powiększyć 105 00:06:31,610 --> 00:06:35,590 Ale jeśli uprościć świat trochę i po prostu powiedzieć, że to tutaj jest Rob 106 00:06:35,590 --> 00:06:40,560 w czerni i bieli, dobrze, do reprezentowania czarny i biały możemy po prostu użyć binarny. 107 00:06:40,560 --> 00:06:44,960 A jeśli będziemy używać binarnych, 1 lub 0, możemy wyrazić ten sam obraz 108 00:06:44,960 --> 00:06:51,970 z uśmiechem na twarzy Roba z tego wzorca bitów: 11000011 reprezentuje 109 00:06:51,970 --> 00:06:55,160 biały, biały, czarny, czarny, czarny, czarny, biały. 110 00:06:55,160 --> 00:06:59,290 A więc to nie jest ogromny skok, a następnie, aby zacząć mówić o kolorowych fotografii. 111 00:06:59,290 --> 00:07:01,920 Rzeczy, które można zobaczyć na Facebooku lub wziąć z aparatu cyfrowego, 112 00:07:01,920 --> 00:07:04,730 ale, z pewnością, jeśli chodzi o kolory, potrzebujesz więcej bitów. 113 00:07:04,730 --> 00:07:08,470 I dość powszechne w świecie fotografii jest używać nie 1-bitowy kolor, 114 00:07:08,470 --> 00:07:12,730 jak to sugeruje, ale 24-bitowy kolor, w którym rzeczywiście się miliony kolorów. 115 00:07:12,730 --> 00:07:15,430 Tak więc, jak w przypadku, gdy w powiększeniu na oko Roba, 116 00:07:15,430 --> 00:07:19,270 to było dowolną liczbę milionów różnych kolorowych możliwości. 117 00:07:19,270 --> 00:07:22,260 >> Więc będziemy wprowadzać ten zestaw problemów 4, jak również w instrukcji 118 00:07:22,260 --> 00:07:27,050 który będzie dziś o 3:30, zamiast zwykłej 2:30 bo wykładu piątkowego tutaj. 119 00:07:27,050 --> 00:07:29,930 Ale wideo online będzie, jak zwykle, jutro. 120 00:07:29,930 --> 00:07:31,880 Będziemy także wprowadzenie do innego formatu pliku. 121 00:07:31,880 --> 00:07:34,150 Więc to jest celowo ma wyglądać zastraszenia w pierwszym, 122 00:07:34,150 --> 00:07:38,980 ale jest to tylko część dokumentacji struct C. 123 00:07:38,980 --> 00:07:42,280 Okazuje się, że Microsoft, rok temu, pomógł spopularyzować ten format, 124 00:07:42,280 --> 00:07:46,630 nazywany bitmap format, BMP, i to był super-proste, 125 00:07:46,630 --> 00:07:50,390 Kolorowy graficzny format pliku, który był używany przez dłuższy czas 126 00:07:50,390 --> 00:07:53,640 a czasami jeszcze do tapet na pulpitach. 127 00:07:53,640 --> 00:07:57,410 Jeśli uważasz, że powrót do systemu Windows XP i pagórki i błękitne niebo, 128 00:07:57,410 --> 00:08:00,660 że był typowo BMP lub bitmapy, a bitmapy 129 00:08:00,660 --> 00:08:03,340 są zabawne dla nas, bo mają trochę więcej złożoności. 130 00:08:03,340 --> 00:08:05,640 To nie jest takie proste, jak się to siatce 0 i 1 s; 131 00:08:05,640 --> 00:08:10,680 zamiast tego masz takie rzeczy jak nagłówek na początku pliku. 132 00:08:10,680 --> 00:08:15,520 Więc innymi słowy, wewnątrz pliku. Bmp jest cała masa 0 i nr 1, 133 00:08:15,520 --> 00:08:18,070 ale jest kilka dodatkowych 0 i 1 jest w środku. 134 00:08:18,070 --> 00:08:21,450 I okazuje się, że to, co zapewne za pewnik przez lata, 135 00:08:21,450 --> 00:08:27,040 formaty plików, takie jak. doc lub. xls lub. mp3 lub mp4,. 136 00:08:27,040 --> 00:08:29,910 niezależnie od formatów, że jesteś zaznajomiony. 137 00:08:29,910 --> 00:08:31,900 No, co to w ogóle znaczy być format pliku? 138 00:08:31,900 --> 00:08:35,740 Ponieważ na końcu dnia, wszystkie te pliki mają tylko używamy 0 i 1 ' 139 00:08:35,740 --> 00:08:39,950 i może te 0 i 1 'stanowią a, b, c, ASCII lub podobnego, 140 00:08:39,950 --> 00:08:42,030 ale przez koniec dnia, to tylko 0 i 1 '. 141 00:08:42,030 --> 00:08:45,300 >> Więc ludzie, tylko sporadycznie decydują się stworzyć nowy format pliku 142 00:08:45,300 --> 00:08:49,420 gdzie standaryzacja co wzorce bitów rzeczywiście myśli. 143 00:08:49,420 --> 00:08:52,790 I w tym przypadku tutaj, ludzie, którzy zaprojektowany format pliku bitmapy 144 00:08:52,790 --> 00:08:58,260 że w pierwszym bajcie w bitmapę, oznaczona offset 0 nie, 145 00:08:58,260 --> 00:09:02,320 tam będzie trochę tajemniczo nazwana zmienna nazwana bfType, 146 00:09:02,320 --> 00:09:06,510 które po prostu oznacza typ pliku bitmapy; jaki typ pliku bitmapy to jest. 147 00:09:06,510 --> 00:09:10,780 Można wywnioskować, być może, z drugiego rzędu, offsetowej 2, nr 2, bajt 148 00:09:10,780 --> 00:09:15,980 ma wzorzec 0 i 1, że reprezentuje co? 149 00:09:15,980 --> 00:09:18,320 Rozmiar czegoś, a to idzie tam. 150 00:09:18,320 --> 00:09:20,660 Więc w zestawie problemu 4, będziesz szedł przez niektóre z tych rzeczy. 151 00:09:20,660 --> 00:09:24,480 >> Nie skończy się dbać o wszystkie, ale zauważ, że zaczyna się interesująca 152 00:09:24,480 --> 00:09:30,780 wokół linii lub bajtu 54, rgbtBlue, zielony i czerwony. 153 00:09:30,780 --> 00:09:35,280 Jeśli kiedykolwiek słyszał skrót RGB, czerwony, zielony, niebieski, jest to odniesienie do tego. 154 00:09:35,280 --> 00:09:37,840 Bo okazuje się, można malować wszystkie kolory tęczy 155 00:09:37,840 --> 00:09:41,580 z niektórych kombinacji czerwony i niebieski i zielony. 156 00:09:41,580 --> 00:09:46,560 I rzeczywiście, w rodzice mogą przypomnieć pomieszczenia pierwszych części projektora. 157 00:09:46,560 --> 00:09:49,360 Te dni, po prostu zobaczyć 1 jasne światło wychodzące z obiektywu. 158 00:09:49,360 --> 00:09:52,870 Ale już w dzień, trzeba było czerwone, niebieskie soczewki obiektywu, a zielone soczewki 159 00:09:52,870 --> 00:09:56,620 i razem skierowany na ekran i tworzą barwny obraz. 160 00:09:56,620 --> 00:09:59,590 I dość często gimnazja i szkoły średnie będą mieć te soczewki 161 00:09:59,590 --> 00:10:02,680 jakże lekko krzywo, więc były rodzaju widzenie podwójne lub potrójne obrazy, 162 00:10:02,680 --> 00:10:07,500 ale to był pomysł. Trzeba było czerwone i zielone i niebieskie światło, malowanie obrazu. 163 00:10:07,500 --> 00:10:09,570 I że sama zasada jest stosowana w komputerach. 164 00:10:09,570 --> 00:10:12,000 >> Tak więc niektóre z wyzwań, to dla ciebie w problemu ustawić 4 165 00:10:12,000 --> 00:10:16,080 będą kilka rzeczy, jeden jest rzeczywiście zmienić rozmiar obrazu. 166 00:10:16,080 --> 00:10:18,050 Aby wziąć w pewien schemat 0 i nr 1, 167 00:10:18,050 --> 00:10:22,840 dowiedzieć się, które kawałki 0 i 1'S reprezentuje to co w strukturze jak ten, 168 00:10:22,840 --> 00:10:26,800 , a następnie dowiedzieć się, jak powielanie pikseli: czerwienie, blues, Zieloni 169 00:10:26,800 --> 00:10:32,460 wewnątrz tak, że gdy obraz wygląda na początku, może wyglądać tak, a nie po. 170 00:10:32,460 --> 00:10:35,590 Wśród innych wyzwań też będzie, że będziesz wręczył 171 00:10:35,590 --> 00:10:38,900 kryminalistycznych wizerunek konkretnego pliku z aparatu cyfrowego 172 00:10:38,900 --> 00:10:42,410 i na tym aparacie, kiedyś były cała masa zdjęć. 173 00:10:42,410 --> 00:10:47,030 Problemem jest to, że przypadkowo usunięte lub miał obraz uszkodzony jakoś. 174 00:10:47,030 --> 00:10:51,040 Złe rzeczy się aparatów cyfrowych, a więc szybko kopiowane wszystkie 0 i 1'S 175 00:10:51,040 --> 00:10:55,410 off z tej karty dla Ciebie, zapisywane je wszystkie w 1 duży plik, a potem oddajemy je do Ciebie 176 00:10:55,410 --> 00:11:00,000 w problemu ustawić 4 tak, że można napisać program w języku C, z którym w celu odzyskania 177 00:11:00,000 --> 00:11:02,660 wszystkie z tych plików JPEG, idealnie. 178 00:11:02,660 --> 00:11:06,280 I okazuje się, że pliki JPEG, choć są one nieco złożonego formacie pliku, 179 00:11:06,280 --> 00:11:09,580 są o wiele bardziej złożone, niż się to uśmiechnięta twarz tutaj. 180 00:11:09,580 --> 00:11:14,320 Okazuje się, że każdy JPEG rozpoczyna się tymi samymi wzorami 0 i 1-tych. 181 00:11:14,320 --> 00:11:18,820 Więc za pomocą pętli while lub do pętli lub podobnego, 182 00:11:18,820 --> 00:11:22,350 można iterować wszystkie 0 i 1 jest w tym obrazie kryminalistycznych 183 00:11:22,350 --> 00:11:26,670 i za każdym razem pojawi się specjalny wzór, który jest określony w zbiorze specyfikacji problemu, 184 00:11:26,670 --> 00:11:29,770 można założyć, "Och, o to, z bardzo wysokim prawdopodobieństwem, 185 00:11:29,770 --> 00:11:33,520 początek JPEG ", i tak szybko, jak można znaleźć ten sam wzór, 186 00:11:33,520 --> 00:11:36,050 pewna liczba bajtów lub kilobajtach lub megabajtach później 187 00:11:36,050 --> 00:11:40,550 można założyć, "Ooh! Oto sekund JPEG, zdjęcie wziąłem po pierwszej. 188 00:11:40,550 --> 00:11:44,720 Pozwól mi przestać czytać ten pierwszy plik, zacząć pisać ten nowy. " 189 00:11:44,720 --> 00:11:49,980 I wyjście z programu do PSET 4 będzie aż 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 A jeśli to nie jest 50 plików JPEG, masz trochę pętli. 191 00:11:52,400 --> 00:11:55,580 Jeśli masz nieskończoną liczbę JPEG, masz nieskończoną pętlę. 192 00:11:55,580 --> 00:11:58,280 Więc to też będzie dość częsty przypadek. 193 00:11:58,280 --> 00:12:00,280 To, co jest na horyzoncie. 194 00:12:00,280 --> 00:12:03,740 >> Quiz 0, za nami. Uświadom sobie, na mój e-mail, że zawsze tam ludzie 195 00:12:03,740 --> 00:12:06,820 którzy są zarówno szczęśliwi, jakby neutralny, i smutno wokół quizu 0 czas. 196 00:12:06,820 --> 00:12:10,160 I proszę dotrzeć do mnie, TF, głowa, Zamyla własne TF 197 00:12:10,160 --> 00:12:14,120 lub w jednym z urzędów, że wiesz, czy chcesz, aby przedyskutować jak poszło. 198 00:12:14,120 --> 00:12:16,460 >> Tak więc, aby zaimponować rodzicom tutaj w pokoju, 199 00:12:16,460 --> 00:12:23,990 co jest CS50 biblioteka? Dobra robota. 200 00:12:23,990 --> 00:12:32,280 Co CS50 biblioteka? Tak? [Odpowiedzi studentów, niezrozumiały] 201 00:12:32,280 --> 00:12:35,730 >> Dobrze. Więc to prewritten zestawem kodu, że my, pracownicy, napisał 202 00:12:35,730 --> 00:12:38,460 oferujemy Państwu, aby zapewnić pewne wspólne funkcje. 203 00:12:38,460 --> 00:12:42,290 Rzeczy, jak dostać się do mnie ciąg; zrozumcie mnie int, wszystkie funkcje, które są tutaj wymienione. 204 00:12:42,290 --> 00:12:45,260 Od teraz zaczynamy naprawdę wziąć te kółka off. 205 00:12:45,260 --> 00:12:48,230 Więc zaczniemy zabrać się "ciąg" z tobą, 206 00:12:48,230 --> 00:12:52,790 które, recall, był po prostu synonimem co rzeczywisty typ danych? char *. 207 00:12:52,790 --> 00:12:57,020 Tak dla rodziców, to prawdopodobnie - to jest dobre, tak char * zaczniemy widzieć 208 00:12:57,020 --> 00:13:00,810 na ekranie, tym bardziej, jak usunąć "ciąg" z naszego słownictwa, 209 00:13:00,810 --> 00:13:02,760 przynajmniej jeśli chodzi o faktycznie pisania kodu. 210 00:13:02,760 --> 00:13:06,240 Podobnie będziemy zaprzestać stosowania niektórych z tych funkcji, jak dużo, 211 00:13:06,240 --> 00:13:08,390 dlatego, że nasze programy są dostanie bardziej wyrafinowane 212 00:13:08,390 --> 00:13:11,370 zamiast po prostu pisać programy, które siedzą tam z polecenia miga, 213 00:13:11,370 --> 00:13:13,580 czeka na użytkownika wpisać coś w. 214 00:13:13,580 --> 00:13:15,220 Dostaniesz swoje wejścia z zewnątrz. 215 00:13:15,220 --> 00:13:18,720 Na przykład, można je dostać z serii bitów na lokalnym dysku twardym. 216 00:13:18,720 --> 00:13:23,340 Będziesz zamiast je w przyszłości z połączenia sieciowego, niektóre strona gdzieś. 217 00:13:23,340 --> 00:13:27,460 Więc odwinąć tej warstwy, po raz pierwszy, i podciągnąć CS50 urządzenia 218 00:13:27,460 --> 00:13:32,300 a ten plik nazywa CS50.h, który byłeś ostry tym na tydzień. 219 00:13:32,300 --> 00:13:34,380 >> Ale bądźmy naprawdę zobaczyć co jest w środku tego. 220 00:13:34,380 --> 00:13:38,250 Więc początek pliku w kolorze niebieskim jest tylko cała masa komentarzy, 221 00:13:38,250 --> 00:13:41,340 informacje na temat gwarancji i licencjonowania. Jest to rodzaj wspólnej paradygmatu 222 00:13:41,340 --> 00:13:44,600 w oprogramowaniu, ponieważ wiele programów w tych dniach jest to, co nazywa "open source" 223 00:13:44,600 --> 00:13:46,940 co oznacza, że ​​ktoś napisany kod 224 00:13:46,940 --> 00:13:50,060 i sprawiło, że łatwo dostępne, nie tylko do uruchomienia i korzystania, 225 00:13:50,060 --> 00:13:53,660 ale właściwie odczytać i zmieniać i zintegrować własnej pracy. 226 00:13:53,660 --> 00:13:55,790 Więc to, co już przy użyciu, oprogramowanie open source, 227 00:13:55,790 --> 00:13:58,030 aczkolwiek w postaci bardzo małych. 228 00:13:58,030 --> 00:14:01,860 Gdybym przewinąć przeszłości komentarzach, choć zaczniemy zobaczyć jakieś bardziej znane rzeczy. 229 00:14:01,860 --> 00:14:08,090 Więc na początku zauważyć tutaj, że plik zawiera CS50.h całą masę plików nagłówkowych. 230 00:14:08,090 --> 00:14:11,160 Teraz większość z nich nie widzieliśmy wcześniej, ale jedno jest 231 00:14:11,160 --> 00:14:15,640 znajomo, które z nich nie widzieliśmy, choć na krótko, do tej pory? 232 00:14:15,640 --> 00:14:18,720 Tak, standardowe biblioteki. Stdlib.h ma malloc, 233 00:14:18,720 --> 00:14:21,590 więc gdy zaczęliśmy rozmawiać o dynamicznej alokacji pamięci, 234 00:14:21,590 --> 00:14:24,960 które wrócimy do przyszłego tygodnia, jak również, zaczęliśmy w tym pliku. 235 00:14:24,960 --> 00:14:29,660 Okazuje się, że bool i prawda i fałsz w rzeczywistości nie istnieją w C, per se, 236 00:14:29,660 --> 00:14:32,460 chyba, że ​​to ten plik tutaj. 237 00:14:32,460 --> 00:14:35,770 Mamy więc, na tydzień, zostały w tym standardowe bool.h 238 00:14:35,770 --> 00:14:39,020 tak aby można było używać pojęcia bool, true lub false. 239 00:14:39,020 --> 00:14:41,830 Bez tego, to masz coś w rodzaju fałszywego niego i używać int 240 00:14:41,830 --> 00:14:45,920 i po prostu arbitralnie założyć, że 0 jest fałszywa i 1 prawda. 241 00:14:45,920 --> 00:14:49,980 >> Teraz, jeśli przewijać dalej, tu jest nasza definicja łańcucha. 242 00:14:49,980 --> 00:14:54,820 Okazuje się, jak już wcześniej powiedziałem, że tam, gdzie to * jest naprawdę nie ma znaczenia. 243 00:14:54,820 --> 00:14:56,750 Można nawet mieć miejsce wszędzie. 244 00:14:56,750 --> 00:15:01,550 My, w tym semestrze, zostały promowanie go jako tego, aby stwierdzić, że * ma do czynienia z tego typu. 245 00:15:01,550 --> 00:15:05,370 Ale uświadomić sobie, jak często, jeśli nie trochę bardziej powszechne, jest umieszczenie go tam 246 00:15:05,370 --> 00:15:07,480 ale funkcjonalnie to samo. 247 00:15:07,480 --> 00:15:11,070 Ale teraz, jeśli czytamy w dół dalej, rzućmy okiem na, powiedzmy, getInt 248 00:15:11,070 --> 00:15:15,350 ponieważ kiedyś, że, być może, zanim cokolwiek innego w tym semestrze. 249 00:15:15,350 --> 00:15:19,620 I tu jest getInt. To jest co? 250 00:15:19,620 --> 00:15:24,650 To jest prototyp. Tak często, musimy umieścić prototypy na szczytach naszych. Pliki c, 251 00:15:24,650 --> 00:15:28,190 ale można również umieścić prototypów w plikach nagłówkowych,. plików h, 252 00:15:28,190 --> 00:15:32,110 jak ten tutaj, tak, że kiedy piszesz niektóre funkcje 253 00:15:32,110 --> 00:15:36,790 , że chcesz, aby inni ludzie mogli używać, co jest dokładnie to miejsce w przypadku CS50 bibliotece 254 00:15:36,790 --> 00:15:40,900 Ci nie tylko realizować swoje funkcje w coś CS50.c, 255 00:15:40,900 --> 00:15:46,720 również umieścić prototypów nie na górze tego pliku, a na początku pliku nagłówka 256 00:15:46,720 --> 00:15:50,810 następnie, że plik nagłówkowy jest co koledzy i przyjaciele obejmują 257 00:15:50,810 --> 00:15:52,800 z ostrymi, jak w swoim własnym kodzie. 258 00:15:52,800 --> 00:15:55,440 Więc cały ten czas byłeś w tym wszystkie z tych prototypów 259 00:15:55,440 --> 00:15:59,870 skutecznie na początku pliku, ale sposób ten obejmuje mechanizm ostre 260 00:15:59,870 --> 00:16:03,320 że zasadniczo kopiuje i wkleja ten plik do własnego. 261 00:16:03,320 --> 00:16:06,400 Teraz tutaj jest kilka dość szczegółową dokumentację. 262 00:16:06,400 --> 00:16:08,880 >> Mamy dość dużo za pewnik, że getInt dostaje int, 263 00:16:08,880 --> 00:16:10,740 ale okazuje się, istnieje kilka przypadków narożne, prawda? 264 00:16:10,740 --> 00:16:14,320 Co zrobić, jeśli użytkownik wpisze w szeregu, który jest zbyt duży? 265 00:16:14,320 --> 00:16:17,350 Trylionów, które po prostu nie może się zmieścić wewnątrz z int? 266 00:16:17,350 --> 00:16:21,180 Jakie jest oczekiwane zachowanie? Cóż, najlepiej, to jest przewidywalne. 267 00:16:21,180 --> 00:16:23,460 Więc w tym przypadku, jeśli rzeczywiście przeczytać drobnym drukiem, 268 00:16:23,460 --> 00:16:27,850 zobaczysz, że jeśli linia nie może zostać odczytany, to INT_MAX zwraca. 269 00:16:27,850 --> 00:16:30,800 Nigdy nie rozmawialiśmy o tym, ale na podstawie jego kapitalizacji, 270 00:16:30,800 --> 00:16:33,030 co to jest, chyba? 271 00:16:33,030 --> 00:16:36,610 To stała, więc jest to jakaś specjalna stała pewnie oświadczył 272 00:16:36,610 --> 00:16:39,460 w jednym z tych plików nagłówkowych, które znajduje się wyżej w pliku, 273 00:16:39,460 --> 00:16:43,400 i INT_MAX prawdopodobnie coś, z grubsza, 2 mld EUR. 274 00:16:43,400 --> 00:16:48,160 Pogląd, że dlatego, że trzeba jakoś oznaczać, że coś poszło nie tak, 275 00:16:48,160 --> 00:16:51,090 my, tak, ma 4 miliardy numerów do naszej dyspozycji, 276 00:16:51,090 --> 00:16:53,980 negatywne 2 mld do 2 mld euro, lub dać. 277 00:16:53,980 --> 00:16:58,030 No, co jest powszechne w programowaniu jest ukraść tylko jeden z tych numerów. 278 00:16:58,030 --> 00:17:02,250 Może 0, może 2 miliardy, a może negatywne 2 miliardy. 279 00:17:02,250 --> 00:17:06,720 Więc można spędzić jedną z możliwych wartości, tak aby można zobowiązać się do świata 280 00:17:06,720 --> 00:17:10,089 że jeśli coś pójdzie nie tak, wrócę to super-duże wartości. 281 00:17:10,089 --> 00:17:13,329 Ale ty nie chcesz, aby użytkownik, wpisując coś zagadkowego "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 liczby naprawdę duże, gdzie zamiast uogólniać jako stała. 283 00:17:17,079 --> 00:17:19,380 Tak naprawdę, jeśli były anal w ciągu ostatnich kilku tygodni, 284 00:17:19,380 --> 00:17:23,800 w każdej chwili zadzwonić getInt, powinien być sprawdzenie z IF stanie. 285 00:17:23,800 --> 00:17:27,109 Czy typ użytkownika w INT_MAX, lub bardziej konkretnie, 286 00:17:27,109 --> 00:17:29,900 zrobił INT_MAX powrócić getInt? Bo jeśli tak, 287 00:17:29,900 --> 00:17:35,140 że w rzeczywistości oznacza, że ​​nie go wpisać, coś poszło nie tak w tym przypadku. 288 00:17:35,140 --> 00:17:38,970 Tak to jest, co się powszechnie znane jako "wartownika" wartości, co oznacza po prostu wyjątkowy. 289 00:17:38,970 --> 00:17:41,020 >> No cóż, teraz z kolei w do plików. C. 290 00:17:41,020 --> 00:17:44,500 Plik C istnieje w urządzeniu przez jakiś czas, 291 00:17:44,500 --> 00:17:47,540 i, w rzeczywistości, urządzenie ma to skompilowany dla Ciebie 292 00:17:47,540 --> 00:17:49,720 do tej rzeczy, którą nazywa się "kodu wynikowego" 293 00:17:49,720 --> 00:17:52,940 ale to nie ma znaczenia dla Ciebie, gdzie to jest, bo system wie, 294 00:17:52,940 --> 00:17:54,780 w tym przypadku, w którym jest urządzenie. 295 00:17:54,780 --> 00:18:00,620 Ale bądźmy przewinąć teraz getInt i zobacz, jak getInt pracuje cały czas. 296 00:18:00,620 --> 00:18:02,380 Więc tutaj mamy podobne komentarze z przed. 297 00:18:02,380 --> 00:18:04,930 Pozwól mi powiększyć tylko części kodu, 298 00:18:04,930 --> 00:18:07,410 i to, co mamy na getInt jest następujące. 299 00:18:07,410 --> 00:18:12,770 Nie potrzeba żadnej wejście i zwraca int, while (true), więc mamy umyślne nieskończoną pętlę 300 00:18:12,770 --> 00:18:16,560 ale zapewne będziemy łamać z tego w jakiś sposób, lub powrót z poziomu tego. 301 00:18:16,560 --> 00:18:19,890 Zobaczmy więc, jak to działa. Cóż, zdaje się, że przy użyciu getString 302 00:18:19,890 --> 00:18:22,550 w pierwszej linii wewnątrz pętli, 166. 303 00:18:22,550 --> 00:18:25,320 Teraz jest to dobra praktyka, ponieważ, w jakich okolicznościach 304 00:18:25,320 --> 00:18:30,820 może zwrócić szczególną GetString słowa kluczowego, null? 305 00:18:30,820 --> 00:18:38,460 Jeśli coś pójdzie nie tak. Co może pójść źle podczas rozmowy coś getString? 306 00:18:38,460 --> 00:18:42,550 Tak? [Odpowiedź Student, niezrozumiały] >> Tak. Więc może malloc zawiedzie. 307 00:18:42,550 --> 00:18:45,310 Gdzieś pod getString kaptur jest wywołanie malloc, 308 00:18:45,310 --> 00:18:48,210 która przydziela pamięć, która umożliwia sklep komputerowy 309 00:18:48,210 --> 00:18:50,950 wszystkie znaki, które użytkownik wpisuje na klawiaturze. 310 00:18:50,950 --> 00:18:53,270 I przypuśćmy, że użytkownik miał dużo wolnego czasu 311 00:18:53,270 --> 00:18:56,470 przepisuje więcej, na przykład, ponad 2 miliardy znaków. 312 00:18:56,470 --> 00:18:59,600 Więcej znaków, niż komputer ma nawet RAM. 313 00:18:59,600 --> 00:19:02,350 Cóż, GetString musi być w stanie oznacza, że ​​ci, 314 00:19:02,350 --> 00:19:05,650 nawet jeśli jest to super, super rzadkością przypadek rogu. 315 00:19:05,650 --> 00:19:08,490 Musi jakoś być w stanie sobie z tym poradzić, i tak GetString, 316 00:19:08,490 --> 00:19:11,850 jeśli mamy wrócić i przeczytać jego dokumentacji, czy w rzeczywistości, zwróci NULL. 317 00:19:11,850 --> 00:19:16,150 Teraz, jeśli nie przez powrót GetString NULL, getInt będzie nie 318 00:19:16,150 --> 00:19:19,370 powracając INT_MAX, jak strażnik. 319 00:19:19,370 --> 00:19:22,650 Są to tylko ludzkie konwencje. Tylko w ten sposób możesz wiedzieć jest to przypadek 320 00:19:22,650 --> 00:19:24,840 jest czytanie dokumentacji. 321 00:19:24,840 --> 00:19:28,200 Warto więc przejść do gdzie int jest rzeczywiście GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Więc jeśli mogę przewinąć nieco dalej, w linii 170 mamy komentarz powyżej tych linii. 323 00:19:34,220 --> 00:19:38,470 Więc stwierdzenie, 172, int n i char c, a następnie ta nowa funkcja 324 00:19:38,470 --> 00:19:41,870 co niektórzy z was natknął się wcześniej, ale sscanf. 325 00:19:41,870 --> 00:19:44,190 To oznacza ciąg skanowania f. 326 00:19:44,190 --> 00:19:48,580 Innymi słowy, daj mi łańcuch i będę go w poszukiwaniu tych informacji, zainteresowania. 327 00:19:48,580 --> 00:19:53,820 Więc co to oznacza? Dobrze, załóżmy, że mam wpisać dosłownie 1 2 3 na klawiaturze, 328 00:19:53,820 --> 00:19:59,730 , a następnie naciśnij Enter. Co to jest typ danych 1 2 3 gdy są zwracane przez getString? 329 00:19:59,730 --> 00:20:05,010 To oczywiście łańcuch, prawda? Mam ciąg znaków, więc 1 2 3 jest naprawdę "1 2 3" 330 00:20:05,010 --> 00:20:07,260 z \ 0 na końcu. To nie jest int. 331 00:20:07,260 --> 00:20:10,420 To nie liczba jest. To wygląda jak liczba, ale nie jest w rzeczywistości. 332 00:20:10,420 --> 00:20:14,680 Więc co getInt zrobić? To musi zeskanować ten ciąg od lewej do prawej, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0 i jakoś przekonwertować go do rzeczywistej liczby całkowitej. 334 00:20:19,010 --> 00:20:21,010 Teraz możesz dowiedzieć się, jak to zrobić. 335 00:20:21,010 --> 00:20:24,240 Jeśli uważasz, że powrót do PSET 2, to zapewne masz mało wygodny 336 00:20:24,240 --> 00:20:26,810 z Cezarem lub Vigenère więc można iteracyjne nad ciąg, 337 00:20:26,810 --> 00:20:29,800 można konwertować znaki na wskazówki z pick. To dużo pracy. 338 00:20:29,800 --> 00:20:32,800 Może wywołać funkcję jak sscanf który robi to za Ciebie? 339 00:20:32,800 --> 00:20:37,520 Więc sscanf oczekuje argumentu, w tym przypadku o nazwie linia, która jest ciągiem. 340 00:20:37,520 --> 00:20:41,310 Następnie należy określić, w cudzysłowie, bardzo podobne do printf, 341 00:20:41,310 --> 00:20:44,960 czego można się spodziewać w tym ciągu? 342 00:20:44,960 --> 00:20:52,980 Co mówię tutaj o to, że spodziewamy się liczby dziesiętnej a może charakter. 343 00:20:52,980 --> 00:20:54,990 I zobaczymy, dlaczego tak jest za chwilę. 344 00:20:54,990 --> 00:20:58,440 Okazuje się, że ten zapis jest teraz przypomina rzeczy 345 00:20:58,440 --> 00:21:00,840 zaczęliśmy rozmawiać o nieco ponad tydzień temu. 346 00:21:00,840 --> 00:21:05,430 >> Co to jest & n & c i robi dla nas? [Odpowiedzi studentów, niezrozumiały] 347 00:21:05,430 --> 00:21:07,610 >> Tak. To daje mi adres n i adres c. 348 00:21:07,610 --> 00:21:10,440 Teraz, dlaczego jest to takie ważne? No, wiesz, że z funkcji w C 349 00:21:10,440 --> 00:21:13,440 zawsze możesz go zwrócić wartość lub żadnej wartości. 350 00:21:13,440 --> 00:21:16,630 Możesz powrócić int, ciąg znaków, float, char, cokolwiek. 351 00:21:16,630 --> 00:21:21,150 Albo możesz wrócić pustkę, ale można zwrócić tylko 1 rzecz maksymalnie. 352 00:21:21,150 --> 00:21:26,100 Ale tutaj chcemy sscanf powrócić mnie może int, liczba dziesiętna, 353 00:21:26,100 --> 00:21:29,240 a także znak, a ja dlaczego char w jednej chwili. 354 00:21:29,240 --> 00:21:34,250 Więc faktycznie chcą f powrotu 2 rzeczy, to nie jest tylko możliwe w C. 355 00:21:34,250 --> 00:21:38,460 Więc można obejść, przekazując 2 adresy, 356 00:21:38,460 --> 00:21:43,710 bo jak tylko oddać funkcję 2 adresy, co można, że ​​funkcja z nimi zrobić? 357 00:21:43,710 --> 00:21:49,880 To może napisz do tych adresów. Można użyć operacji * i "tam", aby każdy z tych adresów. 358 00:21:49,880 --> 00:21:54,320 To coś w rodzaju tego backdoora mechanizmu, ale bardzo często do zmiany wartości zmiennych 359 00:21:54,320 --> 00:21:58,020 w więcej niż 1 miejscu, w tym przypadku 2. 360 00:21:58,020 --> 00:22:04,590 Teraz zauważysz Jestem sprawdzanie == do1, a następnie powrót n jeśli nie w rzeczywistości, ocenia na true. 361 00:22:04,590 --> 00:22:09,340 Więc co się dzieje? Dobrze, technicznie, wszystko, czego naprawdę chcesz się stać w getInt jest to. 362 00:22:09,340 --> 00:22:12,340 Chcemy analizować, by tak rzec, chcemy czytać ciąg 363 00:22:12,340 --> 00:22:16,210 "1 2 3", a jeśli to wygląda tam numer tam, 364 00:22:16,210 --> 00:22:21,360 co mówimy sscanf zrobić, to umieścić ten numer, 1 2 3, w tej zmiennej n dla mnie. 365 00:22:21,360 --> 00:22:26,060 Dlaczego więc nie mam to, jak również? 366 00:22:26,060 --> 00:22:33,750 Jaka jest rola również mówiąc sscanf, można również uzyskać znak tutaj. 367 00:22:33,750 --> 00:22:36,890 [Speaking Student, niezrozumiały] >> Nie - przecinek może zadziałać. 368 00:22:36,890 --> 00:22:40,650 Załóżmy, że posiadają pomyślał przez chwilę. Co jeszcze? 369 00:22:40,650 --> 00:22:42,570 [Student, niezrozumiały] >> Tak, dobra myśl, to może być znak null. 370 00:22:42,570 --> 00:22:44,970 Nie jest to faktycznie, w tym przypadku. Tak? [Student, niezrozumiały] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Albo daj mi generalizować nawet dalej. 372 00:22:47,100 --> 00:22:49,670 C% jest tylko do sprawdzania błędów. 373 00:22:49,670 --> 00:22:52,510 Nie chcemy tam być znak po liczbie, 374 00:22:52,510 --> 00:22:54,980 ale to, co pozwala mi zrobić to: 375 00:22:54,980 --> 00:23:01,270 Okazuje się, że sscanf, oprócz przechowywania wartości w N i C, w tym przykładzie, 376 00:23:01,270 --> 00:23:08,170 , co również nie jest to zwraca liczbę zmiennych to położy wartości w. 377 00:23:08,170 --> 00:23:13,330 Więc jeśli tylko wpisać 1 2 3, to tylko% d będzie pasować 378 00:23:13,330 --> 00:23:18,830 i tylko n zostanie zapisany z wartością jak 1 2 3 i nic nie zostanie wprowadzone w C; 379 00:23:18,830 --> 00:23:20,870 c pozostaje wartość śmieci, że tak powiem. 380 00:23:20,870 --> 00:23:23,550 Garbage, ponieważ nigdy nie został zainicjowany jako jakąś wartość. 381 00:23:23,550 --> 00:23:29,390 Więc w tym przypadku, sscanf zwraca 1, ponieważ wypełniona jednym z tych wskaźników, 382 00:23:29,390 --> 00:23:33,650 w tym przypadku, to świetnie. Mam int, więc zwalniać linię, aby zwolnić pamięć 383 00:23:33,650 --> 00:23:37,150 że GetString faktycznie przyznane, a następnie wrócę n. 384 00:23:37,150 --> 00:23:42,210 Inaczej, jeśli kiedykolwiek zastanawialiście się, gdzie, że ponownie oświadczenie pochodzi, pochodzi właśnie tutaj. 385 00:23:42,210 --> 00:23:45,770 Jeśli natomiast, wpisuję w 1 2 3 foo 386 00:23:45,770 --> 00:23:48,640 tylko jakiś przypadkowy ciąg tekstu, sscanf będzie zobaczyć, 387 00:23:48,640 --> 00:23:51,500 ooh, numer, ooh, numer, ooh, numer, ooh - f. 388 00:23:51,500 --> 00:23:54,190 I to będzie umieścić 1 2 3 W n. 389 00:23:54,190 --> 00:23:59,970 To będzie umieścić f w C, a następnie powrót 2. 390 00:23:59,970 --> 00:24:02,980 Więc mamy, po prostu stosując podstawową definicję zachowań w scanf, 391 00:24:02,980 --> 00:24:06,170 bardzo prosty sposób - oraz, na pierwszy rzut oka skomplikowane, ale pod koniec dnia 392 00:24:06,170 --> 00:24:11,460 dość prosty mechanizm mówiąc, jest tam int, a jeśli tak, jest to, że jedyną rzeczą, którą znalazłem? 393 00:24:11,460 --> 00:24:14,950 I białe miejsca o to zamierzone. Jeśli czytać dokumentację sscanf, 394 00:24:14,950 --> 00:24:18,690 mówi, że jeśli to kawałek białej przestrzeni na początku lub na końcu, 395 00:24:18,690 --> 00:24:24,990 sscanf zbyt pozwoli użytkownikowi, niezależnie od powodu, aby uderzyć spacji 1 2 3, i to będzie zgodne z prawem. 396 00:24:24,990 --> 00:24:28,310 To nie będzie krzyczeć na użytkownika tylko dlatego, naciśnij klawisz spacji na początku lub na końcu, 397 00:24:28,310 --> 00:24:32,160 która jest tylko trochę bardziej przyjazny dla użytkownika. 398 00:24:32,160 --> 00:24:34,160 >> Wszelkie pytania, a następnie, na GetInts? Tak? 399 00:24:34,160 --> 00:24:36,820 [Pytanie Student, niezrozumiały] 400 00:24:36,820 --> 00:24:40,740 >> Dobre pytanie. Co jeśli po prostu wpisane w char, jak F i naciśnij Enter 401 00:24:40,740 --> 00:24:47,830 nigdy nie wpisywać 1 2 3; co myślisz zachowanie tej linii kodu byłoby wtedy? 402 00:24:47,830 --> 00:24:50,500 Więc sscanf może pokryć, że zbyt, bo w tym przypadku, 403 00:24:50,500 --> 00:24:56,280 to nie będzie wypełnić N lub C, to będzie zamiast powrócić 0. 404 00:24:56,280 --> 00:25:01,540 W tym przypadku, jestem również łowienie taki scenariusz, ponieważ wartość oczekiwana chcę jest 1. 405 00:25:01,540 --> 00:25:07,310 Chcę tylko 1 i tylko 1 rzecz do obsadzenia. Dobre pytanie. Inni? 406 00:25:07,310 --> 00:25:09,610 >> W porządku, więc niech nie przejść przez wszystkie funkcje w tutaj, 407 00:25:09,610 --> 00:25:11,820 a który wydaje się, że, być może, z pozostałą zainteresowania 408 00:25:11,820 --> 00:25:14,530 jest getString bo okazuje się, że GetFloat, getInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong wszystko Punt wiele ich funkcji do getString. 410 00:25:19,490 --> 00:25:22,860 Warto więc przyjrzeć się, jak on jest realizowany tutaj. 411 00:25:22,860 --> 00:25:27,040 To wygląda trochę skomplikowane, ale używa tych samych podstaw 412 00:25:27,040 --> 00:25:29,680 że zaczęliśmy rozmawiać o ostatnim tygodniu. Więc w getString, 413 00:25:29,680 --> 00:25:32,670 która przyjmuje żadnego argumentu, jak na pustkę tu, 414 00:25:32,670 --> 00:25:37,110 i zwraca ciąg znaków, więc jestem oświadczając ciąg nazwie buffer. 415 00:25:37,110 --> 00:25:39,670 I naprawdę nie wiem, co to ma być używana do jeszcze, ale zobaczymy. 416 00:25:39,670 --> 00:25:42,950 Wygląda na to, pojemności jest domyślnie, 0, nie całkiem pewien, gdzie to będzie. 417 00:25:42,950 --> 00:25:44,920 Nie wiesz, co n będzie stosowany do jeszcze. 418 00:25:44,920 --> 00:25:47,860 Ale teraz jest coraz bardziej interesująca, więc w linii 243, 419 00:25:47,860 --> 00:25:51,760 oświadczamy, int c, jest to coś w rodzaju głupiego szczegółowo. 420 00:25:51,760 --> 00:25:58,080 Char jest 8 bitów, a 8 bitów można zapisać, ile różne wartości? 421 00:25:58,080 --> 00:26:03,310 256. Problem jest, jeśli chcesz mieć 256 różnych znaków ASCII, 422 00:26:03,310 --> 00:26:06,210 których istnieją, jeśli uważasz, z powrotem, i nie jest to coś do zapamiętania. 423 00:26:06,210 --> 00:26:09,100 Ale jeśli myślisz, że powrót do tego wielkiego ASCII wykresu mieliśmy tydzień temu, 424 00:26:09,100 --> 00:26:13,780 było w tym przypadku, 128 lub 256 znaków ASCII. 425 00:26:13,780 --> 00:26:16,220 Wykorzystaliśmy wszystkie wzorce 0 i 1 jest w górę. 426 00:26:16,220 --> 00:26:19,410 To jest problem, jeśli chcesz być w stanie wykryć błąd. 427 00:26:19,410 --> 00:26:23,290 Bo jeśli używasz już 256 wartości dla swoich bohaterów, 428 00:26:23,290 --> 00:26:26,390 tak naprawdę nie planować, bo teraz nie mam możliwości, mówiąc: 429 00:26:26,390 --> 00:26:29,750 "To nie jest znak legit, to jest jakiś błędny komunikat". 430 00:26:29,750 --> 00:26:32,430 Więc to, co świat robi to, używają następną największą wartość, 431 00:26:32,430 --> 00:26:35,790 coś jak int, aby mieć szaloną liczbę bitów, 432 00:26:35,790 --> 00:26:39,610 32 do 4 miliardów możliwych wartości, tak, że można po prostu skończyć używając, 433 00:26:39,610 --> 00:26:44,800 zasadniczo, 257 z nich, która ma 1 szczególne znaczenie jako jakiś błąd. 434 00:26:44,800 --> 00:26:49,190 >> Zobaczmy więc, jak to działa. Zgodnie 246, mam duży pętli while 435 00:26:49,190 --> 00:26:54,530 że dzwoni fgetc; plik sens f, getc, a następnie stdin. 436 00:26:54,530 --> 00:26:59,030 Okazuje się, że jest to po prostu bardziej precyzyjny sposób na powiedzenie "czytać z klawiatury." 437 00:26:59,030 --> 00:27:02,730 Standardowa klawiatura oznacza wejście, standardowe wyjście oznacza ekran, 438 00:27:02,730 --> 00:27:06,920 i błąd standardowy, który zobaczymy w Pset 4, czyli ekran, 439 00:27:06,920 --> 00:27:09,670 ale specjalnej części ekranu, tak że nie jest łączyła 440 00:27:09,670 --> 00:27:13,760 z rzeczywistej produkcji, które przeznaczone do drukowania, ale o tym w przyszłości. 441 00:27:13,760 --> 00:27:19,430 Więc fgetc oznacza tylko przeczytać jeden znak z klawiatury, i przechowywać go gdzie? 442 00:27:19,430 --> 00:27:24,000 Przechowywać go w C, a następnie sprawdzić, więc jestem po prostu za pomocą spójników logicznych niektóre tutaj 443 00:27:24,000 --> 00:27:28,430 sprawdzić, czy nie jest równa \ n, więc użytkownik naciśnij enter. 444 00:27:28,430 --> 00:27:31,510 Chcemy zatrzymać w tym miejscu, koniec pętli, a także chcemy, aby sprawdzić 445 00:27:31,510 --> 00:27:36,170 dla specjalnych stała EOF, który, jeśli wiesz lub odgadnąć - co się za nim kryje? 446 00:27:36,170 --> 00:27:39,860 Koniec pliku. Jest to więc rodzaj bezsensowne, bo jeśli piszę na klawiaturze, 447 00:27:39,860 --> 00:27:41,900 tam naprawdę nie ma pliku w to, 448 00:27:41,900 --> 00:27:44,330 , ale jest to po prostu coś w rodzaju ogólnej termin używany do oznaczać 449 00:27:44,330 --> 00:27:50,320 że nic innego nie przychodzi z ludzkiego palce. EOF. Koniec pliku. 450 00:27:50,320 --> 00:27:52,600 Tak na marginesie, jeśli kiedykolwiek uderzył control D na klawiaturze, 451 00:27:52,600 --> 00:27:54,680 nie, że trzeba jeszcze, pan hit sterowania c. 452 00:27:54,680 --> 00:27:57,920 Ale kontrola d wysyła specjalną stałą zwaną EOF. 453 00:27:57,920 --> 00:28:03,100 >> Więc teraz musimy tylko trochę dynamicznej alokacji pamięci. 454 00:28:03,100 --> 00:28:06,460 Więc jeśli n + 1> pojemność, teraz wytłumaczę n. 455 00:28:06,460 --> 00:28:09,380 n jest po prostu jak wiele bajtów są obecnie w buforze, 456 00:28:09,380 --> 00:28:11,970 Ciąg, który jesteś aktualnie buduje od użytkownika. 457 00:28:11,970 --> 00:28:16,240 Jeśli masz więcej znaków w buforze nie masz zdolności w buforze, 458 00:28:16,240 --> 00:28:20,760 intuicyjnie, co musimy zrobić, to przydzielić więcej pojemności. 459 00:28:20,760 --> 00:28:24,490 Zamierzam przewertowanie część arytmetyki tutaj 460 00:28:24,490 --> 00:28:26,900 i skupić się tylko na tej funkcji tutaj. 461 00:28:26,900 --> 00:28:29,170 Wiesz co malloc jest, lub przynajmniej ogólnie znane. 462 00:28:29,170 --> 00:28:32,380 Zgadnij co realloc robi. [Odpowiedź Student, niezrozumiały] 463 00:28:32,380 --> 00:28:35,690 >> Tak. I to nie dość dodawania pamięci, to alokację pamięci w następujący sposób: 464 00:28:35,690 --> 00:28:40,530 Jeśli jest jeszcze miejsce na końcu łańcucha, aby dać Ci więcej tej pamięci 465 00:28:40,530 --> 00:28:43,370 niż pierwotnie się daje, a następnie będziesz uzyskać dodatkową pamięć. 466 00:28:43,370 --> 00:28:46,640 Więc możesz po prostu oddanie ciągi znaków z powrotem do tyłu do tyłu do tyłu. 467 00:28:46,640 --> 00:28:49,290 Ale jeśli to nie jest przypadek, bo czekał zbyt długo 468 00:28:49,290 --> 00:28:51,700 i coś losowo dostał koleś w pamięci istnieje, ale jest extra 469 00:28:51,700 --> 00:28:56,480 pamięć i tutaj, to w porządku. Realloc zrobi wszystko podnoszenia ciężkich dla Ciebie, 470 00:28:56,480 --> 00:28:58,810 przesunąć ciąg czytasz w ten sposób daleko stąd, 471 00:28:58,810 --> 00:29:02,550 umieścić go tam, a następnie daje trochę więcej pasa w tym punkcie. 472 00:29:02,550 --> 00:29:05,610 Tak z ruchem ręki, chciałbym powiedzieć, że to, co robi GetString 473 00:29:05,610 --> 00:29:09,540 jest to zaczyna z małym buforze, może 1 postaci pojedynczego, 474 00:29:09,540 --> 00:29:12,300 i jeśli użytkownik wpisze w 2 znaków GetString kończy 475 00:29:12,300 --> 00:29:15,210 dzwoniąc realloc i mówi: "Och, 1 znak nie wystarczyło. 476 00:29:15,210 --> 00:29:18,480 Daj mi 2 znaki. ' Następnie, jeśli przeczytać logiki pętli 477 00:29:18,480 --> 00:29:21,070 to się mówi: "Och, użytkownik wpisze w 3 znaków. 478 00:29:21,070 --> 00:29:25,690 Daj mi teraz nie 2, ale 4 znaki, to dajcie mi 8, a potem dał mi 16 i 32 ". 479 00:29:25,690 --> 00:29:28,180 Fakt, że jestem Podwojenie wydajności każdorazowo 480 00:29:28,180 --> 00:29:30,320 Oznacza to, że nie jest bufor rosnąć powoli. 481 00:29:30,320 --> 00:29:35,870 Zapowiada się super szybko rosnąć, a co może być zaletą, że? 482 00:29:35,870 --> 00:29:38,540 Dlaczego podwojenie rozmiaru bufora, nawet jeśli użytkownik 483 00:29:38,540 --> 00:29:41,450 może wystarczy 1 dodatkowy znak z klawiatury? 484 00:29:41,450 --> 00:29:44,830 [Odpowiedź Student, niezrozumiałe]. >> Co to jest? 485 00:29:44,830 --> 00:29:46,750 Dokładnie. Nie musisz uprawiać go tak często. 486 00:29:46,750 --> 00:29:48,870 A to jest po prostu rodzaj - Jeste zabezpieczających swoje zakłady tutaj. 487 00:29:48,870 --> 00:29:54,150 Pomysł jest, że nie chcesz, aby zadzwonić realloc dużo, bo to wydaje się być wolna. 488 00:29:54,150 --> 00:29:56,840 Za każdym razem poprosić system operacyjny na pamięć, jak wkrótce zobaczyć 489 00:29:56,840 --> 00:30:00,620 w przyszłości zestawu problemów, to ma tendencję do trochę potrwać. 490 00:30:00,620 --> 00:30:04,980 Minimalizując w ten czas, nawet jeśli tracisz trochę przestrzeni, wydaje się być dobrą rzeczą. 491 00:30:04,980 --> 00:30:07,250 >> Ale jeśli przeczytać końcowej części getString tutaj 492 00:30:07,250 --> 00:30:10,880 i znowu, rozumienia każdego pojedynczego wiersza nie jest tu tak ważne dziś. 493 00:30:10,880 --> 00:30:14,830 Zauważmy jednak, że w końcu wywołuje malloc ponownie, i przydziela 494 00:30:14,830 --> 00:30:16,980 dokładnie tyle bajtów, ile potrzebuje na ciąg 495 00:30:16,980 --> 00:30:21,620 a następnie wyrzuca przez wywołanie wolne, zbyt duży bufor, 496 00:30:21,620 --> 00:30:23,510 jeśli rzeczywiście dostałem dwukrotnie zbyt wiele razy. 497 00:30:23,510 --> 00:30:25,970 W skrócie, to jak GetString pracuje cały czas. 498 00:30:25,970 --> 00:30:30,100 Wszystko robi odczytuje jeden znak na raz znowu i znowu i znowu 499 00:30:30,100 --> 00:30:37,930 i za każdym razem potrzebuje dodatkowej pamięci, prosi system operacyjny o nią dzwoniąc realloc. 500 00:30:37,930 --> 00:30:41,660 Masz pytanie? Dobrze. 501 00:30:41,660 --> 00:30:45,220 >> Atak. Teraz, rozumiemy wskaźników, lub co najmniej 502 00:30:45,220 --> 00:30:47,560 są coraz bardziej zaznajomieni z wskaźników, 503 00:30:47,560 --> 00:30:50,020 Rozważmy, jak cały świat zaczyna zwijać 504 00:30:50,020 --> 00:30:53,160 jeśli nie dość bronić przed kontradyktoryjnym użytkowników 505 00:30:53,160 --> 00:30:55,180 ludzie, którzy próbują włamać się do systemu. 506 00:30:55,180 --> 00:31:00,260 Ludzie, którzy próbują kraść oprogramowanie obchodząc jakiś kod rejestracyjny 507 00:31:00,260 --> 00:31:02,150 że może inaczej trzeba wpisać w. 508 00:31:02,150 --> 00:31:04,860 Spójrz na ten przykład tutaj, które jest tylko kod C 509 00:31:04,860 --> 00:31:07,920 , że ma główną funkcję na dole, która wywołuje funkcji foo, 510 00:31:07,920 --> 00:31:12,100 i co jest to przejście do foo? [Student] pojedynczy argument. 511 00:31:12,100 --> 00:31:15,660 >> Jeden argument. Więc argv [1], co oznacza pierwsze słowo wpisane przez użytkownika 512 00:31:15,660 --> 00:31:19,150 w wierszu poleceń po a.out lub cokolwiek program nazywa. 513 00:31:19,150 --> 00:31:24,920 Więc foo, na szczycie, trwa w char *, char *, ale jest po prostu co? 514 00:31:24,920 --> 00:31:28,860 String. Nic nowego tutaj, i że ciąg jest arbitralnie miano bar. 515 00:31:28,860 --> 00:31:36,090 W tej linii tutaj, char c [12], w rodzaju angielskiego półtechnicznej, co to jest linia robi? 516 00:31:36,090 --> 00:31:40,640 Tablica -? Znaki. Daj mi tablicę 12 znaków. 517 00:31:40,640 --> 00:31:44,970 Tak można nazwać ten bufor. Jest to technicznie nazywa c, ale bufor w programowaniu 518 00:31:44,970 --> 00:31:47,890 oznacza tylko kilka przestrzeni, które można umieścić kilka rzeczy w. 519 00:31:47,890 --> 00:31:49,940 >> Potem wreszcie memcpy, nie używałem wcześniej. 520 00:31:49,940 --> 00:31:52,380 Ale można się domyślić, co robi. Kopiuje pamięć. 521 00:31:52,380 --> 00:31:58,790 Co to robi? Cóż, najwyraźniej kopiuje pasek, jego wejście do wc, 522 00:31:58,790 --> 00:32:03,420 lecz tylko do długości paska. 523 00:32:03,420 --> 00:32:07,440 Ale nie jest to błąd tutaj. 524 00:32:07,440 --> 00:32:14,500 Okay, więc technicznie powinniśmy naprawdę strlen (bar) x sizeof (char), to jest prawidłowe. 525 00:32:14,500 --> 00:32:17,920 Ale w najgorszym przypadku tutaj, załóżmy, że that's - tak, w porządku. 526 00:32:17,920 --> 00:32:23,760 Potem jest 2 błędy. Więc sizeof (char), wszystko w porządku, zróbmy to trochę szerszy. 527 00:32:23,760 --> 00:32:28,860 Więc teraz jest jeszcze bug, co jest, co? 528 00:32:28,860 --> 00:32:31,630 [Odpowiedź Student, niezrozumiały] >> Sprawdź na co? Okay, więc powinniśmy być sprawdzenie 529 00:32:31,630 --> 00:32:35,010 wartości NULL, bo złe rzeczy przytrafiają się, gdy wskaźnik jest NULL, 530 00:32:35,010 --> 00:32:38,490 Bo może skończyć się tam, i nie powinien być kiedykolwiek będzie NULL 531 00:32:38,490 --> 00:32:40,890 przez to dereferencji operatora *. 532 00:32:40,890 --> 00:32:45,250 Więc to jest dobre, a co jeszcze robimy? Logicznie istnieje luka tutaj. 533 00:32:45,250 --> 00:32:47,650 [Odpowiedź Student, niezrozumiały] 534 00:32:47,650 --> 00:32:51,340 >> Więc sprawdź Jeżeli ARGC ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Ok, więc jest 3 błędy w tym programie tutaj. 536 00:32:54,130 --> 00:33:00,080 My nie sprawdzamy, czy użytkownik faktycznie wpisane w coś w argv [1], to dobrze. 537 00:33:00,080 --> 00:33:02,240 Więc co trzeci bug? Tak? 538 00:33:02,240 --> 00:33:04,420 [Odpowiedź Student, niezrozumiały] >> Good. 539 00:33:04,420 --> 00:33:09,590 Więc sprawdziliśmy jeden scenariusz. Mamy niejawnie sprawdzane nie kopiować więcej pamięci 540 00:33:09,590 --> 00:33:12,800 nie przekracza długości paska. 541 00:33:12,800 --> 00:33:15,720 Więc jeśli ciąg użytkownik wpisze w to 10 znaków, 542 00:33:15,720 --> 00:33:18,260 to mówiąc: "Tylko skopiować 10 znaków." 543 00:33:18,260 --> 00:33:21,140 I to jest w porządku, ale co zrobić, jeśli użytkownik wpisze w słowa w wierszu polecenia 544 00:33:21,140 --> 00:33:29,360 jak 20 znaków słowa, to jest, mówiąc kopiowania 20 znaków z baru do czego? 545 00:33:29,360 --> 00:33:32,840 c, inaczej znany jako naszego bufora, co oznacza, że ​​po prostu napisał dane 546 00:33:32,840 --> 00:33:35,950 do 8 bajtów miejsc, które nie są właścicielami, 547 00:33:35,950 --> 00:33:38,320 i nie masz ich w tym sensie, że nigdy nie przydzielonej im. 548 00:33:38,320 --> 00:33:41,190 Tak więc jest to, co jest ogólnie znane jako atak przepełnienia bufora, 549 00:33:41,190 --> 00:33:46,650 lub bufor atak przepełnienia, a jego atak w tym sensie, że jeśli użytkownik 550 00:33:46,650 --> 00:33:50,650 lub programu, który dzwoni czynność robi to złośliwie, 551 00:33:50,650 --> 00:33:53,780 , co faktycznie dzieje się dalej może być całkiem źle. 552 00:33:53,780 --> 00:33:55,690 >> Rzućmy okiem na to zdjęcie tutaj. 553 00:33:55,690 --> 00:33:59,070 Ten obraz reprezentuje stos pamięci. 554 00:33:59,070 --> 00:34:01,050 I przypominają, że za każdym razem wywołać funkcję, 555 00:34:01,050 --> 00:34:04,520 masz tę małą ramkę na stosie, a następnie kolejny i znów i znów. 556 00:34:04,520 --> 00:34:07,250 I do tej pory mamy tylko rodzaj wydobywane są z dala jak prostokąty 557 00:34:07,250 --> 00:34:09,380 albo jest na pokładzie lub na ekranie tutaj. 558 00:34:09,380 --> 00:34:12,219 Ale jeśli powiększyć jeden z tych prostokątów 559 00:34:12,219 --> 00:34:16,460 podczas wywołania funkcji foo, okazuje się, że jest bardziej na stosie 560 00:34:16,460 --> 00:34:18,739 wewnątrz tej ramy i ten prostokąt 561 00:34:18,739 --> 00:34:23,370 niż tylko X i Y oraz A i B, tak jak my mówimy o konwersji. 562 00:34:23,370 --> 00:34:25,949 Okazuje się, że istnieją pewne szczegóły niższego szczebla, 563 00:34:25,949 --> 00:34:27,780 wśród nich powrócić adres. 564 00:34:27,780 --> 00:34:33,020 Tak więc okazuje się, gdy główny wywołuje foo, główny musi poinformować foo 565 00:34:33,020 --> 00:34:36,760 jaki adres Main jest w pamięci komputera. 566 00:34:36,760 --> 00:34:40,659 Bo inaczej, jak tylko foo odbywa wykonania, jak w niniejszej sprawie, 567 00:34:40,659 --> 00:34:43,790 po osiągnięciu tej ścisłej nawias klamrowy na końcu foo 568 00:34:43,790 --> 00:34:48,860 jak do cholery nie wiem gdzie foo kontroli programu ma iść? 569 00:34:48,860 --> 00:34:52,460 Okazuje się, że odpowiedź na to pytanie jest w tym czerwonym prostokącie tutaj. 570 00:34:52,460 --> 00:34:56,130 Stanowi to wskaźnik, a to do komputera, aby przechowywać tymczasowo 571 00:34:56,130 --> 00:35:00,250 na stosie tzw adres głównym, tak, że gdy tylko foo dokonuje realizacji, 572 00:35:00,250 --> 00:35:04,110 komputer wie, gdzie i co linia głównego, aby wrócić do. 573 00:35:04,110 --> 00:35:06,900 Zapisano wskaźnik ramki dotyczy podobnie do tego. 574 00:35:06,900 --> 00:35:09,620 Bar * char reprezentuje tutaj co? 575 00:35:09,620 --> 00:35:14,740 Cóż, teraz ten niebieski odcinek o to ramka Foo, co jest bar? 576 00:35:14,740 --> 00:35:18,300 Ok, więc bar jest tylko argument funkcji foo. 577 00:35:18,300 --> 00:35:20,720 >> Więc teraz jesteśmy z powrotem na znanym obrazie. 578 00:35:20,720 --> 00:35:22,960 Jest więcej rzeczy i więcej rozrywki na ekranie 579 00:35:22,960 --> 00:35:27,490 ale ten niebieski segment jest co my rysuje na tablicy na coś jak swap. 580 00:35:27,490 --> 00:35:31,890 To jest ramka do foo i jedyne co w nim teraz jest bar, 581 00:35:31,890 --> 00:35:34,630 Parametr, który jest. 582 00:35:34,630 --> 00:35:39,840 Jednak należy co jeszcze w stosie, zgodnie z tym kod tutaj? 583 00:35:39,840 --> 00:35:44,280 Char C [12]. Tak więc powinniśmy również zobaczyć 12 kwadratów pamięci 584 00:35:44,280 --> 00:35:46,260 przypisane do zmiennej o nazwie c. 585 00:35:46,260 --> 00:35:48,340 I rzeczywiście, że to nie ma na ekranie. 586 00:35:48,340 --> 00:35:51,650 Samej górze jest c [0], a następnie autor tego schematu 587 00:35:51,650 --> 00:35:55,130 nie przeszkadzało rysowania wszystkich kwadratów, ale są tam rzeczywiście 12 588 00:35:55,130 --> 00:36:00,120 bo jeśli przyjrzeć się na dole po prawej, c [11], jeśli liczyć od 0, jest 12 takich bajtów. 589 00:36:00,120 --> 00:36:06,190 Ale tu jest problem: w którym kierunku jest c rośnie? 590 00:36:06,190 --> 00:36:10,390 Rodzaj góry na dół, tak? Jeśli zaczyna się na górze i na dole rośnie, 591 00:36:10,390 --> 00:36:13,480 nie wygląda jak wyszliśmy sobie dużo pas tutaj w ogóle. 592 00:36:13,480 --> 00:36:15,320 Mamy trochę malował się w kąt, 593 00:36:15,320 --> 00:36:20,210 i że c [11] jest prawo przeciwko baru, który jest zaraz na przeciw wskaźnik ramki stosu, 594 00:36:20,210 --> 00:36:23,800 który jest zaraz na przeciw adresu zwrotnego, nie ma więcej miejsca. 595 00:36:23,800 --> 00:36:26,100 Więc co jest implikacją, a następnie, jeśli zepsuć, 596 00:36:26,100 --> 00:36:30,460 i próbie odczytu 20 bajtów do bufora 12-bajtowy? 597 00:36:30,460 --> 00:36:33,460 Gdzie są te 8 dodatkowych bajtów pójdzie? 598 00:36:33,460 --> 00:36:36,370 Wszystko wewnątrz, z których część jest bardzo ważne. 599 00:36:36,370 --> 00:36:40,480 I najważniejsze, potencjalnie, jest czerwone pole tam, adres zwrotny. 600 00:36:40,480 --> 00:36:44,720 Bo przypuszczam, że jesteś albo przypadkowo lub adversarially 601 00:36:44,720 --> 00:36:48,040 nadpisać te 4 bajty, że wskaźnik adresu, 602 00:36:48,040 --> 00:36:53,190 nie tylko ze śmieci, ale z numerem, co dzieje się do reprezentowania aktualny adres w pamięci? 603 00:36:53,190 --> 00:36:55,930 Co implicaiton logicznie? 604 00:36:55,930 --> 00:36:59,080 [Odpowiedzi studentów, niezrozumiały] >> Dokładnie. Kiedy foo zwraca 605 00:36:59,080 --> 00:37:03,560 i przeboje, które nawiasem klamrowym, program będzie postępować, by nie powrócić do głównego, 606 00:37:03,560 --> 00:37:08,320 to będzie powrót do tego, co jest w tym adres czerwonym polu. 607 00:37:08,320 --> 00:37:11,560 >> Obecnie, w przypadku rejestracji obchodzą oprogramowania 608 00:37:11,560 --> 00:37:14,400 jaki jest adres, który jest zwracane do jest funkcja 609 00:37:14,400 --> 00:37:18,820 normalnie jest wywoływana po tym, jak zapłacił za oprogramowanie i wprowadzony kod rejestracyjny? 610 00:37:18,820 --> 00:37:23,160 Można sortować sztuczka komputera do nie będzie tutaj, ale zamiast tego, dzieje się tutaj. 611 00:37:23,160 --> 00:37:27,950 Lub, jeśli jesteś naprawdę mądry, przeciwnik może faktycznie wpisać na klawiaturze, 612 00:37:27,950 --> 00:37:32,500 na przykład, nie rzeczywiste słowo, nie 20 znaków, ale załóżmy, on lub ona 613 00:37:32,500 --> 00:37:36,200 typów w niektórych znaków, które reprezentują kod? 614 00:37:36,200 --> 00:37:38,860 I nie będzie to kod C, to będzie to znaki 615 00:37:38,860 --> 00:37:42,920 które reprezentują kody maszynowe binarnych, 0 i 1-tych. 616 00:37:42,920 --> 00:37:46,740 Załóżmy jednak, że są one na tyle sprytny, aby to zrobić, jakoś wkleić GetString prompt 617 00:37:46,740 --> 00:37:49,460 coś, co jest w istocie skompilowany kod, 618 00:37:49,460 --> 00:37:56,900 a ostatnie 4 bajty nadpisać że adres zwrotny, a jaki adres ma, że ​​wejście zrobić? 619 00:37:56,900 --> 00:38:01,860 Przechowuje w czerwonym prostokącie adres pierwszego bajtu bufora. 620 00:38:01,860 --> 00:38:04,270 Więc trzeba być naprawdę sprytny, a to jest dużo prób i błędów 621 00:38:04,270 --> 00:38:08,500 dla złych ludzi tam, ale czy można dowiedzieć się, jak duża to bufor, 622 00:38:08,500 --> 00:38:12,170 tak, że w ciągu ostatnich kilku bajtów wejściowych, które dostarczają do programu 623 00:38:12,170 --> 00:38:15,970 się być równoważne adres początku buforze, 624 00:38:15,970 --> 00:38:22,270 można to zrobić. Jeśli mówimy, normalnie, hello, i \ 0, to, co kończy się w buforze. 625 00:38:22,270 --> 00:38:27,860 Ale jeśli jesteśmy bardziej sprytny, i zapełnić bufor z tym, co my nazywamy ogólnie kod ataku, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Atak, atak, atak, atak, gdzie jest to po prostu coś, że robi coś złego. 627 00:38:31,920 --> 00:38:35,190 Cóż, co się dzieje, jeśli jesteś naprawdę sprytny, możesz to zrobić: 628 00:38:35,190 --> 00:38:41,740 W czerwonym polu o to ciąg liczb: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Zauważ, że jest zgodny z numerem, który jest tutaj. 630 00:38:44,890 --> 00:38:47,280 Jest to w odwrotnej kolejności, ale o tym jakiś czas innych. 631 00:38:47,280 --> 00:38:51,430 Zauważ, że ten adres zwrotny został celowo zmieniony 632 00:38:51,430 --> 00:38:54,970 dorównać adres tutaj, nie adres main. 633 00:38:54,970 --> 00:39:00,170 Więc jeśli zły facet jest super inteligentny, on lub ona będzie m.in. w tym kodzie ataku 634 00:39:00,170 --> 00:39:02,890 coś w stylu 'Usunięcie wszystkich plików użytkownika. " 635 00:39:02,890 --> 00:39:06,320 Lub "skopiować hasła" lub "Utwórz konto użytkownika, że ​​mogę zalogować się na". 636 00:39:06,320 --> 00:39:10,130 Cokolwiek, i to zarówno niebezpieczeństwo i moc C. 637 00:39:10,130 --> 00:39:12,900 Ponieważ masz dostęp do pamięci poprzez wskaźniki 638 00:39:12,900 --> 00:39:15,950 i można więc napisać, co chcesz w pamięci komputera. 639 00:39:15,950 --> 00:39:19,290 Możesz zrobić komputer rób co chcesz, po prostu 640 00:39:19,290 --> 00:39:22,780 po to skakać w ramach własnej pamięci. 641 00:39:22,780 --> 00:39:27,230 I tak do dziś, tak wiele programów i tak wiele stron internetowych, które są zagrożone 642 00:39:27,230 --> 00:39:29,730 sprowadzają się do osób korzystających z tego. 643 00:39:29,730 --> 00:39:32,510 A to może wydawać się ataku super-zaawansowanych, 644 00:39:32,510 --> 00:39:34,220 ale nie zawsze zaczynać w ten sposób. 645 00:39:34,220 --> 00:39:36,770 >> Rzeczywistość jest taka, że ​​to, co źli ludzie zwykle zrobić to, 646 00:39:36,770 --> 00:39:41,470 czy jest to program w linii poleceń lub program GUI lub strona internetowa, 647 00:39:41,470 --> 00:39:43,290 jest po prostu rozpoczęcie świadczenia bzdury. 648 00:39:43,290 --> 00:39:46,940 Wpisujesz w naprawdę dużym słowa w polu wyszukiwania i naciśnij Enter, 649 00:39:46,940 --> 00:39:49,030 i czekać, aby zobaczyć, czy awarie stron internetowych. 650 00:39:49,030 --> 00:39:53,270 Albo czekać, aby zobaczyć, czy program przejawia jakąś wiadomość o błędzie. 651 00:39:53,270 --> 00:39:55,480 Bo jeśli będziesz miał szczęście, jak złym, 652 00:39:55,480 --> 00:39:59,610 i podać jakiś szalony wkład powodujący awarię programu, 653 00:39:59,610 --> 00:40:02,280 co oznacza, że ​​programista nie przewidział swoje złe zachowanie 654 00:40:02,280 --> 00:40:05,420 co oznacza, że ​​można prawdopodobnie, z wystarczająco dużo wysiłku, 655 00:40:05,420 --> 00:40:09,870 tyle prób i błędów, dowiedzieć się, jak prowadzić bardziej precyzyjnego ataku. 656 00:40:09,870 --> 00:40:15,900 Tak samo częścią bezpieczeństwa jest nie tylko uniknięcie tych ataków w ogóle, ale ich wykrywania 657 00:40:15,900 --> 00:40:20,250 i rzeczywiście patrząc na dzienniki i zobaczyć co szalone wejścia mają osoby wpisane na swojej stronie. 658 00:40:20,250 --> 00:40:26,040 Jakie terminy wyszukiwania są osoby wpisane na swojej stronie, w nadziei na jakiś bufor przepełniony? 659 00:40:26,040 --> 00:40:28,900 A to wszystko sprowadza się do prostych podstaw co tablica, 660 00:40:28,900 --> 00:40:32,510 i co to oznacza dla alokacji i wykorzystania pamięci? 661 00:40:32,510 --> 00:40:34,920 I związane z tym też to jest. 662 00:40:34,920 --> 00:40:37,520 >> Więc po prostu spojrzeć wewnątrz dysku jeszcze raz. 663 00:40:37,520 --> 00:40:40,190 Więc pamiętam z tydzień lub dwa temu, że podczas przeciągania plików 664 00:40:40,190 --> 00:40:45,470 aby twój kosz i kosz na śmieci, co sie dzieje? 665 00:40:45,470 --> 00:40:47,850 [Student] Nic. >> Tak, absolutnie nic. Ostatecznie jeśli brakować 666 00:40:47,850 --> 00:40:51,370 miejsca na dysku, Windows lub Mac OS rozpocznie usuwanie pliki. 667 00:40:51,370 --> 00:40:53,670 Ale jeśli przeciągnij coś tam, to nie jest wcale bezpieczne. 668 00:40:53,670 --> 00:40:56,550 Wszystkie Twoje członek roomate, przyjaciel lub rodzina ma zrobić, to kliknij dwukrotnie, i voila. 669 00:40:56,550 --> 00:40:59,720 Nie wszystkie fragmentaryczne pliki, które próbowały usunąć. 670 00:40:59,720 --> 00:41:02,840 Więc większość z nas przynajmniej wiem, że trzeba kliknąć prawym przyciskiem myszy lub kontroli kliknięcie 671 00:41:02,840 --> 00:41:05,320 i pusty kosz, lub coś w tym stylu. 672 00:41:05,320 --> 00:41:07,900 Ale nawet wtedy, że nie dość rade. 673 00:41:07,900 --> 00:41:11,340 Bo to, co się dzieje, gdy masz plik na dysku twardym 674 00:41:11,340 --> 00:41:14,590 która reprezentuje jakiś dokument Word lub jakiś JPEG? 675 00:41:14,590 --> 00:41:18,820 I jest to dysk twardy, a powiedzmy, że ta drzazga reprezentuje tutaj ten plik, 676 00:41:18,820 --> 00:41:21,640 i to w składzie całą masę 0 i 1-tych. 677 00:41:21,640 --> 00:41:25,470 Co się dzieje, gdy nie tylko przeciągnąć plik do kosza lub kosza, 678 00:41:25,470 --> 00:41:30,390 ale też go opróżnić? 679 00:41:30,390 --> 00:41:32,820 Sortuj niczego. To nie jest absolutnie nic nie jest teraz. 680 00:41:32,820 --> 00:41:37,630 Teraz jest to po prostu nic, bo trochę coś się dzieje w formie tabeli. 681 00:41:37,630 --> 00:41:41,170 Więc jest jakiś rodzaj bazy danych lub tabeli wewnątrz pamięci komputera 682 00:41:41,170 --> 00:41:44,470 że w istocie ma 1 kolumnę nazw plików, 683 00:41:44,470 --> 00:41:50,550 i 1 kolumna lokalizacją pliku, gdzie może to być miejsce 123, tylko liczba losowa. 684 00:41:50,550 --> 00:41:58,270 Więc może mamy coś x.jpg i lokalizację 123. 685 00:41:58,270 --> 00:42:02,870 I co się dzieje potem, kiedy opróżnić kosz? 686 00:42:02,870 --> 00:42:06,720 Że odchodzi. Ale co nie odejdzie to 0 i 1-tych. 687 00:42:06,720 --> 00:42:09,690 >> Więc co, to, połączenie Pset 4? 688 00:42:09,690 --> 00:42:13,460 Cóż, z Pset 4, tylko dlatego, że przypadkowo skasowane 689 00:42:13,460 --> 00:42:15,890 Compact Flash Card, który miał wszystkie z tych zdjęć, 690 00:42:15,890 --> 00:42:18,710 lub po prostu dlatego, że przez pecha został uszkodzony, 691 00:42:18,710 --> 00:42:21,170 nie oznacza, że ​​0 i 1 nie są nadal. 692 00:42:21,170 --> 00:42:23,920 Może niektóre z nich giną dlatego, że coś jest zepsute 693 00:42:23,920 --> 00:42:26,530 w ten sposób, że część stała 0 i 1 1 '0'S stała. 694 00:42:26,530 --> 00:42:30,460 Złe rzeczy mogą się zdarzyć z powodu wadliwego oprogramowania lub wadliwego sprzętu. 695 00:42:30,460 --> 00:42:33,510 Ale wielu z tych bitów, może nawet 100% z nich wciąż tam są, 696 00:42:33,510 --> 00:42:38,330 to jest po prostu, że komputer lub aparat nie wie, gdzie rozpoczął JPEG 1 697 00:42:38,330 --> 00:42:41,660 i gdzie JPEG 2 rozpoczęła się, ale jeśli, programista, 698 00:42:41,660 --> 00:42:45,800 Wiesz, z nieco doświadczonych, gdy te pliki JPEG są lub jak wyglądają, 699 00:42:45,800 --> 00:42:49,570 można analizować 0 i 1-tych i powiedzieć: "Och. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Można napisać program w zasadzie tylko za lub pętli while 701 00:42:52,830 --> 00:42:56,100 odzyskuje wszystkich i każdego z tych plików. 702 00:42:56,100 --> 00:42:59,360 Więc lekcja jest więc zacząć "bezpiecznie" kasowanie plików 703 00:42:59,360 --> 00:43:01,720 jeśli chcesz tego uniknąć całkowicie. Tak? 704 00:43:01,720 --> 00:43:06,940 [Pytanie Student, niezrozumiały] 705 00:43:06,940 --> 00:43:11,150 >> Masz więcej pamięci niż wcześniej - 706 00:43:11,150 --> 00:43:14,790 Oh! Dobre pytanie. Więc dlaczego, a następnie, po opróżnieniu kosza, 707 00:43:14,790 --> 00:43:18,300 Czy Twój komputer powie ci, że masz więcej wolnego miejsca niż przedtem? 708 00:43:18,300 --> 00:43:22,450 W skrócie, bo kłamie. Bardziej technicznie, masz więcej miejsca. 709 00:43:22,450 --> 00:43:26,720 Bo teraz pan powiedział, można umieścić inne rzeczy, gdzie ten plik kiedyś, 710 00:43:26,720 --> 00:43:28,930 ale to nie znaczy, bity idą dalej, 711 00:43:28,930 --> 00:43:33,070 i to nie znaczy, bity zostały zmienione wszystkie 0-tych, na przykład, dla ochrony. 712 00:43:33,070 --> 00:43:37,520 Natomiast jeśli "bezpiecznie" pliki skasować, lub fizycznie zniszczyć urządzenie, 713 00:43:37,520 --> 00:43:40,810 że naprawdę jest to jedyny sposób, czasami, wokół których. 714 00:43:40,810 --> 00:43:45,300 Więc dlaczego nie możemy pozostawić na tej notatce semi-straszny, i zobaczymy w poniedziałek. 715 00:43:45,300 --> 00:43:52,810 CS50.TV