1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Tydzień 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [To jest CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> To CS50, Tydzień 5. 5 00:00:09,740 --> 00:00:12,900 Dziś i ten tydzień, przedstawiamy trochę świata forensics 6 00:00:12,900 --> 00:00:14,850 w kontekście problemu Set 4. 7 00:00:14,850 --> 00:00:18,480 Dzisiaj będzie skrócona wykład bo jest szczególnym wydarzeniem w tutaj później. 8 00:00:18,480 --> 00:00:21,940 Będziemy więc zerknąć i drażnić zarówno uczniów jak i rodziców już dziś 9 00:00:21,940 --> 00:00:24,600 niektóre z rzeczy, które są na horyzoncie. 10 00:00:24,600 --> 00:00:29,050 >> Wśród nich, od poniedziałku, będzie jeszcze kilka kolegów. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard i najnowsza inicjatywa MIT OpenCourseWare i więcej, 12 00:00:32,980 --> 00:00:36,730 jest uruchomienie na terenie kampusu Uniwersytetu Harvarda w poniedziałek, co oznacza pochodzić poniedziałek 13 00:00:36,730 --> 00:00:40,930 trzeba będzie, jak z ostatniego liczenia, 86.000 dodatkowych kolegów 14 00:00:40,930 --> 00:00:43,680 Kto będzie wraz z wykładów CS50 i sekcje 15 00:00:43,680 --> 00:00:45,890 i solucje i zestawy problem. 16 00:00:45,890 --> 00:00:51,870 I jako część tego, staniecie się członkami klasy inauguracyjnym CS50 i teraz CS50x. 17 00:00:51,870 --> 00:00:56,150 W ramach tego teraz, uświadomić sobie, że będzie kilka upsides również. 18 00:00:56,150 --> 00:01:00,620 Aby przygotować się do tego, do ogromnej liczby uczniów, 19 00:01:00,620 --> 00:01:03,820 wystarczy powiedzieć, że nawet jeśli mamy 108 TFS i CAS, 20 00:01:03,820 --> 00:01:07,560 nie dość najlepszy stosunek nauczyciel-uczeń jest raz trafiliśmy 80.000 studentów. 21 00:01:07,560 --> 00:01:09,830 Nie jedziemy do klasyfikacji tak wiele problemu ustawia ręcznie, 22 00:01:09,830 --> 00:01:13,050 tak przedstawił w tym tygodniu w zestawie problem zostanie CS50 Check, 23 00:01:13,050 --> 00:01:15,410 który ma być narzędziem wiersza polecenia wewnątrz urządzenia 24 00:01:15,410 --> 00:01:17,880 że dostaniesz po zaktualizowaniu go później w ten weekend. 25 00:01:17,880 --> 00:01:21,030 Będzie można uruchomić polecenie, check50, na własnym PSET, 26 00:01:21,030 --> 00:01:24,770 a otrzymasz natychmiastową informację zwrotną, czy program jest poprawny lub 27 00:01:24,770 --> 00:01:27,980 według różnych specyfikacji projektowych, które podajemy. 28 00:01:27,980 --> 00:01:30,310 Więcej na ten temat w opisie zestaw problemów. 29 00:01:30,310 --> 00:01:34,220 W CS50x koledzy będą korzystać to za dobrze. 30 00:01:34,220 --> 00:01:36,170 >> Set 4 Problem jest o kryminalistyce, 31 00:01:36,170 --> 00:01:38,630 i to pset naprawdę inspirowane przez niektóre rzeczy rzeczywistych 32 00:01:38,630 --> 00:01:41,210 przy czym, gdy byłem na studiach I internowany na chwilę 33 00:01:41,210 --> 00:01:45,270 z adwokatem Middlesex County dzielnicy biuro robi ekspertyzy, 34 00:01:45,270 --> 00:01:47,660 ich główny badacz kryminalistycznych. 35 00:01:47,660 --> 00:01:50,280 Co ta wynosiła, jak myślę, już wspomniałem kilka tygodni przeszłości, 36 00:01:50,280 --> 00:01:52,720 jest policja lub inne państwowe masowe przychodził, 37 00:01:52,720 --> 00:01:56,150 oni zostawić rzeczy jak dyski twarde i płyty CD i dyskietki i tym podobnych, 38 00:01:56,150 --> 00:01:58,770 a następnie celem Urzędu kryminalistycznych było ustalenie 39 00:01:58,770 --> 00:02:01,470 czy istnieje lub nie był dowód pewnego rodzaju. 40 00:02:01,470 --> 00:02:04,730 To było specjalne Dochodzenia, więc było umysłowych przestępczości. 41 00:02:04,730 --> 00:02:10,949 To było bardziej niepokojący rodzaj zbrodni, wszystko obejmujący jakiś mediów cyfrowych. 42 00:02:10,949 --> 00:02:16,450 Okazuje się, że nie, że wiele osób, napisać e-maila o treści: "Zrobiłem to". 43 00:02:16,450 --> 00:02:20,490 Tak często, te kryminalistyczne wyszukiwania nie pojawił się aż tak dużo owoców, 44 00:02:20,490 --> 00:02:22,820 ale czasem ludzie będą pisać takie maile. 45 00:02:22,820 --> 00:02:25,240 Więc czasami, wysiłki zostały nagrodzone. 46 00:02:25,240 --> 00:02:31,210 >> Ale żeby doprowadzić do tego kryminalistycznych PSET, będziemy wprowadzenie w pset4 trochę grafiką. 47 00:02:31,210 --> 00:02:35,410 Prawdopodobnie wziąć te rzeczy za pewnik - JPEG, GIF, i jak - w tych dniach. 48 00:02:35,410 --> 00:02:38,320 Ale jeśli naprawdę myślisz o tym, obraz, podobnie jak twarz Roba, 49 00:02:38,320 --> 00:02:41,270 może być modelowana, jak w sekwencji lub punktów pikseli. 50 00:02:41,270 --> 00:02:43,380 W przypadku powierzchni Roba, nie wszystkie rodzaje kolorów 51 00:02:43,380 --> 00:02:46,760 i zaczęliśmy zobaczyć poszczególne punkty, inaczej znany jako pikseli, 52 00:02:46,760 --> 00:02:48,610 raz zaczęliśmy, aby powiększyć 53 00:02:48,610 --> 00:02:54,660 Ale jeśli uprościć świat trochę i po prostu powiedzieć, że to o to Rob w czerni i bieli, 54 00:02:54,660 --> 00:02:57,490 do reprezentowania czarne i białe, możemy po prostu użyć binarny. 55 00:02:57,490 --> 00:03:01,660 A jeśli będziemy używać binarnych, 1 lub 0, możemy wyrazić ten sam obraz 56 00:03:01,660 --> 00:03:06,140 z uśmiechem na twarzy Roba z tego wzorca bitów. 57 00:03:06,140 --> 00:03:12,100 11000011 reprezentuje biały, biały, czarny, czarny, czarny, czarny, biały, biały. 58 00:03:12,100 --> 00:03:16,150 I tak to nie jest to ogromny skok jest wtedy zacząć mówić o kolorowych fotografiach 59 00:03:16,150 --> 00:03:18,600 rzeczy, które chcesz zobaczyć na Facebook lub wziąć z aparatu cyfrowego. 60 00:03:18,600 --> 00:03:21,410 Ale na pewno, jeśli chodzi o kolory, potrzebujesz więcej bitów. 61 00:03:21,410 --> 00:03:25,690 I dość powszechne w świecie fotografii jest używać nie 1-bitowy kolor, 62 00:03:25,690 --> 00:03:29,560 jak to sugeruje, ale 24-bitowy kolor, w którym rzeczywiście się miliony kolorów. 63 00:03:29,560 --> 00:03:32,250 Tak więc, jak w przypadku, gdy w powiększeniu na oko Roba, 64 00:03:32,250 --> 00:03:36,370 to było dowolną liczbę milionów różnych kolorowych możliwości. 65 00:03:36,370 --> 00:03:39,040 Więc będziemy wprowadzać to w secie Problem 4, jak również w instrukcji 66 00:03:39,040 --> 00:03:43,370 który będzie dziś o 3:30, zamiast zwykłej 2:30 bo wykładu piątkowego tutaj. 67 00:03:43,370 --> 00:03:46,620 Ale wideo online będzie jak zwykle jutro. 68 00:03:46,620 --> 00:03:48,820 >> Będziemy także wprowadzenie do innego formatu pliku. 69 00:03:48,820 --> 00:03:51,270 To jest celowo ma wyglądać zastraszenia w pierwszym, 70 00:03:51,270 --> 00:03:55,670 ale jest to tylko część dokumentacji struct C. 71 00:03:55,670 --> 00:03:58,940 Okazuje się, że rok temu Microsoft pomógł spopularyzować ten format 72 00:03:58,940 --> 00:04:05,150 nazywany bitmap format, bmp, i to było super proste, kolorowe format pliku graficznego 73 00:04:05,150 --> 00:04:10,150 , który był używany przez jakiś czas, a czasami jeszcze do tapet na pulpitach. 74 00:04:10,150 --> 00:04:14,760 Jeśli uważasz, że powrót do systemu Windows XP i wzgórz i błękitne niebo, 75 00:04:14,760 --> 00:04:17,170 to było zazwyczaj obraz bmp lub bitmap. 76 00:04:17,170 --> 00:04:19,959 Bitmapy są zabawne dla nas, bo mają trochę więcej złożoności. 77 00:04:19,959 --> 00:04:22,610 To nie jest takie proste, jak się to siatki 0s i 1s. 78 00:04:22,610 --> 00:04:27,510 Zamiast tego masz takie rzeczy jak nagłówek na początku pliku. 79 00:04:27,510 --> 00:04:31,990 Więc innymi słowy, wewnątrz pliku. Bmp jest cała masa 0s i 1s, 80 00:04:31,990 --> 00:04:34,910 ale jest kilka dodatkowych 0s i 1s tam. 81 00:04:34,910 --> 00:04:38,220 I okazuje się, że to, co zapewne za pewnik od lat - 82 00:04:38,220 --> 00:04:45,170 formaty plików, takie jak. doc lub. xls lub. mp3, mp4,. cokolwiek formaty plików 83 00:04:45,170 --> 00:04:48,480 że jesteś zaznajomiony z - co to w ogóle znaczy być format pliku, 84 00:04:48,480 --> 00:04:52,480 , ponieważ na końcu dnia wszystkie pliki mają tylko używamy 0s i 1S. 85 00:04:52,480 --> 00:04:56,810 A może te 0s i 1s reprezentować ABC ASCII lub podobnego, 86 00:04:56,810 --> 00:04:58,820 a na końcu dnia, to jest jeszcze tylko 0s i 1S. 87 00:04:58,820 --> 00:05:02,100 Więc ludzie, tylko sporadycznie decydują się stworzyć nowy format pliku 88 00:05:02,100 --> 00:05:06,420 gdzie standaryzacja co wzorce bitów rzeczywiście myśli. 89 00:05:06,420 --> 00:05:09,220 I w tym przypadku tutaj, ludzie, którzy zaprojektowany format pliku bitmapy 90 00:05:09,220 --> 00:05:15,620 powiedział, że na pierwszy bajt w pliku mapy bitowej, jak oznaczone offsetowych 0 tam, 91 00:05:15,620 --> 00:05:18,940 tam będzie trochę tajemniczo nazwana zmienna nazwana bfType, 92 00:05:18,940 --> 00:05:23,080 które po prostu oznacza bitmapy typu pliku, jaki typ plików graficznych jest to. 93 00:05:23,080 --> 00:05:27,700 Można wywnioskować, może z drugiego rzędu, że przesunięcie 2, nr 2, bajt 94 00:05:27,700 --> 00:05:33,740 ma wzorzec 0s i 1s, który reprezentuje co? Rozmiar czegoś. 95 00:05:33,740 --> 00:05:35,310 I idzie tam. 96 00:05:35,310 --> 00:05:37,410 Więc w secie Problem 4, będziesz szedł przez niektóre z tych rzeczy. 97 00:05:37,410 --> 00:05:39,520 Nie skończy się dbać o wszystkich z nich. 98 00:05:39,520 --> 00:05:47,510 Zauważmy jednak, że zaczyna się ciekawie wokół bajcie 54: rgbtBlue, Zielony i Czerwony. 99 00:05:47,510 --> 00:05:52,110 Jeśli kiedykolwiek słyszał skrót RGB - czerwony, zielony, niebieski - to jest odniesienie do 100 00:05:52,110 --> 00:05:54,610 bo okazuje się, można malować wszystkie kolory tęczy 101 00:05:54,610 --> 00:05:58,180 z niektórych kombinacji czerwony i niebieski i zielony. 102 00:05:58,180 --> 00:06:03,320 A w rzeczywistości, rodzice w pokoju może przypomnieć niektóre z najwcześniejszych projektorów. 103 00:06:03,320 --> 00:06:05,890 Te dni, wystarczy zobaczyć jeden jasne światło wychodzące z obiektywu, 104 00:06:05,890 --> 00:06:09,800 ale już w dzień trzeba było czerwone, niebieskie soczewki obiektywu, a zielona soczewka, 105 00:06:09,800 --> 00:06:13,380 i razem ukierunkowane na ekranie i tworzy barwny obraz. 106 00:06:13,380 --> 00:06:16,270 I dość często, gimnazja i szkoły średnie będą mieć te soczewki 107 00:06:16,270 --> 00:06:19,720 nigdy tak lekko krzywo, więc były rodzaju widzenie podwójne lub potrójne obrazy. 108 00:06:19,720 --> 00:06:24,100 Ale to był pomysł. Trzeba było czerwone i zielone i niebieskie światło, malowanie obrazu. 109 00:06:24,100 --> 00:06:26,590 I że sama zasada jest stosowana w komputerach. 110 00:06:26,590 --> 00:06:30,230 >> Tak więc niektóre z wyzwań dla Ciebie w ówczesnych problem Set 4 będą kilka rzeczy. 111 00:06:30,230 --> 00:06:34,800 Jednym z nich jest rzeczywiście zmienić rozmiar obrazu, do podjęcia w strukturze 0s i 1s, 112 00:06:34,800 --> 00:06:40,200 dowiedzieć się, które kawałki 0s i 1s reprezentuje to co w strukturze jak ten, 113 00:06:40,200 --> 00:06:43,630 , a następnie dowiedzieć się, jak powielanie pikseli - The Reds, blues, Zieloni - 114 00:06:43,630 --> 00:06:46,660 wewnątrz tak, że gdy obraz wygląda początkowo 115 00:06:46,660 --> 00:06:49,210 Może to wyglądać tak, a nie po. 116 00:06:49,210 --> 00:06:53,640 Wśród innych wyzwań zbyt będzie, że będziesz wręczył kryminalistycznych obraz 117 00:06:53,640 --> 00:06:56,030 o rzeczywistej pliku z aparatu cyfrowego. 118 00:06:56,030 --> 00:06:58,960 I na tym aparacie, kiedyś były cała masa zdjęć. 119 00:06:58,960 --> 00:07:03,760 Problem jest, że przypadkowo usunięte lub miał obraz uszkodzony jakoś. 120 00:07:03,760 --> 00:07:05,750 Złe rzeczy się aparatami cyfrowymi. 121 00:07:05,750 --> 00:07:09,150 I tak szybko kopiowane wszystkie 0s i 1s off tej karty dla Ciebie, 122 00:07:09,150 --> 00:07:13,610 zapisane je wszystkie w jeden duży plik, a potem oddajemy je do Ciebie w Problem Set 4 123 00:07:13,610 --> 00:07:19,320 tak, że można napisać program w języku C, z którym w celu odzyskania tych wszystkich plików JPEG, idealnie. 124 00:07:19,320 --> 00:07:23,330 I okazuje się, że pliki JPEG, choć są one nieco złożonego formacie pliku - 125 00:07:23,330 --> 00:07:26,360 są o wiele bardziej złożone, niż się to uśmiechnięta twarz tu - 126 00:07:26,360 --> 00:07:31,160 Okazuje się, że każdy JPEG rozpoczyna się tymi samymi wzorami 0s i 1s. 127 00:07:31,160 --> 00:07:35,630 Więc korzystając ostatecznie, pętla lub pętli for lub podobne, 128 00:07:35,630 --> 00:07:38,880 można iterować wszystkie 0s i 1s w tym kryminalistycznych obrazu, 129 00:07:38,880 --> 00:07:43,150 i za każdym razem pojawi się specjalny wzór, który jest zdefiniowany w specyfikacji zestaw problemów, 130 00:07:43,150 --> 00:07:47,880 można założyć o to, z bardzo wysokim prawdopodobieństwem, początek JPEG. 131 00:07:47,880 --> 00:07:51,230 I jak najszybciej znaleźć tego samego wzorca pewną liczbę bajtów 132 00:07:51,230 --> 00:07:55,430 lub kilobajtach lub megabajtach później, można przypuszczać, o to sekundy JPEG, 133 00:07:55,430 --> 00:07:57,380 zdjęcie wziąłem po pierwszej. 134 00:07:57,380 --> 00:08:01,370 Pozwól mi przestać czytać ten pierwszy plik, zacząć pisać ten nowy, 135 00:08:01,370 --> 00:08:06,310 i wyjście z programu do pset4 będzie aż 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 A jeśli to nie jest 50 plików JPEG, masz trochę pętli. 137 00:08:09,270 --> 00:08:12,490 Jeśli masz nieskończoną liczbę JPEG, masz nieskończoną pętlę. 138 00:08:12,490 --> 00:08:14,910 Więc to też będzie dość częsty przypadek. 139 00:08:14,910 --> 00:08:16,600 Więc to, co jest na horyzoncie. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 za nami, zrealizować za mojego maila, że ​​zawsze są ludzie, którzy są zarówno szczęśliwi, 141 00:08:21,310 --> 00:08:23,640 rodzaj neutralnej i smutne okolice quizu 0 czasu. 142 00:08:23,640 --> 00:08:26,800 I proszę do mnie dotrzeć, szef TF Zamyla, własne TF, 143 00:08:26,800 --> 00:08:31,180 lub w jednym z urzędów, że wiesz, czy chcesz, aby przedyskutować jak poszło. 144 00:08:31,180 --> 00:08:35,539 >> Tak więc, aby zaimponować rodzicom tutaj w pokoju, co jest CS50 biblioteka? 145 00:08:36,429 --> 00:08:40,390 [Śmiech] Dobra robota. 146 00:08:40,390 --> 00:08:48,340 Co CS50 biblioteka? Tak. >> [Uczeń] To pre-napisany zestaw kodu [niesłyszalne] 147 00:08:48,340 --> 00:08:49,750 Dobra, dobra. 148 00:08:49,750 --> 00:08:53,240 To jest pre-napisany zestaw kodu, że personel napisał, oferujemy Państwu, 149 00:08:53,240 --> 00:08:55,030 , która zapewnia pewne wspólne funkcje, 150 00:08:55,030 --> 00:08:59,020 Rzeczy jak załatwić mi łańcuch, żebym int - wszystkie funkcje, które są tutaj wymienione. 151 00:08:59,020 --> 00:09:02,260 >> Od teraz zaczynamy naprawdę wziąć te kółka off. 152 00:09:02,260 --> 00:09:05,050 Zamierzamy rozpocząć zabrać ciąg od ciebie, 153 00:09:05,050 --> 00:09:08,870 których odzyskanie było tylko synonimem co rzeczywisty typ danych? Studenci >> [Wiele] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Dla rodziców, to prawdopodobnie [czyni dźwięk whooshing]. To dobrze. 155 00:09:12,730 --> 00:09:17,550 Char * zaczniemy widzieć na ekranie, tym bardziej jak usunąć napis z naszego słownictwa, 156 00:09:17,550 --> 00:09:19,730 przynajmniej jeśli chodzi o faktycznie pisania kodu. 157 00:09:19,730 --> 00:09:22,840 Podobnie będziemy zaprzestać stosowania niektórych z tych funkcji, jak wiele 158 00:09:22,840 --> 00:09:25,280 bo nasze programy będą się bardziej wyrafinowane. 159 00:09:25,280 --> 00:09:28,480 Zamiast po prostu napisać programy, które siedzą tam z polecenia miga, 160 00:09:28,480 --> 00:09:31,870 czeka na użytkownika wpisać coś, dostaniesz swoje wejścia z zewnątrz. 161 00:09:31,870 --> 00:09:35,490 Na przykład, można je dostać z serii bitów na lokalnym dysku twardym. 162 00:09:35,490 --> 00:09:38,580 Będziesz zamiast je w przyszłości z połączenia sieciowego, 163 00:09:38,580 --> 00:09:40,230 jakaś witryna gdzieś. 164 00:09:40,230 --> 00:09:44,110 >> Więc odwinąć tej warstwy po raz pierwszy i wyciągnij CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 a ten plik nazywa cs50.h, którą już w tym na tydzień #, 166 00:09:49,010 --> 00:09:51,140 ale niech rzeczywiście zobaczyć co jest w środku tego. 167 00:09:51,140 --> 00:09:54,430 Top pliku w kolorze niebieskim jest tylko cała masa komentarzy: 168 00:09:54,430 --> 00:09:57,050 informacje na temat gwarancji i licencjonowania. 169 00:09:57,050 --> 00:09:59,050 Jest to rodzaj wspólnej paradygmatu w oprogramowaniu 170 00:09:59,050 --> 00:10:01,580 ponieważ wiele programów w tych dniach jest to, co nazywa się open source, 171 00:10:01,580 --> 00:10:05,220 co oznacza, że ​​ktoś napisał kod i sprawiło, że łatwo dostępne 172 00:10:05,220 --> 00:10:10,470 nie tylko do uruchomienia i do wykorzystania, ale faktycznie czytać i zmieniać i włączać do własnej pracy. 173 00:10:10,470 --> 00:10:14,660 Więc to, co już przy użyciu, oprogramowanie open source, choć w formie bardzo małych. 174 00:10:14,660 --> 00:10:18,560 Gdybym przewinąć przeszłości komentarzach, choć zaczniemy zobaczyć jakieś bardziej znane rzeczy. 175 00:10:18,560 --> 00:10:25,010 Wskazówka na top tutaj, że plik zawiera cs50.h całą masę plików nagłówkowych. 176 00:10:25,010 --> 00:10:28,560 Większość z nich, czego nie widzieliśmy wcześniej, ale jedno jest znajome. 177 00:10:28,560 --> 00:10:32,270 Która z nich widzieliśmy, choć na krótko, do tej pory? >> [Uczeń] Standardowa biblioteka. 178 00:10:32,270 --> 00:10:35,810 Tak, biblioteki standardowej. stdlib.h ma malloc. 179 00:10:35,810 --> 00:10:38,320 Kiedy zaczął mówić o dynamicznej alokacji pamięci, 180 00:10:38,320 --> 00:10:41,650 które wrócimy do przyszłego tygodnia, jak również, zaczęliśmy w tym pliku. 181 00:10:41,650 --> 00:10:46,640 Okazuje się, że bool i prawda i fałsz w rzeczywistości nie istnieją w C per se 182 00:10:46,640 --> 00:10:49,440 chyba, że ​​to ten plik tutaj. 183 00:10:49,440 --> 00:10:52,710 Mamy już za tydzień w tym stdbool.h 184 00:10:52,710 --> 00:10:55,620 tak aby można było używać pojęcia bool, true lub false. 185 00:10:55,620 --> 00:10:58,620 Bez tego, to masz coś w rodzaju fałszywego niego i używać int 186 00:10:58,620 --> 00:11:02,610 i po prostu arbitralnie założyć, że 0 jest fałszywa i 1 prawda. 187 00:11:02,610 --> 00:11:07,150 Jeśli będziemy przewijać dalej, tu jest nasza definicja łańcucha. 188 00:11:07,150 --> 00:11:11,390 Okazuje się, jak już wcześniej powiedziałem, że tam, gdzie ta gwiazda jest naprawdę nie ma znaczenia. 189 00:11:11,390 --> 00:11:13,720 Można nawet mieć miejsce wszędzie. 190 00:11:13,720 --> 00:11:16,740 Mamy w tym semestrze zostały promowanie go jako tego, by wyjaśnić 191 00:11:16,740 --> 00:11:18,620 że gwiazda ma do czynienia z typem 192 00:11:18,620 --> 00:11:21,700 ale zdaje sobie sprawy, jak często, jeśli nie trochę bardziej powszechne, 193 00:11:21,700 --> 00:11:24,430 jest, aby umieścić go tam, ale funkcjonalnie to samo. 194 00:11:24,430 --> 00:11:27,720 Ale teraz, gdy czytamy w dół dalej, rzućmy okiem na getInt 195 00:11:27,720 --> 00:11:32,190 ponieważ kiedyś, że być może zanim cokolwiek innego w tym semestrze. 196 00:11:32,190 --> 00:11:37,440 Oto getInt. To jest co? >> [Uczeń] prototyp. >> To jest tylko prototyp. 197 00:11:37,440 --> 00:11:41,410 Często musimy umieścić prototypy na szczytach naszych. Pliki c, 198 00:11:41,410 --> 00:11:46,690 ale można również umieścić prototypów w plikach nagłówkowych,. pliki h, jak ten tutaj 199 00:11:46,690 --> 00:11:50,840 tak, że gdy piszesz do niektórych funkcji, które chcesz, aby inni ludzie mogli używać, 200 00:11:50,840 --> 00:11:53,550 która jest dokładnie w przypadku biblioteki CS50, 201 00:11:53,550 --> 00:11:57,040 Ci nie tylko realizować swoje funkcje w coś cs50.c, 202 00:11:57,040 --> 00:12:02,790 również umieścić prototypów nie na górze tego pliku, ale na początku pliku nagłówka. 203 00:12:02,790 --> 00:12:07,170 Następnie, że nagłówek pliku jest to, co koledzy i przyjaciele m.in. 204 00:12:07,170 --> 00:12:09,760 z # include w swoim kodzie. 205 00:12:09,760 --> 00:12:12,210 Więc cały ten czas byłeś w tym wszystkie z tych prototypów, 206 00:12:12,210 --> 00:12:16,580 skutecznie na początku pliku ale sposób ten obejmuje: mechanizm 207 00:12:16,580 --> 00:12:20,070 które zasadniczo kopie i pasty ten plik do siebie. 208 00:12:20,070 --> 00:12:23,070 Oto dość szczegółową dokumentację. 209 00:12:23,070 --> 00:12:25,640 Mamy dość dużo za pewnik, że getInt dostaje int, 210 00:12:25,640 --> 00:12:27,640 ale okazuje się, istnieje kilka przypadków, narożne. 211 00:12:27,640 --> 00:12:31,810 Co zrobić, jeśli użytkownik wpisze w szeregu, który jest zbyt duży, trylionów, 212 00:12:31,810 --> 00:12:35,490 że po prostu nie może się zmieścić wewnątrz z int? Jakie jest oczekiwane zachowanie? 213 00:12:35,490 --> 00:12:38,020 Idealnie, to przewidywalne. 214 00:12:38,020 --> 00:12:40,280 Więc w tym przypadku, jeśli rzeczywiście przeczytać drobnym drukiem, 215 00:12:40,280 --> 00:12:44,500 będziesz faktycznie zobaczyć, że jeśli linia nie może zostać odczytany, to INT_MAX zwraca. 216 00:12:44,500 --> 00:12:48,320 Nigdy nie rozmawialiśmy o tym, ale na podstawie jego kapitalizacji, co to jest chyba? 217 00:12:48,320 --> 00:12:50,640 [Uczeń] stała. >> To jest stała. 218 00:12:50,640 --> 00:12:54,770 To jakaś specjalna stała pewnie oświadczył w jednym z tych plików nagłówkowych 219 00:12:54,770 --> 00:13:00,090 to się wyżej w pliku, a INT_MAX chyba coś około 2 mld euro, 220 00:13:00,090 --> 00:13:04,990 Pogląd, że dlatego, że trzeba jakoś oznaczać, że coś poszło nie tak, 221 00:13:04,990 --> 00:13:10,700 my, tak, ma 4 miliardy numerów do naszej dyspozycji: -2 mld euro do 2 mld euro, lub dać. 222 00:13:10,700 --> 00:13:14,710 No, co jest powszechne w programowaniu jest ukraść tylko jeden z tych numerów, 223 00:13:14,710 --> 00:13:18,920 może 0, może 2 miliardy, może -2 miliardów, 224 00:13:18,920 --> 00:13:23,280 więc można spędzić jedną z możliwych wartości, tak aby można zobowiązać się do świata 225 00:13:23,280 --> 00:13:26,820 że jeśli coś pójdzie nie tak, wrócę to super dużą wartość. 226 00:13:26,820 --> 00:13:31,030 Ale ty nie chcesz, aby użytkownik, wpisując coś zagadkowego 234 ..., naprawdę dużą liczbę. 227 00:13:31,030 --> 00:13:34,060 Jesteś uogólnienia zamiast jak stała. 228 00:13:34,060 --> 00:13:38,060 Tak naprawdę, jeśli były anal w ciągu ostatnich kilku tygodni, za każdym razem nazwałeś getInt, 229 00:13:38,060 --> 00:13:42,900 Trzeba było kontroli z jeśli warunek nie typ użytkownika w INT_MAX, 230 00:13:42,900 --> 00:13:46,590 lub, bardziej konkretnie, czy INT_MAX powrotu getInt, bo gdyby tak się stało, 231 00:13:46,590 --> 00:13:51,830 że w rzeczywistości oznacza, że ​​nie wpisywać. Coś poszło nie tak w tym przypadku. 232 00:13:51,830 --> 00:13:56,080 Więc to jest to, co powszechnie znane jako wartości wskaźnikowych, co oznacza po prostu wyjątkowy. 233 00:13:56,080 --> 00:13:58,120 >> Zróbmy teraz skręcić w pliku. C. 234 00:13:58,120 --> 00:14:01,340 Plik C istnieje w urządzeniu przez dłuższy czas. 235 00:14:01,340 --> 00:14:06,840 I rzeczywiście, urządzenie ma to skompilowane dla Ciebie do tej rzeczy nazwaliśmy kod obiektu, 236 00:14:06,840 --> 00:14:09,540 ale to nie ma znaczenia dla Ciebie, gdzie to jest, bo system wie 237 00:14:09,540 --> 00:14:11,730 w tym przypadku, w którym jest: urządzenie. 238 00:14:11,730 --> 00:14:17,400 Załóżmy teraz, aby przewinąć w dół i zobaczyć jak getInt getInt pracuje cały czas. 239 00:14:17,400 --> 00:14:19,460 Tutaj mamy podobne uwagi od wcześniej. 240 00:14:19,460 --> 00:14:21,660 Pozwól mi powiększyć tylko części kodu. 241 00:14:21,660 --> 00:14:23,900 A co mamy na getInt jest następujące. 242 00:14:23,900 --> 00:14:25,700 Nie potrzeba żadnej wejście. 243 00:14:25,700 --> 00:14:29,510 Zwraca int, while (true), więc mamy umyślne nieskończoną pętlę, 244 00:14:29,510 --> 00:14:33,180 ale prawdopodobnie będziemy łamać z tego jakoś wrócić z wewnątrz tego. 245 00:14:33,180 --> 00:14:34,870 >> Zobaczmy, jak to działa. 246 00:14:34,870 --> 00:14:39,240 Wydaje się, że przy użyciu getString w tej pierwszej linii wewnątrz pętli, 166. 247 00:14:39,240 --> 00:14:43,780 Teraz jest to dobra praktyka, ponieważ okoliczności, w jakich może GetString powrót 248 00:14:43,780 --> 00:14:47,660 Specjalne słowo kluczowe NULL? >> [Uczeń] Jeśli coś pójdzie źle. 249 00:14:47,660 --> 00:14:51,630 Jeśli coś pójdzie nie tak. A co może pójść źle podczas rozmowy coś getString? 250 00:14:54,960 --> 00:14:57,640 Tak. >> [Uczeń] malloc nie przydzieliło mu wskazówki. 251 00:14:57,640 --> 00:14:59,150 Tak. Może malloc zawiedzie. 252 00:14:59,150 --> 00:15:03,190 Gdzieś pod maską, GetString dzwoni malloc, która przydziela pamięć, 253 00:15:03,190 --> 00:15:06,020 która pozwala magazyn komputerowy wszystkie znaki 254 00:15:06,020 --> 00:15:07,750 że użytkownik wpisuje na klawiaturze. 255 00:15:07,750 --> 00:15:11,590 I przypuśćmy, że użytkownik miał dużo wolnego czasu i wpisane więcej, na przykład, 256 00:15:11,590 --> 00:15:16,160 ponad 2 mld znaków, więcej cech, niż komputer ma nawet RAM. 257 00:15:16,160 --> 00:15:19,250 GetString musi być w stanie oznacza, że ​​do Ciebie. 258 00:15:19,250 --> 00:15:22,560 Nawet jeśli jest to super, super rzadkością przypadek rogu, 259 00:15:22,560 --> 00:15:24,340 musi być w jakiś sposób w stanie obsłużyć, 260 00:15:24,340 --> 00:15:28,750 i tak getString, jeśli wróciliśmy i przeczytać jego dokumentację, robi w NULL powrotnych fakt. 261 00:15:28,750 --> 00:15:34,460 Więc teraz, jeśli GetString nie zwracając NULL, getInt będzie nie zwracając INT_MAX 262 00:15:34,460 --> 00:15:37,690 jak strażnik. Są to tylko ludzkie konwencje. 263 00:15:37,690 --> 00:15:41,450 Tylko w ten sposób możesz wiedzieć to sprawa jest czytanie dokumentacji. 264 00:15:41,450 --> 00:15:45,040 >> Miejmy przewinąć w dół, gdzie int jest rzeczywiście dostał. 265 00:15:45,040 --> 00:15:51,160 Gdybym przewinąć nieco dalej, w linii 170, mamy komentarz powyżej tych linii. 266 00:15:51,160 --> 00:15:55,100 Deklarujemy w 172 int, N i char, C, a następnie ta nowa funkcja, 267 00:15:55,100 --> 00:15:58,930 co niektórzy z was natknął się wcześniej, sscanf. 268 00:15:58,930 --> 00:16:00,870 To oznacza scanf ciąg. 269 00:16:00,870 --> 00:16:05,700 Innymi słowy, daj mi łańcuch i będę go w poszukiwaniu tych informacji, zainteresowania. 270 00:16:05,700 --> 00:16:07,360 Co to znaczy? 271 00:16:07,360 --> 00:16:11,800 Załóżmy, że mam wpisać dosłownie 123 na klawiaturze, a następnie naciśnij klawisz Enter. 272 00:16:11,800 --> 00:16:16,470 Co to jest typ danych 123 gdy są zwracane przez getString? >> [Uczeń] String. 273 00:16:16,470 --> 00:16:18,380 To oczywiście łańcuch, prawda? Mam ciąg. 274 00:16:18,380 --> 00:16:23,220 Więc 123 jest naprawdę, cytuję-koniec cytatu, 123 z \ 0 na końcu. 275 00:16:23,220 --> 00:16:27,110 To nie jest int. To nie liczba jest. To wygląda jak liczba, ale nie jest w rzeczywistości. 276 00:16:27,110 --> 00:16:29,080 Więc co getInt zrobić? 277 00:16:29,080 --> 00:16:35,750 To musi zeskanować ten ciąg lewej do prawej - 123 \ 0 - i jakoś przekonwertować do rzeczywistej liczby całkowitej. 278 00:16:35,750 --> 00:16:37,850 Można dowiedzieć się, jak to zrobić. 279 00:16:37,850 --> 00:16:41,450 Jeśli uważasz, że powrót do pset2, to zapewne masz mało wygodne z Cezarem 280 00:16:41,450 --> 00:16:44,820 lub Vigenere'a, więc można iteracyjne nad ciąg, można konwertować znaki na wskazówki. 281 00:16:44,820 --> 00:16:46,710 Ale do cholery, to jest dużo pracy. 282 00:16:46,710 --> 00:16:49,860 Może wywołać funkcję jak sscanf który robi to za Ciebie? 283 00:16:49,860 --> 00:16:54,230 Więc sscanf oczekuje argumentu - w tym przypadku nazywa się linia, która jest ciągiem. 284 00:16:54,230 --> 00:17:01,840 Następnie należy określić w cudzysłowie, bardzo podobne do printf, czego spodziewać się w tym ciągu. 285 00:17:01,840 --> 00:17:09,000 I to, co mówię o to mam się spodziewać liczbę dziesiętną a może charakter. 286 00:17:09,000 --> 00:17:12,000 I zobaczymy, dlaczego tak jest za chwilę. 287 00:17:12,000 --> 00:17:15,869 I okazuje się, że ten zapis jest teraz przypomina rzeczy zaczęliśmy rozmawiać o 288 00:17:15,869 --> 00:17:17,619 nieco ponad tydzień temu. 289 00:17:17,619 --> 00:17:21,740 Co to jest & n & c i robi dla nas? >> [Uczeń] Adres n i adres c. 290 00:17:21,740 --> 00:17:25,400 Tak. To daje mi adres n i adres c. Dlaczego jest to ważne? 291 00:17:25,400 --> 00:17:30,220 Wiesz, że z funkcji w C, możesz zawsze zwraca wartość lub brak wartości. 292 00:17:30,220 --> 00:17:34,530 Możesz powrócić int, ciąg znaków, float, char, bez względu, czy możesz wrócić za nieważne, 293 00:17:34,530 --> 00:17:38,030 ale można zwrócić tylko jedną rzecz maksymalnie. 294 00:17:38,030 --> 00:17:42,760 Ale tutaj chcemy sscanf powrócić mnie może int, liczba dziesiętna, 295 00:17:42,760 --> 00:17:46,220 a także znak, a ja dlaczego char w jednej chwili. 296 00:17:46,220 --> 00:17:51,460 Ci efektywnie chcą sscanf wrócić dwie rzeczy, ale to nie tylko możliwe, w C. 297 00:17:51,460 --> 00:17:55,200 Możesz kontynuować pracę przez przechodzącą w dwa adresy 298 00:17:55,200 --> 00:17:57,370 bo jak tylko oddać funkcję dwa adresy 299 00:17:57,370 --> 00:18:00,470 co można, że ​​funkcja z nimi zrobić? >> [Uczeń] Napisz do tych adresów. 300 00:18:00,470 --> 00:18:02,010 To może napisz do tych adresów. 301 00:18:02,010 --> 00:18:05,770 Możesz użyć operacji gwiazdy i tam, do każdego z tych adresów. 302 00:18:05,770 --> 00:18:11,260 To coś w rodzaju tego mechanizmu z powrotem drzwi, ale bardzo często do zmiany wartości zmiennych 303 00:18:11,260 --> 00:18:14,870 więcej niż jednym miejscu - w tym przypadku, dwa. 304 00:18:14,870 --> 00:18:21,340 Zauważcie, jestem sprawdzania == 1, a następnie powrót n jeśli nie w rzeczywistości, ocenia na true. 305 00:18:21,340 --> 00:18:26,170 Więc co się dzieje? Technicznie wszystkie naprawdę chcemy się zdarzyć w getInt jest to. 306 00:18:26,170 --> 00:18:30,740 Chcemy analizować, by tak rzec, chcemy czytać ciąg - cytuję-koniec cytatu 123 - 307 00:18:30,740 --> 00:18:34,560 i jeśli wygląda jak tam numer tam, co mówimy sscanf zrobić 308 00:18:34,560 --> 00:18:38,190 jest umieścić tę liczbę - 123 - w tej zmiennej n dla mnie. 309 00:18:38,190 --> 00:18:42,090 Dlaczego więc ja rzeczywiście to, jak również? 310 00:18:42,090 --> 00:18:48,220 Jaka jest rola sscanf mówiąc można również uzyskać znak tutaj? 311 00:18:48,220 --> 00:18:53,470 [Niesłyszalne reakcja studentów] >> przecinek rzeczywiście może zadziałać. 312 00:18:53,470 --> 00:18:56,330 Załóżmy, że posiadają pomyślał przez chwilę. Co jeszcze? 313 00:18:56,330 --> 00:18:59,270 [Uczeń] To może być NULL. >> Dobra myśl. To może być znak null. 314 00:18:59,270 --> 00:19:01,660 To faktycznie nie w tym przypadku. Tak. >> [Uczeń] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Albo daj mi generalizować nawet dalej. 316 00:19:04,340 --> 00:19:06,640 C% jest tylko do sprawdzania błędów. 317 00:19:06,640 --> 00:19:09,300 Nie chcemy tam być znak po liczbie, 318 00:19:09,300 --> 00:19:11,870 ale to, co pozwala mi zrobić jest następujące. 319 00:19:11,870 --> 00:19:18,210 Okazuje się, że sscanf, oprócz przechowywania wartości w N i C, w tym przykładzie tutaj 320 00:19:18,210 --> 00:19:24,890 , co również nie jest to zwraca liczbę zmiennych to położy wartości w. 321 00:19:24,890 --> 00:19:30,260 Więc jeśli tylko wpisać w 123, to tylko% d będzie zgodne, 322 00:19:30,260 --> 00:19:33,880 i przechowywane tylko n zostaje jak o wartości 123, 323 00:19:33,880 --> 00:19:35,640 i nic nie zostaje wprowadzone wc. 324 00:19:35,640 --> 00:19:37,620 C pozostaje wartość śmieci, by tak rzec - 325 00:19:37,620 --> 00:19:40,730 śmieci, ponieważ nigdy nie był inicjowany do pewnej wartości. 326 00:19:40,730 --> 00:19:45,520 Więc w tym przypadku, sscanf zwraca 1 bo zaludnionych 1 z tych wskaźników, 327 00:19:45,520 --> 00:19:50,190 w takim przypadku świetnie, mam int więc zwalniać linię, aby zwolnić pamięć 328 00:19:50,190 --> 00:19:54,000 że GetString faktycznie przyznane, a następnie wrócę n, 329 00:19:54,000 --> 00:19:58,500 indziej, a jeśli kiedykolwiek zastanawialiście jeżeli Ponów oświadczenie pochodzi, pochodzi z tutaj. 330 00:19:58,500 --> 00:20:04,390 Więc jeśli, przeciwnie, mam wpisać 123foo - tylko jakiś przypadkowy ciąg tekstu - 331 00:20:04,390 --> 00:20:08,490 sscanf będzie zobaczyć, numer, numer, F, 332 00:20:08,490 --> 00:20:16,410 i to będzie umieścić 123 w n; to będzie umieścić f wc, a następnie powrót 2. 333 00:20:16,410 --> 00:20:20,640 Więc mamy, po prostu stosując podstawową definicję zachowań sscanf jest, sposób bardzo prosty - 334 00:20:20,640 --> 00:20:23,900 oraz, na pierwszy rzut oka skomplikowane, ale pod koniec dnia mechanizm bardzo prosty - 335 00:20:23,900 --> 00:20:28,320 powiedzenia ma int i jeśli tak, jest to, że jedyną rzeczą, którą znalazłem? 336 00:20:28,320 --> 00:20:29,860 I odstępy o to zamierzone. 337 00:20:29,860 --> 00:20:34,000 Jeśli czytać dokumentację sscanf, mówi, że jeśli to kawałek spacją 338 00:20:34,000 --> 00:20:38,810 na początku lub na końcu, sscanf zbyt pozwoli użytkownika, niezależnie od przyczyny, 339 00:20:38,810 --> 00:20:41,860 trafienie 123 spacji i to będzie zgodne z prawem. 340 00:20:41,860 --> 00:20:44,150 Nie krzycz na użytkownika tylko dlatego, że nacisnąć spację 341 00:20:44,150 --> 00:20:48,640 na początku lub na końcu, który jest tylko trochę bardziej przyjazny dla użytkownika. 342 00:20:48,640 --> 00:20:52,300 >> Wszelkie pytania następnie na getInt? Tak. >> [Uczeń] Co jeśli po prostu umieścić w char? 343 00:20:52,300 --> 00:20:54,030 Dobre pytanie. 344 00:20:54,030 --> 00:20:59,890 Co jeśli po prostu wpisane w char jak F i naciśnij Enter bez kiedykolwiek wpisując 123? 345 00:20:59,890 --> 00:21:02,420 Co sądzisz zachowanie tej linii kodu byłoby wtedy? 346 00:21:02,420 --> 00:21:04,730 [Niesłyszalne odpowiedź uczeń] 347 00:21:04,730 --> 00:21:08,790 Tak, więc sscanf może pokryć, że zbyt, ponieważ w tym przypadku nie chodzi o wypełnienie N lub C. 348 00:21:08,790 --> 00:21:15,310 To będzie zamiast powrócić 0, w tym przypadku jestem również połowu tego scenariusza 349 00:21:15,310 --> 00:21:18,750 ponieważ wartość oczekiwana chcę jest 1. 350 00:21:18,750 --> 00:21:22,000 Chcę tylko jeden i tylko jedna rzecz do obsadzenia. Dobre pytanie. 351 00:21:22,000 --> 00:21:24,290 >> Inni? Dobrze. 352 00:21:24,290 --> 00:21:26,250 >> Niech nie przejść przez wszystkie funkcje w tutaj, 353 00:21:26,250 --> 00:21:29,500 ale ten, który wydaje się być może pozostały odsetek jest GetString 354 00:21:29,500 --> 00:21:32,790 bo okazuje się, że GetFloat, getInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 wszystkie punt dużo ich funkcjonalności do getString. 356 00:21:36,260 --> 00:21:39,750 Warto więc przyjrzeć się, jak on jest realizowany tutaj. 357 00:21:39,750 --> 00:21:43,630 To wygląda trochę skomplikowane, ale używa tych samych podstaw 358 00:21:43,630 --> 00:21:45,670 że zaczęliśmy rozmawiać o ostatnim tygodniu. 359 00:21:45,670 --> 00:21:49,490 W getString, który nie bierze argumentu za pustki tutaj 360 00:21:49,490 --> 00:21:53,730 i zwraca łańcuch, ja najwyraźniej jestem oświadczając ciąg nazwie buffer. 361 00:21:53,730 --> 00:21:56,270 I naprawdę nie wiem, co to ma być używana do jeszcze, ale zobaczymy. 362 00:21:56,270 --> 00:21:58,390 Wygląda na to pojemność jest domyślnie 0. 363 00:21:58,390 --> 00:22:01,350 Nie bardzo wiesz, gdzie to będzie, nie wiem, co n ma być wykorzystane do jeszcze 364 00:22:01,350 --> 00:22:03,590 ale teraz to coraz bardziej interesujące. 365 00:22:03,590 --> 00:22:06,520 Zgodnie 243 oświadczamy, int, c. 366 00:22:06,520 --> 00:22:08,800 To jest coś w rodzaju głupiego szczegółowo. 367 00:22:08,800 --> 00:22:15,820 Char jest 8 bitów, a 8 bitów można zapisać, ile różne wartości? >> [Uczeń] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Problem jest, jeśli chcesz mieć 256 różnych znaków ASCII, które istnieją 369 00:22:20,730 --> 00:22:23,340 jeśli uważasz, że powrót - i nie jest to coś do zapamiętania jest. 370 00:22:23,340 --> 00:22:25,710 Ale jeśli myślisz, że powrót do tego wielkiego ASCII wykresu mieliśmy tydzień temu, 371 00:22:25,710 --> 00:22:30,600 było w tym przypadku 128 lub 256 znaków ASCII. 372 00:22:30,600 --> 00:22:32,940 Wykorzystaliśmy wszystkie wzory maksymalnie 0s i 1s. 373 00:22:32,940 --> 00:22:36,210 To jest problem, jeśli chcesz być w stanie wykryć błąd 374 00:22:36,210 --> 00:22:40,190 bo jeśli używasz już 256 wartości dla swoich bohaterów, 375 00:22:40,190 --> 00:22:43,050 tak naprawdę nie planować, bo teraz nie mam możliwości, mówiąc 376 00:22:43,050 --> 00:22:46,270 to nie jest legit charakter, to jest jakiś błędny komunikat. 377 00:22:46,270 --> 00:22:50,270 Więc to, co świat robi to oni użyć następnego największą wartość, coś jak int, 378 00:22:50,270 --> 00:22:54,720 tak, że masz szaloną liczbę bitów, 32, do 4 miliardów możliwych wartości 379 00:22:54,720 --> 00:22:58,860 tak, że można po prostu skończyć używając zasadniczo 257 z nich, 380 00:22:58,860 --> 00:23:01,720 1 z nich ma jakieś specjalne znaczenie jako błąd. 381 00:23:01,720 --> 00:23:03,120 >> Zobaczmy więc, jak to działa. 382 00:23:03,120 --> 00:23:07,760 Zgodnie 246, mam duży pętli while wywołującego fgetc, 383 00:23:07,760 --> 00:23:11,090 f sens plik, więc getc, a następnie stdin. 384 00:23:11,090 --> 00:23:15,520 Okazuje się, to jest po prostu bardziej precyzyjny sposób powiedzenia czytania sygnałów z klawiatury. 385 00:23:15,520 --> 00:23:19,300 Standardowa klawiatura oznacza wejście, standardowe wyjście oznacza ekran, 386 00:23:19,300 --> 00:23:23,310 i błąd standardowy, który zobaczymy w pset4 oznacza ekran 387 00:23:23,310 --> 00:23:27,490 a specjalną część ekranu tak, że nie jest w rzeczywistej produkcji łączyła 388 00:23:27,490 --> 00:23:30,750 że przeznaczone do wydrukowania. Ale o tym w przyszłości. 389 00:23:30,750 --> 00:23:34,440 Więc fgetc oznacza tylko przeczytać jeden znak z klawiatury i przechowywać go gdzie? 390 00:23:34,440 --> 00:23:37,350 Przechowywać go w c. 391 00:23:37,350 --> 00:23:41,360 A następnie sprawdzić - więc ja tylko pomocą kilku logicznych spójników tutaj - 392 00:23:41,360 --> 00:23:46,000 sprawdzić, czy nie jest równa - \ n, więc użytkownik naciśnij Enter, chcemy zatrzymać w tym punkcie, 393 00:23:46,000 --> 00:23:49,850 koniec pętli - i chcemy też sprawdzić na specjalnej stałej EOF, 394 00:23:49,850 --> 00:23:53,610 które, jeśli wiesz lub odgadnąć, co się za nim kryje? >> [Uczeń] Koniec pliku. Koniec >> pliku. 395 00:23:53,610 --> 00:23:56,560 Jest to rodzaj bezsensowne, bo jeśli piszę na klawiaturze, 396 00:23:56,560 --> 00:23:58,870 tam naprawdę nie ma pliku w to, 397 00:23:58,870 --> 00:24:01,150 , ale jest to po prostu coś w rodzaju ogólnej termin używany do oznaczać 398 00:24:01,150 --> 00:24:04,220 że nic innego nie przychodzi z ludzkiego palce. 399 00:24:04,220 --> 00:24:06,460 EOF - koniec pliku. 400 00:24:06,460 --> 00:24:09,920 Tak na marginesie, jeśli kiedykolwiek uderzył sterowania D na klawiaturze, a nie, że trzeba jeszcze - 401 00:24:09,920 --> 00:24:15,230 masz uderzyć sterowania C - Control D wysyła ta specjalna stała nazywa EOF. 402 00:24:15,230 --> 00:24:19,850 Więc teraz musimy tylko trochę dynamicznej alokacji pamięci. 403 00:24:19,850 --> 00:24:23,440 >> Tak więc, jeżeli (n + 1 Zdolność>). Teraz wytłumaczę n. 404 00:24:23,440 --> 00:24:26,100 N jak wiele bajtów są aktualnie w buforze, 405 00:24:26,100 --> 00:24:28,620 Ciąg, który jesteś aktualnie buduje od użytkownika. 406 00:24:28,620 --> 00:24:33,450 Jeśli masz więcej znaków w buforze nie masz zdolności w buforze, 407 00:24:33,450 --> 00:24:37,410 intuicyjnie, co musimy zrobić, to przydzielić więcej pojemności. 408 00:24:37,410 --> 00:24:43,330 Więc mam zamiar przejrzeć na niektóre z arytmetyki tutaj i skupić się tylko na tej funkcji tutaj. 409 00:24:43,330 --> 00:24:46,070 Wiesz co malloc jest lub są przynajmniej ogólnie znane. 410 00:24:46,070 --> 00:24:48,970 Zgadnij co realloc robi. >> [Uczeń] Dodaje pamięć. 411 00:24:48,970 --> 00:24:52,920 To nie jest całkiem dodanie pamięci. To zmienia alokację pamięci w następujący sposób. 412 00:24:52,920 --> 00:24:57,220 Jeśli jest jeszcze miejsce na końcu łańcucha, aby dać Ci więcej tej pamięci 413 00:24:57,220 --> 00:25:00,000 niż pierwotnie się daje, a następnie będziesz uzyskać dodatkową pamięć. 414 00:25:00,000 --> 00:25:03,460 Więc może po prostu zachować oddanie napis na znaki z powrotem do tyłu do tyłu do tyłu. 415 00:25:03,460 --> 00:25:05,830 Ale jeśli to nie jest przypadek, bo czekał zbyt długo 416 00:25:05,830 --> 00:25:07,940 i coś losowo ale koleś w pamięci nie 417 00:25:07,940 --> 00:25:10,290 ale jest dodatkowa pamięć i tutaj, to w porządku. 418 00:25:10,290 --> 00:25:13,100 Realloc zrobi wszystko podnoszenia ciężkich dla Ciebie, 419 00:25:13,100 --> 00:25:16,750 przesunąć ciąg czytasz w ten sposób daleko stąd, umieścić go tam, 420 00:25:16,750 --> 00:25:19,460 a następnie daje trochę więcej pasa w tym punkcie. 421 00:25:19,460 --> 00:25:22,550 >> Tak z ruchem ręki, chciałbym powiedzieć, że to, co robi GetString 422 00:25:22,550 --> 00:25:26,330 jest to zaczyna z małym buforze, może jeden, pojedynczy znak 423 00:25:26,330 --> 00:25:30,820 i jeśli użytkownik wpisze w dwóch znaków, GetString kończy wywołanie realloc i mówi 424 00:25:30,820 --> 00:25:33,150 jedna postać nie wystarczy, daj mi dwa znaki. 425 00:25:33,150 --> 00:25:35,950 Następnie, jeśli przeczytać logiki pętli, to powie 426 00:25:35,950 --> 00:25:39,600 użytkownik wpisze w 3 znaków, daj mi teraz nie 2, ale 4 znaków, 427 00:25:39,600 --> 00:25:42,320 to dajcie mi 8, a potem dał mi 16 i 32. 428 00:25:42,320 --> 00:25:45,000 Fakt, że jestem Podwojenie wydajności każdorazowo 429 00:25:45,000 --> 00:25:48,570 Oznacza to, że bufor nie ma rosnąć powoli, to będzie super szybko rosnąć. 430 00:25:48,570 --> 00:25:51,380 A co może być zaletą, że? 431 00:25:51,380 --> 00:25:54,600 Dlaczego podwajając rozmiar bufora 432 00:25:54,600 --> 00:25:58,020 chociaż użytkownik może wystarczy jeden dodatkowy znak z klawiatury? 433 00:25:58,020 --> 00:26:01,750 [Niesłyszalne reakcja studentów] >> Co to jest? >> [Uczeń] Nie musisz uprawiać go tak często. 434 00:26:01,750 --> 00:26:03,300 Dokładnie. Nie musisz uprawiać go tak często. 435 00:26:03,300 --> 00:26:05,510 A to jest po prostu rodzaj jakbyś zabezpieczających swoje zakłady tutaj 436 00:26:05,510 --> 00:26:10,850 Pomysł jest, że nie chcesz, aby zadzwonić realloc dużo, ponieważ wydaje się być wolna. 437 00:26:10,850 --> 00:26:12,910 Za każdym razem poprosić systemem operacyjnym dla pamięci, 438 00:26:12,910 --> 00:26:16,990 jak wkrótce zobaczyć w przyszłym planie problem, że ma tendencję do trochę potrwać. 439 00:26:16,990 --> 00:26:20,010 Minimalizując w ten czas, nawet jeśli tracisz trochę przestrzeni, 440 00:26:20,010 --> 00:26:21,900 wydaje się być dobrą rzeczą. 441 00:26:21,900 --> 00:26:24,060 >> Ale jeśli przeczytać końcowej części getString tutaj - 442 00:26:24,060 --> 00:26:27,950 i znowu rozumienia każdego pojedynczego wiersza nie jest tu tak ważne dziś - 443 00:26:27,950 --> 00:26:30,530 zauważyć, że w końcu znów wywołuje malloc 444 00:26:30,530 --> 00:26:33,880 i przydziela dokładnie tyle bajtów, ile potrzebuje na ciąg 445 00:26:33,880 --> 00:26:38,060 a następnie wyrzuca przez wywołanie darmowe nadmiernie duży bufor 446 00:26:38,060 --> 00:26:40,080 jeśli rzeczywiście dostałem dwukrotnie zbyt wiele razy. 447 00:26:40,080 --> 00:26:42,730 Tak w skrócie, to jak GetString pracuje cały czas. 448 00:26:42,730 --> 00:26:47,060 Wszystko robi to przeczytać jeden znak naraz znowu i znowu i znowu, 449 00:26:47,060 --> 00:26:50,750 i za każdym razem potrzebuje dodatkowej pamięci, prosi system operacyjny, dla niej 450 00:26:50,750 --> 00:26:53,670 dzwoniąc realloc. 451 00:26:53,670 --> 00:26:57,890 >> Masz pytanie? Dobrze. 452 00:26:57,890 --> 00:26:59,270 >> Atak. 453 00:26:59,270 --> 00:27:04,060 Teraz, kiedy rozumiemy wskaźników lub przynajmniej są coraz bardziej zaznajomieni z wskaźników, 454 00:27:04,060 --> 00:27:06,700 Rozważmy, jak cały świat zaczyna zwijać 455 00:27:06,700 --> 00:27:10,030 jeśli nie dość bronić przed kontradyktoryjnym użytkowników 456 00:27:10,030 --> 00:27:11,850 ludzie, którzy próbują włamać się do systemu, 457 00:27:11,850 --> 00:27:16,890 ludzie, którzy próbują kraść oprogramowanie obchodząc jakiś kod rejestracyjny 458 00:27:16,890 --> 00:27:19,090 że może inaczej trzeba wpisać w. 459 00:27:19,090 --> 00:27:22,990 >> Spójrz na przykład o tym, który jest tylko kod C ma funkcję głównego na dole 460 00:27:22,990 --> 00:27:26,380 który wywołuje funkcję foo. I co to jest przejście do foo? 461 00:27:26,380 --> 00:27:29,680 [Uczeń] pojedynczy argument. >> [Malan] pojedynczy argument. 462 00:27:29,680 --> 00:27:33,450 Więc argv [1], co oznacza pierwsze słowo, które użytkownik wpisze w wierszu polecenia 463 00:27:33,450 --> 00:27:36,360 po a.out lub cokolwiek program nazywa. 464 00:27:36,360 --> 00:27:41,680 Tak więc w górnej foo ma w char *. Ale char * jest tylko co? >> [Uczeń] string. 465 00:27:41,680 --> 00:27:43,350 [Malan] string, więc nie ma nic nowego. 466 00:27:43,350 --> 00:27:45,420 Że ciąg jest arbitralnie miano bar. 467 00:27:45,420 --> 00:27:51,430 W tej linii tutaj, char c [12], w rodzaju angielskiego półtechnicznej, co to jest linia robi? 468 00:27:51,430 --> 00:27:55,220 [Uczeń] Tablica - >> Array? >> [Uczeń] Znaki. Postacie. >> 469 00:27:55,220 --> 00:27:58,870 Daj mi tablicę 12 znaków. Tak można nazwać ten bufor. 470 00:27:58,870 --> 00:28:02,920 Jest to technicznie nazywa c, ale bufor w programowaniu oznacza tylko kilka przestrzeni 471 00:28:02,920 --> 00:28:04,800 że można umieścić kilka rzeczy w. 472 00:28:04,800 --> 00:28:07,940 Potem wreszcie memcpy nie używałem wcześniej, ale można się domyślić, co robi. 473 00:28:07,940 --> 00:28:10,480 Kopiuje pamięć. Co to robi? 474 00:28:10,480 --> 00:28:19,270 Najwyraźniej kopiuje pasek, na wejściu, do C, ale tylko do długości paska. 475 00:28:19,270 --> 00:28:24,930 Ale nie jest to błąd tutaj. >> [Uczeń] Musisz sizeof charakter. >> Okay. 476 00:28:24,930 --> 00:28:30,860 Technicznie, powinniśmy naprawdę strlen (bar) * sizeof (char)). Zgadza się. 477 00:28:30,860 --> 00:28:33,930 Ale w najgorszym przypadku tutaj, załóżmy, że that's - 478 00:28:33,930 --> 00:28:35,950 Okay. Potem jest dwa błędy. 479 00:28:35,950 --> 00:28:39,160 Więc sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Zróbmy to trochę szerszy. 481 00:28:41,290 --> 00:28:44,910 Więc teraz jest jeszcze bug, co jest, co? >> [Niesłyszalne odpowiedź uczeń] 482 00:28:44,910 --> 00:28:46,990 Sprawdź, za co? >> [Student] Sprawdź na NULL. 483 00:28:46,990 --> 00:28:50,270 Powinniśmy być ogólnie sprawdzanie NULL bo złe rzeczy przytrafiają 484 00:28:50,270 --> 00:28:53,200 gdy wskaźnik jest NULL, ponieważ może skończyć się tam, 485 00:28:53,200 --> 00:28:57,630 i nie powinny być nigdy zamiar NULL za dereferencji go z operatorem gwiazdy. 486 00:28:57,630 --> 00:29:01,050 Tak, że jest dobry. I co jeszcze robimy? Logicznie rzecz biorąc, nie ma tu też wada. 487 00:29:01,050 --> 00:29:04,450 [Student] Sprawdź czy argc jest> = do 2. 488 00:29:04,450 --> 00:29:10,550 Należy więc sprawdzić, czy argc jest> = 2. Okay, więc nie trzy błędy w tym programie tutaj. 489 00:29:10,550 --> 00:29:16,630 Jesteśmy teraz sprawdzenie, czy użytkownik faktycznie wpisane w coś w argv [1]. Good. 490 00:29:16,630 --> 00:29:20,950 Więc co trzeci bug? Tak. >> [Uczeń] C może nie być wystarczająco duża. 491 00:29:20,950 --> 00:29:23,320 Good. Sprawdziliśmy jeden scenariusz. 492 00:29:23,320 --> 00:29:29,520 Mamy niejawnie sprawdzane nie kopiować więcej pamięci niż przekracza długości baru. 493 00:29:29,520 --> 00:29:32,510 Więc jeśli ciąg użytkownik wpisze w to 10 znaków, 494 00:29:32,510 --> 00:29:36,020 ta mówi tylko skopiować 10 znaków. I to jest w porządku. 495 00:29:36,020 --> 00:29:39,940 Ale co, jeśli użytkownik wpisze w słowa w wierszu, jak 20-znakowym słowem? 496 00:29:39,940 --> 00:29:44,900 To mówi kopię 20 znaków z paska do czego? 497 00:29:44,900 --> 00:29:49,750 C, inaczej znany jako naszego bufora, co oznacza, że ​​po prostu napisał dane 498 00:29:49,750 --> 00:29:52,540 do 8 bajtów miejsc, które nie są właścicielami, 499 00:29:52,540 --> 00:29:54,870 i nie masz ich w tym sensie, że nigdy nie przydzielonej im. 500 00:29:54,870 --> 00:30:00,370 Więc to jest to, co ogólnie znane jako atak przepełnienia bufora lub atak przepełnienia buforu. 501 00:30:00,370 --> 00:30:05,580 I jest to atak w tym sensie, że jeśli użytkownik lub program, który dzwoni czynność 502 00:30:05,580 --> 00:30:10,490 robi to złośliwie, co faktycznie dzieje się dalej, być może nawet bardzo złe. 503 00:30:10,490 --> 00:30:12,450 >> Warto więc spojrzeć na to zdjęcie tutaj. 504 00:30:12,450 --> 00:30:16,060 Ten obraz reprezentuje stos pamięci. 505 00:30:16,060 --> 00:30:19,580 Przypomnijmy, że za każdym razem wywołać funkcję masz tę małą ramkę na stosie 506 00:30:19,580 --> 00:30:21,520 i znów i znów i innym. 507 00:30:21,520 --> 00:30:24,300 I do tej pory, mamy po prostu rodzaj wydobywane są jako prostokąty 508 00:30:24,300 --> 00:30:26,290 albo na pokładzie lub na ekranie tutaj. 509 00:30:26,290 --> 00:30:30,580 Ale jeśli powiększyć jeden z tych prostokątów, podczas wywołania funkcji foo, 510 00:30:30,580 --> 00:30:35,880 okazuje się, że jest coś więcej w środku stosu tej ramki, w tym prostokącie 511 00:30:35,880 --> 00:30:40,060 niż tylko X i Y oraz A i B, tak jak my mówimy o konwersji. 512 00:30:40,060 --> 00:30:44,410 Okazuje się, że istnieje pewne szczegóły niższego szczebla, wśród nich adres zwrotny. 513 00:30:44,410 --> 00:30:49,550 Tak więc okazuje się, gdy główny wywołuje foo, główny musi poinformować foo 514 00:30:49,550 --> 00:30:53,520 jaki adres Main jest w pamięci komputera 515 00:30:53,520 --> 00:30:57,770 bo inaczej, jak tylko foo odbywa wykonania, jak w niniejszej sprawie, 516 00:30:57,770 --> 00:31:00,830 po osiągnięciu tej zamkniętej nawias klamrowy na końcu foo 517 00:31:00,830 --> 00:31:05,310 jak do cholery nie wiem gdzie foo kontroli programu ma iść? 518 00:31:05,310 --> 00:31:08,970 Okazuje się, że odpowiedź na to pytanie jest w tym czerwonym prostokącie tutaj. 519 00:31:08,970 --> 00:31:12,670 Stanowi to wskaźnik, i jest do komputera do czasowego przechowywania 520 00:31:12,670 --> 00:31:17,030 na stosie tzw adres głównym, tak, że gdy tylko foo dokonuje realizacji, 521 00:31:17,030 --> 00:31:21,120 komputer wie, gdzie i co linia głównego, aby wrócić do. 522 00:31:21,120 --> 00:31:23,940 Zapisano wskaźnik ramki dotyczy podobnie do tego. 523 00:31:23,940 --> 00:31:26,310 Bar * char reprezentuje tutaj co? 524 00:31:26,310 --> 00:31:31,350 Teraz ten niebieski odcinek o to ramka Foo. Co to jest bar? 525 00:31:31,570 --> 00:31:35,010 Bar to tylko argument funkcji foo. 526 00:31:35,010 --> 00:31:37,500 Więc teraz jesteśmy z powrotem w rodzaju znanego obrazu. 527 00:31:37,500 --> 00:31:39,850 Jest więcej rzeczy i więcej rozrywki na ekranie, 528 00:31:39,850 --> 00:31:43,380 ale ten niebieski odcinek tylko to, co mamy już rysunek na tablicy 529 00:31:43,380 --> 00:31:45,790 na coś takiego swapu. To jest ramka do foo. 530 00:31:45,790 --> 00:31:51,490 I jedyną rzeczą, w tym teraz jest bar, który jest ten parametr. 531 00:31:51,490 --> 00:31:55,220 Jednak należy co jeszcze w tym w zależności od stosu kod tutaj? 532 00:31:55,220 --> 00:31:57,760 [Uczeń] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Warto również zobaczyć 12 kwadratów pamięci przydzielonej do zmiennej o nazwie c, 534 00:32:02,810 --> 00:32:04,970 i rzeczywiście, że ma na ekranie. 535 00:32:04,970 --> 00:32:08,480 Samej górze jest c [0], a następnie autor tego schematu 536 00:32:08,480 --> 00:32:11,850 nie przeszkadzało rysowania wszystkich kwadratów, ale są tam rzeczywiście 12 537 00:32:11,850 --> 00:32:16,590 bo jeśli przyjrzeć się na dole po prawej, c [11], jeśli liczyć od 0 jest 12 takich bajt. 538 00:32:16,590 --> 00:32:18,400 Ale tu jest problem. 539 00:32:18,400 --> 00:32:22,390 W którym kierunku jest c rośnie? 540 00:32:22,390 --> 00:32:27,080 Rodzaju odgórne, jeśli zaczyna się na górze i rośnie na dnie. 541 00:32:27,080 --> 00:32:30,110 To nie wygląda na to, że zostawili sobie dużo pas tutaj w ogóle. 542 00:32:30,110 --> 00:32:32,090 Mamy trochę malował się w kąt, 543 00:32:32,090 --> 00:32:36,940 i że c [11] jest prawo przeciwko baru, który jest zaraz na przeciw ofert wskaźnik ramki, 544 00:32:36,940 --> 00:32:39,960 który jest zaraz na przeciw adres zwrotny. Nie ma więcej miejsca. 545 00:32:39,960 --> 00:32:42,810 Więc co jest implikacja wtedy jeśli spieprzysz 546 00:32:42,810 --> 00:32:46,500 i próbie odczytu 20 bajtów do bufora 12-bajtowy? 547 00:32:46,500 --> 00:32:50,060 Gdzie są te 8 dodatkowych bajtów pójdzie? >> [Uczeń] Inside - 548 00:32:50,060 --> 00:32:53,200 Wszystko wewnątrz, z których część jest bardzo ważne. 549 00:32:53,200 --> 00:32:57,260 I najważniejsze, potencjalnie, jest czerwone pole tam, adres zwrotny, 550 00:32:57,260 --> 00:33:03,560 bo załóżmy, że przypadkowo lub adversarially zastąpić te 4 bajty, 551 00:33:03,560 --> 00:33:07,260 wskaźnik ten adres, nie tylko z odpadkami, ale z kilkoma 552 00:33:07,260 --> 00:33:09,810 że dzieje stanowią aktualny adres w pamięci. 553 00:33:09,810 --> 00:33:13,880 Co jest implikacja, logicznie? >> [Uczeń] Funkcja ma zamiar powrócić do innego miejsca. 554 00:33:13,880 --> 00:33:15,250 Dokładnie. 555 00:33:15,250 --> 00:33:19,170 Kiedy powraca Foo i przeboje, które nawiasem klamrowym, program będzie kontynuować 556 00:33:19,170 --> 00:33:25,060 nie wracać do głównego, to będzie powrót do tego, co jest w tym adres czerwonym polu. 557 00:33:25,060 --> 00:33:28,600 >> W przypadku rejestracji obchodzą oprogramowania 558 00:33:28,600 --> 00:33:32,260 co jeśli adres, który jest zwracane do jest funkcja, która normalnie jest wywoływana 559 00:33:32,260 --> 00:33:35,690 po tym, jak zapłacił za oprogramowanie i wprowadzony kod rejestracyjny? 560 00:33:35,690 --> 00:33:39,870 Możesz sortować sztuczka do komputera nie będzie tutaj, ale zamiast dzieje się tutaj. 561 00:33:39,870 --> 00:33:45,100 Lub jeśli jesteś naprawdę mądry, przeciwnik może faktycznie wpisać na klawiaturze, na przykład, 562 00:33:45,100 --> 00:33:50,690 nie rzeczywiste słowo, nie 20 znaków, ale przypuszczam, że ona faktycznie rodzaje w 563 00:33:50,690 --> 00:33:52,770 niektóre znaki, które reprezentują kod. 564 00:33:52,770 --> 00:33:55,320 I nie będzie to kod C, to faktycznie będzie to znaki 565 00:33:55,320 --> 00:33:59,290 które reprezentują binarnego kodu maszynowego, 0s i 1s. 566 00:33:59,290 --> 00:34:01,290 Załóżmy jednak, że są one na tyle sprytny, aby to zrobić, 567 00:34:01,290 --> 00:34:06,500 jakoś wkleić do getString coś polecenia, które jest zasadniczo skompilowany kod, 568 00:34:06,500 --> 00:34:09,980 a ostatnie 4 bajty nadpisać że adres zwrotny. 569 00:34:09,980 --> 00:34:13,360 A co to ma adres wejściowy zrobić? 570 00:34:13,360 --> 00:34:18,630 To faktycznie przechowuje w czerwonym prostokącie adres pierwszego bajtu bufora. 571 00:34:18,630 --> 00:34:23,070 Więc trzeba być naprawdę sprytny, a to jest dużo prób i błędów dla złych ludzi tam, 572 00:34:23,070 --> 00:34:25,639 ale jeśli można dowiedzieć się, jak duża to bufor jest 573 00:34:25,639 --> 00:34:28,820 tak, że w ciągu ostatnich kilku bajtów wejściowych podać do programu 574 00:34:28,820 --> 00:34:33,540 stało się równoznaczne z adresem początku buforze, możesz to zrobić. 575 00:34:33,540 --> 00:34:39,320 Jeśli mówimy, że normalnie przywitać i \ 0, to co kończy się w buforze. 576 00:34:39,320 --> 00:34:44,420 Ale jeśli jesteśmy bardziej sprytny i zapełnić bufor z tym, co my nazywamy ogólnie kod ataku - 577 00:34:44,420 --> 00:34:48,860 AAA, atak, atak, atak - gdy jest to po prostu coś, że robi coś złego, 578 00:34:48,860 --> 00:34:51,820 co się dzieje, jeśli jesteś naprawdę sprytny, może to zrobić. 579 00:34:51,820 --> 00:34:58,610 W czerwonym polu o to ciąg liczb - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Zauważ, że jest zgodny z numerem, który jest tutaj. 581 00:35:01,610 --> 00:35:04,430 Jest to w odwrotnej kolejności, ale o tym jakiś czas innych. 582 00:35:04,430 --> 00:35:08,140 Zauważ, że ten adres zwrotny został celowo zmieniony 583 00:35:08,140 --> 00:35:12,020 dorównać adres tutaj, nie adres main. 584 00:35:12,020 --> 00:35:17,500 Więc jeśli zły facet jest super inteligentny, on lub ona będzie m.in. w tym kodzie ataku 585 00:35:17,500 --> 00:35:20,930 coś jak usunięcie wszystkich plików użytkownika lub skopiować hasła 586 00:35:20,930 --> 00:35:24,680 lub utworzyć konto użytkownika, które można następnie zalogować się - nic. 587 00:35:24,680 --> 00:35:26,950 >> I to zarówno niebezpieczeństwo i moc C. 588 00:35:26,950 --> 00:35:29,840 Ponieważ masz dostęp do pamięci poprzez wskaźniki 589 00:35:29,840 --> 00:35:32,520 i można więc napisać, co chcesz do pamięci komputera, 590 00:35:32,520 --> 00:35:35,080 można zrobić komputer rób co chcesz 591 00:35:35,080 --> 00:35:39,550 po prostu po to skakać w swojej własnej pamięci. 592 00:35:39,550 --> 00:35:44,650 I tak do tej pory tak wiele programów i tak wiele stron internetowych, które są zagrożone 593 00:35:44,650 --> 00:35:46,200 sprowadzają się do osób korzystających z tego. 594 00:35:46,200 --> 00:35:50,760 A to może wydawać się super ataku wyrafinowany, ale nie zawsze zaczynać w ten sposób. 595 00:35:50,760 --> 00:35:53,560 Rzeczywistość jest taka, że ​​to, co źli ludzie zwykle zrobić to, 596 00:35:53,560 --> 00:35:58,200 czy jest to program w linii poleceń lub program GUI lub strona internetowa, 597 00:35:58,200 --> 00:35:59,940 po prostu rozpocząć świadczenie bzdury. 598 00:35:59,940 --> 00:36:03,980 Wpisujesz w naprawdę dużym słowa w polu wyszukiwania i naciśnij Enter, 599 00:36:03,980 --> 00:36:05,780 i czekać, aby zobaczyć, czy strona wywala 600 00:36:05,780 --> 00:36:09,990 albo czekać, aby zobaczyć, czy program przejawia pewien komunikat o błędzie 601 00:36:09,990 --> 00:36:14,330 bo jeśli będziesz miał szczęście, jak zły facet i podać jakiś szalony wejście 602 00:36:14,330 --> 00:36:18,980 że wywala program, oznacza to, że programista nie przewidział swoje złe zachowanie, 603 00:36:18,980 --> 00:36:23,630 co oznacza, że ​​można prawdopodobnie z dość wysiłku, tyle prób i błędów, 604 00:36:23,630 --> 00:36:26,650 dowiedzieć się, jak prowadzić bardziej precyzyjnego ataku. 605 00:36:26,650 --> 00:36:31,410 Tak samo częścią bezpieczeństwa jest nie tylko całkowicie uniknąć tych ataków 606 00:36:31,410 --> 00:36:34,100 ale ich wykrywania i rzeczywiście patrząc na dzienniki 607 00:36:34,100 --> 00:36:36,780 i zobaczyć, co szalone wejścia mają osoby wpisane na swojej stronie, 608 00:36:36,780 --> 00:36:38,960 jakie terminy wyszukiwania są osoby wpisane na swojej stronie 609 00:36:38,960 --> 00:36:42,870 w nadziei, że brzegi trochę bufor. 610 00:36:42,870 --> 00:36:45,500 A to wszystko sprowadza się do prostych podstaw Co jest tablica 611 00:36:45,500 --> 00:36:49,080 i co to oznacza dla alokacji i wykorzystania pamięci. 612 00:36:49,080 --> 00:36:51,710 >> Podobne do tego, wtedy też to jest. 613 00:36:51,710 --> 00:36:54,280 Miejmy tylko spojrzeć wewnątrz dysku twardego po raz kolejny. 614 00:36:54,280 --> 00:36:58,440 Pamiętacie z tydzień lub dwa temu, że podczas przeciągania plików do kosza lub kosza, 615 00:36:58,440 --> 00:37:03,710 co się dzieje? >> [Uczeń] Nic. >> Absolutnie nic, prawda? 616 00:37:03,710 --> 00:37:05,740 Ostatecznie jeśli brakować miejsca na dysku, 617 00:37:05,740 --> 00:37:08,190 Windows lub Mac OS rozpocznie usuwanie pliki. 618 00:37:08,190 --> 00:37:10,390 Ale jeśli przeciągnij coś tam, że w ogóle nie jest bezpieczne. 619 00:37:10,390 --> 00:37:13,800 Wszystko twój współlokator lub przyjaciel lub członek rodziny ma zrobić, to kliknij dwukrotnie i, voila, 620 00:37:13,800 --> 00:37:16,310 tam wszystkie fragmentaryczne pliki, które próbowały usunąć. 621 00:37:16,310 --> 00:37:19,590 Większość z nas, przynajmniej wiem, że trzeba kliknąć prawym przyciskiem myszy lub sterowania kliknij 622 00:37:19,590 --> 00:37:22,310 i pusty kosz lub coś w tym stylu. 623 00:37:22,310 --> 00:37:25,000 Ale nawet wtedy nie dość rade 624 00:37:25,000 --> 00:37:28,010 ponieważ to, co się dzieje, gdy masz plik na dysku twardym 625 00:37:28,010 --> 00:37:32,770 która reprezentuje jakiś dokument Word lub jakiś JPEG, a to oznacza dysk twardy, 626 00:37:32,770 --> 00:37:35,350 i powiedzmy, że ta drzazga reprezentuje tutaj ten plik, 627 00:37:35,350 --> 00:37:38,390 i to w składzie całą masę 0s i 1s. 628 00:37:38,390 --> 00:37:42,470 Co się dzieje, gdy nie tylko przeciągnąć plik do kosza lub kosza 629 00:37:42,470 --> 00:37:48,020 ale też go opróżnić? Sortuj niczego. 630 00:37:48,020 --> 00:37:49,640 To nie jest absolutnie nic nie jest teraz. 631 00:37:49,640 --> 00:37:54,290 Teraz jest to po prostu nic, bo trochę coś się dzieje w formie tabeli. 632 00:37:54,290 --> 00:37:58,370 Więc jest jakiś rodzaj bazy danych lub tabeli wewnątrz pamięci komputera 633 00:37:58,370 --> 00:38:03,850 który zasadniczo zawiera jedną kolumnę dla plików nazwisk i kolumny dla plików "lokalizacji, 634 00:38:03,850 --> 00:38:07,720 gdzie to może być lokalizacja 123, tylko liczba losowa. 635 00:38:07,720 --> 00:38:14,560 Więc może mamy coś x.jpeg i lokalizacja 123. 636 00:38:14,560 --> 00:38:18,800 Co dzieje się wtedy, gdy faktycznie opróżnić kosz? 637 00:38:18,800 --> 00:38:20,330 Że odchodzi. 638 00:38:20,330 --> 00:38:23,610 Ale co nie odejdzie to 0s i 1s. 639 00:38:23,610 --> 00:38:26,270 >> Więc co jest potem połączenie pset4? 640 00:38:26,270 --> 00:38:31,240 Cóż, z pset4, tylko dlatego, że przypadkowo usunięte z karty Compact Flash 641 00:38:31,240 --> 00:38:35,750 że miał wszystkie z tych zdjęć lub po prostu dlatego, że przez pecha został uszkodzony 642 00:38:35,750 --> 00:38:38,000 nie oznacza, że ​​0s i 1s nie są tam nadal. 643 00:38:38,000 --> 00:38:40,410 Może niektóre z nich giną dlatego, że coś jest zepsute 644 00:38:40,410 --> 00:38:43,320 w tym sensie, że niektóre stały 1s i 0s 1s stał 0s. 645 00:38:43,320 --> 00:38:47,240 Złe rzeczy mogą się zdarzyć z powodu wadliwego oprogramowania lub wadliwego sprzętu. 646 00:38:47,240 --> 00:38:50,370 Ale wielu z tych bitów, może nawet 100% z nich wciąż tam są. 647 00:38:50,370 --> 00:38:55,050 Tyle tylko, że komputer lub aparat nie wie, gdzie rozpoczął JPEG1 648 00:38:55,050 --> 00:38:56,910 i gdzie JPEG2 zaczęło. 649 00:38:56,910 --> 00:39:01,070 Ale jeśli, programista, wiem z nieco doświadczonych, gdzie te pliki JPEG są 650 00:39:01,070 --> 00:39:06,010 lub jak wyglądają, dzięki czemu można analizować 0s i 1s i powiedzieć JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 można napisać program w zasadzie tylko za lub pętli while 652 00:39:09,440 --> 00:39:12,820 odzyskuje każdy z tych plików. 653 00:39:12,820 --> 00:39:16,030 Więc lekcja jest więc bezpiecznie rozpocząć usuwanie plików 654 00:39:16,030 --> 00:39:18,340 jeśli chcesz tego uniknąć całkowicie. Tak. 655 00:39:18,340 --> 00:39:21,010 >> [Uczeń] Jak to jest napisane na komputerze 656 00:39:21,010 --> 00:39:23,550 że masz więcej pamięci niż wcześniej? 657 00:39:23,550 --> 00:39:27,820 Miał więcej pamięci niż wcześniej - >> [uczeń] Więcej dostępnej pamięci. 658 00:39:27,820 --> 00:39:29,630 Oh. Dobre pytanie. 659 00:39:29,630 --> 00:39:32,360 Dlaczego więc po opróżnieniu kosza nie komputer powiedzieć 660 00:39:32,360 --> 00:39:34,910 że masz więcej wolnego miejsca niż wcześniej? 661 00:39:34,910 --> 00:39:36,770 W skrócie, bo kłamie. 662 00:39:36,770 --> 00:39:40,740 Bardziej technicznie, masz więcej miejsca, bo teraz pan powiedział 663 00:39:40,740 --> 00:39:43,680 można umieścić inne rzeczy, gdzie ten plik kiedyś. 664 00:39:43,680 --> 00:39:45,450 Ale to nie znaczy, bity idą dalej, 665 00:39:45,450 --> 00:39:48,590 oraz, że nie oznacza to, że ulegają zmianie bitów wszystkich 0s, na przykład 666 00:39:48,590 --> 00:39:50,150 dla ochrony. 667 00:39:50,150 --> 00:39:54,640 Tak dla odmiany, jeśli bezpiecznie usunąć pliki lub fizycznie zniszczyć urządzenie, 668 00:39:54,640 --> 00:39:57,300 że naprawdę jest jedynym sposobem czasami obejść. 669 00:39:57,300 --> 00:40:02,020 >> Więc dlaczego nie możemy pozostawić na tej notatce semi-straszny, i zobaczymy w poniedziałek. 670 00:40:02,020 --> 00:40:07,000 [Oklaski] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]