1 00:00:00,000 --> 00:00:03,381 >> [MUZYKI] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [ODTWARZANIE] 4 00:00:11,610 --> 00:00:13,640 >> -On kłamie. 5 00:00:13,640 --> 00:00:14,380 >> -O czym? 6 00:00:14,380 --> 00:00:17,182 >> -Nie Wiem. 7 00:00:17,182 --> 00:00:19,990 >> -Więc Co wiemy? 8 00:00:19,990 --> 00:00:23,145 >> -To Na 9:15, Ray Santoya był na ATM. 9 00:00:23,145 --> 00:00:23,644 -Tak. 10 00:00:23,644 --> 00:00:27,030 Więc pytanie jest, co on robił na 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Wykonywanie Na 9 milimetr na coś. 12 00:00:29,720 --> 00:00:31,540 Może widział snajpera. 13 00:00:31,540 --> 00:00:33,412 >> -lub Pracował z nim. 14 00:00:33,412 --> 00:00:34,340 >> -wait. 15 00:00:34,340 --> 00:00:36,200 Wróć jednym. 16 00:00:36,200 --> 00:00:36,975 >> -Co widzisz? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Jego twarz się pełnym ekranie. 19 00:00:47,805 --> 00:00:48,680 >> Okulary -Jego. 20 00:00:48,680 --> 00:00:50,060 >> -Jest Odbiciem. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -To Drużyna baseballowa Nuevitas. 23 00:01:02,280 --> 00:01:03,110 To ich logo. 24 00:01:03,110 --> 00:01:05,820 >> -A On mówi do kto ma na sobie tą kurtkę. 25 00:01:05,820 --> 00:01:06,670 >> [Zakończyć odtwarzanie] 26 00:01:06,670 --> 00:01:07,628 >> DAVID MALAN: Wszystko w porządku. 27 00:01:07,628 --> 00:01:11,210 Jest CS50, co jest nieco więcej z [niesłyszalne], z którym jesteś 28 00:01:11,210 --> 00:01:12,890 dabbling z problemem ustawić cztery. 29 00:01:12,890 --> 00:01:16,606 Dziś zaczynają wyglądać trochę bardziej głęboko na te rzeczy zwane wskaźniki, 30 00:01:16,606 --> 00:01:18,480 które mimo że dość ezoteryczne temat, 31 00:01:18,480 --> 00:01:20,813 okazuje się, że to będzie się środki, za pomocą których 32 00:01:20,813 --> 00:01:24,320 może rozpocząć budowę i montaż o wiele bardziej zaawansowane programy. 33 00:01:24,320 --> 00:01:28,150 Ale zrobiliśmy to na ostatnią środę w drodze pewnego claymation pierwszy. 34 00:01:28,150 --> 00:01:30,190 Więc to, przypomnijmy, jest Binky a my go używane 35 00:01:30,190 --> 00:01:33,148 aby spojrzeć na program, który tak naprawdę nie zrobić coś ciekawego, 36 00:01:33,148 --> 00:01:34,950 ale to nie ujawnić kilka problemów. 37 00:01:34,950 --> 00:01:38,570 Tak, aby rozpocząć dzisiaj, dlaczego nie idziemy szybko przez niektóre z tych etapów, 38 00:01:38,570 --> 00:01:41,920 starają się destylować pod względem człowieka dokładnie to, co się tu dzieje 39 00:01:41,920 --> 00:01:45,410 i dlaczego to jest złe, a następnie przejść i zacząć coś budowy 40 00:01:45,410 --> 00:01:46,309 z tej techniki? 41 00:01:46,309 --> 00:01:48,350 Więc to były pierwsze dwie linie w tym programie 42 00:01:48,350 --> 00:01:51,340 i laika, co są te dwie linie robi? 43 00:01:51,340 --> 00:01:55,600 Ktoś, kto rozsądnie wygodne z tym, co ogłosił na ekranie? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Co to są te dwie linie robi? 46 00:02:00,120 --> 00:02:02,070 To nie wszystko, różni się od jednego tygodnia 47 00:02:02,070 --> 00:02:03,611 ale jest jakiś nowy specjalny symbol. 48 00:02:03,611 --> 00:02:04,152 Tak? 49 00:02:04,152 --> 00:02:05,628 Powrót istnieje. 50 00:02:05,628 --> 00:02:07,092 >> PUBLICZNOŚCI: Deklarowanie wskaźników? 51 00:02:07,092 --> 00:02:08,050 DAVID MALAN: Powiedz jeszcze raz? 52 00:02:08,050 --> 00:02:08,860 PUBLICZNOŚCI: Deklarowanie wskaźników? 53 00:02:08,860 --> 00:02:11,776 DAVID MALAN: Deklarowanie wskaźniki i niech udoskonalić go trochę więcej. 54 00:02:11,776 --> 00:02:14,050 PUBLICZNOŚCI: [niesłyszalne] Adres x i y. 55 00:02:14,050 --> 00:02:15,300 DAVID MALAN: A potem zająć. 56 00:02:15,300 --> 00:02:18,550 Tak konkretnie to, co robimy jest nam deklarując dwie zmienne. 57 00:02:18,550 --> 00:02:21,252 Zmienne te jednak będą być typu int gwiazdy, które 58 00:02:21,252 --> 00:02:23,210 Dokładniej oznacza idą do przechowywania 59 00:02:23,210 --> 00:02:26,450 adres int, odpowiednio X i Y. 60 00:02:26,450 --> 00:02:27,660 Teraz są jakieś wartości? 61 00:02:27,660 --> 00:02:32,621 Czy są jakieś rzeczywiste adresy w nich dwie zmienne w tym momencie? 62 00:02:32,621 --> 00:02:33,120 Nie. 63 00:02:33,120 --> 00:02:35,030 To tylko tak zwane wartości śmieci. 64 00:02:35,030 --> 00:02:38,120 Jeśli nie właściwie przypisać zmienna, co było w pamięci RAM 65 00:02:38,120 --> 00:02:42,224 wcześniej zamierza wypełnić zerami i te, oba z tych zmiennych. 66 00:02:42,224 --> 00:02:44,140 Ale jeszcze nie wiem czym one są i to jest 67 00:02:44,140 --> 00:02:47,060 będzie kluczem do dlaczego Binky stracił głowę w zeszłym tygodniu. 68 00:02:47,060 --> 00:02:49,980 >> Więc to był claymation wcielenie tego 69 00:02:49,980 --> 00:02:53,580 w którym masz tylko dwie zmienne, małe okrągłe kawałki gliny, 70 00:02:53,580 --> 00:02:57,330 która może przechowywać zmienne, ale owinięte się strzałki wskazują, 71 00:02:57,330 --> 00:03:00,640 nie są one w rzeczywistości, wskazując do dowolnego miejsca znane. 72 00:03:00,640 --> 00:03:03,670 Tak więc mieliśmy ten wiersz, a to był nowy w zeszłym tygodniu, malloc dla pamięci 73 00:03:03,670 --> 00:03:07,130 alokacji, która jest tylko fantazyjny sposób informując system operacyjny, Linux 74 00:03:07,130 --> 00:03:09,750 lub Mac OS lub Windows, hej, daj mi trochę pamięci, 75 00:03:09,750 --> 00:03:11,780 i wszystko, co masz powiedzieć System operacyjny 76 00:03:11,780 --> 00:03:14,699 jest to, co prosząc go do pamięci. 77 00:03:14,699 --> 00:03:16,990 To nie będzie obchodziło, co masz zamiar z tym zrobić, 78 00:03:16,990 --> 00:03:19,786 ale trzeba powiedzieć eksploatacji System, co w drodze malloc. 79 00:03:19,786 --> 00:03:20,286 Tak? 80 00:03:20,286 --> 00:03:21,078 >> PUBLICZNOŚCI: Jak dużo? 81 00:03:21,078 --> 00:03:21,994 DAVID MALAN: Jak dużo? 82 00:03:21,994 --> 00:03:25,280 Jak wiele bajtów, a więc ta znowu zmyślony przykład, jest po prostu mówiąc, 83 00:03:25,280 --> 00:03:27,360 daj mi rozmiar wew. 84 00:03:27,360 --> 00:03:30,550 Teraz, rozmiar int jest cztery bajty lub 32 bity. 85 00:03:30,550 --> 00:03:32,850 Więc to jest tylko sposób mówiąc: hej, system operacyjny, 86 00:03:32,850 --> 00:03:37,290 daj mi cztery bajtów pamięci że można używać do mojej dyspozycji, 87 00:03:37,290 --> 00:03:40,560 a szczególnie co czyni malloc zwrotu w odniesieniu 88 00:03:40,560 --> 00:03:41,795 do tego kawałka czterech bajtów? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 PUBLICZNOŚCI: Adres? 91 00:03:44,860 --> 00:03:45,901 DAVID MALAN: Adres. 92 00:03:45,901 --> 00:03:47,580 Adres tego kawałka czterech bajtów. 93 00:03:47,580 --> 00:03:48,190 Dokładnie. 94 00:03:48,190 --> 00:03:51,430 A więc to, co jest zapisane w końcu w x i dlatego tak naprawdę nie 95 00:03:51,430 --> 00:03:55,240 obchodzi, co liczba, że Adres jest, czy to OX1 lub OX2 96 00:03:55,240 --> 00:03:57,110 lub jakiś tajemniczy adres szesnastkowym. 97 00:03:57,110 --> 00:03:59,850 Właśnie obchodzi obrazowo że zmienna x jest teraz 98 00:03:59,850 --> 00:04:01,630 wskazując na tym fragmencie pamięci. 99 00:04:01,630 --> 00:04:05,570 Więc strzałka reprezentuje wskaźnik, lub W szczególności, adres pamięci. 100 00:04:05,570 --> 00:04:09,120 Ale znowu, nie typowo obchodzi co te rzeczywiste adresy są. 101 00:04:09,120 --> 00:04:11,780 Teraz, ta linia mówi co w laika? 102 00:04:11,780 --> 00:04:14,330 Gwiazda x dostaje 42 średnik. 103 00:04:14,330 --> 00:04:17,390 Co to znaczy? 104 00:04:17,390 --> 00:04:18,200 Chcesz iść? 105 00:04:18,200 --> 00:04:20,102 Nie rysuj szyi. 106 00:04:20,102 --> 00:04:22,360 >> PUBLICZNOŚCI: Adres x jest na 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID MALAN: Adres x jest na 42. 108 00:04:24,300 --> 00:04:25,190 Nie bardzo. 109 00:04:25,190 --> 00:04:28,485 Tak blisko, ale nie do końca, bo nie ma gwiazda, która jest poprzedzenie tego x. 110 00:04:28,485 --> 00:04:29,860 Więc musimy podkręcić trochę. 111 00:04:29,860 --> 00:04:31,032 Tak? 112 00:04:31,032 --> 00:04:36,044 >> PUBLICZNOŚCI: Wartość, że wskaźnik x wskazuje na to 42. 113 00:04:36,044 --> 00:04:36,710 DAVID MALAN: OK. 114 00:04:36,710 --> 00:04:40,840 Wartość, że wskaźnik x jest wskazując na, powiedzmy, jest 42, 115 00:04:40,840 --> 00:04:44,165 lub innymi słowy, gwiazdy x mówi, iść do jakiegokolwiek adresu 116 00:04:44,165 --> 00:04:48,340 jest w x, czy to 1 Oxford Ulica lub 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 lub OX1 lub OX33, cokolwiek że adres numeryczny jest, 118 00:04:51,850 --> 00:04:54,380 gwiazda x jest wyłuskania x. 119 00:04:54,380 --> 00:04:57,297 Więc idź na ten adres i następnie umieścić numer 42 nie. 120 00:04:57,297 --> 00:04:59,380 Tak że byłoby równoważny sposób powiedzenia, że. 121 00:04:59,380 --> 00:05:01,860 Więc to wszystko jest w porządku, a następnie chcemy reprezentować obraz 122 00:05:01,860 --> 00:05:05,370 w następujący sposób, gdzie dodaliśmy 42 do tego kawałka czterech 123 00:05:05,370 --> 00:05:09,370 bajty po stronie prawej, a ta linia była gdzie wszystko wyszło 124 00:05:09,370 --> 00:05:11,120 i szef binky w trzasnął się w tym miejscu, 125 00:05:11,120 --> 00:05:15,290 bo dzieją się złe rzeczy, kiedy Ci dereference wartości śmieci 126 00:05:15,290 --> 00:05:18,210 lub nieprawidłowego nieważny wskaźniki, i mówię nieważny 127 00:05:18,210 --> 00:05:21,020 bo w tym momencie historia, to, co jest wewnątrz y? 128 00:05:21,020 --> 00:05:24,440 Jaka jest wartość y oparte na przestrzeni ostatnich kilku krokach? 129 00:05:24,440 --> 00:05:25,360 Tak? 130 00:05:25,360 --> 00:05:26,115 Co to? 131 00:05:26,115 --> 00:05:26,990 >> PUBLICZNOŚCI: Adres. 132 00:05:26,990 --> 00:05:28,460 DAVID MALAN: Adres. 133 00:05:28,460 --> 00:05:31,910 Powinna ona być adres ale ja zainicjowany go? 134 00:05:31,910 --> 00:05:32,800 Więc nie masz jeszcze. 135 00:05:32,800 --> 00:05:35,430 Więc co na pewno jest w środku? 136 00:05:35,430 --> 00:05:37,590 To tylko niektóre wartości śmieci. 137 00:05:37,590 --> 00:05:41,500 Może to być dowolny adres od zera do 2 mld, jeśli masz dwóch gigabajtów pamięci RAM, 138 00:05:41,500 --> 00:05:44,289 lub zero do 4 miliardów, jeśli masz dostał cztery gigabajty pamięci RAM. 139 00:05:44,289 --> 00:05:46,080 To jakaś wartość śmieci, ale problem jest 140 00:05:46,080 --> 00:05:48,200 że system operacyjny jeżeli nie zostało wam dane 141 00:05:48,200 --> 00:05:51,140 że fragment pamięci specjalnie że starasz się udać, 142 00:05:51,140 --> 00:05:54,650 to na ogół będzie powodować co widzieliśmy jako błąd segmentacji. 143 00:05:54,650 --> 00:05:57,810 Tak więc w rzeczywistości każdy z was, którzy mają zmagał się problemów w godzinach pracy 144 00:05:57,810 --> 00:06:00,393 lub problemów, które więcej na ogół z próbuje dowiedzieć się, 145 00:06:00,393 --> 00:06:02,150 usterka segmentacji, które zwykle oznacza 146 00:06:02,150 --> 00:06:05,017 jesteś dotykając segment pamięci, że nie powinno być. 147 00:06:05,017 --> 00:06:07,350 Dotykasz pamięć system operacyjny nie ma 148 00:06:07,350 --> 00:06:10,450 pozwalał dotknąć, czy to idąc za daleko w swojej tablicy 149 00:06:10,450 --> 00:06:12,870 lub od zaraz, czy to dlatego, że dotyka 150 00:06:12,870 --> 00:06:14,780 Pamięć, która po prostu jest jakaś wartość śmieci. 151 00:06:14,780 --> 00:06:18,230 >> Czyniąc gwiazda x jest tu rodzaju zachowanie niezdefiniowane. 152 00:06:18,230 --> 00:06:22,030 Nigdy nie powinno się zrobić, bo kursy są, program po prostu idzie do katastrofy, 153 00:06:22,030 --> 00:06:24,050 bo mówisz, przejść pod ten adres 154 00:06:24,050 --> 00:06:27,000 i nie masz pojęcia, gdzie że adres w rzeczywistości. 155 00:06:27,000 --> 00:06:30,300 Więc system operacyjny może będzie crash programu 156 00:06:30,300 --> 00:06:33,840 w wyniku I rzeczywiście, to co się stało tam Binky. 157 00:06:33,840 --> 00:06:37,210 Więc ostatecznie, Binky stałe problem z tym. 158 00:06:37,210 --> 00:06:38,909 Więc ten program sam w sobie nie była prawidłowa. 159 00:06:38,909 --> 00:06:41,450 Ale jeśli rodzaj posunąć się naprzód i wykonać tę linię, a nie, 160 00:06:41,450 --> 00:06:45,580 y jest równa x oznacza po prostu, bez względu na Adres jest x, a także umieścić go w r. 161 00:06:45,580 --> 00:06:48,740 >> I tak obrazowo, mamy reprezentowane w tym z dwoma strzałkami 162 00:06:48,740 --> 00:06:51,570 od x oraz y, wskazując w tym samym miejscu. 163 00:06:51,570 --> 00:06:55,760 Więc semantycznie, x jest równa do y, ponieważ oba te 164 00:06:55,760 --> 00:07:00,300 są przechowywane takie same adres, ergo, wskazując na 42, 165 00:07:00,300 --> 00:07:04,910 a teraz, kiedy mówisz gwiazdę y, przejdź do adresu w y, 166 00:07:04,910 --> 00:07:06,790 to ma ciekawy efekt uboczny. 167 00:07:06,790 --> 00:07:10,320 Tak więc adres w y jest samo jak adres w x. 168 00:07:10,320 --> 00:07:15,060 Więc jeśli mówisz go na adres w y i zmień wartość na 13, 169 00:07:15,060 --> 00:07:17,140 kto jeszcze ma wpływ? 170 00:07:17,140 --> 00:07:21,100 X, punkt D, że tak powiem, powinny wpływać również. 171 00:07:21,100 --> 00:07:24,340 >> I rzeczywiście, jak Nick wyciągnął ten obraz w claymation było dokładnie to. 172 00:07:24,340 --> 00:07:28,665 Mimo, że kierujemy się wskaźnik y, znaleźliśmy się w tym samym miejscu, 173 00:07:28,665 --> 00:07:32,780 i tak, jakbyśmy byli do wydrukowania z X lub Y jest wskazywany, 174 00:07:32,780 --> 00:07:35,720 to możemy zobaczyć wartość 13. 175 00:07:35,720 --> 00:07:37,927 Teraz mówię wskazywany się spójne z obrazem. 176 00:07:37,927 --> 00:07:39,760 Programiści, do mojego wiedzy, nigdy nie 177 00:07:39,760 --> 00:07:42,460 wskazywanego powiedzieć słowo, to, co jest szpiczasty 178 00:07:42,460 --> 00:07:44,650 na, ale dla spójności z video, uświadomić sobie, 179 00:07:44,650 --> 00:07:47,520 to wszystko, co było rozumie się w tej sytuacji. 180 00:07:47,520 --> 00:07:54,190 Więc wszelkie pytania dotyczące claymation lub wskaźniki lub malloc tylko jeszcze? 181 00:07:54,190 --> 00:07:54,850 Nie? 182 00:07:54,850 --> 00:07:55,470 W porządku. 183 00:07:55,470 --> 00:07:58,560 >> Więc bez dalszego ado, rzućmy okiem 184 00:07:58,560 --> 00:08:00,700 co, gdzie to ma właściwie stosuje się od pewnego czasu. 185 00:08:00,700 --> 00:08:03,580 Więc mieliśmy tej biblioteki CS50 że ma wszystkie te funkcje. 186 00:08:03,580 --> 00:08:06,810 Użyliśmy GetInt dużo, getString, Prawdopodobnie GetLongLong wcześniej 187 00:08:06,810 --> 00:08:09,840 w moim pset jeden lub więcej, ale co się rzeczywiście dzieje? 188 00:08:09,840 --> 00:08:12,920 Cóż, rzućmy okiem pod wyciągiem w programie, który 189 00:08:12,920 --> 00:08:17,017 inspiruje Dlatego dajemy Ci CS50 biblioteka, a nawet, jak w zeszłym tygodniu, 190 00:08:17,017 --> 00:08:18,850 zaczęliśmy biorąc te kółka off. 191 00:08:18,850 --> 00:08:21,080 Więc to jest teraz posortowana z postmortem co 192 00:08:21,080 --> 00:08:23,690 trwa już wewnątrz biblioteki CS50, 193 00:08:23,690 --> 00:08:27,250 chociaż teraz będzie ruszyć z dala od niego dla większości programów. 194 00:08:27,250 --> 00:08:29,460 >> Więc to jest program o nazwie scanf 0. 195 00:08:29,460 --> 00:08:30,510 To bardzo krótki. 196 00:08:30,510 --> 00:08:33,909 To ma tylko te linie, ale wprowadza funkcję o nazwie scanf 197 00:08:33,909 --> 00:08:36,909 że jesteśmy rzeczywiście będzie zobaczyć w moment wewnątrz biblioteki CS50, 198 00:08:36,909 --> 00:08:38,600 choć w nieco innej formie. 199 00:08:38,600 --> 00:08:41,330 Więc ten program na linii 16 deklaruje zmienną x. 200 00:08:41,330 --> 00:08:43,150 Więc daj mi cztery bajty na int. 201 00:08:43,150 --> 00:08:45,750 To było mówienie użytkownikowi, Numer prosimy, a następnie 202 00:08:45,750 --> 00:08:49,010 jest to interesująca linia rzeczywiście wiąże ze sobą w zeszłym tygodniu 203 00:08:49,010 --> 00:08:49,790 i to. 204 00:08:49,790 --> 00:08:53,230 Scanf, a następnie zauważyć, że trwa string format, podobnie jak printf, 205 00:08:53,230 --> 00:08:57,480 % i oznacza, int, a potem trwa Drugi argument, który wygląda trochę 206 00:08:57,480 --> 00:08:58,260 odjazdowe. 207 00:08:58,260 --> 00:09:01,880 To znaku & x, i przypomnieć, my widzieliśmy tylko ten jeden raz w zeszłym tygodniu. 208 00:09:01,880 --> 00:09:03,465 Co ampersand x reprezentują? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Co handlowe i zrobić w C? 211 00:09:08,450 --> 00:09:08,950 Tak? 212 00:09:08,950 --> 00:09:10,024 >> PUBLICZNOŚCI: Adres. 213 00:09:10,024 --> 00:09:11,190 DAVID MALAN: Adres. 214 00:09:11,190 --> 00:09:13,190 Więc to jest przeciwieństwem operatora gwiazdy, 215 00:09:13,190 --> 00:09:17,270 podczas gdy operator gwiazda mówi, przejdź do ten adres, operator ampersand 216 00:09:17,270 --> 00:09:20,280 mówi, dowiedzieć się adres tej zmiennej, 217 00:09:20,280 --> 00:09:23,530 i tak to jest klucz, bo Celem scanf w życiu 218 00:09:23,530 --> 00:09:26,320 jest skanowanie Na użytkowniku wejście z klawiatury, 219 00:09:26,320 --> 00:09:29,970 w zależności od co on lub ona typy, a następnie odczytać wejście tego użytkownika 220 00:09:29,970 --> 00:09:32,970 do zmiennej, ale widział w ciągu ostatnich dwóch tygodni 221 00:09:32,970 --> 00:09:36,080 że swap, że Próbowaliśmy wysiłku w celu wdrożenia 222 00:09:36,080 --> 00:09:37,110 po prostu uszkodzony. 223 00:09:37,110 --> 00:09:42,470 Przypomnijmy, że z funkcją wymiany, jeśli po prostu oświadczył A i B, jak wskazówki, 224 00:09:42,470 --> 00:09:47,040 my z powodzeniem zamienić dwie zmienne wewnątrz swapu 225 00:09:47,040 --> 00:09:50,080 Podobnie jak w przypadku mleka i OJ, ale jak tylko wymiany powrócił, 226 00:09:50,080 --> 00:09:55,200 jaki był wynik z tytułu do x i y, oryginalne wartości? 227 00:09:55,200 --> 00:09:55,700 Nic. 228 00:09:55,700 --> 00:09:56,200 Tak. 229 00:09:56,200 --> 00:09:59,754 Nic się nie stało, że czas, ponieważ swapy zmienić tylko jego lokalne kopie, 230 00:09:59,754 --> 00:10:01,670 to znaczy, wszystkie tym razem, gdy mamy 231 00:10:01,670 --> 00:10:04,010 zostały przekazując argumenty do funkcji, jesteśmy 232 00:10:04,010 --> 00:10:05,939 tylko przejazdem kopie tych argumentów. 233 00:10:05,939 --> 00:10:07,980 Można z tym zrobić co chcesz z nimi, 234 00:10:07,980 --> 00:10:10,890 ale nie będziemy mieć żadnego Wpływ na oryginalnych wartości. 235 00:10:10,890 --> 00:10:13,650 Więc to jest problematyczne, jeśli Ciebie chcą mieć funkcji takich jak scanf 236 00:10:13,650 --> 00:10:17,170 w życiu, którego celem jest skanowanie Wejście użytkownika z klawiatury 237 00:10:17,170 --> 00:10:22,010 a następnie wypełnić puste pola, tak aby mówić, to znaczy daje się zmienną jak X 238 00:10:22,010 --> 00:10:25,410 wartość, bo gdybym był po prostu przejść x do scanf, 239 00:10:25,410 --> 00:10:28,790 jeśli wziąć pod uwagę logikę ostatnia Tydzień, może scanf robić, co chce 240 00:10:28,790 --> 00:10:33,100 z kopią x, ale nie mógł stałe zmienić x chyba damy 241 00:10:33,100 --> 00:10:37,120 scanf mapę skarbów, że tak powiem, gdzie x oznacza miejsce, w którym 242 00:10:37,120 --> 00:10:41,860 mijamy na adres X, tak aby scanf może pójść tam i faktycznie zmiana 243 00:10:41,860 --> 00:10:42,920 wartość x. 244 00:10:42,920 --> 00:10:45,080 I tak rzeczywiście, wszystkie że ten program robi 245 00:10:45,080 --> 00:10:53,180 jeśli zrobię scanf 0, w moim źródła Katalog 5m, aby scanf 0, 246 00:10:53,180 --> 00:10:57,730 Dot slash scanf, numer prosimy o 50, dzięki za 50. 247 00:10:57,730 --> 00:11:01,020 >> Więc to nie jest wszystko, co ciekawe, ale co się rzeczywiście dzieje 248 00:11:01,020 --> 00:11:04,820 jest to, że tak szybko, jak zadzwonić scanf tutaj, wartość x 249 00:11:04,820 --> 00:11:06,410 jest trwale zmieniło. 250 00:11:06,410 --> 00:11:08,335 Teraz, to wydaje się dobre i dobre, aw rzeczywistości 251 00:11:08,335 --> 00:11:11,200 Wygląda na to, że naprawdę nie trzeba biblioteka CS50 w ogóle już. 252 00:11:11,200 --> 00:11:13,960 Na przykład, powiedzmy, uruchomić to jeszcze raz tutaj. 253 00:11:13,960 --> 00:11:15,750 Pozwól, że ponownie go przez sekundę. 254 00:11:15,750 --> 00:11:20,600 Spróbujmy numer i proszę zamiast mówić 50 jak poprzednio, 255 00:11:20,600 --> 00:11:22,810 powiedzmy, że nie. 256 00:11:22,810 --> 00:11:24,000 OK, to trochę dziwne. 257 00:11:24,000 --> 00:11:25,270 OK. 258 00:11:25,270 --> 00:11:28,680 I tylko niektóre bzdury tutaj. 259 00:11:28,680 --> 00:11:31,170 Tak więc nie wydaje się, aby obsługi sytuacji błędnych. 260 00:11:31,170 --> 00:11:33,620 Musimy więc minimalnie początek dodając trochę Sprawdzanie błędów 261 00:11:33,620 --> 00:11:37,460 aby upewnić się, że użytkownik ma wpisane w rzeczywistej liczby jak 50, 262 00:11:37,460 --> 00:11:40,720 bo podobno wpisując słowa nie jest wykrywany jako problematyczne 263 00:11:40,720 --> 00:11:42,020 ale to chyba powinno być. 264 00:11:42,020 --> 00:11:46,450 >> Przyjrzyjmy się tej wersji teraz to moja próba reimplement getString. 265 00:11:46,450 --> 00:11:48,437 Jeśli scanf ma to wszystko funkcje wbudowane, 266 00:11:48,437 --> 00:11:51,270 dlaczego mamy już dabbling z nich kółka jak getString? 267 00:11:51,270 --> 00:11:55,450 Cóż, tutaj jest chyba moja własna prosta wersja getString 268 00:11:55,450 --> 00:12:00,766 przy czym tydzień temu, mogę powiedzieć, daj mi łańcuch i nazywają to bufor. 269 00:12:00,766 --> 00:12:03,390 Dzisiaj mam zamiar zacząć po prostu mówiąc gwiazdę char, który, przypomnijmy, 270 00:12:03,390 --> 00:12:04,400 to jest po prostu synonimem. 271 00:12:04,400 --> 00:12:06,629 To wygląda bardziej przerażające, ale to dokładnie to samo. 272 00:12:06,629 --> 00:12:09,420 Więc daj mi bufor zmienną że będzie przechowywać ciąg, 273 00:12:09,420 --> 00:12:12,780 powiedzieć ciąg użytkownika proszę, a następnie, podobnie jak poprzednio, 274 00:12:12,780 --> 00:12:17,760 spróbujmy pożyczyć tę lekcję scanf % s tym razem, a następnie przekazać w buforze. 275 00:12:17,760 --> 00:12:19,310 Teraz szybkie kontrola poprawności. 276 00:12:19,310 --> 00:12:22,120 Dlaczego nie mówi handlowe i bufor ten czas? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Wywnioskować z poprzedniego przykładu. 279 00:12:26,625 --> 00:12:28,000 PUBLICZNOŚCI: Char gwiazda jest wskaźnikiem. 280 00:12:28,000 --> 00:12:29,920 DAVID MALAN: Dokładnie, bo tym razem, char 281 00:12:29,920 --> 00:12:34,080 Gwiazda jest już wskaźnikiem, adres, z definicji tej gwiazdy razie nie. 282 00:12:34,080 --> 00:12:37,530 A jeśli scanf oczekuje adres, wystarczy po prostu przekazać w buforze. 283 00:12:37,530 --> 00:12:39,260 Nie muszę powiedzieć, bufor ampersand. 284 00:12:39,260 --> 00:12:42,177 Dla ciekawskich, można zrobić coś takiego. 285 00:12:42,177 --> 00:12:43,510 Musiałby inne znaczenie. 286 00:12:43,510 --> 00:12:47,240 To daje wskaźnik do wskaźnika, który jest w rzeczywistości 287 00:12:47,240 --> 00:12:50,050 ważna rzecz w C, ale dla Teraz, powiedzmy, keep it simple 288 00:12:50,050 --> 00:12:51,750 i zachować historię spójne. 289 00:12:51,750 --> 00:12:54,100 Jestem po prostu przejdzie w bufor i to jest prawidłowe. 290 00:12:54,100 --> 00:12:56,487 Problemem jest jednak to. 291 00:12:56,487 --> 00:12:58,820 Pozwólcie mi iść do przodu i uruchomić to Program po kompilacji go. 292 00:12:58,820 --> 00:13:00,902 Bądź scanf 1. 293 00:13:00,902 --> 00:13:02,610 Cholera, mój kompilator wzrok mój błąd. 294 00:13:02,610 --> 00:13:04,090 Daj mi jedną sekundę. 295 00:13:04,090 --> 00:13:05,460 Clang. 296 00:13:05,460 --> 00:13:06,990 Powiedzmy scanf-1.C. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 OK. 299 00:13:11,380 --> 00:13:12,720 No to jedziemy. 300 00:13:12,720 --> 00:13:14,280 Potrzebuję tego. 301 00:13:14,280 --> 00:13:16,750 CS50 ID ma różne ustawienia konfiguracyjne 302 00:13:16,750 --> 00:13:18,280 które chroni przed siebie. 303 00:13:18,280 --> 00:13:21,300 Musiałem wyłączyć te przez prowadzenie szczęk ręcznie ten czas. 304 00:13:21,300 --> 00:13:22,140 Tak więc ciąg proszę. 305 00:13:22,140 --> 00:13:25,560 Mam zamiar iść do przodu i wpisz w moim ulubionym Hello World. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 To nie to, co wpisałem. 308 00:13:27,700 --> 00:13:29,690 Więc to wskazuje coś jest nie tak. 309 00:13:29,690 --> 00:13:33,920 Pozwólcie mi iść do przodu i wpisz w bardzo długi ciąg. 310 00:13:33,920 --> 00:13:37,210 Dzięki za nieważne i nie wiem jeśli będę w stanie go zawiesić. 311 00:13:37,210 --> 00:13:40,240 Spróbujmy trochę kopię wklej i zobacz, czy to pomaga. 312 00:13:40,240 --> 00:13:43,290 Wystarczy wkleić dużo tego. 313 00:13:43,290 --> 00:13:47,310 To zdecydowanie większe Ciąg niż zwykle. 314 00:13:47,310 --> 00:13:51,450 Miejmy tylko naprawdę pisać. 315 00:13:51,450 --> 00:13:51,950 Nie. 316 00:13:51,950 --> 00:13:52,650 Cholera. 317 00:13:52,650 --> 00:13:53,480 Nie znaleziono polecenia. 318 00:13:53,480 --> 00:13:54,550 Więc to jest niezwiązane. 319 00:13:54,550 --> 00:13:56,440 To dlatego, że wklejony złe znaki, 320 00:13:56,440 --> 00:13:59,780 ale to okazuje się nie będzie działać. 321 00:13:59,780 --> 00:14:03,510 >> Spróbujmy jeszcze raz, bo to jest więcej zabawy, jeśli faktycznie rozbić go. 322 00:14:03,510 --> 00:14:09,116 Załóżmy, wpisz to i teraz, jestem zamiar skopiować naprawdę długi ciąg 323 00:14:09,116 --> 00:14:10,990 a teraz zobaczmy, czy mamy może zawiesić tę rzecz. 324 00:14:10,990 --> 00:14:14,235 Zauważ, że pominięte przestrzenie i nowych linii i średniki 325 00:14:14,235 --> 00:14:16,035 i wszystkie znaki ostry. 326 00:14:16,035 --> 00:14:16,535 Wchodzić. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 A teraz po prostu sieć jest wolna. 329 00:14:22,880 --> 00:14:27,460 Trzymałem się Command-V zbyt długo, wyraźnie. 330 00:14:27,460 --> 00:14:28,190 Cholera! 331 00:14:28,190 --> 00:14:29,260 Nie znaleziono polecenia. 332 00:14:29,260 --> 00:14:29,780 >> OK. 333 00:14:29,780 --> 00:14:32,240 Cóż, chodzi o to, jednak następujące. 334 00:14:32,240 --> 00:14:36,910 Więc, co się rzeczywiście dzieje na niniejszego oświadczenia 335 00:14:36,910 --> 00:14:39,240 z char gwiazdkowy bufor na linii 16? 336 00:14:39,240 --> 00:14:41,820 Więc co ja mam się kiedy zadeklarować wskaźnik? 337 00:14:41,820 --> 00:14:47,440 Wszystko Dostaję jest wartością czterech bajtów zwany bufor, ale to, co jest w jej wnętrzu 338 00:14:47,440 --> 00:14:49,540 w tym momencie? 339 00:14:49,540 --> 00:14:50,930 To tylko niektóre wartości śmieci. 340 00:14:50,930 --> 00:14:54,170 Ponieważ dowolnym czasie zadeklarować zmienną w C, to tylko niektóre wartości śmieci, 341 00:14:54,170 --> 00:14:56,220 i zaczynamy podróż nad tą rzeczywistością. 342 00:14:56,220 --> 00:14:59,720 Teraz, kiedy powiem, scanf, przejść pod ten adres 343 00:14:59,720 --> 00:15:01,520 i umieścić bez względu na rodzaje użytkowników w. 344 00:15:01,520 --> 00:15:06,400 Jeśli użytkownik wpisze w komentarzy świat, dobrze, gdzie mogę umieścić go? 345 00:15:06,400 --> 00:15:07,750 Bufor jest wartością śmieci. 346 00:15:07,750 --> 00:15:11,510 >> Więc to jest trochę jak strzała wskazując, że jest nie wiadomo gdzie. 347 00:15:11,510 --> 00:15:13,880 Może to wskazuje tutaj, w mojej pamięci. 348 00:15:13,880 --> 00:15:16,560 I tak, gdy użytkownik typy w Hello World, 349 00:15:16,560 --> 00:15:22,380 program stara się umieścić Ciąg hello world backslash 0 350 00:15:22,380 --> 00:15:23,910 w tym fragmencie pamięci. 351 00:15:23,910 --> 00:15:27,070 Ale z dużym prawdopodobieństwem, ale oczywiście nie w 100% prawdopodobieństwo, 352 00:15:27,070 --> 00:15:30,440 komputer będzie wtedy upaść Program, ponieważ nie jest 353 00:15:30,440 --> 00:15:32,490 Pamięć należy pozwolić mi dotknąć. 354 00:15:32,490 --> 00:15:36,330 Tak w skrócie, ten program jest wadliwy dokładnie z tego powodu. 355 00:15:36,330 --> 00:15:38,070 Ja zasadniczo nie robi, co? 356 00:15:38,070 --> 00:15:42,366 Jakie kroki mogę pominięte, podobnie jak pominęliśmy w pierwszym przykładzie binky jest? 357 00:15:42,366 --> 00:15:42,866 Tak? 358 00:15:42,866 --> 00:15:43,710 >> PUBLICZNOŚCI: alokacji pamięci? 359 00:15:43,710 --> 00:15:45,001 >> DAVID MALAN: alokacji pamięci. 360 00:15:45,001 --> 00:15:48,400 Nie właściwie przydzielone jakakolwiek pamięć do tego łańcucha. 361 00:15:48,400 --> 00:15:50,270 Więc możemy to naprawić w kilka sposobów. 362 00:15:50,270 --> 00:15:52,700 Jeden z nich, możemy keep it simple i faktycznie, teraz jesteś 363 00:15:52,700 --> 00:15:55,116 zacznie widzieć zatarcia linii między tym, co 364 00:15:55,116 --> 00:15:58,520 tablica jest, co ciąg jest, co gwiazda char to, co tablica znaków 365 00:15:58,520 --> 00:15:59,020 jest. 366 00:15:59,020 --> 00:16:02,450 Oto drugi przykład udziałem smyczków i uprzedzenia 367 00:16:02,450 --> 00:16:05,690 wszystko robiłem na linii 16, zamiast mówić 368 00:16:05,690 --> 00:16:09,530 że bufor będzie char gwiazda, wskaźnik do kawałka pamięci, 369 00:16:09,530 --> 00:16:14,057 Będę bardzo aktywnie dać Sam bufor do 16 znaków, 370 00:16:14,057 --> 00:16:16,390 i faktycznie, jeśli znasz z buforowania okresie, 371 00:16:16,390 --> 00:16:20,570 chyba ze świata wideo, gdzie film jest buforowanie, buforowanie, 372 00:16:20,570 --> 00:16:21,175 buforujące. 373 00:16:21,175 --> 00:16:22,550 No i co tu jest połączenie? 374 00:16:22,550 --> 00:16:24,960 Cóż, Wewnątrz YouTube i wewnątrz odtwarzaczy wideo 375 00:16:24,960 --> 00:16:27,200 ogólnie jest tablicą to jest większy niż 16. 376 00:16:27,200 --> 00:16:30,340 To może być tablica rozmiarów jednej megabajtowego może 10 megabajtów, 377 00:16:30,340 --> 00:16:34,330 i do tej tablicy ma przeglądarkę pobrać całą masę bajtów, 378 00:16:34,330 --> 00:16:37,500 cała masa megabajtów wideo i odtwarzacz wideo, 379 00:16:37,500 --> 00:16:40,930 YouTube lub kto jest, zaczyna czytanie bajtów z tej tablicy, 380 00:16:40,930 --> 00:16:43,530 i za każdym razem można zobaczyć Słowo buforowanie, buforowanie, 381 00:16:43,530 --> 00:16:46,350 oznacza to, że gracz ma dostał się do końca tej tablicy. 382 00:16:46,350 --> 00:16:50,430 Sieć jest tak wolno, że nie ma uzupełniane tablicę z większą liczbą bajtów 383 00:16:50,430 --> 00:16:55,610 i tak jesteś na bitach aby wyświetlić użytkownikowi. 384 00:16:55,610 --> 00:16:59,430 >> Więc bufor jest trafny termin tutaj, że to tylko tablica, kawał pamięci. 385 00:16:59,430 --> 00:17:02,530 I to będzie to naprawić ponieważ okazuje 386 00:17:02,530 --> 00:17:07,410 że można traktować tablic jakby są adresy, chociaż bufora 387 00:17:07,410 --> 00:17:10,710 to tylko symbol, to Sekwencja postaci, buforem 388 00:17:10,710 --> 00:17:14,760 to jest dla mnie przydatne, programista, można przekazać jej nazwę na całym 389 00:17:14,760 --> 00:17:17,079 jakby to były wskaźnik, jakby to 390 00:17:17,079 --> 00:17:21,000 byli adres klocek pamięci do 16 znaków. 391 00:17:21,000 --> 00:17:24,530 Więc to znaczy, mogę przejść scanf dokładnie to słowo 392 00:17:24,530 --> 00:17:30,670 i tak teraz, jeśli zrobię ten program, aby scanf 2, kropka ukośnik scanf 2, 393 00:17:30,670 --> 00:17:35,386 i wpisz hello world, Wprowadź, że time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, co się stało? 395 00:17:37,590 --> 00:17:39,340 String proszę. 396 00:17:39,340 --> 00:17:41,430 Co zrobiłem źle? 397 00:17:41,430 --> 00:17:43,800 Witaj, świecie, bufor. 398 00:17:43,800 --> 00:17:44,705 Witaj świecie. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ach, wiem, co robi. 401 00:17:49,420 --> 00:17:49,920 OK. 402 00:17:49,920 --> 00:17:51,628 Więc to czyta się do pierwszej przestrzeni. 403 00:17:51,628 --> 00:17:55,680 Warto więc oszukiwać na chwilę i Chciałem tylko powiedzieć, aby coś napisać 404 00:17:55,680 --> 00:18:01,408 bardzo długo, jak to jest długa zdanie to jeden, dwa, trzy, cztery, pięć, 405 00:18:01,408 --> 00:18:04,420 sześć, siedem, osiem, dziewięć, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 OK. 407 00:18:05,300 --> 00:18:07,600 To jest rzeczywiście długa zdanie. 408 00:18:07,600 --> 00:18:10,710 Więc to zdanie jest dłuższy niż 16 znaków 409 00:18:10,710 --> 00:18:13,670 i tak, kiedy nacisnąć klawisz Enter, co się stanie? 410 00:18:13,670 --> 00:18:16,940 No cóż, w tym przypadku z historia, I oświadczył, bufor 411 00:18:16,940 --> 00:18:22,190 faktycznie jest tablicą z 16 znaków gotowy do pracy. 412 00:18:22,190 --> 00:18:27,426 Tak jeden, dwa, trzy, cztery, pięć, sześć, siedem, osiem, dziewięć, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Tak więc 16 znaków, a teraz, kiedy przeczytać w coś takiego jest długi 415 00:18:34,410 --> 00:18:43,950 Zdanie to, co się wydarzy jest które mam zamiar przeczytać w tym jest długa 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E zdanie. 417 00:18:49,660 --> 00:18:52,270 >> Więc to jest celowo złe, że 418 00:18:52,270 --> 00:18:55,060 zachować pisanie poza Granice mojej tablicy, 419 00:18:55,060 --> 00:18:56,660 poza granice mojego bufora. 420 00:18:56,660 --> 00:19:00,100 Mogłem mieć szczęście i program utrzyma się na prowadzeniu i nie obchodzi mnie, 421 00:19:00,100 --> 00:19:03,450 ale ogólnie rzecz biorąc, rzeczywiście rozbić mój program, 422 00:19:03,450 --> 00:19:06,440 i to jest błąd w moim kod moment I krok 423 00:19:06,440 --> 00:19:08,576 poza granicami z tej tablicy, bo 424 00:19:08,576 --> 00:19:10,450 nie wiem, czy jest to niekoniecznie będzie katastrofy 425 00:19:10,450 --> 00:19:12,120 czy jestem po prostu będzie miał szczęście. 426 00:19:12,120 --> 00:19:15,750 Więc to jest problematyczne, ponieważ w w tym przypadku, to nie wydaje się do pracy 427 00:19:15,750 --> 00:19:20,931 i niech kusić losu tutaj, chociaż IDE wydaje się tolerować trochę 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> No to jedziemy. 430 00:19:22,040 --> 00:19:23,240 Wreszcie. 431 00:19:23,240 --> 00:19:26,470 Więc jestem jedyną osobą, która może to zobaczyć. 432 00:19:26,470 --> 00:19:29,630 Więc po prostu miałem dużo zabawy pisania się naprawdę długi rzeczywistej frazy 433 00:19:29,630 --> 00:19:32,800 że to na pewno przekroczyła 16 bajtów, bo 434 00:19:32,800 --> 00:19:38,050 wpisane w tym szalonym długi multi-line wyrażenie, a następnie zauważył, co się stało. 435 00:19:38,050 --> 00:19:41,110 Program próbował wydrukowaniem a następnie dostał winy segmentacji 436 00:19:41,110 --> 00:19:44,430 i błędy segmentacji jest, gdy dzieje się coś takiego 437 00:19:44,430 --> 00:19:47,650 i system operacyjny mówi nie, nie można dotknąć, że pamięć. 438 00:19:47,650 --> 00:19:49,570 Mamy zamiar zabić program w ogóle. 439 00:19:49,570 --> 00:19:51,180 >> Tak więc wydaje się problematyczne. 440 00:19:51,180 --> 00:19:54,540 Mam poprawiła programu, w którym przynajmniej mieć trochę pamięci, 441 00:19:54,540 --> 00:19:58,000 ale to wydaje się ograniczyć funkcja GetString do uzyskania 442 00:19:58,000 --> 00:20:00,780 ciągi jakiejś skończonej długości 16. 443 00:20:00,780 --> 00:20:04,200 Więc jeśli chcesz wesprzeć dłużej zdania niż 16 znaków, 444 00:20:04,200 --> 00:20:04,880 co robisz? 445 00:20:04,880 --> 00:20:07,970 Cóż, można zwiększyć rozmiar bufora do 32 446 00:20:07,970 --> 00:20:09,190 lub, że wydaje się trochę krótki. 447 00:20:09,190 --> 00:20:12,260 Dlaczego nie możemy po prostu zrobić to 1000, ale odepchnąć. 448 00:20:12,260 --> 00:20:17,100 Jaka jest odpowiedź intuicyjnie od tylko uniknąć tego problemu poprzez 449 00:20:17,100 --> 00:20:20,660 mój bufor większy, podobnie jak 1000 znaków? 450 00:20:20,660 --> 00:20:23,470 Poprzez wdrożenie getString ten sposób. 451 00:20:23,470 --> 00:20:27,130 Co tu dobre, czy złe? 452 00:20:27,130 --> 00:20:28,033 Tak? 453 00:20:28,033 --> 00:20:30,574 PUBLICZNOŚCI: Jeśli zwiążesz się dużo miejsca i nie należy go używać, 454 00:20:30,574 --> 00:20:33,500 to nie może przydzielić tego miejsca. 455 00:20:33,500 --> 00:20:34,500 DAVID MALAN: Absolutnie. 456 00:20:34,500 --> 00:20:38,480 Jest to marnotrawstwo, o ile jeśli nie rzeczywiście potrzeba 900 tych bajtów 457 00:20:38,480 --> 00:20:41,057 i jeszcze prosisz 1000 w sumie tak, 458 00:20:41,057 --> 00:20:44,140 jesteś po prostu zużywa więcej pamięci na komputer użytkownika niż trzeba, 459 00:20:44,140 --> 00:20:45,740 A przecież, niektóre już napotkał 460 00:20:45,740 --> 00:20:47,620 w życiu, że kiedy jesteś działa wiele programów 461 00:20:47,620 --> 00:20:50,470 a oni zjadają dużo pamięci, to rzeczywiście może wpłynąć na wydajność 462 00:20:50,470 --> 00:20:52,220 i doświadczenie użytkownika na komputerze. 463 00:20:52,220 --> 00:20:56,090 Więc to jest trochę leniwy rozwiązaniem, na pewno, i odwrotnie, 464 00:20:56,090 --> 00:21:00,140 to nie tylko marnotrawstwo, jaki problem nadal, nawet jeśli robię mój bufor 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Tak? 467 00:21:02,600 --> 00:21:04,475 >> PUBLICZNOŚCI: Łańcuch ma długość tysięcy jeden. 468 00:21:04,475 --> 00:21:05,350 DAVID MALAN: Dokładnie. 469 00:21:05,350 --> 00:21:08,280 Jeśli łańcuch jest długość 1001, masz dokładnie ten sam problem, 470 00:21:08,280 --> 00:21:10,705 i przez mojego argumentu, że tak właśnie wtedy zrobić to 2000, 471 00:21:10,705 --> 00:21:12,830 ale nie wiesz, w wcześniej, jak duże powinno być, 472 00:21:12,830 --> 00:21:16,890 a jednak, muszę skompilować mój program przed najmu ludzie używają i pobierz 473 00:21:16,890 --> 00:21:17,390 ono. 474 00:21:17,390 --> 00:21:21,490 Więc to jest dokładnie ten rodzaj rzeczy, że stara biblioteka CS50 475 00:21:21,490 --> 00:21:24,750 aby pomóc nam, a my tylko rzut oka na niektóre z realizacji bazowego 476 00:21:24,750 --> 00:21:29,790 Tutaj jednak to CS50 dot C. jest plikiem, który był na CS50 IDE 477 00:21:29,790 --> 00:21:31,420 wszystkie te tygodnie, które już korzystają. 478 00:21:31,420 --> 00:21:34,280 Jest to skompilowane i masz używam go automatycznie 479 00:21:34,280 --> 00:21:38,780 przez naturę z posiadania kreska L CS50 flagę z brzękiem, 480 00:21:38,780 --> 00:21:42,300 ale jeśli mogę przewinąć w dół przez wszystkie te funkcje, oto getString, 481 00:21:42,300 --> 00:21:44,636 i po prostu dać ci smak, co się dzieje, 482 00:21:44,636 --> 00:21:46,760 rzućmy okiem na względną złożoność. 483 00:21:46,760 --> 00:21:48,870 To nie jest bardzo długa funkcja, ale nie 484 00:21:48,870 --> 00:21:52,530 wszyscy mają myśleć intensywnie o jak go o coraz sznurki. 485 00:21:52,530 --> 00:21:55,660 >> Tak tu jest mój bufor i najwyraźniej zainicjować go na null. 486 00:21:55,660 --> 00:21:57,990 To, oczywiście, jest samo, jak gwiazdy char, 487 00:21:57,990 --> 00:22:00,585 ale zdecydowałem się wdrażanie biblioteki CS50 488 00:22:00,585 --> 00:22:02,460 że jeśli mamy zamiar być całkowicie dynamiczny, 489 00:22:02,460 --> 00:22:05,770 Nie wiem z wyprzedzeniem jak duży użytkowników smyczkowych będą chcieli dostać. 490 00:22:05,770 --> 00:22:08,140 Więc mam zamiar zacząć tylko z pustym ciągiem znaków 491 00:22:08,140 --> 00:22:11,507 i mam zamiar budować tyle Pamięć jak trzeba dopasować ciąg użytkownika 492 00:22:11,507 --> 00:22:13,340 a jeśli nie mam tyle, mam zamiar zapytać 493 00:22:13,340 --> 00:22:15,010 system operacyjny, aby uzyskać więcej pamięci. 494 00:22:15,010 --> 00:22:17,510 Mam zamiar przenieść swój ciąg do większego kawałka pamięci 495 00:22:17,510 --> 00:22:21,847 i mam zamiar zwolnić lub uwolnić wystarczająco duży fragment pamięci 496 00:22:21,847 --> 00:22:23,680 a my po prostu się to zrobić iteracyjnie. 497 00:22:23,680 --> 00:22:25,570 >> Tak szybki rzut oka, tutaj jest po prostu zmienna 498 00:22:25,570 --> 00:22:28,780 z którym mam zamiar śledzić zdolności mojego bufora. 499 00:22:28,780 --> 00:22:30,071 Ile bajtów mogę zmieścić? 500 00:22:30,071 --> 00:22:32,070 Oto zmiennej n, które mam zamiar utrzymać 501 00:22:32,070 --> 00:22:36,200 utwór o tym, jak wiele bajtów są rzeczywiście w bufor lub że użytkownik wpisał. 502 00:22:36,200 --> 00:22:39,900 Jeśli nie widziałem tego wcześniej, ci Można określić, że zmienna jak int 503 00:22:39,900 --> 00:22:46,370 jest niepodpisany, które jak sama nazwa wskazuje, Oznacza to nieujemna i dlaczego będzie 504 00:22:46,370 --> 00:22:50,590 I nigdy nie chce niepokoić określające że nie tylko int int, 505 00:22:50,590 --> 00:22:52,540 ale niepodpisany int? 506 00:22:52,540 --> 00:22:55,064 To nieujemną int. 507 00:22:55,064 --> 00:22:56,355 Co oznacza [niesłyszalne] oznacza? 508 00:22:56,355 --> 00:22:58,910 >> PUBLICZNOŚCI: To opisujący ilość pamięci, która może być [niesłyszalne]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID MALAN: Tak. 510 00:22:59,660 --> 00:23:03,710 Więc jeśli powiem, bez znaku, to jest rzeczywiście co daje jeden trochę dodatkowej pamięci 511 00:23:03,710 --> 00:23:07,440 i wydaje się trochę głupie, ale jeśli jeden trochę dodatkowej pamięci, że 512 00:23:07,440 --> 00:23:09,940 oznacza, że ​​masz dwa razy tyle Wartości można reprezentują, 513 00:23:09,940 --> 00:23:11,570 ponieważ może on być 0 lub 1. 514 00:23:11,570 --> 00:23:14,660 Więc domyślnie, int może być mniej ujemna 2 mld na drodze 515 00:23:14,660 --> 00:23:16,030 do pozytywnego 2 mld. 516 00:23:16,030 --> 00:23:18,540 To są duże zakresy, ale to wciąż rodzaj marnotrawstwa 517 00:23:18,540 --> 00:23:21,280 jeśli tylko o rozmiary, które po prostu intuicyjnie 518 00:23:21,280 --> 00:23:24,620 powinna być ujemna lub dodatnie lub 0, a następnie, 519 00:23:24,620 --> 00:23:28,884 dlaczego marnujesz 2 miliardy Możliwe wartości dla liczb ujemnych 520 00:23:28,884 --> 00:23:30,300 jeśli nigdy nie będziemy z nich korzystać? 521 00:23:30,300 --> 00:23:35,350 Więc mówiąc niepodpisany, teraz mój int może być pomiędzy 0 a około 4 mld. 522 00:23:35,350 --> 00:23:39,280 >> Więc tutaj jest po prostu int C z powodów nie dostaniemy się właśnie teraz, 523 00:23:39,280 --> 00:23:42,280 dlaczego jest to int zamiast z char, ale tutaj jest 524 00:23:42,280 --> 00:23:44,630 istota tego, co się dzieje na, a niektórzy z was 525 00:23:44,630 --> 00:23:48,340 może być używany, na przykład, fgetc funkcji nawet w pset czterech 526 00:23:48,340 --> 00:23:51,580 lub później, będziemy go zobaczyć ponownie w problemu ustawić pięć, 527 00:23:51,580 --> 00:23:55,410 fgetc jest dobre, bo jak nazwa rodzaj, rodzaj arcanely sugeruje, 528 00:23:55,410 --> 00:23:57,940 jest to funkcja, która dostaje charakter i tak, 529 00:23:57,940 --> 00:24:00,690 co zasadniczo różni o tym, co robimy w getString 530 00:24:00,690 --> 00:24:03,110 jest nie używamy scanfa w taki sam sposób. 531 00:24:03,110 --> 00:24:07,550 Jesteśmy po prostu pełzanie wraz krok po kroku przez co użytkownik wpisane, 532 00:24:07,550 --> 00:24:10,970 ponieważ zawsze możemy przydzielić jeden char, i tak zawsze możemy bezpiecznie 533 00:24:10,970 --> 00:24:15,599 wyglądają z jednej odbarwiającego w czasie, magia zaczyna się dziać tutaj. 534 00:24:15,599 --> 00:24:17,890 Zamierzam przejść do środek tej funkcji 535 00:24:17,890 --> 00:24:20,360 tylko pokrótce przedstawić tę funkcję. 536 00:24:20,360 --> 00:24:22,670 Podobnie jak tam jest Funkcja malloc, nie 537 00:24:22,670 --> 00:24:27,740 funkcja realloc gdzie realloc pozwala ci przydzielić kawałek pamięci 538 00:24:27,740 --> 00:24:29,570 i sprawiają, że większe lub mniejsze. 539 00:24:29,570 --> 00:24:33,060 Tak w wielkim skrócie i fala mojej strony na dzisiaj, 540 00:24:33,060 --> 00:24:35,620 wiem, że to, co getString robi to jest coś w rodzaju 541 00:24:35,620 --> 00:24:39,720 z magicznie rośnie lub kurczy się bufor, jak użytkownik 542 00:24:39,720 --> 00:24:41,440 typy w jego ciąg. 543 00:24:41,440 --> 00:24:43,962 >> Więc jeśli użytkownik wpisze krótki ciąg znaków, kod 544 00:24:43,962 --> 00:24:45,920 tylko przydziela tyle Pamięć dopasować ciąg. 545 00:24:45,920 --> 00:24:48,086 Jeśli użytkownik trzyma pisania jak ja go znowu i znowu 546 00:24:48,086 --> 00:24:50,330 i znowu, dobrze, jeśli bufora początkowo ten wielki 547 00:24:50,330 --> 00:24:53,310 , program realizuje, na Chwileczkę, jestem z przestrzeni, 548 00:24:53,310 --> 00:24:55,410 to się podwoić rozmiar bufora 549 00:24:55,410 --> 00:24:59,110 a następnie dwa razy rozmiar bufora i kod, który robi podwojenie, 550 00:24:59,110 --> 00:25:03,170 jeśli spojrzymy na to tutaj, to tylko ten sprytny-liner. 551 00:25:03,170 --> 00:25:06,830 Może nie widzieliście tej składni wcześniej, ale jeśli powiesz, że gwiazda jest równy, 552 00:25:06,830 --> 00:25:10,470 to jest to samo, co mówiąc razy pojemności 2. 553 00:25:10,470 --> 00:25:13,390 Więc to tylko trzyma podwajając Wydajność buforze 554 00:25:13,390 --> 00:25:17,480 a następnie mówi realloc dać Sam, że o wiele więcej pamięci. 555 00:25:17,480 --> 00:25:19,720 >> Teraz, na marginesie, nie są inne funkcje w tutaj 556 00:25:19,720 --> 00:25:23,680 że nie będziemy patrzeć na jakiekolwiek szczegóły inne niż do wyświetlenia w GetInt, 557 00:25:23,680 --> 00:25:26,150 używamy w GetInt getString. 558 00:25:26,150 --> 00:25:28,192 Sprawdzimy, że nie jest null, która, przypomnijmy, 559 00:25:28,192 --> 00:25:30,400 jest specjalna wartość, która oznacza coś poszło nie tak. 560 00:25:30,400 --> 00:25:31,233 Jesteśmy pamięci. 561 00:25:31,233 --> 00:25:32,310 Lepiej sprawdź to. 562 00:25:32,310 --> 00:25:33,710 I wracamy wartości wskaźnikowych. 563 00:25:33,710 --> 00:25:37,850 Ale będę odroczyć do uwag co do dlaczego, a potem użyć tego kuzyn scanf 564 00:25:37,850 --> 00:25:42,100 nazywa sscanf i okazuje się, że scanf sscanf, lub ciąg znaków, 565 00:25:42,100 --> 00:25:45,310 pozwala spojrzeć na linii, które wpisane przez użytkownika i niech cię w 566 00:25:45,310 --> 00:25:49,610 analizować zasadniczo i co jestem tu robisz jest Mówię sscanf, 567 00:25:49,610 --> 00:25:54,440 analizować, co użytkownik ma wpisane i upewnij% I, 568 00:25:54,440 --> 00:25:59,250 nie jest liczbą całkowitą w nim, i nie będzie dostać się do dziś, dlaczego nie ma również 569 00:25:59,250 --> 00:26:03,760 a% c tutaj, ale w skrócie pozwala nas, aby wykryć, czy użytkownik wpisał 570 00:26:03,760 --> 00:26:06,050 w coś fałszywego po numerze. 571 00:26:06,050 --> 00:26:11,766 Więc dlatego, że GetInt i GetString powiedzieć, aby ponowić próbę, ponownie, ponownie 572 00:26:11,766 --> 00:26:13,640 Jest tak, ponieważ ze wszystkich że kod pisaliśmy, 573 00:26:13,640 --> 00:26:17,900 To trochę patrząc na wejście użytkownika upewniając się, że to całkiem numeryczny 574 00:26:17,900 --> 00:26:21,700 czy jest to rzeczywista zmiennoprzecinkowych Wartość punktu lub podobne, 575 00:26:21,700 --> 00:26:24,233 W zależności od wartości funkcjonować używasz. 576 00:26:24,233 --> 00:26:25,060 >> Ufff. 577 00:26:25,060 --> 00:26:25,710 OK. 578 00:26:25,710 --> 00:26:27,592 To był łyk ale chodzi o to, 579 00:26:27,592 --> 00:26:29,550 że powodem mieliśmy te kółka na 580 00:26:29,550 --> 00:26:32,880 Jest tak, ponieważ na najniższym poziomie Jest tak wiele rzeczy, które 581 00:26:32,880 --> 00:26:35,674 może pójść nie tak, że chcieliśmy do zapobiegawczo obsługi 582 00:26:35,674 --> 00:26:38,090 te rzeczy na pewno w Pierwsze tygodnie klasy, 583 00:26:38,090 --> 00:26:42,230 ale teraz z pset cztery i pset pięć i poza widać, że jest to bardziej do 584 00:26:42,230 --> 00:26:45,570 ty, ale również jesteś bardziej zdolny rozwiązywania tego rodzaju problemów 585 00:26:45,570 --> 00:26:47,180 samodzielnie. 586 00:26:47,180 --> 00:26:51,770 Wszelkie pytania dotyczące getString lub GetInt? 587 00:26:51,770 --> 00:26:52,630 Tak? 588 00:26:52,630 --> 00:26:55,130 >> PUBLICZNOŚCI: Dlaczego chcesz podwoić Wydajność buforze 589 00:26:55,130 --> 00:26:57,630 a nie tylko zwiększenie to przez dokładnej kwoty? 590 00:26:57,630 --> 00:26:58,100 >> DAVID MALAN: Dobre pytanie. 591 00:26:58,100 --> 00:27:00,474 Dlaczego mielibyśmy podwojenie zdolności bufora zamiast 592 00:27:00,474 --> 00:27:02,800 po prostu zwiększenie jej przez jakąś stałą wartość? 593 00:27:02,800 --> 00:27:03,900 To była decyzja projektowa. 594 00:27:03,900 --> 00:27:08,590 My po prostu uznał, że ponieważ ma tendencję do być trochę drogie, czas mądry zapytać 595 00:27:08,590 --> 00:27:10,440 System operacyjny za pamięć, my nie 596 00:27:10,440 --> 00:27:13,210 chcesz skończyć się w sytuacja dla dużych ciągów 597 00:27:13,210 --> 00:27:14,960 które pytaliśmy znowu i znowu OS 598 00:27:14,960 --> 00:27:17,500 i znowu i znowu w szybka sukcesja dla pamięci. 599 00:27:17,500 --> 00:27:20,387 Więc po prostu zdecydował, nieco arbitralnie ale mamy nadzieję, rozsądnie, 600 00:27:20,387 --> 00:27:22,720 że, wiesz co, niech postarać się przed siebie 601 00:27:22,720 --> 00:27:25,520 i po prostu podwojenie go tak, że zminimalizować ilość razy 602 00:27:25,520 --> 00:27:29,010 mamy zadzwonić malloc lub realloc, ale w sumie wyrok 603 00:27:29,010 --> 00:27:31,820 zadzwonić w przypadku braku znajomości co użytkownicy mogą chcieć wpisać. 604 00:27:31,820 --> 00:27:33,600 Oba sposoby mogą być dyskusyjne. 605 00:27:33,600 --> 00:27:35,430 Prawdopodobnie dobre. 606 00:27:35,430 --> 00:27:39,240 >> Warto więc przyjrzeć się kilku od innych skutków ubocznych pamięci 607 00:27:39,240 --> 00:27:41,610 rzeczy, które mogą pójść źle i narzędzi, które można 608 00:27:41,610 --> 00:27:43,880 używać do połowu tego rodzaju błędów. 609 00:27:43,880 --> 00:27:47,800 Okazuje się, wszyscy z was, nawet jeśli check50 nie powiedział ci tyle, 610 00:27:47,800 --> 00:27:50,050 pisali buggy Kod od tygodnia, 611 00:27:50,050 --> 00:27:53,630 nawet jeśli wszystkie testy check50 są minął, a nawet jeśli ty i twój TF 612 00:27:53,630 --> 00:27:56,010 są bardzo pewni, że Twój kod działa zgodnie z przeznaczeniem. 613 00:27:56,010 --> 00:27:59,190 Twój kod jest wadliwy lub wadliwy, że wszyscy z was, 614 00:27:59,190 --> 00:28:02,540 w korzystaniu z biblioteki CS50, zostały wyciek pamięci. 615 00:28:02,540 --> 00:28:06,040 Byłaś prosi system operacyjny do pamięci w większości programów 616 00:28:06,040 --> 00:28:08,850 napisałeś, ale masz nigdy nie podano go z powrotem. 617 00:28:08,850 --> 00:28:12,110 Masz nazywa GetString i GetInt i GetFloat, 618 00:28:12,110 --> 00:28:15,270 ale z getString, masz nigdy nie nazywa unGetString lub Give 619 00:28:15,270 --> 00:28:19,890 String Powrót lub podobne, ale widzieliśmy że GetString nie przydzielić pamięci 620 00:28:19,890 --> 00:28:22,810 w drodze malloc lub tego Funkcja realloc, który jest po prostu 621 00:28:22,810 --> 00:28:25,670 bardzo podobne w duchu, a jednak, byliśmy 622 00:28:25,670 --> 00:28:28,629 zwracając się do systemu operacyjnego dla pamięci i pamięci ponownie i ponownie 623 00:28:28,629 --> 00:28:29,670 ale nigdy nie dając go z powrotem. 624 00:28:29,670 --> 00:28:33,550 >> Teraz, na marginesie, to okazuje się, że gdy program kończy działanie, wszystkie pamięci 625 00:28:33,550 --> 00:28:34,870 jest automatycznie usuwane. 626 00:28:34,870 --> 00:28:36,150 Więc to nie był to ogromny problem. 627 00:28:36,150 --> 00:28:38,590 To się nie złamać IDE lub spowolnić, 628 00:28:38,590 --> 00:28:40,670 Ale kiedy programy zrobić ogólnie wyciek pamięci 629 00:28:40,670 --> 00:28:42,170 i są one uruchomione przez długi czas. 630 00:28:42,170 --> 00:28:45,640 Jeśli kiedykolwiek widział głupiego Malutki Piłka plażowa w Mac OS lub klepsydry 631 00:28:45,640 --> 00:28:51,160 w systemie Windows, gdzie jest to rodzaj spowolnienie lub myśli i myślenie 632 00:28:51,160 --> 00:28:53,770 lub po prostu naprawdę zaczyna spowolnić do indeksowania, 633 00:28:53,770 --> 00:28:56,960 to bardzo prawdopodobne może być skutkiem nieszczelności pamięci. 634 00:28:56,960 --> 00:28:59,970 Programiści, którzy pisali oprogramowanie używasz 635 00:28:59,970 --> 00:29:03,570 zwrócić się do systemu operacyjnego dla pamięci co kilka minut, co godzinę. 636 00:29:03,570 --> 00:29:05,570 Ale jeśli uruchamiając oprogramowanie, nawet jeśli jest to 637 00:29:05,570 --> 00:29:08,680 zminimalizowane w komputerze przez kilka godzin lub dni, w celu 638 00:29:08,680 --> 00:29:11,980 można prosić o więcej i więcej pamięci i nigdy nie korzystali z basenu 639 00:29:11,980 --> 00:29:15,180 i tak kod może być, lub programy mogą być wyciek pamięci, 640 00:29:15,180 --> 00:29:18,350 i jeśli zaczniesz wycieki pamięci, jest mniej pamięci dla innych programów, 641 00:29:18,350 --> 00:29:21,220 a efekt jest spowolnić wszystko w dół. 642 00:29:21,220 --> 00:29:23,600 >> Teraz, jest to zdecydowanie jeden z najbardziej okrutne programy 643 00:29:23,600 --> 00:29:26,350 będziesz mieć możliwości do pracy w CS50 zakresie 644 00:29:26,350 --> 00:29:31,650 a jego produkcja jest jeszcze bardziej ezoteryczny niż szczęk lub zrobić lub którykolwiek z polecenia 645 00:29:31,650 --> 00:29:35,930 Linia jakie programy prowadzone wcześniej, ale na szczęście, osadzone w swojej produkcji 646 00:29:35,930 --> 00:29:39,810 Jest kilka bardzo pomocnych wskazówek, które będą przydatne zarówno dla pset czterech 647 00:29:39,810 --> 00:29:41,510 czy na pewno pset pięć. 648 00:29:41,510 --> 00:29:44,250 Więc valgrind jest narzędziem który może być użyty do sprawdzenia 649 00:29:44,250 --> 00:29:46,930 przecieków pamięci w programie. 650 00:29:46,930 --> 00:29:48,570 Jest to stosunkowo prosty do uruchomienia. 651 00:29:48,570 --> 00:29:51,420 Uruchomić valgrind a następnie, nawet choć jest to trochę rozwlekły, 652 00:29:51,420 --> 00:29:54,440 Kontrola szczelności kreska kreska równa się pełna, a następnie kropka 653 00:29:54,440 --> 00:29:56,320 slash i nazwa programu. 654 00:29:56,320 --> 00:30:00,010 Więc valgrind następnie uruchomić program a na samym końcu programu 655 00:30:00,010 --> 00:30:02,240 uruchomiony, zanim zostanie zamknięty i daje się kolejny monit, 656 00:30:02,240 --> 00:30:04,980 to będzie analizować Program natomiast, że został uruchomiony 657 00:30:04,980 --> 00:30:07,740 i powiedzieć, czy wyciek żadnej pamięci, a jeszcze lepiej, 658 00:30:07,740 --> 00:30:10,610 nie dotykać pamięć nie należy do ciebie? 659 00:30:10,610 --> 00:30:13,700 To nie może złapać wszystko, ale to całkiem dobry wzrok większość rzeczy. 660 00:30:13,700 --> 00:30:19,700 >> Więc tutaj jest przykład z mojego mającego metę ten program, o run valgrind, 661 00:30:19,700 --> 00:30:21,470 na program o nazwie Pamięć i idę 662 00:30:21,470 --> 00:30:24,730 aby zaznaczyć linie, które są ostatecznie nas interesują. 663 00:30:24,730 --> 00:30:27,690 Więc jest jeszcze więcej rozrywki że już usunięte z zjeżdżalnią. 664 00:30:27,690 --> 00:30:30,930 Ale niech po prostu zobaczyć, co to Program jest w stanie powiedzieć nam. 665 00:30:30,930 --> 00:30:34,800 Jest w stanie powiedzieć nam rzeczy jak niepoprawnego zapisu wielkości 4. 666 00:30:34,800 --> 00:30:38,020 Innymi słowy, jeśli dotykać pamięci, konkretnie 4 bajty pamięci 667 00:30:38,020 --> 00:30:40,350 że nie powinien mieć, valgrind mogę ci powiedzieć. 668 00:30:40,350 --> 00:30:41,660 Nieprawidłowy zapis wielkości 4. 669 00:30:41,660 --> 00:30:43,640 Dotknąłeś cztery bajty że nie powinien mieć. 670 00:30:43,640 --> 00:30:44,840 Gdzie pan to zrobił? 671 00:30:44,840 --> 00:30:45,900 To jest piękno. 672 00:30:45,900 --> 00:30:50,000 Pamięć c kropka linia 21 jest tam, gdzie wkręca się i dlatego jest to pomocne. 673 00:30:50,000 --> 00:30:53,410 Podobnie jak GDB, może pomóc punktu, w faktycznym błędem. 674 00:30:53,410 --> 00:30:57,170 >> Teraz, ten jest trochę więcej gadatliwy, jeśli nie mylące. 675 00:30:57,170 --> 00:31:01,307 40 bajtów 1 bloków są zdecydowanie utracone w rekordzie strat 1 z 1. 676 00:31:01,307 --> 00:31:02,140 Co to znaczy? 677 00:31:02,140 --> 00:31:05,920 Cóż, to po prostu oznacza, że ​​poprosił o 40 bajtów i nigdy nie oddał. 678 00:31:05,920 --> 00:31:08,930 Nazwałeś malloc lub dzwoniłeś GetString i system operacyjny 679 00:31:08,930 --> 00:31:12,450 dałem 40 bajtów, ale nigdy nie uwolnione lub udostępnione, że pamięć, 680 00:31:12,450 --> 00:31:15,400 i żeby być w porządku, my nigdy nie pokazują Ci, jak oddać pamięć. 681 00:31:15,400 --> 00:31:17,910 Okazuje się, że jest super Prosta funkcja nazywa darmo. 682 00:31:17,910 --> 00:31:21,170 Przyjmuje jeden argument, na rzecz Aby zwolnić lub oddać, 683 00:31:21,170 --> 00:31:23,430 ale 40 bajtów, najwyraźniej, w tym programie 684 00:31:23,430 --> 00:31:27,300 zostały utracone na linii 20 pamięci dot c. 685 00:31:27,300 --> 00:31:28,650 >> Zobaczmy więc, ten program. 686 00:31:28,650 --> 00:31:31,020 To super bezużyteczne. 687 00:31:31,020 --> 00:31:33,980 To tylko pokazuje, ten konkretny błąd. 688 00:31:33,980 --> 00:31:34,920 Warto więc przyjrzeć. 689 00:31:34,920 --> 00:31:39,920 Oto główne i najważniejsze, zawiadomienia, rozmowy funkcja o nazwie F, a następnie wraca. 690 00:31:39,920 --> 00:31:41,550 Więc nie wszystko, co ciekawe. 691 00:31:41,550 --> 00:31:42,664 Co f zrobić? 692 00:31:42,664 --> 00:31:44,330 Zauważ, że nie przeszkadzało z prototypem. 693 00:31:44,330 --> 00:31:46,520 Chciałem zachować kod możliwie jak najmniejszy. 694 00:31:46,520 --> 00:31:49,530 Włożyłem więc f powyżej głównym i to jest w porządku, na pewno, 695 00:31:49,530 --> 00:31:51,500 dla krótkich programów takich jak ten. 696 00:31:51,500 --> 00:31:56,910 Więc f niczego nie wrócić i nie Nie ma nic, ale to nie to zrobić. 697 00:31:56,910 --> 00:31:59,620 Deklaruje, podobnie jak na przykład binky, 698 00:31:59,620 --> 00:32:02,682 wskaźnik o nazwie x, że będzie przechowywać adres int. 699 00:32:02,682 --> 00:32:03,890 Więc to jest lewa strona. 700 00:32:03,890 --> 00:32:07,230 W języku angielskim, co jest prawa strona robi? 701 00:32:07,230 --> 00:32:09,770 Każdy, kto? 702 00:32:09,770 --> 00:32:13,665 Co to robi dla nas? 703 00:32:13,665 --> 00:32:14,651 Tak? 704 00:32:14,651 --> 00:32:16,623 >> PUBLICZNOŚCI: [niesłyszalne] razy większe int 705 00:32:16,623 --> 00:32:19,175 która jest 10 razy, że [niesłyszalne] 706 00:32:19,175 --> 00:32:20,800 DAVID MALAN: Dobry i pozwól mi podsumować. 707 00:32:20,800 --> 00:32:25,480 Więc przeznaczyć wystarczająco dużo miejsca dla 10 liczb całkowitych lub 10, co jest rozmiar int, 708 00:32:25,480 --> 00:32:29,340 to cztery bajty, więc 10 razy 4 jest 40, tak, że po prawej stronie, że mam 709 00:32:29,340 --> 00:32:33,930 Podświetlona jest mi dać 40 bajtów i przechowywać adres pierwszego bajtu 710 00:32:33,930 --> 00:32:34,940 do x. 711 00:32:34,940 --> 00:32:38,380 A teraz na koniec, a tu, gdzie ten program jest wadliwy, co jest 712 00:32:38,380 --> 00:32:41,540 tak z linii 21 na podstawie tej logiki? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Co jest nie tak z linii 21? 715 00:32:46,280 --> 00:32:46,780 Tak? 716 00:32:46,780 --> 00:32:49,550 PUBLICZNOŚCI: Nie możesz Strona jest w x [niesłyszalne]. 717 00:32:49,550 --> 00:32:50,300 DAVID MALAN: Tak. 718 00:32:50,300 --> 00:32:52,270 Nie powinienem indeks do x w tym stylu. 719 00:32:52,270 --> 00:32:53,850 Więc składniowo, to jest OK. 720 00:32:53,850 --> 00:32:56,990 Co miłe jest, podobnie jak Ciebie można traktować nazwę tablicy 721 00:32:56,990 --> 00:33:01,080 jakby to wskaźnik, podobnie można traktować wskaźnik jakby to 722 00:33:01,080 --> 00:33:06,425 tablica, i tak mogę składniowo Wspornik coś powiedzieć, x, x uchwyt i, 723 00:33:06,425 --> 00:33:07,800 ale 10 jest problematyczne. 724 00:33:07,800 --> 00:33:09,096 Czemu? 725 00:33:09,096 --> 00:33:10,910 >> PUBLICZNOŚCI: Bo to nie jest w środku. 726 00:33:10,910 --> 00:33:12,390 >> DAVID MALAN: Nie wewnątrz tego kawałka pamięci. 727 00:33:12,390 --> 00:33:15,306 Jaka jest największa wartość Powinienem być wprowadzenie w tych nawiasach kwadratowych? 728 00:33:15,306 --> 00:33:16,870 9, od 0 do 9. 729 00:33:16,870 --> 00:33:18,160 Ze względu na zerowej indeksowania. 730 00:33:18,160 --> 00:33:20,190 Więc od 0 do 9 będzie dobrze. 731 00:33:20,190 --> 00:33:23,960 Wspornik 10 nie jest dobre, a ale, pamiętam jednak, za każdym razem, 732 00:33:23,960 --> 00:33:27,017 Wydaje mi się, aby spróbować zrobić CS50 IDE Crash wpisując wartości fałszywych, 733 00:33:27,017 --> 00:33:29,100 nie zawsze współpracują, i rzeczywiście, często 734 00:33:29,100 --> 00:33:31,460 miał szczęście tylko dlatego, że System operacyjny nie działa 735 00:33:31,460 --> 00:33:35,467 zauważysz, że zawsze tak lekko zdać jakiś fragment pamięci, 736 00:33:35,467 --> 00:33:38,300 dlatego, że pozostał w technicznie Twój segmentu, ale o tym 737 00:33:38,300 --> 00:33:40,940 w klasie systemów operacyjnych, i tak coś takiego 738 00:33:40,940 --> 00:33:43,000 może bardzo łatwo przejść niezauważony. 739 00:33:43,000 --> 00:33:48,120 Twój program nie będzie katastrofy konsekwentnie, ale być może raz na jakiś czas. 740 00:33:48,120 --> 00:33:50,610 >> A więc spróbujmy valgrind na ten temat, a tu 741 00:33:50,610 --> 00:33:52,870 gdzie będziemy się przytłoczony przez wyjście na chwilę. 742 00:33:52,870 --> 00:34:00,810 Więc dokonać pamięci próbę szczelności valgrind równa pełnej pamięci kropka slash. 743 00:34:00,810 --> 00:34:03,040 A oto dlaczego obiecuję to będzie przytłaczać. 744 00:34:03,040 --> 00:34:05,700 Oto co valgrind, oto co programista, kilka lat temu- 745 00:34:05,700 --> 00:34:08,469 zdecydował, że będzie to dobry pomysł na wyjście wyglądać. 746 00:34:08,469 --> 00:34:09,750 Warto więc sensu w tym. 747 00:34:09,750 --> 00:34:13,120 Tak więc przez całą drogę z lewej ręki boczne bez powodu 748 00:34:13,120 --> 00:34:16,620 jest identyfikator procesu programu po prostu działać, niepowtarzalny identyfikator 749 00:34:16,620 --> 00:34:18,030 programu po prostu uciekł. 750 00:34:18,030 --> 00:34:19,738 Mamy usunięty, że od slajd, ale nie 751 00:34:19,738 --> 00:34:22,190 jest kilka przydatnych informacji tutaj. 752 00:34:22,190 --> 00:34:24,684 >> Miejmy przewijać się na sam szczyt. 753 00:34:24,684 --> 00:34:25,600 Oto, gdzie zaczęliśmy. 754 00:34:25,600 --> 00:34:27,040 Więc to nie jest aż tak dużo wyjście. 755 00:34:27,040 --> 00:34:30,429 Oto, że nieważne zapisu wielkości 4 na linii 21. 756 00:34:30,429 --> 00:34:31,760 Cóż, to, co było linii 21? 757 00:34:31,760 --> 00:34:34,500 Linia 21 było dokładnie to i to ma sens 758 00:34:34,500 --> 00:34:37,290 że jestem w ważnie pisanie 4 bajty, bo jestem 759 00:34:37,290 --> 00:34:40,389 starają się umieścić tę liczbę całkowitą, co mogłoby być w ogóle, 760 00:34:40,389 --> 00:34:42,370 to po prostu dzieje się zero, ale staram 761 00:34:42,370 --> 00:34:44,940 umieścić go w miejscu które nie należą do mnie. 762 00:34:44,940 --> 00:34:50,900 Co więcej, tu, 40 bajty w jednym Bloki są zdecydowanie stracił w rekordzie 1. 763 00:34:50,900 --> 00:34:56,500 To dlatego, że gdy zgłoszę malloc tutaj, nigdy tak naprawdę zwolnić pamięć. 764 00:34:56,500 --> 00:34:58,140 >> Więc jak można rozwiązać ten problem? 765 00:34:58,140 --> 00:35:02,970 Pozwólcie mi iść do przodu i być trochę bezpieczniej i zrobić 9 nie i niech mnie tu bezpłatne x. 766 00:35:02,970 --> 00:35:04,820 Jest to nowa funkcja na dzisiaj. 767 00:35:04,820 --> 00:35:11,520 Jeśli teraz ponownie uruchomić dot memory ukośnik, niech na nim uruchomić valgrind ponownie 768 00:35:11,520 --> 00:35:14,990 zmaksymalizować okno i naciśnij Enter. 769 00:35:14,990 --> 00:35:16,900 Teraz, to jest dobre. 770 00:35:16,900 --> 00:35:19,590 Pochować ich dobrą nowinę We wszystkich tego wyjścia. 771 00:35:19,590 --> 00:35:20,810 Wszystkie bloki sterty były wolne. 772 00:35:20,810 --> 00:35:23,604 Wrócimy do tego, co stercie jest, ale nie ma wycieków są możliwe. 773 00:35:23,604 --> 00:35:25,520 Więc jest to tylko kolejny Narzędzie do zestawu narzędzi 774 00:35:25,520 --> 00:35:30,220 z którym można zacząć znaleźć teraz błędów takich jak to. 775 00:35:30,220 --> 00:35:34,532 >> Ale zobaczmy, co więcej może się nie udać się tutaj. 776 00:35:34,532 --> 00:35:38,890 Miejmy przejście teraz właściwie rozwiązanie problemu. 777 00:35:38,890 --> 00:35:42,440 Tak na marginesie, czy to będzie zwolnić Trochę zamieszania i napięcia, 778 00:35:42,440 --> 00:35:43,430 teraz jest to śmieszne. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Tak. 781 00:35:46,900 --> 00:35:49,040 To dość dobre. 782 00:35:49,040 --> 00:35:50,890 Ponieważ wskaźniki są adresy i adresy 783 00:35:50,890 --> 00:35:53,098 ogólnie przyjętą konwencją napisane szesnastkowym. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, to jest śmieszne. 785 00:35:54,650 --> 00:35:58,390 Tak czy inaczej, więc niech teraz rzeczywiście rozwiązać problem. 786 00:35:58,390 --> 00:36:00,840 To było bardzo, bardzo niski poziom tej pory, 787 00:36:00,840 --> 00:36:03,950 i możemy faktycznie użyteczne rzeczy z tych szczegółów niskiego poziomu. 788 00:36:03,950 --> 00:36:06,710 >> Więc wprowadziliśmy kilka tygodni temu pojęcie tablicy. 789 00:36:06,710 --> 00:36:09,177 Tablica było miłe, bo trudno jest oczyścić nasz kod 790 00:36:09,177 --> 00:36:11,760 bo jeśli chcemy napisać Program z wieloma studentami 791 00:36:11,760 --> 00:36:15,270 lub wielu nazw i domy i akademików i uczelni i wszystko to, 792 00:36:15,270 --> 00:36:19,430 możemy przechowywać wszystko więcej czysto w środku tablicy. 793 00:36:19,430 --> 00:36:23,039 Ale proponuję jedną wadę tablicy tej pory. 794 00:36:23,039 --> 00:36:26,080 Nawet jeśli wcześniej nie cierpiała go samodzielnie w programie, tylko instynktownie, 795 00:36:26,080 --> 00:36:30,870 to, co jest złe o tablicy, być może? 796 00:36:30,870 --> 00:36:32,337 Słyszę jakieś szepty. 797 00:36:32,337 --> 00:36:34,170 PUBLICZNOŚCI: Trudno aby zmienić rozmiar. 798 00:36:34,170 --> 00:36:36,128 DAVID MALAN: Trudno aby zmienić rozmiar. 799 00:36:36,128 --> 00:36:38,660 Nie można zmienić rozmiaru tablicy, w rzeczywistości, per se 800 00:36:38,660 --> 00:36:43,040 w C. Możesz przydzielić inną tablicę, przenieść wszystko od starego 801 00:36:43,040 --> 00:36:45,380 na nowy, a teraz mają trochę wolnego miejsca, 802 00:36:45,380 --> 00:36:47,469 ale to nie jest jak język jak Java czy Python 803 00:36:47,469 --> 00:36:49,760 lub dowolne inne języki z których niektórzy z was 804 00:36:49,760 --> 00:36:52,070 może znać gdzie może po prostu zachować dodając rzeczy 805 00:36:52,070 --> 00:36:53,930 znudzenia do końca tablicy. 806 00:36:53,930 --> 00:36:57,880 Gdy masz tablicę Rozmiar 6, które jest jego wielkość, 807 00:36:57,880 --> 00:37:01,970 i tak dużo jak pomysł wcześniej bufor o określonej wielkości, 808 00:37:01,970 --> 00:37:05,940 musisz zgadywać z bramy jaki rozmiar chcesz go mieć? 809 00:37:05,940 --> 00:37:07,880 Jeśli chyba zbyt duże, marnujesz miejsca. 810 00:37:07,880 --> 00:37:10,950 Jeśli chyba zbyt małe, Nie można przechowywać te dane, co najmniej 811 00:37:10,950 --> 00:37:12,940 nie dużo więcej pracy. 812 00:37:12,940 --> 00:37:18,180 >> Więc dzisiaj, dzięki wskazówek, możemy rozpocząć szycie wraz własny zwyczaj 813 00:37:18,180 --> 00:37:20,989 struktury danych, a Fakt, jest tu coś 814 00:37:20,989 --> 00:37:23,030 że wygląda trochę więcej tajemnicze na pierwszy rzut oka, 815 00:37:23,030 --> 00:37:26,440 ale to jest to, co my nazywamy powiązane lista, a jego nazwa rodzaju podsumowanie 816 00:37:26,440 --> 00:37:26,940 ono. 817 00:37:26,940 --> 00:37:29,550 Jest to lista numerów, lub w tym przypadku, wykaz numerów, 818 00:37:29,550 --> 00:37:33,480 ale może to być lista z niczego, ale to jest połączone ze sobą za pomocą strzałek, 819 00:37:33,480 --> 00:37:36,380 i po prostu zgadywać z tego, co technika 820 00:37:36,380 --> 00:37:38,310 będziemy w stanie zszyć razem, 821 00:37:38,310 --> 00:37:42,540 coś jak popcorn z wątku, Listy wiązana prostokąty tutaj? 822 00:37:42,540 --> 00:37:43,936 Jego numery? 823 00:37:43,936 --> 00:37:45,560 Jaka jest funkcja język podstawowy? 824 00:37:45,560 --> 00:37:46,350 >> PUBLICZNOŚCI: Wskaźnik. 825 00:37:46,350 --> 00:37:47,308 >> DAVID MALAN: Wskaźnik. 826 00:37:47,308 --> 00:37:51,700 Tak więc każdy z tych strzałek tutaj reprezentuje wskaźnik lub po prostu adres. 827 00:37:51,700 --> 00:37:54,590 Więc innymi słowy, jeśli chcę do przechowywania listy numerów 828 00:37:54,590 --> 00:37:59,040 Nie mogę po prostu zapisać go, jeśli chcę zdolność do wzrostu i kurczyć 829 00:37:59,040 --> 00:38:00,990 moja struktura danych w tablicy. 830 00:38:00,990 --> 00:38:03,000 Więc muszę mieć trochę więcej wyrafinowania, 831 00:38:03,000 --> 00:38:05,720 ale zauważ, że ten obraz rodzaj sugeruje 832 00:38:05,720 --> 00:38:08,650 że jeśli właśnie dostał małe wątki łączenia wszystkiego ze sobą, 833 00:38:08,650 --> 00:38:13,100 Prawdopodobnie nie jest to, że trudno, aby zrobić miejsce między dwa z tych prostokątów 834 00:38:13,100 --> 00:38:16,750 lub dwa z tych węzłów, jak zaczniemy nazywając je umieścić w nowym węźle, 835 00:38:16,750 --> 00:38:19,547 a następnie z jakiegoś nowego wątku, po prostu rów trzy węzły razem, 836 00:38:19,547 --> 00:38:22,880 pierwszy, ostatni i jeden że po prostu umiejscawia się w środku. 837 00:38:22,880 --> 00:38:26,000 >> I rzeczywiście połączonej listy, w przeciwieństwie do tablicy, jest dynamiczny. 838 00:38:26,000 --> 00:38:27,840 Może rosnąć, a to może kurczą się, a ty nie 839 00:38:27,840 --> 00:38:32,434 trzeba znać lub opieki z góry how wiele danych idziesz do przechowywania, 840 00:38:32,434 --> 00:38:35,600 ale okazuje się, że musimy być trochę Uważaj, jak zaimplementować to. 841 00:38:35,600 --> 00:38:39,070 Więc najpierw rozważmy, jak wdrożyć jednego z tych małych prostokątów. 842 00:38:39,070 --> 00:38:40,690 Jest to łatwe do wdrożenia int. 843 00:38:40,690 --> 00:38:44,000 Wystarczy powiedzieć, int n, a następnie masz 4 bajty na int, 844 00:38:44,000 --> 00:38:49,089 ale jak mogę int, nazywamy to n, a następnie wskaźnik, nazwijmy to w przyszłym. 845 00:38:49,089 --> 00:38:50,880 Możemy nazwać je rzeczy, cokolwiek chcemy 846 00:38:50,880 --> 00:38:53,590 ale muszę strukturę niestandardowych danych. 847 00:38:53,590 --> 00:38:54,257 Tak? 848 00:38:54,257 --> 00:38:57,020 >> PUBLICZNOŚCI: Ampersand [niesłyszalne]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID MALAN: Tak handlowe i będziemy używać do uzyskać adres węzła potencjalnie. 850 00:39:00,940 --> 00:39:02,740 Ale potrzebujemy innego cechą C w celu 851 00:39:02,740 --> 00:39:06,700 dać mi możliwość tworzenia zwyczaj ten prostokąt, ten zwyczaj 852 00:39:06,700 --> 00:39:08,919 jeśli będzie zmienna w pamięci. 853 00:39:08,919 --> 00:39:09,710 PUBLICZNOŚCI: struct. 854 00:39:09,710 --> 00:39:10,626 DAVID MALAN: struct. 855 00:39:10,626 --> 00:39:14,310 Przypomnijmy, z ostatniego tygodnia, wprowadziliśmy struktura, to stosunkowo proste słowo kluczowe 856 00:39:14,310 --> 00:39:16,254 który pozwala nam dokonać takich rzeczy. 857 00:39:16,254 --> 00:39:18,420 C nie pochodzą z danych Struktura nazywa studenta. 858 00:39:18,420 --> 00:39:22,190 Pochodzi z pływakiem i int i char i takie, ale nie pochodzi z uczniem, 859 00:39:22,190 --> 00:39:26,750 ale możemy stworzyć typ danych student, struktura student, z tej składni 860 00:39:26,750 --> 00:39:27,250 tutaj. 861 00:39:27,250 --> 00:39:28,350 I zobaczysz to znowu i znowu. 862 00:39:28,350 --> 00:39:30,426 Więc nie martw się o zapamiętywania słów kluczowych, 863 00:39:30,426 --> 00:39:33,300 ale kluczowe jest to ważne jest, tylko fakt, że powiedział struct 864 00:39:33,300 --> 00:39:37,590 i wtedy nazwał go ucznia i wewnątrz studenta była nazwa i dom 865 00:39:37,590 --> 00:39:39,390 lub w akademiku lub podobne. 866 00:39:39,390 --> 00:39:41,980 >> A więc teraz już, niech proponują. 867 00:39:41,980 --> 00:39:45,240 Dodałem kilka słów, ale jeśli chcę do wdrożenia tego prostokąta, który jest 868 00:39:45,240 --> 00:39:48,440 ma zarówno int i kolacja wskaźnik, wiesz co, jestem 869 00:39:48,440 --> 00:39:51,540 zamiar oświadczyć struct nazwie węzła. 870 00:39:51,540 --> 00:39:55,630 Jestem też, w jej wnętrzu, powie że węzeł ten prostokąt, ma int 871 00:39:55,630 --> 00:39:59,730 a my go nazywamy n oraz ma kolejny wskaźnik. 872 00:39:59,730 --> 00:40:02,540 I to jest trochę rozwlekły, ale jeśli myślisz o tym, 873 00:40:02,540 --> 00:40:07,300 Strzałki, które były w obrazie przed chwilą to, jaki rodzaj danych? 874 00:40:07,300 --> 00:40:12,330 Przy czym każdy z tych strzałek wskazuje jaki rodzaj struktury danych? 875 00:40:12,330 --> 00:40:14,332 To nie jest skierowany tylko do int per se. 876 00:40:14,332 --> 00:40:16,165 Jest skierowany do Cała prostokątna rzeczą 877 00:40:16,165 --> 00:40:18,720 i że prostokątne rzeczą, powiedzieliśmy, jest nazywany węzłem. 878 00:40:18,720 --> 00:40:21,720 A więc my niby trzeba rekurencyjnie zdefiniować to takie 879 00:40:21,720 --> 00:40:26,270 że węzeł, powiedzmy, zawiera int nazwie n 880 00:40:26,270 --> 00:40:31,070 i wskaźnik zwany obok i typ struktury danych, do której 881 00:40:31,070 --> 00:40:35,770 że wskaźnik wskazuje jest najwyraźniej będzie struct node. 882 00:40:35,770 --> 00:40:41,550 >> Więc to jest irytująco gadatliwy i po prostu być pedantyczny 883 00:40:41,550 --> 00:40:44,100 dlatego nie możemy po prostu powiedzieć, że to, co szczerze mówiąc 884 00:40:44,100 --> 00:40:46,860 wygląda o wiele bardziej czytelny, Jest tak, ponieważ Przypomnijmy, że C przeczytać 885 00:40:46,860 --> 00:40:48,710 rzeczy, od góry do dołu, od lewej do prawej. 886 00:40:48,710 --> 00:40:54,120 To nie jest aż dojdziemy średnik że węzeł kluczowe faktycznie istnieje. 887 00:40:54,120 --> 00:40:57,980 Więc jeśli chcemy mieć tego rodzaju cykliczne odniesienia wewnątrz danych 888 00:40:57,980 --> 00:41:02,120 Struktura, musimy to zrobić, gdzie mówimy węzeł struct na górze, która 889 00:41:02,120 --> 00:41:06,770 daje nam dłuższą sposób opisywania tego rzeczą, następnie wewnątrz mówimy węzeł struct, 890 00:41:06,770 --> 00:41:09,560 a następnie w ostatniej linii mówimy, wszystko w porządku, C, przy okazji, 891 00:41:09,560 --> 00:41:12,060 zadzwoń ten cały cholerny rzeczą węzeł i zatrzymać 892 00:41:12,060 --> 00:41:14,360 za pomocą słowa kluczowego struct całkowicie się. 893 00:41:14,360 --> 00:41:18,030 Więc to jest po prostu coś w rodzaju składniowym Sztuką, która ostatecznie pozwala nam tworzyć 894 00:41:18,030 --> 00:41:21,370 coś, co wygląda dokładnie tak. 895 00:41:21,370 --> 00:41:25,010 >> Tak więc, jeśli założymy, teraz możemy wdrożyć tę rzecz w C, 896 00:41:25,010 --> 00:41:28,040 W jaki sposób właściwie rozpocząć przejeżdżające? 897 00:41:28,040 --> 00:41:32,360 Cóż, w rzeczywistości, wszystko co musisz zrobić, to iteracyjne od lewej do prawej i po prostu 898 00:41:32,360 --> 00:41:35,960 rodzaj wstawić węzły lub usunąć węzły lub wyszukaj rzeczy, wszędzie tam, gdzie chcemy, 899 00:41:35,960 --> 00:41:39,560 ale aby to zrobić, idziemy do przodu i zrobić rzeczy trochę bardziej realne, ponieważ 900 00:41:39,560 --> 00:41:42,560 jest bardzo niski poziom tej pory. 901 00:41:42,560 --> 00:41:45,700 Czy ktoś dosłownie lubią być pierwszy? 902 00:41:45,700 --> 00:41:46,200 OK. 903 00:41:46,200 --> 00:41:47,092 Chodź na górę. 904 00:41:47,092 --> 00:41:47,800 Jak masz na imię? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID MALAN: David. 907 00:41:49,290 --> 00:41:49,998 Miło cię poznać. 908 00:41:49,998 --> 00:41:50,960 Ja też. 909 00:41:50,960 --> 00:41:52,450 W porządku. 910 00:41:52,450 --> 00:41:53,990 A my potrzebujemy numer 9. 911 00:41:53,990 --> 00:41:55,240 Nie tak dobry jak pierwszy, być może. 912 00:41:55,240 --> 00:41:56,430 OK, numer 9. 913 00:41:56,430 --> 00:41:59,667 Numer 17, proszę. 914 00:41:59,667 --> 00:42:01,000 Pozwól mi wrócić trochę dalej. 915 00:42:01,000 --> 00:42:03,980 Numer 22, proszę, i jak się dalej wstecz 916 00:42:03,980 --> 00:42:06,344 jeśli widzę żadnych ręce ze wszystkimi świetle lub nie. 917 00:42:06,344 --> 00:42:08,010 Ktoś jest na ochotnika tam. 918 00:42:08,010 --> 00:42:08,968 Chcesz wymyślić? 919 00:42:08,968 --> 00:42:10,450 Twój przedramienia jest siłą idzie w górę. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 . 22 922 00:42:13,690 --> 00:42:15,120 26 idzie w dół. 923 00:42:15,120 --> 00:42:18,450 Czy ktoś jeszcze chciał forcefully-- Chodź. 924 00:42:18,450 --> 00:42:21,030 Rzeczywisty wolontariuszy. 925 00:42:21,030 --> 00:42:23,330 >> Tak bardzo szybko, jeśli wam się zorganizować 926 00:42:23,330 --> 00:42:26,550 się po prostu podoba węzły na ekranie. 927 00:42:26,550 --> 00:42:27,510 Dziękuję. 928 00:42:27,510 --> 00:42:29,234 I będziesz 26. 929 00:42:29,234 --> 00:42:30,650 Wszystkie właściwe i szybkie wstępy. 930 00:42:30,650 --> 00:42:32,139 Więc jestem Dawid i jesteś też? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID MALAN: A ty jesteś? 933 00:42:33,721 --> 00:42:34,229 JAKE: Jake. 934 00:42:34,229 --> 00:42:34,729 Sue Sue. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Raphael. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID MALAN: Taylor. 939 00:42:37,466 --> 00:42:37,590 Doskonałe. 940 00:42:37,590 --> 00:42:39,810 To są nasi wolontariusze do dziś i iść do przodu 941 00:42:39,810 --> 00:42:43,090 i przesunąć trochę w ten sposób, i po prostu iść dalej i utrzymać 942 00:42:43,090 --> 00:42:47,024 trzymając swoje numery jak ty lub twoi Pierwszy znak i za pomocą lewej ręki, 943 00:42:47,024 --> 00:42:48,940 śmiało i po prostu wdrożyć te strzały, po prostu 944 00:42:48,940 --> 00:42:51,360 tak, że lewa ręka jest dosłownie wskazując na co należy zwrócić 945 00:42:51,360 --> 00:42:54,610 w, i dać sobie trochę miejsca, tak aby możemy naocznie zobaczyć swoje ramiona rzeczywistości 946 00:42:54,610 --> 00:42:58,120 wskazując, a może po prostu wskazać jakby na ziemi jest w porządku. 947 00:42:58,120 --> 00:43:03,040 >> Więc tutaj mamy połączonej listy jednego, dwa, trzy, cztery, pięć węzłów początkowo, 948 00:43:03,040 --> 00:43:05,860 i zauważyć, mamy ten specjalny wskaźnik na początku, kto jest 949 00:43:05,860 --> 00:43:09,770 klucz, ponieważ mamy do śledzenia całej listy długość jakoś. 950 00:43:09,770 --> 00:43:13,590 Ci faceci, nawet jeśli są one pozostawione do prawej, z powrotem do tyłu w pamięci, 951 00:43:13,590 --> 00:43:15,950 mogą one być wszędzie w pamięci komputera. 952 00:43:15,950 --> 00:43:18,240 Więc ci faceci mogą być stojąc w dowolnym miejscu na scenie 953 00:43:18,240 --> 00:43:20,960 i to jest w porządku, tak długo, jak są one faktycznie, wskazując na siebie, 954 00:43:20,960 --> 00:43:22,770 ale do przechowywania rzeczy czyste i proste, będziemy 955 00:43:22,770 --> 00:43:25,728 wystarczy wyciągnąć je od lewej do prawej, jak to, ale nie może być ogromne luki 956 00:43:25,728 --> 00:43:26,790 Pomiędzy tymi węzłami. 957 00:43:26,790 --> 00:43:30,710 >> Teraz, jeśli chcę, aby faktycznie wprowadzić pewne nowa wartość, idziemy naprzód i to zrobić. 958 00:43:30,710 --> 00:43:33,720 Mamy szansę teraz wybrać inny węzeł. 959 00:43:33,720 --> 00:43:39,820 Powiedzieć, zacznijmy od z mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Czy ktoś przeszkadza malloc? 961 00:43:41,320 --> 00:43:42,280 OK, chodź na górę. 962 00:43:42,280 --> 00:43:42,992 Jak masz na imię? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Rainbow. 964 00:43:43,700 --> 00:43:44,050 DAVID MALAN: Rainbow? 965 00:43:44,050 --> 00:43:44,810 W porządku. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Chodź na górę. 968 00:43:47,450 --> 00:43:51,610 Więc teraz musimy zadać sobie pytanie, algorytmicznie, gdzie możemy umieścić 55. 969 00:43:51,610 --> 00:43:53,610 Tak więc każdy z nas wie, oczywiście, gdzie prawdopodobnie 970 00:43:53,610 --> 00:43:55,401 należy, jeśli chcemy zachować to klasyfikowane 971 00:43:55,401 --> 00:43:58,299 i jeśli wy może przyjąć jedną krok do tyłu, więc nie spaść 972 00:43:58,299 --> 00:43:59,590 etap, że byłoby świetnie. 973 00:43:59,590 --> 00:44:01,420 Tak naprawdę, Tęcza, rozpocząć tutaj ze mną, 974 00:44:01,420 --> 00:44:04,200 bo jak komputer teraz może zobaczyć tylko jedną zmienną w czasie. 975 00:44:04,200 --> 00:44:05,190 Tak więc, jeżeli jest to pierwszy węzeł. 976 00:44:05,190 --> 00:44:07,160 Zauważ, że nie jest węzłem, on jest tylko wskaźnikiem, 977 00:44:07,160 --> 00:44:10,270 i dlatego on wyciągnąć się tylko wielkość wskaźnika nie 978 00:44:10,270 --> 00:44:11,780 jeden z tych pełnych prostokątów. 979 00:44:11,780 --> 00:44:16,650 Tak więc mamy zamiar sprawdzić na siebie iteracja jest 55 mniej niż 9? 980 00:44:16,650 --> 00:44:17,150 Nie. 981 00:44:17,150 --> 00:44:19,060 Czy 55 mniej niż 17 lat? 982 00:44:19,060 --> 00:44:19,720 Nie. 983 00:44:19,720 --> 00:44:20,800 Mniej niż 22? 984 00:44:20,800 --> 00:44:22,020 Mniej niż 26 lat? 985 00:44:22,020 --> 00:44:23,390 Mniej niż 34? 986 00:44:23,390 --> 00:44:25,890 A więc teraz, oczywiście Rainbow należy na końcu. 987 00:44:25,890 --> 00:44:27,270 Więc być jasne, a co było na imię, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID MALAN: Tak między Taylor lewa ręka i ręce Rainbow jest tutaj, 990 00:44:32,510 --> 00:44:38,324 czyja ręka musi wskazywać na to, co w Aby wstawić 55 na tej liście? 991 00:44:38,324 --> 00:44:39,240 Co trzeba zrobić? 992 00:44:39,240 --> 00:44:39,700 Tak? 993 00:44:39,700 --> 00:44:41,140 >> PUBLICZNOŚCI: ręka Taylora musi wskazać w lewo. 994 00:44:41,140 --> 00:44:41,680 >> DAVID MALAN: Dokładnie. 995 00:44:41,680 --> 00:44:43,800 Więc wstawienie węzła na koniec listy 996 00:44:43,800 --> 00:44:47,140 Jest to bardzo proste, ponieważ Taylor po prostu ma wskazywać, zamiast w podłożu 997 00:44:47,140 --> 00:44:49,640 lub nazwijmy to null null jest rodzaj nieobecności 998 00:44:49,640 --> 00:44:51,640 od wskaźnika lub specjalny zerowy wskaźnik, że jesteś 999 00:44:51,640 --> 00:44:53,740 będzie wskazywać z lewej Ręka w Rainbow a następnie Rainbow, 1000 00:44:53,740 --> 00:44:55,910 Gdzie lewej Prawdopodobnie ręcznie wskazać? 1001 00:44:55,910 --> 00:44:56,570 W dół. 1002 00:44:56,570 --> 00:45:00,140 To nie jest dobre, jeśli jej ręka jest rodzajem wskazując się tutaj lub rodzaj dowolny 1003 00:45:00,140 --> 00:45:00,640 która droga. 1004 00:45:00,640 --> 00:45:02,407 To byłoby uznane za wartość śmieci, 1005 00:45:02,407 --> 00:45:04,240 ale jeśli ona wskazuje na niektóre znana wartość, będziemy 1006 00:45:04,240 --> 00:45:07,360 Nazywamy to zero lub wartość null, to jest OK bo mamy termin w tym 1007 00:45:07,360 --> 00:45:09,390 i wiemy, że lista jest zakończona. 1008 00:45:09,390 --> 00:45:11,550 >> Więc co innego stosunkowo prosta sprawa? 1009 00:45:11,550 --> 00:45:13,125 Czy możemy malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Chodź na górę. 1011 00:45:14,010 --> 00:45:14,782 Jak masz na imię? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID MALAN: przepraszam? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID MALAN: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 W porządku. 1017 00:45:17,110 --> 00:45:19,071 Tiffany został malloced o wartości 5. 1018 00:45:19,071 --> 00:45:19,570 Chodź na górę. 1019 00:45:19,570 --> 00:45:23,820 Ten jest stosunkowo łatwa, ale rozważmy kolejność operacji teraz. 1020 00:45:23,820 --> 00:45:25,820 To było całkiem proste z Taylor na końcu. 1021 00:45:25,820 --> 00:45:30,302 Numer 5 jest oczywiście mniejszy niż 9, i tak mamy Dawida, mamy Tiffany, 1022 00:45:30,302 --> 00:45:31,260 a co masz na imię? 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: Jake. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID MALAN: Jake. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Jake i David. 1026 00:45:34,300 --> 00:45:36,580 Czyja ręka powinna być pierwszy zaktualizowany? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Co chcesz robić tutaj? 1029 00:45:40,590 --> 00:45:45,244 Istnieje kilka możliwych sposobów, ale tam również jeden lub więcej złe drogi. 1030 00:45:45,244 --> 00:45:46,620 >> PUBLICZNOŚCI: Zacznij skrajnej lewej. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID MALAN: Zacznij od skrajnej lewej. 1032 00:45:47,800 --> 00:45:49,008 Kto jest tu najbardziej na lewo, a następnie? 1033 00:45:49,008 --> 00:45:49,700 PUBLICZNOŚCI: Po pierwsze. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID MALAN: OK. 1035 00:45:50,366 --> 00:45:53,781 Tak rozpoczyna się pierwsza i gdzie chcesz zaktualizować ręce Dawida być? 1036 00:45:53,781 --> 00:45:54,780 PUBLICZNOŚCI: Pod 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID MALAN: OK. 1038 00:45:55,446 --> 00:45:59,026 Dawid, punkt, w pięciu lub Tiffany tu i teraz? 1039 00:45:59,026 --> 00:46:01,072 >> PUBLICZNOŚCI: Tiffany wskazuje na 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID MALAN: Perfect, z wyjątkiem Binky na szef po prostu rodzaj spadł, prawda? 1041 00:46:04,030 --> 00:46:06,820 Bo to, co się dzieje z ten obraz dosłownie? 1042 00:46:06,820 --> 00:46:08,070 PUBLICZNOŚCI: Nic nie wskazuje. 1043 00:46:08,070 --> 00:46:09,945 DAVID MALAN: Nic nie jest wskazując na Jake'a teraz. 1044 00:46:09,945 --> 00:46:13,360 Mamy dosłownie osierocone 9 i 17, i mamy dosłownie 1045 00:46:13,360 --> 00:46:18,450 wyciekała z tej pamięci, ponieważ przez aktualizowanie rękę Dawida pierwsze, to 1046 00:46:18,450 --> 00:46:21,660 w porządku, o ile jest prawidłowo wskazując na Tiffany teraz 1047 00:46:21,660 --> 00:46:25,410 ale jeśli nikt nie miał foresight wskazać na Jake'a, 1048 00:46:25,410 --> 00:46:27,490 potem straciliśmy Całość tej listy. 1049 00:46:27,490 --> 00:46:28,200 Warto więc cofnąć. 1050 00:46:28,200 --> 00:46:30,950 Więc to była dobra rzecz potknąć, ale niech poprawić teraz. 1051 00:46:30,950 --> 00:46:33,624 Co powinniśmy zrobić w pierwszej kolejności, a nie? 1052 00:46:33,624 --> 00:46:34,124 Tak? 1053 00:46:34,124 --> 00:46:35,791 >> PUBLICZNOŚCI: Tiffany powinien wskazywać na 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID MALAN: nie mogę uzyskać tak blisko Ciebie. 1055 00:46:37,582 --> 00:46:38,720 Kto powinien wskazywać na 9? 1056 00:46:38,720 --> 00:46:39,220 >> PUBLICZNOŚCI: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID MALAN: Wszystko w porządku. 1058 00:46:39,390 --> 00:46:41,200 Więc Tiffany powinien pierwszy punkt na 9. 1059 00:46:41,200 --> 00:46:43,550 Więc Tiffany powinny na identycznej wartości 1060 00:46:43,550 --> 00:46:45,820 do Dawida, który wydaje zbędne na chwilę, 1061 00:46:45,820 --> 00:46:48,820 ale to dobrze, bo teraz, druga krok, możemy aktualizować rękę Dawida 1062 00:46:48,820 --> 00:46:52,680 wskazać na Tiffany, a następnie, jeśli my po prostu rodzaj czyste rzeczy do góry 1063 00:46:52,680 --> 00:46:55,740 jako że jest to rodzaj wiosennej, teraz, że jest to prawidłowe wstawiania. 1064 00:46:55,740 --> 00:46:56,700 Tak doskonałe. 1065 00:46:56,700 --> 00:46:57,970 Więc teraz jesteśmy prawie na miejscu. 1066 00:46:57,970 --> 00:47:01,075 Miejmy wstawić jeden finał wartość jak wartość 20. 1067 00:47:01,075 --> 00:47:03,010 Gdybyśmy mogli malloc ostatnią wolontariuszem? 1068 00:47:03,010 --> 00:47:04,140 Chodź na górę. 1069 00:47:04,140 --> 00:47:06,224 Więc ten jeden to trochę bardziej skomplikowane. 1070 00:47:06,224 --> 00:47:08,390 Ale tak naprawdę, kod jesteśmy pisanie, choć werbalnie, 1071 00:47:08,390 --> 00:47:10,610 jest po prostu jak o kilka od tego, czy zostały spełnione warunki, prawda? 1072 00:47:10,610 --> 00:47:12,318 Mieliśmy stan sprawdzenie, czy należy 1073 00:47:12,318 --> 00:47:13,840 Na koniec, może początku. 1074 00:47:13,840 --> 00:47:15,940 Potrzebujemy pewnego rodzaju pętli do znaleźć miejsce w środku. 1075 00:47:15,940 --> 00:47:17,400 Więc zróbmy to, że z tego, co masz na imię? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID MALAN: Eric? 1078 00:47:18,340 --> 00:47:18,660 Eric. 1079 00:47:18,660 --> 00:47:19,368 Miło cię poznać. 1080 00:47:19,368 --> 00:47:20,490 Mamy więc 20. 1081 00:47:20,490 --> 00:47:21,220 Mniej niż pięć? 1082 00:47:21,220 --> 00:47:21,530 Nie. 1083 00:47:21,530 --> 00:47:22,160 Mniej niż dziewięciu? 1084 00:47:22,160 --> 00:47:22,410 Nie. 1085 00:47:22,410 --> 00:47:23,050 Mniej niż 17 lat? 1086 00:47:23,050 --> 00:47:23,550 Nie. 1087 00:47:23,550 --> 00:47:23,740 OK. 1088 00:47:23,740 --> 00:47:25,701 On należy tu wasze imiona znów są? 1089 00:47:25,701 --> 00:47:26,200 Sue Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID MALAN: Sue. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID MALAN: Sue, Alex, i? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID MALAN: Eric. 1095 00:47:30,120 --> 00:47:32,140 Których ręce muszą uzyskać zaktualizowane pierwszy? 1096 00:47:32,140 --> 00:47:32,930 >> PUBLICZNOŚCI: Eric. 1097 00:47:32,930 --> 00:47:33,429 OK. 1098 00:47:33,429 --> 00:47:35,200 Więc Eric powinien wskazywać na to gdzie? 1099 00:47:35,200 --> 00:47:35,930 W 22. 1100 00:47:35,930 --> 00:47:36,430 Dobry. 1101 00:47:36,430 --> 00:47:38,180 A teraz co dalej? 1102 00:47:38,180 --> 00:47:40,800 Sue może to wskazywać na Erica a teraz, jeśli faceci po prostu 1103 00:47:40,800 --> 00:47:44,077 zrobić trochę miejsca, które jest w porządku wizualnie, teraz zrobiliśmy wprowadzenie. 1104 00:47:44,077 --> 00:47:47,160 Więc teraz rozważyć pytanie, ale dziękuję bardzo za naszych wolontariuszy. 1105 00:47:47,160 --> 00:47:48,090 Bardzo dobra robota. 1106 00:47:48,090 --> 00:47:50,831 Możesz zachować te, jeśli chcesz. 1107 00:47:50,831 --> 00:47:54,140 I mamy piękny pożegnalny prezent jeśli chcesz wziąć każdy lubi piłkę stres. 1108 00:47:54,140 --> 00:47:56,030 Pozwól mi tylko przejść to w dół. 1109 00:47:56,030 --> 00:47:58,430 Więc co jest na wynos z tego? 1110 00:47:58,430 --> 00:48:02,430 To wydaje się być niesamowite o ile mamy teraz 1111 00:48:02,430 --> 00:48:06,360 wprowadził alternatywa Tablica, która nie jest tak ograniczona 1112 00:48:06,360 --> 00:48:07,780 do tablicy pewnej ustalonej wielkości. 1113 00:48:07,780 --> 00:48:09,380 Mogą rozwijać się dynamicznie. 1114 00:48:09,380 --> 00:48:13,220 >> Ale tak jak widzieliśmy w tygodniach przeszłości, nigdy nie dostaniesz nic za darmo, 1115 00:48:13,220 --> 00:48:15,740 jak na pewno nie jest to kompromis tutaj. 1116 00:48:15,740 --> 00:48:18,890 Więc z upside wiązany lista, jest to dynamika? 1117 00:48:18,890 --> 00:48:21,590 Ta zdolność do wzrostu i szczerze mówiąc, mogliśmy zrobić kasowania 1118 00:48:21,590 --> 00:48:23,570 i mogliśmy kurczyć w miarę potrzeb. 1119 00:48:23,570 --> 00:48:24,710 Jaką cenę płacimy? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dwa razy tyle miejsca, przede wszystkim. 1122 00:48:30,340 --> 00:48:34,010 Jeśli spojrzeć na zdjęcie, nie jestem przechowywania listę liczb całkowitych. 1123 00:48:34,010 --> 00:48:36,740 Jestem przechowywania listę całkowite plus wskaźniki. 1124 00:48:36,740 --> 00:48:38,240 Jestem więc podwojenie ilości miejsca. 1125 00:48:38,240 --> 00:48:40,740 Teraz, być może, że nie jest to takie wielkiego, 4 bajty, 8 bajtów, 1126 00:48:40,740 --> 00:48:43,160 ale z pewnością mogą dodać się dla dużych zbiorów danych. 1127 00:48:43,160 --> 00:48:45,570 Co znajduje się w innym minusem? 1128 00:48:45,570 --> 00:48:46,070 Tak? 1129 00:48:46,070 --> 00:48:48,010 >> PUBLICZNOŚCI: Musimy przemierzać je jeden po drugim. 1130 00:48:48,010 --> 00:48:48,760 DAVID MALAN: Tak. 1131 00:48:48,760 --> 00:48:50,260 Musimy przechodzić je jeden po drugim. 1132 00:48:50,260 --> 00:48:53,860 Wiesz co, daliśmy się tym super wygodna funkcja nawiasach kwadratowych 1133 00:48:53,860 --> 00:48:57,240 zapis, bardziej poprawnie znany jako losowego dostępu 1134 00:48:57,240 --> 00:48:59,280 gdzie możemy po prostu skoczyć do pojedynczego elementu 1135 00:48:59,280 --> 00:49:01,470 ale teraz, gdy miałem jeszcze tutaj moje wolontariuszy, 1136 00:49:01,470 --> 00:49:04,660 gdybym chciał znaleźć Numer 22, nie mogę po prostu 1137 00:49:04,660 --> 00:49:06,620 Uchwyt coś przeskoczyć do czegoś. 1138 00:49:06,620 --> 00:49:10,530 Muszę patrzeć na liście, o wiele jak nasze przykłady przeszukiwania liniowo, 1139 00:49:10,530 --> 00:49:12,260 znaleźć numer 22. 1140 00:49:12,260 --> 00:49:14,340 Tak więc wydaje się, że zapłacił nie cenę. 1141 00:49:14,340 --> 00:49:16,430 Ale możemy jednak rozwiązać inne problemy. 1142 00:49:16,430 --> 00:49:18,587 >> W rzeczywistości, pozwól mi przedstawić tylko kilka wizualizacji. 1143 00:49:18,587 --> 00:49:20,920 Więc jeśli już się do Sala jadalna Mather w ostatnim czasie, 1144 00:49:20,920 --> 00:49:23,320 przypomnijmy sobie, że ich stosy tacek takich jak ta, 1145 00:49:23,320 --> 00:49:26,300 pożyczyliśmy je od Annenberg przed klasą. 1146 00:49:26,300 --> 00:49:28,930 Więc ten stos tac, choć, jest przedstawicielem rzeczywiście 1147 00:49:28,930 --> 00:49:30,860 struktury danych informatycznej. 1148 00:49:30,860 --> 00:49:32,910 Jest struktura danych w informatyce 1149 00:49:32,910 --> 00:49:38,010 znany jako stos, który bardzo ładnie nadaje się do dokładnie tego wideo. 1150 00:49:38,010 --> 00:49:41,380 Tak więc, jeśli każdy z tych zasobników nie jest tacy, ale jak liczba i chciałem 1151 00:49:41,380 --> 00:49:45,010 do przechowywania numerów, ja może umieścić jeden tu, 1152 00:49:45,010 --> 00:49:48,320 i mogłem umieścić tu innego, i kontynuować układanie liczb 1153 00:49:48,320 --> 00:49:53,180 na jeden na drugim, a co potencjalnie pomocne na ten temat 1154 00:49:53,180 --> 00:49:55,450 jest to, że to, co jest implikacja tej struktury danych? 1155 00:49:55,450 --> 00:49:58,045 Jaki numer można wyciągnąć Pierwszy najwygodniej? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Ostatnio jeden umieścić tam. 1158 00:50:03,030 --> 00:50:06,430 >> Więc to jest to, co nazywamy w informatyka struktura danych LIFO. 1159 00:50:06,430 --> 00:50:08,070 Trwać, pierwsze wyszło. 1160 00:50:08,070 --> 00:50:10,800 Zobaczymy niebawem, dlaczego które mogą być przydatne, ale teraz, 1161 00:50:10,800 --> 00:50:12,200 tylko za nieruchomość. 1162 00:50:12,200 --> 00:50:15,158 I to jest głupie, jeśli myślisz o tym, jak jadalnia robi. 1163 00:50:15,158 --> 00:50:17,910 Za każdym razem, gdy czyste tace i umieścić najświeższych tych na górze, 1164 00:50:17,910 --> 00:50:22,160 Można mieć wcześniej czyste ale w końcu bardzo brudne i zakurzone 1165 00:50:22,160 --> 00:50:24,360 podajnik na samym dole Jeśli nigdy w rzeczywistości 1166 00:50:24,360 --> 00:50:26,820 dostać się do dołu, że stos, bo ciebie tylko 1167 00:50:26,820 --> 00:50:29,380 utrzymać wprowadzenie nowych i czyste te na wierzchu. 1168 00:50:29,380 --> 00:50:31,840 To samo może się zdarzyć w supermarkecie też. 1169 00:50:31,840 --> 00:50:35,450 Jeśli masz gablotę mleka i za każdym razem CVS 1170 00:50:35,450 --> 00:50:37,610 czy kto dostaje więcej mleka, po prostu wpakować się mleczka 1171 00:50:37,610 --> 00:50:39,880 masz już do tyłu i umieścić te nowe góry, 1172 00:50:39,880 --> 00:50:43,088 będziesz mieć trochę dość nieprzyjemny mleko w końcu struktury danych 1173 00:50:43,088 --> 00:50:46,390 bo to zawsze na dnie lub równoważnie, że zawsze z tyłu. 1174 00:50:46,390 --> 00:50:50,407 >> Ale istnieje inny sposób myślenia o w kolejce danych i na przykład, to. 1175 00:50:50,407 --> 00:50:53,490 Jeśli jesteś jednym z tych ludzi, którzy lubi w kolejce na zewnątrz sklepach Apple 1176 00:50:53,490 --> 00:50:55,610 gdy nowy produkt jest się, jesteś prawdopodobnie 1177 00:50:55,610 --> 00:50:58,780 nie przy użyciu danych stosu Struktura bo Ciebie 1178 00:50:58,780 --> 00:51:03,070 nie zrażać każdy, kto jest w kolejce, aby kupić jakąś nową zabawkę. 1179 00:51:03,070 --> 00:51:06,610 Raczej, prawdopodobnie za pomocą jaki rodzaj struktury danych 1180 00:51:06,610 --> 00:51:10,050 lub jaki rodzaj systemu w świecie rzeczywistym? 1181 00:51:10,050 --> 00:51:13,493 Mam nadzieję, że jest to linia, lub więcej Brytyjski prawidłowo lub bardziej podobny, kolejka. 1182 00:51:13,493 --> 00:51:17,700 I okazuje się, kolejka jest również Struktura danych w informatyce, 1183 00:51:17,700 --> 00:51:19,700 ale kolejka jest bardzo inna nieruchomość. 1184 00:51:19,700 --> 00:51:20,820 To nie LIFO. 1185 00:51:20,820 --> 00:51:21,990 Trwać, pierwsze wyszło. 1186 00:51:21,990 --> 00:51:22,800 Broń Boże. 1187 00:51:22,800 --> 00:51:24,280 To zamiast FIFO. 1188 00:51:24,280 --> 00:51:26,110 Pierwsze weszło, pierwsze wyszło. 1189 00:51:26,110 --> 00:51:27,970 I to jest dobra rzecz dla sprawiedliwości "dobra 1190 00:51:27,970 --> 00:51:30,428 pewnością, gdy jesteś w kolejce się bardzo wcześnie rano. 1191 00:51:30,428 --> 00:51:33,400 Jeśli się tam pierwsze, chcesz wyjść pierwsza, jak również. 1192 00:51:33,400 --> 00:51:35,880 >> A więc wszystkie te dane struktury, kolejki i stosy 1193 00:51:35,880 --> 00:51:39,220 i kiście innych, okazuje ci można myśleć o tym, jak tylko tablicy. 1194 00:51:39,220 --> 00:51:41,820 To jest tablica, może stały rozmiar 4, ale to, że 1195 00:51:41,820 --> 00:51:44,990 być miłe, czy może po prostu pali tace niemal nieskończenie wysokie gdybyśmy 1196 00:51:44,990 --> 00:51:46,780 mają, że wiele tace lub cyfry. 1197 00:51:46,780 --> 00:51:48,840 Więc może chcemy użyć połączonej listy tutaj, 1198 00:51:48,840 --> 00:51:51,800 ale kompromis będzie potencjalnie, że potrzebujemy więcej pamięci, 1199 00:51:51,800 --> 00:51:55,930 zajmuje trochę więcej czasu, ale nie ograniczają wysokość stosu 1200 00:51:55,930 --> 00:51:59,550 podobnie jak gablocie Mather w może ograniczyć rozmiar stosu, 1201 00:51:59,550 --> 00:52:03,117 i tak są to decyzje projektowe lub Opcje dostępne dla nas ostatecznie. 1202 00:52:03,117 --> 00:52:04,950 Więc z tych danych struktury, zaczęliśmy 1203 00:52:04,950 --> 00:52:09,360 widząc nowe górne granice potencjalnie na to, co wcześniej było super szybki 1204 00:52:09,360 --> 00:52:11,260 i gdzie zostawimy od dzisiaj i gdzie 1205 00:52:11,260 --> 00:52:13,200 my nadzieję, że dostać się do jest w środę, będziemy 1206 00:52:13,200 --> 00:52:15,740 zacząć patrzeć na dane struktura, która pozwala nam szukać 1207 00:52:15,740 --> 00:52:18,260 za pośrednictwem danych w czasie końca dziennika ponownie. 1208 00:52:18,260 --> 00:52:21,470 I widzieliśmy, że pamiętam, w tym tygodniu zerowym i jeden z wyszukiwaniem binarnym lub podziału 1209 00:52:21,470 --> 00:52:22,180 i podbić. 1210 00:52:22,180 --> 00:52:26,240 To wraca, a jeszcze lepiej, Święty Graal w tym środę 1211 00:52:26,240 --> 00:52:29,510 będzie pochodzić z struktura danych, która działa dobrze 1212 00:52:29,510 --> 00:52:32,070 i teoretycznie Stała czasowa, w której 1213 00:52:32,070 --> 00:52:34,760 to nie ma znaczenia, ile miliony lub miliardy rzeczy 1214 00:52:34,760 --> 00:52:38,470 mamy w strukturze danych, to będzie zabrać nam stały czas, być może jeden krok 1215 00:52:38,470 --> 00:52:41,387 lub dwa kroki lub 10 kroków, ale stałe numery etapów 1216 00:52:41,387 --> 00:52:42,970 przeszukiwać tej struktury danych. 1217 00:52:42,970 --> 00:52:46,300 Że rzeczywiście będzie święty graal ale o tym w środę. 1218 00:52:46,300 --> 00:52:49,045 Do zobaczenia potem. 1219 00:52:49,045 --> 00:52:53,704 >> [MUZYKI] 1220 00:52:53,704 --> 00:56:08,448