1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MUZYKA GRA] 3 00:00:11,261 --> 00:00:12,640 >> David J. MALAN: Wszystko w porządku. 4 00:00:12,640 --> 00:00:14,525 To CS50. 5 00:00:14,525 --> 00:00:16,009 I to jest początek tygodnia 5. 6 00:00:16,009 --> 00:00:18,050 I jak można zauważyć, niektóre materiały 7 00:00:18,050 --> 00:00:21,050 jest trochę więcej kompleks, trochę gęstsza. 8 00:00:21,050 --> 00:00:24,560 >> I to jest bardzo proste, zwłaszcza jeśli masz w zwyczaju od jakiegoś czasu, 9 00:00:24,560 --> 00:00:28,600 próbuje się mazać się najbardziej cokolwiek robimy, mówimy w klasie. 10 00:00:28,600 --> 00:00:31,626 Ale sobie sprawę, że być może nie jest idealne podejście pedagogiczne 11 00:00:31,626 --> 00:00:34,250 do uczenia się tego rodzaju materiału, i materiał bardziej ogólnie. 12 00:00:34,250 --> 00:00:37,250 I tak jesteśmy zadowoleni, informujemy, że CS50 własnego Gheng 13 00:00:37,250 --> 00:00:39,780 Gong rozpoczęto przygotować kanoniczny zestaw nut 14 00:00:39,780 --> 00:00:42,100 na kurs, nadzieja która jest taka, że ​​jeden, to 15 00:00:42,100 --> 00:00:44,030 służyć nie tylko jako odniesienia i źródło 16 00:00:44,030 --> 00:00:47,410 do przeglądu i będzie materiał z powrotem przez materiał, który może mieć 17 00:00:47,410 --> 00:00:51,230 uciekł ci za pierwszym razem, ale również tak, że głowice mogą być bardziej 18 00:00:51,230 --> 00:00:53,740 w górę niż w dół, gdy go przychodzi czas na wykład, 19 00:00:53,740 --> 00:00:56,960 tak, że może zaangażować więcej w zamyśleniu, jak 20 00:00:56,960 --> 00:00:59,170 przeciwieństwie do bardziej scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Z powiedział, że to, co znajdziesz na Strona jest takie dokumenty jak ten. 22 00:01:02,510 --> 00:01:04,660 Oraz informacja, w lewym górnym rogu, tam nie tylko spis treści, 23 00:01:04,660 --> 00:01:06,920 ale również kody czasowe które Ci natychmiast przeskoczyć 24 00:01:06,920 --> 00:01:09,077 do odpowiedniej części w wideo online. 25 00:01:09,077 --> 00:01:11,410 I co tu zrobiła Chang jest w istocie, udokumentowane 26 00:01:11,410 --> 00:01:13,340 co wydarzyło się w tym szczególności wykład. 27 00:01:13,340 --> 00:01:16,370 I wiele wykładów są już teraz z tego adresu URL. 28 00:01:16,370 --> 00:01:20,110 A my nadal dodawać pozostałą tych końca tego tygodnia 29 00:01:20,110 --> 00:01:22,380 więc nie skorzystać z tego zasobu. 30 00:01:22,380 --> 00:01:25,740 >> Więc bez zbędnych ceregieli, zaczęliśmy obierać powrót 31 00:01:25,740 --> 00:01:28,180 Warstwa, która ma być Ciąg na jakiś czas. 32 00:01:28,180 --> 00:01:30,670 A co możemy powiedzieć ciąg faktycznie jest w zeszłym tygodniu? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Tak char gwiazda. 35 00:01:32,900 --> 00:01:34,900 I gwiazda char, dobrze, co czy to naprawdę oznacza? 36 00:01:34,900 --> 00:01:37,150 Cóż, tym razem, jeśli mamy było wywołanie funkcji, 37 00:01:37,150 --> 00:01:40,450 jak i przechowywania getString Tak zwane ponowne 38 00:01:40,450 --> 00:01:42,910 Wartość w getString zmienna-- to się nazywa 39 00:01:42,910 --> 00:01:47,721 s Typ string-- byliśmy pisania linii kodu tam powyżej. 40 00:01:47,721 --> 00:01:49,970 I to tylko wtedy, gdy widzę powiększony o pisma 41 00:01:49,970 --> 00:01:51,930 mogę sobie sprawę, jak okropna jest. 42 00:01:51,930 --> 00:01:54,180 >> Jednak załóżmy, że, po stronie prawej 43 00:01:54,180 --> 00:01:57,070 jest jednak, uzasadnione obraz tego, co jest 44 00:01:57,070 --> 00:01:58,880 trwa to wszystko razem z getString. 45 00:01:58,880 --> 00:02:00,380 getString oczywiście dostaje ciąg. 46 00:02:00,380 --> 00:02:01,691 Ale co to tak naprawdę oznacza? 47 00:02:01,691 --> 00:02:04,190 Oznacza to, że dostaje kawałek z pamięci systemu operacyjnego 48 00:02:04,190 --> 00:02:06,040 przez wywołanie funkcji, zwany malloc. 49 00:02:06,040 --> 00:02:07,390 Ale o tym później. 50 00:02:07,390 --> 00:02:09,139 A następnie zapełnia że fragment pamięci 51 00:02:09,139 --> 00:02:11,764 z literami użytkownik ma wpisany, a następnie, oczywiście, 52 00:02:11,764 --> 00:02:14,800 znak null, lub odwrotny ukośnik zera na samym końcu. 53 00:02:14,800 --> 00:02:18,280 >> W tym czasie, po stronie lewej tej historii, przez cały ten czas, 54 00:02:18,280 --> 00:02:20,850 byliśmy deklarowanie zmiennej, jak s. 55 00:02:20,850 --> 00:02:24,770 I to jest to, co teraz o zmiennej rozpocznie wywołanie wskaźnik. 56 00:02:24,770 --> 00:02:29,190 To nie pudełko, wewnątrz którego kładziemy ciąg, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 ale raczej stawiamy w tym placu pole po lewej stronie, co dokładnie? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Tak? 60 00:02:35,390 --> 00:02:37,118 >> PUBLICZNOŚCI: adres w którym to znajduje się w pamięci. 61 00:02:37,118 --> 00:02:38,118 >> David J. MALAN: Dokładnie. 62 00:02:38,118 --> 00:02:40,690 Adresu miejsca daven znajduje się w pamięci. 63 00:02:40,690 --> 00:02:44,650 , A nie tam, gdzie wszyscy Daven znajduje się, per se, ale w szczególności adres 64 00:02:44,650 --> 00:02:45,150 z czego? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Tak? 67 00:02:46,810 --> 00:02:47,460 >> PUBLICZNOŚCI: Pierwszy znak. 68 00:02:47,460 --> 00:02:50,209 >> David J. MALAN: pierwszy znak w Daven, który, w tym przypadku, 69 00:02:50,209 --> 00:02:53,820 Zaproponowałem był arbitralnie i nierealistycznie 1, OX1, 70 00:02:53,820 --> 00:02:55,910 co oznacza po prostu liczba szesnastkowa z 1. 71 00:02:55,910 --> 00:02:57,993 Ale to prawdopodobnie będzie być znacznie większa liczba 72 00:02:57,993 --> 00:03:01,260 że możemy wyciągnąć z 0x na początku, 73 00:03:01,260 --> 00:03:02,806 reprezentujący znak szesnastkowy. 74 00:03:02,806 --> 00:03:05,930 A ponieważ nie musimy wiedzieć, gdzie Reszta bohaterów Daven 75 00:03:05,930 --> 00:03:09,860 są to, co prosta konstrukcja Decyzja, że ​​powstał wiele lat temu? 76 00:03:09,860 --> 00:03:10,548 Tak? 77 00:03:10,548 --> 00:03:11,651 >> PUBLICZNOŚCI: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 David J. MALAN: Tak, dokładnie. 79 00:03:12,900 --> 00:03:18,100 Odwrotny ukośnik 0 pozwala, choć w czas liniowy, przemierzać ciąg, 80 00:03:18,100 --> 00:03:20,400 spacerem od lewej do prawej, z pętli for, lub chwilę 81 00:03:20,400 --> 00:03:22,608 pętla, czy coś , że i określić, o, tutaj 82 00:03:22,608 --> 00:03:24,751 jest koniec tego konkretnego napisu. 83 00:03:24,751 --> 00:03:27,000 Tak, tylko z adresu w początek łańcucha, 84 00:03:27,000 --> 00:03:30,290 możemy uzyskać dostęp do całości to, ponieważ przez cały ten czas, 85 00:03:30,290 --> 00:03:32,030 Ciąg został właśnie gwiazda char. 86 00:03:32,030 --> 00:03:36,370 >> Więc to na pewno dobrze, aby kontynuować korzystanie z Biblioteka CS50 i to abstrakcja, 87 00:03:36,370 --> 00:03:38,440 że tak powiem, ale będzie rozpocząć, aby zobaczyć dokładnie, 88 00:03:38,440 --> 00:03:41,230 co się dzieje pod tym cały czas. 89 00:03:41,230 --> 00:03:45,260 Więc może pamiętacie ten przykład, też, od ostatniego czasu, porównać 0, 90 00:03:45,260 --> 00:03:47,300 które rzeczywiście nie porównać. 91 00:03:47,300 --> 00:03:49,070 Ale zaczęliśmy rozwiązać. 92 00:03:49,070 --> 00:03:52,020 >> Ale jak może odświeżające, I może zainteresować kogoś 93 00:03:52,020 --> 00:03:54,261 w różowym słoniu dziś również przez Chang? 94 00:03:54,261 --> 00:03:55,760 Jak o tobie z przodu? [Niesłyszalne]. 95 00:03:55,760 --> 00:03:56,660 Chodź na górę. 96 00:03:56,660 --> 00:03:58,740 >> A w międzyczasie, jak można wymyślić, niech 97 00:03:58,740 --> 00:04:01,670 rozważyć na chwilę, co Kod ten faktycznie robi. 98 00:04:01,670 --> 00:04:04,917 To deklarując dwie zmienne się Najwięcej, s i t, i wzywając getString. 99 00:04:04,917 --> 00:04:08,250 Nie jest bardzo przyjazne dla użytkownika program dlatego, że nie mówi ci co masz robić. 100 00:04:08,250 --> 00:04:10,541 Ale niech tylko zakładać, że jesteśmy koncentrując się na soczyste części. 101 00:04:10,541 --> 00:04:14,470 A potem my, jeśli s jest równa wynosi t, należy powiedzieć printf, 102 00:04:14,470 --> 00:04:16,170 wpisane to samo. 103 00:04:16,170 --> 00:04:16,670 Witaj. 104 00:04:16,670 --> 00:04:17,050 Jak masz na imię? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. MALAN: Janelle, Miło cię poznać. 107 00:04:19,529 --> 00:04:21,800 Więc twoim wyzwaniem Ręka do tego słonia 108 00:04:21,800 --> 00:04:25,230 jest najpierw zwrócić nam obraz tego, co znajduje się są reprezentowane w tych pierwszych dwóch 109 00:04:25,230 --> 00:04:25,970 linie. 110 00:04:25,970 --> 00:04:28,139 Więc s i t mogą być reprezentowane, jak na ekranie? 111 00:04:28,139 --> 00:04:30,680 A może po prostu wyciągnąć go z palec na tym dużym ekranie. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Więc nie dwie połówki do każda strona tego równania. 114 00:04:34,510 --> 00:04:37,760 Więc nie ma a po lewej stronie, a następnie getString po prawej stronie. 115 00:04:37,760 --> 00:04:40,540 A wtedy nie t po lewej stronie, i GetString prawej. 116 00:04:40,540 --> 00:04:42,630 Więc jak możemy zacząć rysunek obraz, który 117 00:04:42,630 --> 00:04:46,340 reprezentuje to, co się dzieje tutaj w pamięci, można by powiedzieć? 118 00:04:46,340 --> 00:04:49,150 I niech mi pozwolić wyjaśnić to, co robisz, jak jesteś. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Cóż, po pierwsze, że będzie pytać , aby uzyskać ciąg wejściowy. 121 00:04:58,890 --> 00:05:00,439 I to store-- och, przepraszam. 122 00:05:00,439 --> 00:05:01,230 David J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Dobry. 124 00:05:01,730 --> 00:05:03,330 I to się nazywa, co? 125 00:05:03,330 --> 00:05:03,950 Och, OK. 126 00:05:03,950 --> 00:05:04,450 Trzymaj się. 127 00:05:04,450 --> 00:05:05,575 Nie chciałam przeszkadzać. 128 00:05:05,575 --> 00:05:07,060 Janelle: Przepraszam. 129 00:05:07,060 --> 00:05:14,237 Więc to go do wejścia Adres nie of-- pewno. 130 00:05:14,237 --> 00:05:17,320 Nie potrafię dokładnie pamiętam numeru, ale uważam, że to było od 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. MALAN: To wszystko prawda, bo zrobiłem numery się, 132 00:05:18,420 --> 00:05:19,650 więc nie ma dobrej odpowiedzi. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Począwszy od 0 łuku. 134 00:05:22,105 --> 00:05:24,000 >> David J. MALAN: OK, więc elementem 0. 135 00:05:24,000 --> 00:05:24,765 Jasne. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: A jeśli było jak tylko dwa-letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. MALAN: OK, z powrotem do Ciebie. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Tak Element 0, a następnie elementem 1 lub 2 Element. 139 00:05:33,629 --> 00:05:36,670 David J. MALAN: A który kawałek obraz rysujesz teraz? 140 00:05:36,670 --> 00:05:37,690 Wezwanie do getString? 141 00:05:37,690 --> 00:05:38,830 Lub deklaracja s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: deklaracja S, wierzę. 143 00:05:42,890 --> 00:05:45,980 Och, getString, bo to by być wprowadzane do każdego [? obszar. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. MALAN: Dobra. 145 00:05:46,510 --> 00:05:47,051 Dokładnie. 146 00:05:47,051 --> 00:05:49,300 Pomimo tego, że skuteczny Zwraca tablicę, przypomnieć, 147 00:05:49,300 --> 00:05:53,300 gdy wrócimy ciąg, możemy Indeks do tego łańcucha przy użyciu 01 i 2. 148 00:05:53,300 --> 00:05:56,180 Technicznie, to prawdopodobnie przedstawiciele poszczególnych adresów, 149 00:05:56,180 --> 00:05:57,100 ale to jest w porządku. 150 00:05:57,100 --> 00:06:00,170 >> Więc przypuszczam, jeśli mogę tak szybko przesyłają którym skończyliśmy 151 00:06:00,170 --> 00:06:04,320 Ostatnim razem, gdy jedna z struny było g b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, a tym samym stanowiących Gabe'a Wejście, jak możemy reprezentować s teraz? 153 00:06:10,337 --> 00:06:12,670 Jeśli jest to pamięć, która jest zostały zwrócone przez getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Czy jest reprezentowane przez łuk? 156 00:06:17,610 --> 00:06:18,750 >> David J. MALAN: łukiem? 157 00:06:18,750 --> 00:06:19,130 Cóż, nie. 158 00:06:19,130 --> 00:06:21,171 Powiedzmy tylko, obrazowo, Pozwólcie mi iść do przodu 159 00:06:21,171 --> 00:06:25,710 i zaproponowanie, że jeżeli jest to, ten jest wartość zwracana getString. 160 00:06:25,710 --> 00:06:29,482 A ty, jak wyciągnąć to 0, 1, 2, które jest całkowicie uzasadnione, ponieważ my 161 00:06:29,482 --> 00:06:30,940 może wskaźnik do łańcucha, jako takie. 162 00:06:30,940 --> 00:06:33,340 Ale tylko być zgodne z Ostatni raz, pozwól mi iść do przodu 163 00:06:33,340 --> 00:06:37,310 i zaproponować, że arbitralnie jest adres 1, to jest adres 2, 164 00:06:37,310 --> 00:06:39,597 jest to adres 3 i tak dalej. 165 00:06:39,597 --> 00:06:41,430 I tak, po prostu, aby być super jasne, co się dzieje 166 00:06:41,430 --> 00:06:44,580 iść s w wyniku tego Pierwsza linia kodu, można by powiedzieć? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adres 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. MALAN: Dokładnie. 169 00:06:46,420 --> 00:06:47,190 Więc zająć 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 A tymczasem, pozwól mi iść do przodu i powielić wiele z tego, co zrobiłeś 172 00:06:51,230 --> 00:06:52,740 i dodać moje własne t tutaj. 173 00:06:52,740 --> 00:06:56,340 Gdybym wpisać Gabe znowu, po raz drugi, 174 00:06:56,340 --> 00:07:01,530 gdy pojawi się monit z getString, gdzie, Oczywiście, jest Gabe zamiar iść? 175 00:07:01,530 --> 00:07:02,280 Cóż, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Podobnie jak tutaj? 178 00:07:05,975 --> 00:07:06,850 David J. MALAN: Tak. 179 00:07:06,850 --> 00:07:08,516 Janelle: Albo jest to również w tych samych polach? 180 00:07:08,516 --> 00:07:11,940 David J. MALAN: Pozwól mi zaproponować, tak, dokładnie, a więc w tych dodatkowych pól. 181 00:07:11,940 --> 00:07:15,230 Ale co jest teraz to, że klucz, nawet choć mam wyciągnąć te całkiem blisko 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, to jest 0x2-- w rzeczywistości, 183 00:07:18,650 --> 00:07:25,750 Teraz może być to adres 0x10, na przykład, a 0x11 i 0x12, 184 00:07:25,750 --> 00:07:26,870 i tak dalej. 185 00:07:26,870 --> 00:07:29,955 I tak, jeśli o to chodzi, co się w końcu tutaj w t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. MALAN: Dokładnie. 188 00:07:31,830 --> 00:07:33,180 Więc 0x10. 189 00:07:33,180 --> 00:07:34,570 I tak teraz, ostatnie pytanie. 190 00:07:34,570 --> 00:07:37,510 Zostały, jak dotąd, musiały pracować Najtrudniejszą dla słonia do tej pory. 191 00:07:37,510 --> 00:07:42,650 Teraz, jeśli podciągnąć kod ponownie, gdy ja, w trzeciej linii, 192 00:07:42,650 --> 00:07:47,630 jeśli y jest równa jest równa t, co ja właściwie porównanie, że mamy wyciągnąć tutaj? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Dwa adresy? 194 00:07:49,271 --> 00:07:50,270 David J. MALAN: Dokładnie. 195 00:07:50,270 --> 00:07:53,350 Więc mówię, jest y równa równa t? 196 00:07:53,350 --> 00:07:56,210 Innymi słowy, jest równa 1 równą 10? 197 00:07:56,210 --> 00:07:59,710 Oczywiście, Oczywistą odpowiedzią jest teraz, nie. 198 00:07:59,710 --> 00:08:02,920 I tak ten program jest ostatecznie będzie drukować, co, można by powiedzieć? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Czy byłoby, wpisane to samo? 201 00:08:08,405 --> 00:08:11,446 >> David J. MALAN: Więc jeśli s oznacza 1, a t wynosi 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Wpisano różne rzeczy. 203 00:08:13,320 --> 00:08:13,570 >> David J. MALAN: Dokładnie. 204 00:08:13,570 --> 00:08:14,480 Wpisano różne rzeczy. 205 00:08:14,480 --> 00:08:14,850 Wszystko w porządku. 206 00:08:14,850 --> 00:08:16,714 Więc brawa, jeśli można, tutaj. 207 00:08:16,714 --> 00:08:17,214 [Aplauz] 208 00:08:17,214 --> 00:08:17,708 To było bolesne. 209 00:08:17,708 --> 00:08:18,208 Wiem. 210 00:08:18,208 --> 00:08:19,684 Ładnie wykonane. 211 00:08:19,684 --> 00:08:24,690 Teraz zobaczmy, czy nie możemy odciąć to, co było naprawić. 212 00:08:24,690 --> 00:08:28,040 I oczywiście, kiedy stała to-- które będę teraz reprezentować w green-- 213 00:08:28,040 --> 00:08:29,690 zrobiliśmy kilka ulepszeń tutaj. 214 00:08:29,690 --> 00:08:32,409 Po pierwsze, tak jak normalności sprawdzić, jestem pierwszym sprawdzeniu 215 00:08:32,409 --> 00:08:35,110 jeśli y jest równa wartości null i t równa NULL. 216 00:08:35,110 --> 00:08:39,440 I żeby była jasność, kiedy może s lub t być null w kodzie jak to? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Kiedy może s lub t być null. 219 00:08:44,490 --> 00:08:44,990 Tak? 220 00:08:44,990 --> 00:08:45,990 >> PUBLICZNOŚCI: [niesłyszalne]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. MALAN: Dokładnie. 223 00:08:50,510 --> 00:08:52,840 Jeśli ciąg znaków, który użytkownik wpisany jest zbyt długi 224 00:08:52,840 --> 00:08:56,140 w celu dopasowania do pamięci, albo niektóre dziwna sprawa rogu tak, 225 00:08:56,140 --> 00:08:59,010 getString, jak zobaczymy, dosłownie dzisiaj, w jego dokumentacji, 226 00:08:59,010 --> 00:09:02,330 mówi, że zwróci null jako Szczególna wartość sentinel, 227 00:09:02,330 --> 00:09:05,417 lub po prostu rodzaj specjalny symbol co oznacza, że ​​coś poszło nie tak. 228 00:09:05,417 --> 00:09:07,500 Dlatego chcemy, aby sprawdzić, , że z powodu okazuje 229 00:09:07,500 --> 00:09:09,720 że wartość null jest bardzo niebezpieczne. 230 00:09:09,720 --> 00:09:14,250 >> Często, jeśli starają się zrobić coś z wartość null udziałem function-- przekazania go 231 00:09:14,250 --> 00:09:17,470 jako wejście dla instance-- tej funkcji może bardzo padnie, a wraz z nim, 232 00:09:17,470 --> 00:09:19,090 zdjąć cały program. 233 00:09:19,090 --> 00:09:22,570 Więc to trzecia linia jest teraz po prostu zdrowy rozsądek sprawdzić, sprawdzanie błędów, jeśli będzie. 234 00:09:22,570 --> 00:09:25,450 To jest dobry zwyczaj teraz nam się dostać do każdej chwili możemy 235 00:09:25,450 --> 00:09:28,050 spróbuj użyć wartości, które może potencjalnie być null. 236 00:09:28,050 --> 00:09:32,000 >> Teraz, w czwartej linii tutaj, "Jeśli strcmp (s, t)," dobrze, 237 00:09:32,000 --> 00:09:33,180 co to na myśli? 238 00:09:33,180 --> 00:09:36,750 Cóż, powiedział, że to bardzo krótko o nazwie funkcja porównania ciągów. 239 00:09:36,750 --> 00:09:40,370 A jego celem w życiu jest do porównania jej pierwszy argument przeciwko nim drugi, 240 00:09:40,370 --> 00:09:44,640 , ale nie pod względem ich adresami jak my nieświadomie chwila 241 00:09:44,640 --> 00:09:48,270 temu z czerwonego kodu, ale raczej porównać te dwie 242 00:09:48,270 --> 00:09:53,210 sznurki w intuicyjny po ludzku Sposób porównując to na tym, 243 00:09:53,210 --> 00:09:56,690 wobec tego na tym, a Następnie zatrzymywania wtedy, gdy jeden 244 00:09:56,690 --> 00:09:59,590 lub oba palce uderza odwrotny ukośnik 0. 245 00:09:59,590 --> 00:10:04,530 Więc ktoś lat temu realizowane strcmp do wdrożenia dla nas funkcjonalność 246 00:10:04,530 --> 00:10:08,890 że mamy nadzieję, że dostaliśmy tylko przez porównanie dwóch prostych wartości. 247 00:10:08,890 --> 00:10:14,929 >> Teraz szczerze, trzymam rysunek wszystkie z tych różnych ilościach. 248 00:10:14,929 --> 00:10:17,470 Ale rzeczywistość jest taka, że ​​byli co to się cały czas. 249 00:10:17,470 --> 00:10:19,580 A więc pozwól mi tylko iść do przodu i mazać te z 250 00:10:19,580 --> 00:10:23,100 do punktu, że na końcu dnia i do przodu, 251 00:10:23,100 --> 00:10:30,160 nie jesteśmy naprawdę będzie dbać o co dotyczy rzeczy są rzeczywiście 252 00:10:30,160 --> 00:10:30,790 w pamięci. 253 00:10:30,790 --> 00:10:34,320 Więc nie będę rysować te rodzaje numerów już tak dużo, 254 00:10:34,320 --> 00:10:38,970 Jestem tylko to streszczenie dala trochę bardziej przyjazny, z zaledwie strzałkami. 255 00:10:38,970 --> 00:10:42,060 >> Innymi słowy, gdy s jest wskaźnik, dobrze, po prostu wyciągnąć go, dosłownie, 256 00:10:42,060 --> 00:10:45,430 jako wskaźnik, strzałka skierowana z Sam na coś innego, 257 00:10:45,430 --> 00:10:48,280 i nie martw się o zbyt wiele bardziej minucja z tych adresów 258 00:10:48,280 --> 00:10:49,910 które ponownie, zrobiłem się tak. 259 00:10:49,910 --> 00:10:52,680 Ale zobaczymy te adresy, Czasami, podczas debugowania kodu. 260 00:10:52,680 --> 00:10:56,450 >> Teraz zaś, w ramach programu tu poprawki, oczywiście, 261 00:10:56,450 --> 00:10:58,720 ten problem przez porównanie te dwa ciągi. 262 00:10:58,720 --> 00:11:00,260 Ale wpadł na inny problem. 263 00:11:00,260 --> 00:11:03,180 To był z kopii zaprogramować ostatni raz, 264 00:11:03,180 --> 00:11:06,880 przy czym, starałem się wykorzystać tylko pierwszy znak w ciągu znaków. 265 00:11:06,880 --> 00:11:09,620 Ale to, co było objawem widzieliśmy ostatni raz, kiedy 266 00:11:09,620 --> 00:11:14,150 użytkownik wpisze w wartości, jak Gabe małymi literami, na południe, 267 00:11:14,150 --> 00:11:19,310 potem przypisane s do t, w trzecim wierszu, 268 00:11:19,310 --> 00:11:22,900 a następnie próbowałem wykorzystać t wspornik 0? 269 00:11:22,900 --> 00:11:25,950 Jaki był efekt zmianę t wspornik 0 tutaj? 270 00:11:25,950 --> 00:11:27,150 >> PUBLICZNOŚCI: To zmieniło s. 271 00:11:27,150 --> 00:11:29,360 >> David J. MALAN: Tak, Zmienione S, jak również. 272 00:11:29,360 --> 00:11:31,050 Bo to, co się naprawdę dzieje? 273 00:11:31,050 --> 00:11:34,130 Cóż, pozwól mi zobaczyć, czy mogę wyczyścić do tego obrazu, jak następuje. 274 00:11:34,130 --> 00:11:41,390 >> Jeśli S jest znowu słowo g A, B, E, odwrotny ukośnik, 0 i y 275 00:11:41,390 --> 00:11:44,084 będziemy kontynuować rysunku jako pole tutaj, ale nie więcej adresów. 276 00:11:44,084 --> 00:11:45,250 Zatrzymajmy dokonywania rzeczy. 277 00:11:45,250 --> 00:11:47,510 Po prostu narysować obrazek uproszczenie świat. 278 00:11:47,510 --> 00:11:52,640 >> Kiedy Oświadczam t sznurkiem t, który tworzy ten fragment pamięci. 279 00:11:52,640 --> 00:11:55,850 Plac dzieje się 32 bity w większości komputerów. 280 00:11:55,850 --> 00:11:59,530 W rzeczywistości, jeśli kiedykolwiek słyszał Komputer ma strukturę 32-bitowego 281 00:11:59,530 --> 00:12:03,000 bardzo fantazyjne-mówią, że tylko oznacza to, że korzysta z adresów 32-bitowych. 282 00:12:03,000 --> 00:12:05,370 I jako techniczne na bok, Jeśli kiedykolwiek zastanawialiście się, 283 00:12:05,370 --> 00:12:09,630 dlaczego starsze komputery, jeśli rzeczywiście próbował zupy je z dużą ilością pamięci RAM, 284 00:12:09,630 --> 00:12:12,360 może mieć tylko maksimum czterech gigabajtów pamięci RAM, 285 00:12:12,360 --> 00:12:14,860 dobrze, że to, dlatego, że dosłownie, Twój stary komputer może tylko 286 00:12:14,860 --> 00:12:17,250 Ilość aż 4 miliardów, 4 miliardy bajtów, 287 00:12:17,250 --> 00:12:20,590 dlatego, że był przy użyciu 32-bitowego Numery adresów. 288 00:12:20,590 --> 00:12:23,260 >> Ale w każdym przypadku, w tym przykład, historia jest o wiele prostsze. 289 00:12:23,260 --> 00:12:27,250 t tylko kolejny wskaźnik, lub naprawdę gwiazda char, aka ciąg. 290 00:12:27,250 --> 00:12:30,860 I jak chcę zaktualizować tego obrazu teraz z tej drugiej linii kodu, 291 00:12:30,860 --> 00:12:31,950 po kropce, kropka, kropka? 292 00:12:31,950 --> 00:12:35,845 Kiedy zrobić łańcuch t jest równa s średnik, W jaki sposób zmienić ten obraz? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Tak? 295 00:12:38,000 --> 00:12:38,916 >> PUBLICZNOŚCI: [niesłyszalne]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. MALAN: Tak. 298 00:12:42,020 --> 00:12:42,600 Dokładnie. 299 00:12:42,600 --> 00:12:45,620 I po prostu umieścić strzałę z t Skrzynka na ten sam adres, 300 00:12:45,620 --> 00:12:47,570 sama pierwsza litera w dali. 301 00:12:47,570 --> 00:12:50,850 Lub technicznych, jeżeli Facet wciąż na 0x1, 302 00:12:50,850 --> 00:12:53,052 To tak, jakbym miał 0x1 i 0x1 tutaj, tutaj. 303 00:12:53,052 --> 00:12:54,760 Ale znowu, kto dba o adresy? 304 00:12:54,760 --> 00:12:56,345 To tylko pomysł, który teraz liczy. 305 00:12:56,345 --> 00:12:57,720 Więc to jest to, co się tutaj dzieje. 306 00:12:57,720 --> 00:13:02,690 Tak, oczywiście, jeśli nie t wspornika 0, co jest zapis tablicy, 307 00:13:02,690 --> 00:13:05,650 z course-- i szczerze mówiąc, wygląda jak jest tu tablica, 308 00:13:05,650 --> 00:13:07,340 ale teraz nie jest to dziwne. 309 00:13:07,340 --> 00:13:11,160 Wiedzieć, że język programowania, C, oferuje tę funkcję, 310 00:13:11,160 --> 00:13:14,650 w którym nawet, jeśli t Wskaźnik lub S jest wskaźnikiem, 311 00:13:14,650 --> 00:13:18,050 nadal można korzystać, które zna, wygodne nawias kwadratowy 312 00:13:18,050 --> 00:13:22,520 notacji, aby przejść do pierwszego elementu, lub drugi element lub każdy element 313 00:13:22,520 --> 00:13:26,130 , które wskazuje, że wskaźnik się, bo zapewne go 314 00:13:26,130 --> 00:13:29,410 jest, jak w tym przypadku, wskazując na jakąś tablicę. 315 00:13:29,410 --> 00:13:30,340 >> Jak więc rozwiązać ten problem? 316 00:13:30,340 --> 00:13:33,660 Szczerze mówiąc, to gdzie to ma trochę przytłaczająca na pierwszy rzut oka. 317 00:13:33,660 --> 00:13:35,340 Ale tutaj jest nowa i ulepszona wersja. 318 00:13:35,340 --> 00:13:37,460 >> Więc po pierwsze, jestem coraz pozbyć biblioteki CS50, 319 00:13:37,460 --> 00:13:41,170 żeby odsłonić że s jest rzeczywiście gwiazdkowy char, po prostu synonimem. 320 00:13:41,170 --> 00:13:43,540 I t jest również gwiazdą char. 321 00:13:43,540 --> 00:13:48,290 Ale to, co dzieje się na po prawej stronie tej linii 322 00:13:48,290 --> 00:13:49,970 gdzie t jest przypisana wartość? 323 00:13:49,970 --> 00:13:50,790 >> Co to jest malloc? 324 00:13:50,790 --> 00:13:51,630 Co to strlen? 325 00:13:51,630 --> 00:13:52,547 Co to jest sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Dlaczego do cholery robi to Linia tak skomplikowane spojrzenie? 327 00:13:54,380 --> 00:13:55,713 Co on robi na wysokim poziomie? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Co to przechowywanie w t? 330 00:13:57,440 --> 00:13:58,646 Tak? 331 00:13:58,646 --> 00:14:01,104 PUBLICZNOŚCI: To przydzielania pewna ilość pamięci. 332 00:14:01,104 --> 00:14:03,032 To jest do przechowywania, jak sądzę, Litery [niesłyszalne]. 333 00:14:03,032 --> 00:14:04,032 >> David J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Idealny. 335 00:14:04,540 --> 00:14:06,650 To alokacji pewne ilość miejsca w pamięci 336 00:14:06,650 --> 00:14:08,940 do przechowywania, przypuszczalnie przyszłe liter. 337 00:14:08,940 --> 00:14:11,310 A w szczególności, malloc jest zatem powrót co? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> PUBLICZNOŚCI: Przywracanie [niesłyszalne]? 340 00:14:14,851 --> 00:14:15,850 David J. MALAN: Dokładnie. 341 00:14:15,850 --> 00:14:18,850 Wracając adres tej pamięci, która jest fantazyjny sposób na powiedzenie, 342 00:14:18,850 --> 00:14:21,640 zwraca adres Pierwszy bajt tej pamięci. 343 00:14:21,640 --> 00:14:25,460 Spoczywa na mnie, aby pamiętać, ile pamięci faktycznie 344 00:14:25,460 --> 00:14:27,140 przyznane lub zapytał malloc dla. 345 00:14:27,140 --> 00:14:28,384 >> Teraz, ile to jest? 346 00:14:28,384 --> 00:14:30,550 Cóż, nawet jeśli nie Wiele nawiasach tutaj 347 00:14:30,550 --> 00:14:32,970 malloc zajmuje tylko jeden argument. 348 00:14:32,970 --> 00:14:37,250 A ja określając strlen S, więc dać mi, jak wiele bajtów, ile jest w sekundach, 349 00:14:37,250 --> 00:14:37,800 ale dodać. 350 00:14:37,800 --> 00:14:38,300 Dlaczego? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Tak? 353 00:14:39,530 --> 00:14:40,840 >> PUBLICZNOŚCI: backslash 0. 354 00:14:40,840 --> 00:14:41,840 David J. MALAN: Dokładnie. 355 00:14:41,840 --> 00:14:43,423 Musimy zrobić trochę sprzątanie. 356 00:14:43,423 --> 00:14:45,970 Tak, bo jest odwrotny ukośnik 0, to lepiej o tym pamiętać. 357 00:14:45,970 --> 00:14:47,310 W przeciwnym razie będziemy aby utworzyć ciąg 358 00:14:47,310 --> 00:14:49,170 nie ma to specjalnego terminator. 359 00:14:49,170 --> 00:14:52,640 >> Tymczasem, po prostu być super anal, mam sizeof (char), 360 00:14:52,640 --> 00:14:55,730 tylko w przypadku gdy ktoś uruchamia Mój Kod nie na urządzeniu CS50, 361 00:14:55,730 --> 00:14:58,220 ale może inny komputer łącznie, gdzie znaki 362 00:14:58,220 --> 00:15:01,470 to jeden bajt, zgodnie z konwencją, ale dwa bajtów, lub coś większego niż to. 363 00:15:01,470 --> 00:15:04,490 To jest po prostu być super, bardzo niechętna do błędów. 364 00:15:04,490 --> 00:15:06,940 Mimo, że w rzeczywistości jest to najprawdopodobniej będzie 1. 365 00:15:06,940 --> 00:15:11,490 >> Teraz, w międzyczasie, śmiało i skopiować ciąg, t wynosi t uchwyt i wspornik s. 366 00:15:11,490 --> 00:15:14,962 A ja odłożyć do zeszłotygodniowej kod źródłowy, aby zobaczyć, co się dzieje. 367 00:15:14,962 --> 00:15:17,670 Ale klucz na wynos, i Powodem umieścić kod teraz w kolorze zielonym, 368 00:15:17,670 --> 00:15:22,520 Jest tak dlatego, że w ostatniej linii, t Uchwyt 0 równa toupper, 369 00:15:22,520 --> 00:15:25,230 skutkuje kapitalizacji, które ciąg? 370 00:15:25,230 --> 00:15:26,960 t i / lub s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Ta ostatnia linia kodu. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Tylko t, bo to, co jest się tym razem, 375 00:15:35,560 --> 00:15:41,500 jeśli nieco cofnąć ostatni krok, co się stało jest, gdy zgłoszę malloc, 376 00:15:41,500 --> 00:15:45,380 I w zasadzie dostać kawałek pamięci , że ma taki sam rozmiar jak oryginał, 377 00:15:45,380 --> 00:15:47,020 bo to arytmetyka zrobiłem. 378 00:15:47,020 --> 00:15:50,920 Jestem przechowywania t adres tego fragmentu pamięci. 379 00:15:50,920 --> 00:15:53,370 Pomimo tego, że ładnie wygląda i ładne, ładne i puste, 380 00:15:53,370 --> 00:15:56,882 Rzeczywistość jest tam, co będzie wzywasz, wartości śmieci tutaj. 381 00:15:56,882 --> 00:15:59,340 Że kawałek pamięci może bardzo dobrze zostały wykorzystane wcześniej, 382 00:15:59,340 --> 00:16:00,940 kilka sekund, kilka minut temu. 383 00:16:00,940 --> 00:16:04,410 Więc nie może absolutnie być liczbami lub litery tam, po prostu przez przypadek. 384 00:16:04,410 --> 00:16:08,580 Ale nie są ważne, dopóki nie ja zapełnić ten fragment pamięci 385 00:16:08,580 --> 00:16:12,510 z rzeczywistych znaków, jak atrakcje, które dla pętli tam. 386 00:16:12,510 --> 00:16:13,180 Wszystko w porządku? 387 00:16:13,180 --> 00:16:16,180 >> Więc teraz, punkt kulminacyjny Te trzy przykłady 388 00:16:16,180 --> 00:16:20,730 które pozornie uszkodzony ostatni raz, Przykład ten wymiany, funkcja 389 00:16:20,730 --> 00:16:23,670 pracował w tym sensie, że zamieniłem a i b. 390 00:16:23,670 --> 00:16:25,620 Ale to nie działa w jakim innym sensie? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Tak? 393 00:16:28,614 --> 00:16:29,612 >> PUBLICZNOŚCI: [niesłyszalne]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. MALAN: Dokładnie. 396 00:16:36,700 --> 00:16:39,530 Gdybym miał wywołać tę funkcję od another-- na przykład 397 00:16:39,530 --> 00:16:42,870 z funkcji, takich jak główne, gdzie Mam zmienne X i Y, jak 398 00:16:42,870 --> 00:16:46,160 w zeszłym tygodniu, sam kod, i przechodzą w x i y 399 00:16:46,160 --> 00:16:49,860 do wymiany, a następnie zadzwonić Swap-- tego, Oczywiście, jest poprawna wersja 400 00:16:49,860 --> 00:16:52,220 jest to, co mamy zamiar see-- to nie działa. 401 00:16:52,220 --> 00:16:53,770 Więc co jest poprawka? 402 00:16:53,770 --> 00:16:56,850 >> Cóż, tak właśnie być jasne, pozwól mi iść do przodu 403 00:16:56,850 --> 00:17:05,450 i-- dać mi chwilę tutaj i zobacz czy mogę pokazać ci ostatni, który 404 00:17:05,450 --> 00:17:12,464 będzie in-- zobaczmy, czy mogę znaleźć to prawdziwy fast-- OK, [niesłyszalne]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, nie jest to. 407 00:17:19,240 --> 00:17:21,000 Więc ignorować polecenia Ja tylko pisać. 408 00:17:21,000 --> 00:17:23,780 Chcę, aby pobrać na Przykładem ostatniej chwili 409 00:17:23,780 --> 00:17:27,960 z ostatniego czasu, które nazywa się teraz nie zmienne. 410 00:17:27,960 --> 00:17:30,200 >> Zmiennych jest tak, gdzie nie skończyliśmy ostatnim razem, 411 00:17:30,200 --> 00:17:32,930 przy czym, to zainicjowany x i y na 1 do 2. 412 00:17:32,930 --> 00:17:35,840 Następnie zadzwonić Zamień, przekazując 1 i 2. 413 00:17:35,840 --> 00:17:37,930 I wtedy ta funkcja pracował w pewnym sensie, 414 00:17:37,930 --> 00:17:40,750 ale nie miał stałego Wpływ na x i y. 415 00:17:40,750 --> 00:17:45,430 Więc pytanie pod ręką jest, jak teraz możemy rzeczywiście rozwiązać ten problem? 416 00:17:45,430 --> 00:17:47,820 Jakie jest rozwiązanie w zasięgu ręki? 417 00:17:47,820 --> 00:17:53,150 >> Cóż, w swap.c, który jest nowy dzisiaj dostrzec kilka różnic. 418 00:17:53,150 --> 00:17:54,700 x i y są takie same. 419 00:17:54,700 --> 00:17:57,250 Ale to, co jest wyraźnie różne o linię 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Co nowego jest, jeśli pamiętać jak to wyglądało godziny temu? 422 00:18:01,715 --> 00:18:02,565 >> PUBLICZNOŚCI: [niesłyszalne]. 423 00:18:02,565 --> 00:18:03,440 >> David J. MALAN: Tak. 424 00:18:03,440 --> 00:18:06,680 Tak więc Ampersands są nowe piece składni nie tylko w tym programie, 425 00:18:06,680 --> 00:18:08,560 ale także bardziej ogólnie w CS50. 426 00:18:08,560 --> 00:18:10,680 Do tej pory, nie sądzę, widzieliśmy żadnych przykładów 427 00:18:10,680 --> 00:18:14,070 czy naprawdę mówił o nich w dowolny szczegóły, inne niż, być może, zapobiegawczo 428 00:18:14,070 --> 00:18:16,467 w przekroju, handlowego i tak. 429 00:18:16,467 --> 00:18:19,300 Cóż, okazuje się, handlowego i jest jednym z ostatnich kawałków nowej składni 430 00:18:19,300 --> 00:18:20,174 będziemy się uczyć. 431 00:18:20,174 --> 00:18:23,500 Wszystko to oznacza, adres jakiejś zmiennej. 432 00:18:23,500 --> 00:18:25,070 Na jaki adres ma x żyć? 433 00:18:25,070 --> 00:18:26,510 Ale jaki adres ma y mieszka? 434 00:18:26,510 --> 00:18:28,700 Bo jeśli Podstawowym problemem przed 435 00:18:28,700 --> 00:18:32,970 było to, że X i Y były przekazywane jak kopie, co tak naprawdę chcemy robić 436 00:18:32,970 --> 00:18:38,780 jest zapewnienie SWAP z jak skarb mapę, która prowadzi do miejsca, gdzie x i y faktycznie 437 00:18:38,780 --> 00:18:41,910 znajdują się w pamięci RAM, żeby Zmienne mogą śledzić tę mapę 438 00:18:41,910 --> 00:18:47,760 i iść tam, gdzie x i y oznacza miejsce i zmienić wartości rzeczywiste 1 i 2 439 00:18:47,760 --> 00:18:48,270 tam. 440 00:18:48,270 --> 00:18:50,710 >> Zmienne musi więc lekko zmienić też. 441 00:18:50,710 --> 00:18:53,760 I na pierwszy rzut oka, to siła wydawać się nieco podobna do gwiazdy char. 442 00:18:53,760 --> 00:18:54,850 I rzeczywiście tak jest. 443 00:18:54,850 --> 00:18:59,635 Tak jest wskaźnikiem do jakiego typu danych, na podstawie tego zaznaczonego fragmentu? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Więc jest to int. 446 00:19:01,620 --> 00:19:04,880 >> Więc już nie jest int, to adres wew. 447 00:19:04,880 --> 00:19:07,910 Podobnie, B będzie teraz być adres int. 448 00:19:07,910 --> 00:19:12,470 Więc kiedy teraz zadzwonić Zamień z główną, Nie zamierzam dać SWAP 1 i 2. 449 00:19:12,470 --> 00:19:15,540 Mam zamiar dać go jak Wół Wół coś i coś, 450 00:19:15,540 --> 00:19:19,820 dwa adresy, które będą prowadzić Zmienne do ich rzeczywistych lokalizacjach 451 00:19:19,820 --> 00:19:21,310 w pamięci mojego komputera. 452 00:19:21,310 --> 00:19:25,580 >> Więc teraz, mój pozostały realizacji musi się zmienić odrobinę. 453 00:19:25,580 --> 00:19:28,650 Co jest oczywiście inna teraz w tych trzech linii kodu? 454 00:19:28,650 --> 00:19:31,350 Nie wszystkie te cholerne gwiazdkowych na miejscu, wszystko w porządku? 455 00:19:31,350 --> 00:19:33,014 Więc co tu się dzieje? 456 00:19:33,014 --> 00:19:33,514 Tak? 457 00:19:33,514 --> 00:19:35,055 >> PUBLICZNOŚCI: To oczywiście [niesłyszalne]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. MALAN: Dokładnie. 460 00:19:37,990 --> 00:19:41,560 Tak więc w tym context-- i nie było najlepsza decyzja projektowa, prawda, 461 00:19:41,560 --> 00:19:42,530 lat temu. 462 00:19:42,530 --> 00:19:45,110 W tym kontekście, w którym wystarczy gwiazdę, 463 00:19:45,110 --> 00:19:48,240 i nie ma typu danych, jak int, bezpośrednio po lewej stronie, 464 00:19:48,240 --> 00:19:53,146 a nie masz znak równości, jasno, w związku z tym, kiedy mówisz gwiazda, 465 00:19:53,146 --> 00:19:56,980 to znaczy przejść do adres, który znajduje się w. 466 00:19:56,980 --> 00:19:58,870 Śledzić mapę skarbów, że tak powiem. 467 00:19:58,870 --> 00:20:01,720 >> A tymczasem w linii 37, oznacza to samo. 468 00:20:01,720 --> 00:20:05,460 Idź do adresu A, i umieścić to, co tam jest? 469 00:20:05,460 --> 00:20:09,520 Cokolwiek jest miejsce, które b określa. 470 00:20:09,520 --> 00:20:10,980 Innymi słowy, przejdź do b. 471 00:20:10,980 --> 00:20:12,130 Uzyskać tę wartość. 472 00:20:12,130 --> 00:20:15,620 Przejdź do, a na równi podpisać, operator przypisania, 473 00:20:15,620 --> 00:20:17,010 umieścić tę wartość tam. 474 00:20:17,010 --> 00:20:19,272 >> Podobnie, int temp jest tylko int. 475 00:20:19,272 --> 00:20:20,730 Nic nie musi się zmienić o temp. 476 00:20:20,730 --> 00:20:24,810 To tylko szkło z Annenberg zapasowe jakiegoś mleka lub soku pomarańczowym. 477 00:20:24,810 --> 00:20:27,630 Ale trzeba powiedzieć, przejdź do b. 478 00:20:27,630 --> 00:20:31,449 Idź do tego celu i umieścić wartość w temperaturze nie. 479 00:20:31,449 --> 00:20:32,490 Więc co się dzieje potem? 480 00:20:32,490 --> 00:20:36,540 Kiedy rzeczywiście wywołać Zamień ten czas, jeśli ten pierwszy reprezentuje Główny podajnik tutaj, 481 00:20:36,540 --> 00:20:42,270 ten drugi podajnik oznacza swap, gdy Mijam Ampersand X oraz handlowego y 482 00:20:42,270 --> 00:20:47,150 z Main do wymiany, tak aby było jasne, co to jest ramka stosu odbiorcza? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Tak? 485 00:20:49,200 --> 00:20:50,180 >> PUBLICZNOŚCI: [niesłyszalne]. 486 00:20:50,180 --> 00:20:51,180 David J. MALAN: Dokładnie. 487 00:20:51,180 --> 00:20:53,129 Adres adres x i y. 488 00:20:53,129 --> 00:20:55,170 A może myślisz o nich jak adresy pocztowe. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street i 35 Oxford Street, a ty 490 00:20:58,772 --> 00:21:01,230 chcą przenieść dwa budynki które są w tych miejscach. 491 00:21:01,230 --> 00:21:04,680 >> To trochę śmiesznej idei, ale to wszystko rozumiemy przez adres. 492 00:21:04,680 --> 00:21:07,000 Gdzie na świecie można można znaleźć te dwa ints? 493 00:21:07,000 --> 00:21:09,470 Gdzie na świecie można znaleźć te dwa budynki? 494 00:21:09,470 --> 00:21:15,170 Więc jeśli w końcu, po tak długim czasie I idź do dzisiejszego kodu źródłowego i skompilować 495 00:21:15,170 --> 00:21:22,110 Zmienne i uruchomić ./swap wreszcie na raz pierwszy możemy zobaczyć, że w rzeczywistości 496 00:21:22,110 --> 00:21:25,330 Rzeczywiście moje wartości mają zostały zamienione pomyślnie. 497 00:21:25,330 --> 00:21:30,860 A teraz możemy nawet zabrać Wzmiankę o tym, powiedzmy, w gdb. 498 00:21:30,860 --> 00:21:32,740 >> Więc pozwól mi iść do tego samego pliku. 499 00:21:32,740 --> 00:21:35,010 Pozwól mi iść dalej i uruchomić gdb z ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 A teraz, w swap, mam zamiar iść do przodu i ustawić punkt przerwania w Main. 502 00:21:40,547 --> 00:21:42,630 A teraz mam zamiar iść dalej i uruchomić program. 503 00:21:42,630 --> 00:21:45,810 A teraz widzimy, mój kod Przerwał na tej linii. 504 00:21:45,810 --> 00:21:48,330 >> Jeśli pójdę do przodu i drukuj x, co powinienem zobaczyć tutaj? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 To jest pytanie. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Jeszcze raz? 509 00:21:51,530 --> 00:21:52,295 >> PUBLICZNOŚCI: [niesłyszalne]. 510 00:21:52,295 --> 00:21:53,910 >> David J. MALAN: Tak liczby losowe, może. 511 00:21:53,910 --> 00:21:56,010 Może mi się poszczęści, i to ładne i proste, jak 0. 512 00:21:56,010 --> 00:21:57,230 Ale być może jest to jakiś losowy numer. 513 00:21:57,230 --> 00:21:58,090 W tym przypadku, mam szczęście. 514 00:21:58,090 --> 00:21:59,030 To właśnie dzieje się 0. 515 00:21:59,030 --> 00:22:00,780 Ale to jest naprawdę szczęście, ponieważ dopóki nie 516 00:22:00,780 --> 00:22:06,280 wpisz obok print x, a następnie, że ma linii kodu, linia 19, zostały wykonane. 517 00:22:06,280 --> 00:22:10,942 >> Tymczasem, jeśli napiszę następny raz, i teraz wydrukować y, mam zamiar zobaczyć 2. 518 00:22:10,942 --> 00:22:13,900 Teraz, jeśli napiszę następny, to będzie trochę mylące, bo teraz, 519 00:22:13,900 --> 00:22:17,250 printf będzie umieszczony na Ekran, jak to zrobił. x oznacza 1. 520 00:22:17,250 --> 00:22:18,606 >> Zróbmy to jeszcze raz. 521 00:22:18,606 --> 00:22:20,480 A teraz, tutaj, gdzie robi się ciekawie. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Zanim zadzwonię Zamień lub nawet krok do niego, weźmy trochę zerknąć. 524 00:22:26,580 --> 00:22:28,980 x jest znów 1. 525 00:22:28,980 --> 00:22:33,240 Y jest oczywiście szybkie rozsądku sprawdzić, 2, więc nie trudno tam. 526 00:22:33,240 --> 00:22:35,740 Ale to, co jest Ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Odpowiedź, to rodzaj funky patrząc. 529 00:22:39,350 --> 00:22:43,500 Ale int gwiazdki w nawiasach jest tylko sposób GDP mówiąc to jest adres. 530 00:22:43,500 --> 00:22:48,290 To nie int, to wskaźnik do int, lub w inny sposób znany jako adres. 531 00:22:48,290 --> 00:22:49,742 >> Co to jest szalone rzeczy? 532 00:22:49,742 --> 00:22:51,825 Nigdy nie widziałem czegoś zupełnie jak wcześniej. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Więc jest to adres w moim komputerze jest pamięci, gdzie x dzieje się żyć. 535 00:22:58,120 --> 00:22:59,040 Wół to jest coś. 536 00:22:59,040 --> 00:23:01,290 I to jest, szczerze mówiąc, dlaczego Zacząłem strzałki rysunek, 537 00:23:01,290 --> 00:23:03,340 zamiast cyfr bo kto naprawdę troszczy się 538 00:23:03,340 --> 00:23:06,890 że int jest w szczególności adres, który jest tak duży. 539 00:23:06,890 --> 00:23:12,160 Ale bffff0c4, to wszystko rzeczywiście cyfry szesnastkowe, 540 00:23:12,160 --> 00:23:13,720 które są od 0 do f. 541 00:23:13,720 --> 00:23:16,590 >> Więc nie będziemy mieszkać zbyt długo na to, co te rzeczy są. 542 00:23:16,590 --> 00:23:19,400 Ale jeśli mogę wydrukować y, Oczywiście, widzę 2. 543 00:23:19,400 --> 00:23:22,440 Ale Ampersand y, widzę ten adres. 544 00:23:22,440 --> 00:23:26,527 Oraz informacja, na nowoczesny, jak daleko od siebie są X i Y? 545 00:23:26,527 --> 00:23:27,985 Można zignorować większość adres. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Cztery bajty. 548 00:23:29,920 --> 00:23:33,510 I to jest zgodne z naszymi wcześniej twierdzą, że jak duże jest int? 549 00:23:33,510 --> 00:23:34,130 Cztery bajty. 550 00:23:34,130 --> 00:23:37,420 Wygląda więc na to wszystko za okładziny ładnie, jak można mieć nadzieję, w pamięci. 551 00:23:37,420 --> 00:23:40,010 >> Więc teraz, po prostu do przodu do końca tej historii. 552 00:23:40,010 --> 00:23:43,290 Idziemy dalej i wpisz krok, do nurkowania w swap. 553 00:23:43,290 --> 00:23:46,880 Zauważcie, jeśli typ, to identyczne pod adresem x. 554 00:23:46,880 --> 00:23:52,130 Gdybym typu B, to jest identyczne na adres R. 555 00:23:52,130 --> 00:23:57,020 Więc co mam sprawdzić, czy ja powiedzieć, przejdź do adresu w? 556 00:23:57,020 --> 00:23:58,120 Więc drukować gwiazda. 557 00:23:58,120 --> 00:24:00,130 Więc tam gwiazda oznacza w tym kontekście. 558 00:24:00,130 --> 00:24:02,730 Handlowe oznacza co adres. 559 00:24:02,730 --> 00:24:05,000 Więc gwiazda środki 1. 560 00:24:05,000 --> 00:24:09,590 I gwiazda druku b daje mi 2. 561 00:24:09,590 --> 00:24:15,750 >> I pozwól mi zakładać, w tej chwili, że co najmniej kod 562 00:24:15,750 --> 00:24:18,950 przystępuje do wykonania może być teraz uzasadniona przez w ten sposób. 563 00:24:18,950 --> 00:24:21,150 Ale my ponownie ten pomysł przed długo. 564 00:24:21,150 --> 00:24:23,850 Więc ta wersja swap jest poprawne i pozwala 565 00:24:23,850 --> 00:24:26,650 nam zamienić ten szczególny typ danych. 566 00:24:26,650 --> 00:24:29,120 >> Więc jakieś pytania to na swap? 567 00:24:29,120 --> 00:24:29,890 Na gwiazdy? 568 00:24:29,890 --> 00:24:30,690 Na adres? 569 00:24:30,690 --> 00:24:33,270 A zobaczysz, ze Problem zestaw 4, rodzaj, 570 00:24:33,270 --> 00:24:37,310 ale problem, zestaw 5, na pewno, jak to rzeczy są przydatne i dostać dużo więcej 571 00:24:37,310 --> 00:24:39,584 wygodne z nich, w wyniku. 572 00:24:39,584 --> 00:24:40,430 Cokolwiek? 573 00:24:40,430 --> 00:24:40,930 Wszystko w porządku. 574 00:24:40,930 --> 00:24:44,350 Więc się przydzielić jest znowu funkcja że po prostu przydziela pamięć, pamięć 575 00:24:44,350 --> 00:24:45,330 alokacji. 576 00:24:45,330 --> 00:24:47,024 I dlaczego jest to przydatne? 577 00:24:47,024 --> 00:24:48,940 Cóż, przez cały ten czas, już przy malloc. 578 00:24:48,940 --> 00:24:52,230 Jeżeli uważasz, że teraz, jak getString prace, prawdopodobnie, to 579 00:24:52,230 --> 00:24:56,140 pytali kogoś na fragmencie pamięci, w każdej chwili użytkownik wpisze ciąg 580 00:24:56,140 --> 00:24:59,040 w, bo na pewno nie wiem, jak personel CS50, 581 00:24:59,040 --> 00:25:02,710 jak duże te struny, które ludzie zamiar wpisać może być. 582 00:25:02,710 --> 00:25:07,910 >> Warto więc, po raz pierwszy, od początku do oderwij jak działa biblioteka CS50, 583 00:25:07,910 --> 00:25:10,990 za pomocą kilku przykładów, że doprowadzi nas tam. 584 00:25:10,990 --> 00:25:15,300 Więc jeśli ja otworzyć gedit i otworzyć scanf 0, 585 00:25:15,300 --> 00:25:17,055 jedziemy zobaczyć następujący kod. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, dostępne na stronie internetowej dzisiaj, ma stosunkowo mało linii kodu 588 00:25:23,530 --> 00:25:25,351 o, 14 do 20. 589 00:25:25,351 --> 00:25:26,600 I zobaczmy, co robi. 590 00:25:26,600 --> 00:25:28,920 Deklaruje, zwany int x. 591 00:25:28,920 --> 00:25:30,850 To mówi coś takiego, numer należy. 592 00:25:30,850 --> 00:25:33,940 A teraz mówi, scanf% i, i x. 593 00:25:33,940 --> 00:25:35,620 Więc jest kilka nowych rzeczy tam. 594 00:25:35,620 --> 00:25:38,420 >> Ale scanf, można trochę pomyśleć jako przeciwieństwo printf. 595 00:25:38,420 --> 00:25:40,090 printf, oczywiście, druki do ekranu. 596 00:25:40,090 --> 00:25:44,410 scanf rodzaj skanowania od użytkownika coś klawiatury on lub ona wpisana. 597 00:25:44,410 --> 00:25:46,550 >> % I jest jak printf. 598 00:25:46,550 --> 00:25:49,410 Oznacza to spodziewać użytkownikowi wpisać int. 599 00:25:49,410 --> 00:25:52,820 A teraz, dlaczego myślisz, że może być przechodząc scanf & X? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Jeśli celem w życiu scanf jest dostać coś od użytkownika, 602 00:25:57,770 --> 00:26:02,480 jaki jest sens mijając go, & x, teraz? 603 00:26:02,480 --> 00:26:02,980 Tak? 604 00:26:02,980 --> 00:26:03,896 >> PUBLICZNOŚCI: [niesłyszalne]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. MALAN: Dokładnie. 607 00:26:06,540 --> 00:26:12,900 Cokolwiek, ludzki, wpisać, moje wejście zostanie zapisany w tej lokalizacji. 608 00:26:12,900 --> 00:26:17,660 To nie wystarczy, przypominam, po prostu przejść w X, bo już widać, 609 00:26:17,660 --> 00:26:21,630 za każdym razem przechodzą tylko zmienną surowego, jak int, do innej funkcji, 610 00:26:21,630 --> 00:26:25,640 Oczywiście, że może się zmienić zmienne, ale nie na stałe. 611 00:26:25,640 --> 00:26:27,360 To nie może mieć wpływu na główną. 612 00:26:27,360 --> 00:26:29,420 Może tylko zmienić swoją lokalną kopię. 613 00:26:29,420 --> 00:26:32,560 Ale jeśli zamiast, nie musisz daj mi rzeczywiste int, 614 00:26:32,560 --> 00:26:36,640 ale możesz dać mi wskazówki do że int, I teraz, będąc scanf, 615 00:26:36,640 --> 00:26:41,050 pewnie, że mogę podążać adres i umieścić tam kilka 616 00:26:41,050 --> 00:26:43,280 więc masz do niego dostęp, jak również. 617 00:26:43,280 --> 00:26:45,120 >> Więc kiedy uruchomić ten program, zobaczymy. 618 00:26:45,120 --> 00:26:49,660 Dodać scanf 0 dot slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 I jeśli teraz wpisać liczbę jak 50, dzięki za 50. 620 00:26:54,030 --> 00:26:58,150 Gdybym teraz jak wpisać numer ujemny 1 ujemnej 1. 621 00:26:58,150 --> 00:27:04,200 Teraz wpisz numer jak 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Dlaczego mój program ignoruje mnie? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 No, bo po prostu, powiedziałem to można oczekiwać tylko int. 625 00:27:09,880 --> 00:27:10,380 Wszystko w porządku. 626 00:27:10,380 --> 00:27:11,630 Więc to jest jedna wersja tego. 627 00:27:11,630 --> 00:27:16,600 Weźmy się w garść i zaproponować, że to nie jest dobre. 628 00:27:16,600 --> 00:27:20,530 I tu leży bardzo prosty przykład w jaki sposób możemy rozpocząć pisanie kodu 629 00:27:20,530 --> 00:27:24,450 że inni ludzie mogą wykorzystywać lub kompromisu robiąc złe rzeczy. 630 00:27:24,450 --> 00:27:28,336 Tak więc linia 16, tak podobny w duchu, aby wcześniej, 631 00:27:28,336 --> 00:27:29,960 ale nie jestem oświadczając, że int ten czas. 632 00:27:29,960 --> 00:27:32,970 Jestem deklarowania char gwiazdę, aka ciąg. 633 00:27:32,970 --> 00:27:35,190 >> Ale co to tak naprawdę oznacza? 634 00:27:35,190 --> 00:27:38,790 Tak więc, jeśli nie określić address-- i Dzwonię go dowolnie, bufor, 635 00:27:38,790 --> 00:27:43,370 ale mogę nazwać to s, być simple-- , a następnie zrobić to, wyjaśnij mi, 636 00:27:43,370 --> 00:27:48,630 jeśli można, w oparciu o poprzednie logika, co robi w scanf linii 18, 637 00:27:48,630 --> 00:27:55,000 Jeśli upłynie% s i buforem, który jest adres? 638 00:27:55,000 --> 00:27:58,210 Co to jest scanf, jeśli stosuje się dokładnie taka sama logika jak w wersji 0, 639 00:27:58,210 --> 00:28:00,640 Spróbuję zrobić tutaj, kiedy coś, co użytkownik wpisze w? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Tak? 642 00:28:03,409 --> 00:28:04,407 >> PUBLICZNOŚCI: [niesłyszalne]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. MALAN: Dokładnie. 645 00:28:08,890 --> 00:28:11,577 Scanf, przez logikę wcześniej, zajmie ciąg 646 00:28:11,577 --> 00:28:13,410 że ludzki pisanych in-- to teraz ciąg, 647 00:28:13,410 --> 00:28:15,790 to nie jest liczba, prawdopodobnie, jeśli on lub ona cooperates-- 648 00:28:15,790 --> 00:28:19,310 i to będzie starał się umieścić, że ciąg w pamięci na dowolnym adresem 649 00:28:19,310 --> 00:28:20,340 bufora określa. 650 00:28:20,340 --> 00:28:23,870 I to jest wspaniałe, ponieważ bufor jest rzeczywiście przeznaczona do adresu. 651 00:28:23,870 --> 00:28:30,470 >> Ale twierdzą, ten program jest wadliwy w bardzo poważny sposób, ponieważ to, co jest wartością 652 00:28:30,470 --> 00:28:31,330 Domyślnie bufor? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Co ja zainicjowany w? 655 00:28:34,790 --> 00:28:35,770 Co kawałek pamięci? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 I nie ma, prawda? 658 00:28:38,620 --> 00:28:42,265 >> Więc nawet jeśli mam przydzielone char, że gwiazda nie nazywa s, 659 00:28:42,265 --> 00:28:48,030 to zamiast nazwie, buffer-- tak narysujmy nazwę zmiennej 660 00:28:48,030 --> 00:28:53,380 teraz jak buffer-- jeśli nie mają nazywa getString lub malloc tutaj 661 00:28:53,380 --> 00:28:56,030 że w rzeczywistości oznacza, że Bufor to tylko niektóre wartości śmieci. 662 00:28:56,030 --> 00:28:57,030 >> Teraz co to oznacza? 663 00:28:57,030 --> 00:29:00,220 Oznacza to, że powiedziałem scanf oczekiwać ciąg od użytkownika. 664 00:29:00,220 --> 00:29:01,300 I wiesz co? 665 00:29:01,300 --> 00:29:03,883 Niezależnie od tego, co wskazuje to-- i rysuję znak zapytania, 666 00:29:03,883 --> 00:29:07,060 ale w rzeczywistości, to będzie coś OX1, 2, 3, prawda? 667 00:29:07,060 --> 00:29:10,730 To niektóre fałszywe wartości, które po prostu dzieje się tam z przed. 668 00:29:10,730 --> 00:29:13,440 Więc innymi słowy, jest to jakby bufora tylko 669 00:29:13,440 --> 00:29:16,180 wskazując na coś w pamięci. 670 00:29:16,180 --> 00:29:17,610 Nie mam pojęcia co. 671 00:29:17,610 --> 00:29:24,130 >> Więc jeśli teraz wpisać Gabe, to będzie próbować umieścić g-a-b-e / 0 tam. 672 00:29:24,130 --> 00:29:25,530 Ale kto wie, co to jest? 673 00:29:25,530 --> 00:29:27,480 I w przeszłości, każde czas staraliśmy się dotknąć 674 00:29:27,480 --> 00:29:29,770 pamięcią, które nie należą do nas, co się stało? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Lub prawie za każdym razem. 677 00:29:32,870 --> 00:29:34,310 Błąd segmentacji, prawda? 678 00:29:34,310 --> 00:29:37,829 >> Ta strzałka, nie mam pojęcia, gdzie jest to wskazującego. to tylko kilka losowych wartości. 679 00:29:37,829 --> 00:29:40,370 I oczywiście, jeśli interpretować wartość losowa jak adres, 680 00:29:40,370 --> 00:29:42,610 masz zamiar udać się do jakiś przypadkowy przeznaczenia. 681 00:29:42,610 --> 00:29:46,810 Więc mógłby rzeczywiście katastrofa Gabe mój program w tym przypadku. 682 00:29:46,810 --> 00:29:50,600 >> Więc co możemy zrobić, to prawie tak złe? 683 00:29:50,600 --> 00:29:52,660 Rozważ to trzeci i Ostatnim przykładem scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Ta wersja jest lepsza w jakim sensie? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Jeśli są wygodne z poprzednie problem ten jest lepszy. 688 00:30:01,400 --> 00:30:02,250 Dlaczego? 689 00:30:02,250 --> 00:30:03,250 >> PUBLICZNOŚCI: [niesłyszalne]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. MALAN: Dobra. 692 00:30:07,110 --> 00:30:09,970 Więc w tym przypadku linii 16 jest korzystniejsze, w sensie 693 00:30:09,970 --> 00:30:12,030 że jesteśmy wyraźnie alokacji trochę pamięci. 694 00:30:12,030 --> 00:30:14,190 Nie używasz malloc, używamy tygodniu 2 695 00:30:14,190 --> 00:30:16,060 podejście po prostu deklarując tablicę. 696 00:30:16,060 --> 00:30:18,130 A my już powiedziałem, że ciąg tylko szereg znaków 697 00:30:18,130 --> 00:30:19,690 tak, to jest całkowicie legalne. 698 00:30:19,690 --> 00:30:22,910 Ale to, oczywiście, jak pamiętać, stały rozmiar, 16. 699 00:30:22,910 --> 00:30:25,440 >> Więc ten program jest całkowicie bezpieczne, jeśli typ 700 00:30:25,440 --> 00:30:29,760 w ciągi jednego znaku, dwóch znaków łańcuchy, 15 łańcuchów znaków. 701 00:30:29,760 --> 00:30:34,970 Ale jak tylko zaczniesz wpisywać 16, 17, 18, 1000 ciągi znaków, 702 00:30:34,970 --> 00:30:37,390 gdzie jest, że łańcuch skończy? 703 00:30:37,390 --> 00:30:39,570 To się w końcu częściowo tutaj. 704 00:30:39,570 --> 00:30:42,820 Ale kto wie, co jeszcze jest poza granicami 705 00:30:42,820 --> 00:30:44,270 tej konkretnej tablicy? 706 00:30:44,270 --> 00:30:48,015 >> To tak, jakbym zadeklarowane 16 pola. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Więc zamiast wyciągnąć wszystkie 16, to będzie udawać, że mam wyciągnąć 16. 709 00:30:52,690 --> 00:30:56,540 Ale jeśli spróbuj przeczytać ciąg to o wiele dłużej, jak 50 znaków, 710 00:30:56,540 --> 00:31:01,270 Mam zamiar rozpocząć wprowadzanie , b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 A to przypuszczalnie inny segment pamięci 712 00:31:04,916 --> 00:31:06,790 które znów może powodować mój program do katastrofy, 713 00:31:06,790 --> 00:31:10,600 bo ja nie prosiłem o coś więcej niż tylko 16 bajtów. 714 00:31:10,600 --> 00:31:12,260 >> Więc kogo to obchodzi? 715 00:31:12,260 --> 00:31:13,880 Cóż, tutaj jest biblioteka CS50. 716 00:31:13,880 --> 00:31:17,220 I większość z tego jest tylko jak instrukcje do góry góry. 717 00:31:17,220 --> 00:31:21,670 Biblioteka CS50, przez cały ten czas, miał ten wiersz w wierszu 52. 718 00:31:21,670 --> 00:31:23,680 Widzieliśmy typedef lub zobaczysz typedef 719 00:31:23,680 --> 00:31:27,930 w Pset 4, który właśnie tworzy synonimem którym gwiazda char może być więcej 720 00:31:27,930 --> 00:31:29,290 określany po prostu jako ciąg. 721 00:31:29,290 --> 00:31:31,540 Tak więc jest to jeden z Kilka kółka 722 00:31:31,540 --> 00:31:34,120 używaliśmy potajemnie pod maską. 723 00:31:34,120 --> 00:31:36,490 >> Tymczasem tutaj jest funkcja getchar. 724 00:31:36,490 --> 00:31:38,190 Teraz widać, że nie ma do niej ciało. 725 00:31:38,190 --> 00:31:40,273 I rzeczywiście, jeśli trzymam przewijanie, nie wiem właściwie 726 00:31:40,273 --> 00:31:42,080 zobacz wszystkie realizacje z tych funkcji. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Jako kontrola poprawności, to dlaczego? 729 00:31:45,516 --> 00:31:46,795 >> PUBLICZNOŚCI: [niesłyszalne]. 730 00:31:46,795 --> 00:31:47,670 David J. MALAN: Tak. 731 00:31:47,670 --> 00:31:48,950 Więc to jest nagłówek pliku. 732 00:31:48,950 --> 00:31:52,520 I pliki nagłówkowe zawierają prototypy, plus kilka innych rzeczy, jak się wydaje, 733 00:31:52,520 --> 00:31:53,780 jak typedefs. 734 00:31:53,780 --> 00:31:56,910 Ale w CS50.c, które mamy Nigdy wam wprost, 735 00:31:56,910 --> 00:32:02,100 ale nie było w ogóle urządzenia CS50 Tym razem, w głębi swoich folderów, 736 00:32:02,100 --> 00:32:04,990 zauważyć, że istnieje cały kilka funkcji w tutaj. 737 00:32:04,990 --> 00:32:06,720 >> W rzeczywistości, niech przewijać. 738 00:32:06,720 --> 00:32:08,810 Zignorujmy większość z nich, do teraz. 739 00:32:08,810 --> 00:32:12,670 Ale przejdź do getInt i zobaczyć, jak getInt działa. 740 00:32:12,670 --> 00:32:13,890 Więc tutaj jest getInt. 741 00:32:13,890 --> 00:32:17,727 I jeśli kiedykolwiek naprawdę zależało, jak uzyskać int działa, tutaj jest jego dokumentacja. 742 00:32:17,727 --> 00:32:19,560 I wśród rzeczy mówi, to mówi, 743 00:32:19,560 --> 00:32:21,340 jakie są zakresy wartości może powrócić. 744 00:32:21,340 --> 00:32:24,400 Jest to w zasadzie negatywne 2000000000 do pozytywnego 2000000000, lub dać. 745 00:32:24,400 --> 00:32:26,420 >> I jak się okazuje, to wszystko czas, mimo że nigdy nie 746 00:32:26,420 --> 00:32:28,570 nie można sprawdzić na nim, jeśli coś pójdzie nie tak, 747 00:32:28,570 --> 00:32:30,680 okazuje się, że wszystkie Ten czas ma getInt 748 00:32:30,680 --> 00:32:33,600 powróciła specjalne stała, nie jest pusta, 749 00:32:33,600 --> 00:32:36,760 lecz INT_MAX, który jest Konwencja tylko programisty. 750 00:32:36,760 --> 00:32:38,846 Oznacza to, tutaj jest szczególną wartością. 751 00:32:38,846 --> 00:32:41,470 Upewnij się, aby sprawdzić, czy to po prostu w przypadku gdyby coś poszło nie tak. 752 00:32:41,470 --> 00:32:43,261 Ale nigdy nie przeszkadzało konsekwencji do tej pory 753 00:32:43,261 --> 00:32:45,200 ponieważ, tym Ma to uprościć. 754 00:32:45,200 --> 00:32:46,950 >> Ale jak getInt się wdrożyć? 755 00:32:46,950 --> 00:32:48,450 Cóż, jeden, że nie wymaga żadnych argumentów. 756 00:32:48,450 --> 00:32:49,390 Wiemy, że. 757 00:32:49,390 --> 00:32:50,820 Zwraca int. 758 00:32:50,820 --> 00:32:51,950 Wiemy, że. 759 00:32:51,950 --> 00:32:54,460 Więc jak to działa pod maską? 760 00:32:54,460 --> 00:32:58,290 >> Więc nie ma widocznie nieskończony Pętla przynajmniej jednego wygląd. 761 00:32:58,290 --> 00:33:00,290 Zauważ, że używamy getString. 762 00:33:00,290 --> 00:33:04,000 Więc to jest interesujące. getInt zwraca nasza funkcja, getString. 763 00:33:04,000 --> 00:33:05,645 A teraz, dlaczego to może być przypadek? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Dlaczego jest defensywa tutaj w linii 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Co może się stać w kolejce 164, po prostu być jasne? 768 00:33:15,639 --> 00:33:16,930 To ta sama odpowiedź, jak wcześniej. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Może być tylko z pamięci. 771 00:33:20,089 --> 00:33:23,130 Coś jest nie tak z getString, Musimy być w stanie sobie z tym poradzić. 772 00:33:23,130 --> 00:33:27,070 I powodem nie wrócę null jest że, technicznie, null jest wskaźnik. 773 00:33:27,070 --> 00:33:29,120 getInt musi powrócić int. 774 00:33:29,120 --> 00:33:31,060 Więc mam arbitralnie zdecydował, zasadniczo, 775 00:33:31,060 --> 00:33:34,600 że 2 mld euro, lub dać, będzie za szczególną wartość, że nie mogę 776 00:33:34,600 --> 00:33:35,970 rzeczywiście się od użytkownika. 777 00:33:35,970 --> 00:33:39,930 To tylko jedna wartość idę odpadów do reprezentowania kod błędu. 778 00:33:39,930 --> 00:33:41,540 >> Więc teraz, robi się trochę kręci. 779 00:33:41,540 --> 00:33:44,670 I to nie jest to samo, funkcja jak wcześniej, ale to jest bardzo podobne. 780 00:33:44,670 --> 00:33:50,120 Więc zauważyć, oświadczam tutaj, w linii 172, zarówno int n i char c. 781 00:33:50,120 --> 00:33:53,600 A potem użyć tego modny linię, sscanf, który okazuje się 782 00:33:53,600 --> 00:33:55,990 nie skanuje ciąg znaków z klawiatury. 783 00:33:55,990 --> 00:33:59,226 To oznacza, że ​​istniejący ciąg użytkownik został już wpisany. 784 00:33:59,226 --> 00:34:02,100 Więc ja już, co nazywa getString Oznacza mam ciąg w pamięci. 785 00:34:02,100 --> 00:34:05,020 sscanf jest to, czego bym wywołać funkcję analizowania. 786 00:34:05,020 --> 00:34:07,760 To wygląda na ciąg Mam wpisany, znak po znaku, 787 00:34:07,760 --> 00:34:09,250 i robi coś pożytecznego. 788 00:34:09,250 --> 00:34:10,969 Ten ciąg jest przechowywany w jednej linii. 789 00:34:10,969 --> 00:34:13,560 I wiem, że tylko przechodząc kopię zapasową tutaj i mówiąc, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Nazwałem go nie s to czas, ale linia. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> A teraz to jest trochę inaczej. 793 00:34:18,080 --> 00:34:22,480 Praktycznie oznacza to jednak, ze względów my trochę pomachać na dziś nasze ręce, 794 00:34:22,480 --> 00:34:26,070 które sprawdzają się sprawdzić, czy użytkownik wpisał w 795 00:34:26,070 --> 00:34:29,909 i int a może inny charakter. 796 00:34:29,909 --> 00:34:33,610 Jeśli użytkownik wpisze w int, to zamierza się przechowywać w N, ponieważ ja 797 00:34:33,610 --> 00:34:36,739 przechodzącej przez ten adres, nowa sztuczka widzieliśmy dzisiaj. 798 00:34:36,739 --> 00:34:41,570 Jeśli użytkownik wpisze także w jak 123x, że x 799 00:34:41,570 --> 00:34:45,060 zamierza skończyć List w postaci c. 800 00:34:45,060 --> 00:34:48,739 >> Teraz okazuje się, że sscanf powie mi, inteligentny, 801 00:34:48,739 --> 00:34:54,750 jak wielu zmiennych została sscanf powodzeniem w stanie wypełnić. 802 00:34:54,750 --> 00:34:58,770 Tak by tej logiki, jeśli funkcja Jestem wykonawczych jest getInt, 803 00:34:58,770 --> 00:35:00,900 ale mam kontroli, potencjalnie w użytkownik 804 00:35:00,900 --> 00:35:04,190 na wpisaniu w int następnie przez coś innego, 805 00:35:04,190 --> 00:35:08,580 co chcę w sscanf Wartość zwracana naprawdę być? 806 00:35:08,580 --> 00:35:10,950 Jeśli celem jest uzyskanie tylko int od użytkownika? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Więc jeśli sscanf zwrotów 2, co to oznacza? 809 00:35:19,300 --> 00:35:21,660 Użytkownik wpisze w coś, dosłownie, 810 00:35:21,660 --> 00:35:24,770 123x, która jest po prostu nonsensem. 811 00:35:24,770 --> 00:35:27,490 Jest to stan błędu, a Chcę sprawdzić, że. 812 00:35:27,490 --> 00:35:32,960 >> Więc jeśli użytkownik wpisze w to, by to logiczne, co robi sscanf powrócić, 813 00:35:32,960 --> 00:35:33,740 można by powiedzieć? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Tak to się zwróci 2, ponieważ 123 ma zamiar udać się tutaj, 816 00:35:39,130 --> 00:35:41,580 i x zamierza skończyć tutaj. 817 00:35:41,580 --> 00:35:43,970 Ale ja nie chcę x aby wypełnione. 818 00:35:43,970 --> 00:35:48,580 Chcę sscanf tylko uda się napełniania pierwszej kolejności jego zmienne. 819 00:35:48,580 --> 00:35:52,490 I tak to jest, dlaczego chcesz sscanf powrotu 1. 820 00:35:52,490 --> 00:35:55,750 >> I, jeśli jest to nieco nad głową w tej chwili, to jest całkowicie w porządku. 821 00:35:55,750 --> 00:36:00,030 Sobie sprawę jednak, że jednym z Wartości getInt i getString 822 00:36:00,030 --> 00:36:03,630 jest to, że robimy kawał Wiele błędów sprawdzania tak więc 823 00:36:03,630 --> 00:36:07,130 że do tej pory, można dość dużo wpisz cokolwiek w klawiaturze 824 00:36:07,130 --> 00:36:08,490 a my go złapać. 825 00:36:08,490 --> 00:36:10,592 A my na pewno, personel, na pewno nie będzie 826 00:36:10,592 --> 00:36:13,300 być źródłem błędu w swoim Program, ponieważ jesteśmy w defensywie 827 00:36:13,300 --> 00:36:16,270 sprawdzanie wszystkich głupi rzeczy, które użytkownik może zrobić, 828 00:36:16,270 --> 00:36:18,900 jak wpisując ciąg, kiedy naprawdę chciał int. 829 00:36:18,900 --> 00:36:21,350 Więc dla teraz-- przyjdziemy Przed powrotem do tego long-- 830 00:36:21,350 --> 00:36:23,710 ale przez cały ten czas, ma getString i getInt 831 00:36:23,710 --> 00:36:29,950 było pod maską za pomocą tego Podstawową ideą adresów pamięci. 832 00:36:29,950 --> 00:36:32,580 >> Więc teraz, zróbmy wszystko trochę bardziej przyjazny dla użytkownika. 833 00:36:32,580 --> 00:36:38,740 Jak być może pamiętacie, z Binky ostatniego time-- jeśli mysz będzie cooperate-- tak 834 00:36:38,740 --> 00:36:42,560 mieliśmy ten kod, który szczerze mówiąc, to dość bezsensowne. 835 00:36:42,560 --> 00:36:45,330 Kod ten osiąga nic przydatne, ale to był przykład 836 00:36:45,330 --> 00:36:48,330 że profesor Parlante stosuje się w celu reprezentowania 837 00:36:48,330 --> 00:36:51,840 co się dzieje w Program z udziałem pamięci. 838 00:36:51,840 --> 00:36:54,850 >> Warto więc opowiedzieć to historia bardzo krótko. 839 00:36:54,850 --> 00:36:58,720 Te dwie pierwsze linie, w Angielski, czy co, można by powiedzieć? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Tylko w przystępnej człowieka, ale nieznacznie terminy techniczne, warto ukłucie. 842 00:37:05,430 --> 00:37:06,346 PUBLICZNOŚCI: [niesłyszalne]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. MALAN: OK, jesteś ustanawiającego Adresy swoim x i y. zmiennych 845 00:37:11,080 --> 00:37:15,520 Nie całkiem, bo x i y nie są zmienne w tradycyjnym sensie. 846 00:37:15,520 --> 00:37:18,054 x i y są adresami lub będzie przechowywać adres. 847 00:37:18,054 --> 00:37:19,220 Więc spróbujmy jeszcze raz. 848 00:37:19,220 --> 00:37:21,010 Nie zły początek, choć. 849 00:37:21,010 --> 00:37:21,510 Tak? 850 00:37:21,510 --> 00:37:22,426 >> PUBLICZNOŚCI: [niesłyszalne]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. MALAN: Dobra. 853 00:37:24,840 --> 00:37:26,173 Myślę, że to trochę czystsze. 854 00:37:26,173 --> 00:37:28,630 Deklarowanie dwa wskaźniki, dwie liczby całkowite. 855 00:37:28,630 --> 00:37:30,150 A my nazywając je x i y. 856 00:37:30,150 --> 00:37:32,790 Albo gdybyśmy remis Ten jako obraz znowu 857 00:37:32,790 --> 00:37:36,410 Przypomnijmy, że po prostu wszystko robimy z tej pierwszej linii 858 00:37:36,410 --> 00:37:39,690 jest rysunek okno tak, z niektórych wartości w nim śmieci, 859 00:37:39,690 --> 00:37:41,920 i nazywając ją X, a następnie kolejne okno tak, 860 00:37:41,920 --> 00:37:43,880 z niektórych wartości śmieci w niej, nazywając ją y. 861 00:37:43,880 --> 00:37:45,810 Mamy oświadczył dwa wskaźniki, które ostatecznie 862 00:37:45,810 --> 00:37:47,860 będzie przechowywać adres int. 863 00:37:47,860 --> 00:37:49,170 Więc to wszystko. 864 00:37:49,170 --> 00:37:53,290 >> Więc kiedy Binky to zrobił, gliny po prostu wyglądał jak ten. 865 00:37:53,290 --> 00:37:55,350 Nick tylko rodzaj zawinięte strzałki, 866 00:37:55,350 --> 00:37:57,590 tak, jakby nigdzie nie wskazujesz w szczególności dlatego, że są po prostu 867 00:37:57,590 --> 00:37:58,250 Wartości śmieci. 868 00:37:58,250 --> 00:38:01,670 Nie są one jawnie zainicjowana gdziekolwiek w szczególności. 869 00:38:01,670 --> 00:38:03,980 >> Teraz następny wiersz Kod, przypomnieć, było to. 870 00:38:03,980 --> 00:38:07,510 Więc w przystępnej łatwy w obsłudze, ale nieco techniczny angielski, 871 00:38:07,510 --> 00:38:09,790 co to jest linia kodu robi? 872 00:38:09,790 --> 00:38:10,391 Tak? 873 00:38:10,391 --> 00:38:11,333 >> PUBLICZNOŚCI: [niesłyszalne]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> David J. MALAN: Perfect. 876 00:38:13,950 --> 00:38:17,016 To alokacji kawał Pamięć to rozmiar wew. 877 00:38:17,016 --> 00:38:18,140 I to jest połowa odpowiedzi. 878 00:38:18,140 --> 00:38:20,056 Odpowiedziałeś sobie prawo połowy ekspresji. 879 00:38:20,056 --> 00:38:22,473 Co dzieje się na Po lewej stronie od znaku równości? 880 00:38:22,473 --> 00:38:22,972 Tak? 881 00:38:22,972 --> 00:38:24,814 PUBLICZNOŚCI: i przypisuje to zmiennej x? 882 00:38:24,814 --> 00:38:27,690 >> David J. MALAN: i przypisuje to zmiennej x. 883 00:38:27,690 --> 00:38:31,650 Przypomnę więc, prawe boczne przydziela mało pamięci do przechowywania int. 884 00:38:31,650 --> 00:38:34,150 Ale malloc specjalnie zwraca adres 885 00:38:34,150 --> 00:38:37,270 tego fragmentu pamięci, które już tylko proponowany dostaje przechowywane w x. 886 00:38:37,270 --> 00:38:42,560 >> Więc to, co ostatnio zrobił Nick z Binky jest wlókł ten wskaźnik z, glina, 887 00:38:42,560 --> 00:38:46,820 wskazać teraz w białym fragmencie pamięci który jest równy wielkości int. 888 00:38:46,820 --> 00:38:49,360 I rzeczywiście, to się rozumie do reprezentowania cztery bajty. 889 00:38:49,360 --> 00:38:55,310 >> Teraz, obok linii kodu to zrobił, gwiazda x dostaje 42. 890 00:38:55,310 --> 00:38:58,530 Tak 42 jest proste na prawa strona, sens życia. 891 00:38:58,530 --> 00:39:00,500 Lewa strona, gwiazda x oznacza co? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 To też może mieć gone-- to jest OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> PUBLICZNOŚCI: Zasadniczo, przejdź do [niesłyszalne] 896 00:39:06,875 --> 00:39:07,750 David J. MALAN: Dobra. 897 00:39:07,750 --> 00:39:08,760 PUBLICZNOŚCI: [niesłyszalne]. 898 00:39:08,760 --> 00:39:09,760 David J. MALAN: Dokładnie. 899 00:39:09,760 --> 00:39:11,979 Lewa strona oznacza iść do x. 900 00:39:11,979 --> 00:39:12,520 x to adres. 901 00:39:12,520 --> 00:39:15,520 To jak 33 Oxford Street, lub OX1. 902 00:39:15,520 --> 00:39:18,690 I gwiazda x oznacza, że ​​iść do adres i umieścić to, co tam jest? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Tak naprawdę, to właśnie Nick zrobił. 905 00:39:21,290 --> 00:39:23,740 Zaczął By, zasadniczo, psychicznie 906 00:39:23,740 --> 00:39:26,270 wskazując palcem x, zgodnie ze strzałką 907 00:39:26,270 --> 00:39:30,670 na białym polu po prawej z boku, a wprowadzenie numeru 42 nie. 908 00:39:30,670 --> 00:39:34,120 Ale potem zrobiło trochę niebezpieczne, prawda? 909 00:39:34,120 --> 00:39:35,860 Binky na temat stracić głowę. 910 00:39:35,860 --> 00:39:39,465 >> Gwiazda y jest równa 13, pech, czyli co? 911 00:39:39,465 --> 00:39:43,620 Więc gwiazdkowe y środki przejść do adresu w y. 912 00:39:43,620 --> 00:39:45,630 Ale co to jest adres y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Dobrze, że to wartość śmieci, prawda? 915 00:39:49,440 --> 00:39:50,800 Narysowałem go jako znak zapytania. 916 00:39:50,800 --> 00:39:54,850 Nick wyciągnął go jako zwinięty strzałką. 917 00:39:54,850 --> 00:39:59,600 I tak szybko, jak spróbować Czy Star y, mówiąc, tam, 918 00:39:59,600 --> 00:40:03,872 ale nie jest uzasadniony adres, to niektóre fałszywe położenie, 919 00:40:03,872 --> 00:40:05,080 Program będzie katastrofy. 920 00:40:05,080 --> 00:40:08,580 I szef Binky jest zamiar odlecieć tutaj, jak to zrobił. 921 00:40:08,580 --> 00:40:12,130 >> Więc w końcu tego programu było po prostu płaskim się wada. 922 00:40:12,130 --> 00:40:13,540 Był to program buggy. 923 00:40:13,540 --> 00:40:14,760 I to musiała być ustalona. 924 00:40:14,760 --> 00:40:18,260 A jedynym sposobem, naprawdę, to naprawić Chodzi tu na przykład linia, 925 00:40:18,260 --> 00:40:21,010 które nawet nie dostać się do, ponieważ Program rozbił się zbyt szybko. 926 00:40:21,010 --> 00:40:26,170 Ale gdybyśmy to naprawić, co Efekt nie robi r równe x mają? 927 00:40:26,170 --> 00:40:30,010 Cóż, w zasadzie wskazuje y niezależnie od wartości x wskazuje na. 928 00:40:30,010 --> 00:40:32,430 >> Więc w historii Nicka, lub historia Binky, zarówno 929 00:40:32,430 --> 00:40:34,640 x i y były wskazując na biały fragment pamięci, 930 00:40:34,640 --> 00:40:38,300 tak, że w końcu, kiedy Czy Star y wynosi 13 raz 931 00:40:38,300 --> 00:40:43,080 skończyć się wprowadzenie 13 odpowiednia lokalizacja. 932 00:40:43,080 --> 00:40:47,640 Tak więc wszystkie te linie są całkowicie uzasadnione, z wyjątkiem tego jednego, 933 00:40:47,640 --> 00:40:51,730 kiedy to się stało przed tobą faktycznie przypisane pręd jakąś wartość. 934 00:40:51,730 --> 00:40:54,290 >> Teraz na szczęście, nie musisz ma się rozumieć, przez wszystkie 935 00:40:54,290 --> 00:40:56,560 z tych rodzajów problemów na własną rękę. 936 00:40:56,560 --> 00:40:59,310 Pozwólcie mi iść do przodu i otworzyć okno terminala tutaj 937 00:40:59,310 --> 00:41:03,050 i otworzyć się na chwilę, bardzo krótki program, który 938 00:41:03,050 --> 00:41:04,360 również jest rodzajem sensu. 939 00:41:04,360 --> 00:41:05,152 Jest brzydki. 940 00:41:05,152 --> 00:41:06,610 To nie ma nic użytecznego osiągnąć. 941 00:41:06,610 --> 00:41:10,180 Ale to nie wykazywać problemy z pamięci, więc rzućmy okiem. 942 00:41:10,180 --> 00:41:11,830 >> Głównym, super proste. 943 00:41:11,830 --> 00:41:14,830 To najwyraźniej wywołuje funkcję, f, a następnie zwraca 0. 944 00:41:14,830 --> 00:41:16,310 To trochę trudne do bałaganu to. 945 00:41:16,310 --> 00:41:18,540 Tak więc główna jest bardzo dobry, jak na razie. 946 00:41:18,540 --> 00:41:20,100 >> Tak więc f jest problematyczne. 947 00:41:20,100 --> 00:41:22,120 I po prostu nie umieścić wiele nazywając go do wysiłku 948 00:41:22,120 --> 00:41:23,990 tutaj, aby zachować ostrość na kodzie. 949 00:41:23,990 --> 00:41:25,740 f ma dwie linie. 950 00:41:25,740 --> 00:41:27,610 I zobaczmy, co się teraz dzieje. 951 00:41:27,610 --> 00:41:29,840 Tak więc z jednej strony tutaj-- i pozwól mi 952 00:41:29,840 --> 00:41:32,680 Ten zgodny z poprzedniego example-- jednej strony 953 00:41:32,680 --> 00:41:35,830 lewa strona jest robi to, co w języku angielskim? 954 00:41:35,830 --> 00:41:36,493 To jest-- 955 00:41:36,493 --> 00:41:37,701 PUBLICZNOŚCI: Tworzenie wskaźnika. 956 00:41:37,701 --> 00:41:40,830 David J. MALAN: Tworzenie wskaźnik do int i nazywając to x. 957 00:41:40,830 --> 00:41:43,789 Więc jest stworzenie jednego z tych pól Wciąż rysowanie na ekranie dotykowym. 958 00:41:43,789 --> 00:41:45,913 A teraz, na prawej bocznym się przydzielić Oczywiście 959 00:41:45,913 --> 00:41:47,420 przeznacza kawałek pamięci. 960 00:41:47,420 --> 00:41:49,989 I po prostu być jasne, w jaki sposób ilość pamięci jest najwyraźniej 961 00:41:49,989 --> 00:41:52,030 alokacji, jeśli tylko niby do matematyki tutaj? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Więc jest to 40 bajtów. 964 00:41:54,040 --> 00:41:57,400 I wiem, że tylko dlatego, że wiem, int, na urządzeniu CS50 Przynajmniej 965 00:41:57,400 --> 00:41:58,060 to cztery bajty. 966 00:41:58,060 --> 00:41:59,610 Tak 10 razy 4 to 40. 967 00:41:59,610 --> 00:42:04,924 Więc to jest przechowywanie x, adres pierwszego z 40 wskazówki, które 968 00:42:04,924 --> 00:42:07,340 zostały przydzielone miejsce z powrotem, do tyłu, do tyłu, do tyłu. 969 00:42:07,340 --> 00:42:08,470 >> I to właśnie jest klucz o malloc. 970 00:42:08,470 --> 00:42:11,261 Nie ma mało pamięci tu, trochę tu, trochę tu. 971 00:42:11,261 --> 00:42:14,220 To daje jeden fragment pamięci, w sposób ciągły, z działalności operacyjnej 972 00:42:14,220 --> 00:42:15,240 System. 973 00:42:15,240 --> 00:42:18,500 >> Teraz to, co na ten temat, x Uchwyt 10 jest równa 0? 974 00:42:18,500 --> 00:42:19,470 Dowolna linia kodu. 975 00:42:19,470 --> 00:42:21,100 To nie ma nic użytecznego osiągnąć. 976 00:42:21,100 --> 00:42:26,128 Ale ciekawe jest to, ponieważ x wspornika 10--? 977 00:42:26,128 --> 00:42:26,628 Tak? 978 00:42:26,628 --> 00:42:27,912 >> PUBLICZNOŚCI: [niesłyszalne]? 979 00:42:27,912 --> 00:42:30,500 >> David J. MALAN: x wspornik 10 nie musi być wartością pustą. 980 00:42:30,500 --> 00:42:35,070 Null szczegóły w grę wchodzi tylko z tekstem, na końcu łańcucha. 981 00:42:35,070 --> 00:42:36,700 Ale dobra myśl. 982 00:42:36,700 --> 00:42:39,615 >> Jak duża jest ta tablica, nawet choć mam przydzielone 40 bajtów? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 To od 0 do dziewiątej, tak? 985 00:42:43,690 --> 00:42:45,120 To 10 ints, całkowita. 986 00:42:45,120 --> 00:42:48,790 40 bajtów, ale 10 ints, indeksowane od 0 do 0. 987 00:42:48,790 --> 00:42:50,930 >> Więc co to jest x wspornik 10? 988 00:42:50,930 --> 00:42:53,090 To rzeczywiście niektóre wartość nieznana śmieci. 989 00:42:53,090 --> 00:42:54,780 Jest to pamięć, która nie należy do mnie. 990 00:42:54,780 --> 00:42:59,650 Nie należy dotykać, że Liczba bajtów 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Idę trochę za daleko. 992 00:43:01,420 --> 00:43:04,490 >> I rzeczywiście, jeśli uruchomię to Program, to może bardzo dobrze upaść. 993 00:43:04,490 --> 00:43:05,790 Ale czasem, będziemy mieli szczęście. 994 00:43:05,790 --> 00:43:07,706 I tak po prostu, aby wykazać To-- i szczerze mówiąc, 995 00:43:07,706 --> 00:43:11,000 nigdy nie wiesz, przed tobą nie to-- uciekajmy to. 996 00:43:11,000 --> 00:43:12,480 To faktycznie nie upaść. 997 00:43:12,480 --> 00:43:15,032 >> Ale jeśli mogę to zmienić, dla Przykładowo, aby być jak 1000, 998 00:43:15,032 --> 00:43:16,740 aby to naprawdę celowe, zobaczmy 999 00:43:16,740 --> 00:43:18,710 jeśli uda nam się go rozbić ten czas. 1000 00:43:18,710 --> 00:43:20,070 OK, to nie błąd. 1001 00:43:20,070 --> 00:43:22,600 Jak o 100.000? 1002 00:43:22,600 --> 00:43:25,000 Miejmy przerobić go, a teraz ponownie uruchomić go. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Uff. 1005 00:43:25,960 --> 00:43:26,460 Wszystko w porządku. 1006 00:43:26,460 --> 00:43:29,090 Tak więc widać, znowu, są segmenty pamięci, że tak powiem, 1007 00:43:29,090 --> 00:43:32,660 są dość duże, więc możemy miał szczęście ponownie. 1008 00:43:32,660 --> 00:43:36,510 Ale w końcu, kiedy już się śmieszne i bardzo daleko się na ekranie, 1009 00:43:36,510 --> 00:43:39,120 Dotknięcie pamięci, które naprawdę, naprawdę nie należy do ciebie. 1010 00:43:39,120 --> 00:43:40,870 >> Ale szczerze mówiąc, to rodzaje błędów będą 1011 00:43:40,870 --> 00:43:43,020 być trudniej dowiedzieć się na własną rękę. 1012 00:43:43,020 --> 00:43:47,880 Ale na szczęście, jak programiści, mamy narzędzia, które pozwalają nam zrobić to za nas. 1013 00:43:47,880 --> 00:43:50,140 Tak to jest, być może, jeden z poważniejszymi programami, 1014 00:43:50,140 --> 00:43:52,060 jeszcze brzydszy niż wyjście GDB za. 1015 00:43:52,060 --> 00:43:55,670 Ale to zawsze jest linia lub dwa, które są bardzo przydatne. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind to program, który pomaga nie debugować program, per se, 1017 00:44:00,310 --> 00:44:03,500 ale znaleźć związane pamięci problemy, w szczególności. 1018 00:44:03,500 --> 00:44:07,590 Zostanie ona automatycznie uruchomić kod ty i wygląda na co najmniej dwie rzeczy. 1019 00:44:07,590 --> 00:44:10,680 Jeden, coś zrobiłeś przypadkowe jak pamięci dotykowym 1020 00:44:10,680 --> 00:44:11,980 które nie należą do ciebie? 1021 00:44:11,980 --> 00:44:13,590 To pomoże Ci znaleźć te przypadki. 1022 00:44:13,590 --> 00:44:15,710 >> A dwa, że ​​to pomoże można znaleźć coś, co nazywa 1023 00:44:15,710 --> 00:44:19,270 wycieki pamięci, które mamy całkowicie ignorowane, naiwnie, 1024 00:44:19,270 --> 00:44:21,380 przez jakiś czas i błogo. 1025 00:44:21,380 --> 00:44:23,140 Ale okazuje się, wszystko Tym razem, ilekroć 1026 00:44:23,140 --> 00:44:26,620 już w nazwie getString tak wielu z naszych programów, 1027 00:44:26,620 --> 00:44:28,930 pytasz o eksploatacji system pamięci, 1028 00:44:28,930 --> 00:44:32,070 ale masz jakieś wspomnienia od zawsze daje to 1029 00:44:32,070 --> 00:44:36,169 powrotem, robiąc UNALLOC, lub za darmo, jak to się nazywa. 1030 00:44:36,169 --> 00:44:37,960 Nie, ponieważ nigdy nie poprosił Cię, aby to zrobić. 1031 00:44:37,960 --> 00:44:41,250 >> Ale przez cały ten czas, programy Pisałeś w C 1032 00:44:41,250 --> 00:44:43,800 zostały wyciek pamięci, zwracając się do eksploatacji 1033 00:44:43,800 --> 00:44:46,190 System coraz Pamięć na smyczki i etażerka, 1034 00:44:46,190 --> 00:44:47,870 ale nigdy nie podając go. 1035 00:44:47,870 --> 00:44:50,080 A teraz jest to nieco z uproszczeń, 1036 00:44:50,080 --> 00:44:53,550 ale jeśli kiedykolwiek uruchomić komputera Mac lub komputer od jakiegoś czasu, otwarcia 1037 00:44:53,550 --> 00:44:55,790 wiele programów, może i zamykania programów, 1038 00:44:55,790 --> 00:44:57,795 i mimo, że Twój Komputer nie rozbił, 1039 00:44:57,795 --> 00:45:01,690 robi się tak wiele wolniej, tak, jakby to naprawdę 1040 00:45:01,690 --> 00:45:04,290 przy użyciu dużo pamięci lub Środki, chociaż 1041 00:45:04,290 --> 00:45:06,070 jeśli nie jesteś jeszcze dotykając klawiatury, 1042 00:45:06,070 --> 00:45:10,430 które mogą być: ale nie always-- mógł się, że programy używasz 1043 00:45:10,430 --> 00:45:11,920 mają sobie wycieków pamięci. 1044 00:45:11,920 --> 00:45:15,645 I prosić o więcej i OS więcej pamięci, ale zapominając o tym, 1045 00:45:15,645 --> 00:45:18,470 właściwie nie używając go, ale Dlatego biorąc pamięć dala 1046 00:45:18,470 --> 00:45:20,500 z innych programów, które mogą go chcą. 1047 00:45:20,500 --> 00:45:23,940 Więc to jest wspólne wyjaśnienie. 1048 00:45:23,940 --> 00:45:25,940 Teraz tutaj jest gdzie Valgrind jest Wyjście jest całkowicie 1049 00:45:25,940 --> 00:45:29,290 okropna do tych mniej i bardziej komfortowe podobnie. 1050 00:45:29,290 --> 00:45:32,690 Ale ciekawe rzeczy jest aż tutaj. 1051 00:45:32,690 --> 00:45:37,060 Jest on mówi mi pisać z nieprawidłową rozmiar cztery dzieje się w tym programie, 1052 00:45:37,060 --> 00:45:40,640 w szczególności, linia 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Jeśli pójdę do linii 21, hm, to rzeczywiście jest nieważny zapis wielkości czterech. 1054 00:45:45,450 --> 00:45:46,250 Dlaczego rozmiar cztery? 1055 00:45:46,250 --> 00:45:49,500 Cóż, to number-- i może być anything-- jest int. 1056 00:45:49,500 --> 00:45:50,450 Więc to cztery bajty. 1057 00:45:50,450 --> 00:45:52,550 Więc zamieszczam cztery bajty gdzie oni nie należą. 1058 00:45:52,550 --> 00:45:55,080 To Valgrind rzeczywiście mówi mi. 1059 00:45:55,080 --> 00:45:57,600 Ponadto będzie również powiedz mi, jak zobaczymy, 1060 00:45:57,600 --> 00:46:01,490 jak uruchomić to w przyszłym Pset, czy i kiedy już wyciekły pamięć, która rzeczywiście 1061 00:46:01,490 --> 00:46:05,300 Mam, bo już o nazwie malloc, ale w rzeczywistości nie ma 1062 00:46:05,300 --> 00:46:08,010 nazwie, w tym przypadku, za darmo, które będziemy w końcu zobaczyć 1063 00:46:08,010 --> 00:46:09,830 jest przeciwieństwem malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Więc teraz, myślę, że ostateczny przykład. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Więc ten jest nieco bardziej Arcane, ale to być może 1068 00:46:16,690 --> 00:46:19,180 Największym powodem do uważaj z pamięci, 1069 00:46:19,180 --> 00:46:24,490 i dlatego, że wiele programów i / lub serwery internetowe, nawet do dnia dzisiejszego, 1070 00:46:24,490 --> 00:46:28,200 zostały przejęte przez złych facetów gdzieś w Internecie, które są w jakiś 1071 00:46:28,200 --> 00:46:33,390 wysyłanie fałszywych pakietów do serwera próby kompromisu kont, 1072 00:46:33,390 --> 00:46:36,420 lub zabrać swoje dane, lub po prostu ogólnie przejąć maszyna. 1073 00:46:36,420 --> 00:46:38,910 Przepełnienie bufora, jak nazwa wskazuje, środki 1074 00:46:38,910 --> 00:46:40,740 przepełnione nie int, ale bufor. 1075 00:46:40,740 --> 00:46:43,490 I bufor jest tylko fantazyjny sposób powiedzieć, że to banda pamięci. 1076 00:46:43,490 --> 00:46:46,710 >> I rzeczywiście, zadzwoniłem ciąg przed buforem, zamiast s. 1077 00:46:46,710 --> 00:46:49,234 Bo jeśli to jest bufor, W tym sensie, jak YouTube, 1078 00:46:49,234 --> 00:46:52,400 lub za każdym razem, czy oglądasz film, Może widzieliście buforowanie słowo, 1079 00:46:52,400 --> 00:46:53,040 kropka, kropka, kropka. 1080 00:46:53,040 --> 00:46:54,240 Jest to niezwykle irytujące. 1081 00:46:54,240 --> 00:46:55,990 I to właśnie oznacza że odtwarzacz wideo 1082 00:46:55,990 --> 00:46:58,710 próbuje pobrać wiele bajtów, wiele bajtów 1083 00:46:58,710 --> 00:47:00,170 z filmów z Internetu. 1084 00:47:00,170 --> 00:47:02,920 Ale to powoli, tak że próbuje pobrać kilka z nich 1085 00:47:02,920 --> 00:47:06,430 do wypełnienia bufora, pojemnik, tak, że masz wystarczająco dużo bajtów, że może to 1086 00:47:06,430 --> 00:47:09,174 pokazać film, bez wstrzymywania stale. 1087 00:47:09,174 --> 00:47:11,340 Ale okazuje się, możesz posiada bufor na ten wielki. 1088 00:47:11,340 --> 00:47:15,710 Ale staram się umieścić to dużo danych w to, i bardzo złe rzeczy mogą się zdarzyć. 1089 00:47:15,710 --> 00:47:22,780 Tak na przykład, spójrzmy na ten ostatni teaser przykład. 1090 00:47:22,780 --> 00:47:24,720 Jest to inny program które na pierwszy rzut oka, 1091 00:47:24,720 --> 00:47:26,540 ma coś bardzo przydatne nie. 1092 00:47:26,540 --> 00:47:29,590 Jest tam główną funkcją , który wywołuje tę funkcję, f. 1093 00:47:29,590 --> 00:47:36,640 I że funkcja f, tutaj, ma Tablica char, zwany c, o wielkości 12. 1094 00:47:36,640 --> 00:47:39,340 A potem jest za pomocą tego Nowa funkcja o nazwie strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Okazuje się, że w ten prosty, prosta linia kodu, tylko dwie linie, 1097 00:47:45,190 --> 00:47:49,130 zrobiliśmy mój cały program, iw związku z tym, cały mój komputer, 1098 00:47:49,130 --> 00:47:54,000 i moje konto użytkownika, a mój dysk prowadzić potencjalnie narażone na nikogo 1099 00:47:54,000 --> 00:47:58,170 kto wie i jest wystarczająco dobry, aby uruchomić ten program z pewnym wierszu poleceń 1100 00:47:58,170 --> 00:47:58,900 Argument. 1101 00:47:58,900 --> 00:48:03,400 Innymi słowy, jeżeli zły stawia wewnątrz argvargv [1], wpisując 1102 00:48:03,400 --> 00:48:08,750 na klawiaturze bardzo specjalnie spreparowany ciąg, nie abc, 123, ale w istocie, 1103 00:48:08,750 --> 00:48:15,180 Symbole binarne reprezentujące wykonywalny Kod, program, który on napisał, 1104 00:48:15,180 --> 00:48:19,190 z tego prostego programu, który jest Przedstawiciel tysięcy programów 1105 00:48:19,190 --> 00:48:23,610 które są podobnie narażone, śmiem twierdzić, on lub ona może ostatecznie usunąć wszystkie 1106 00:48:23,610 --> 00:48:26,680 pliki na dysku twardym, uzyskać miga wiersz tak, że on lub ona może 1107 00:48:26,680 --> 00:48:30,170 wpisz komendy na własną rękę, napisz wszystkie pliki do siebie. 1108 00:48:30,170 --> 00:48:34,660 Wszystko, co mogę zrobić, to lub ona może zrobić z tym kodem. 1109 00:48:34,660 --> 00:48:36,575 >> Nie będzie to jednak zupełnie rozwiązać. 1110 00:48:36,575 --> 00:48:38,700 A w rzeczywistości, to będzie obejmować trochę obraz 1111 00:48:38,700 --> 00:48:41,470 jak ten, który będziemy wkrótce zrozumieć, tym lepiej. 1112 00:48:41,470 --> 00:48:44,480 Ale na dzisiaj, niech zakończy się w co, miejmy nadzieję, nieco bardziej 1113 00:48:44,480 --> 00:48:48,360 zrozumiałe XKCD żart, aż wznowić następnym razem. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Wszystko w porządku. 1116 00:48:51,600 --> 00:48:53,446 Do zobaczenia w środę. 1117 00:48:53,446 --> 00:48:54,754 >> [MUZYKA GRA] 1118 00:48:54,754 --> 00:48:57,790 >> Głośnik: A teraz, głęboko myśli, by Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Pamięć jest jak skoki w stos złote liście na niedzielne popołudnie. 1121 00:49:04,770 --> 00:49:09,000 Wiatr wieje, rzucając swoje hair-- oh, tęsknię dni when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Śmiech] 1124 00:49:12,650 --> 00:49:13,750