1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Musik zu spielen] 3 00:00:11,261 --> 00:00:12,640 >> David J. MALAN: In Ordnung. 4 00:00:12,640 --> 00:00:14,525 Dies ist CS50. 5 00:00:14,525 --> 00:00:16,009 Und dies ist der Beginn der Woche 5. 6 00:00:16,009 --> 00:00:18,050 Und wie Sie vielleicht bemerkt haben, ein Teil des Materials 7 00:00:18,050 --> 00:00:21,050 ist immer ein wenig mehr komplex, die etwas dichter. 8 00:00:21,050 --> 00:00:24,560 >> Und es ist sehr einfach, vor allem, wenn Sie haben die Angewohnheit seit einiger Zeit, 9 00:00:24,560 --> 00:00:28,600 zu versuchen, die meisten kritzeln alles, was wir tun, sind wir in der Klasse sagen. 10 00:00:28,600 --> 00:00:31,626 Aber erkennen, dass es vielleicht nicht die ideale pädagogischen Ansatz 11 00:00:31,626 --> 00:00:34,250 zu lernen, diese Art von Material, und Material im Allgemeinen. 12 00:00:34,250 --> 00:00:37,250 Und so freuen wir uns, verkünden, dass CS50 eigenen Gheng 13 00:00:37,250 --> 00:00:39,780 Gong begonnen hat, bereiten eine kanonische Satz von Notizen 14 00:00:39,780 --> 00:00:42,100 für den Kurs, die Hoffnung der Das ist das, ein, diese 15 00:00:42,100 --> 00:00:44,030 nicht nur als dienen Referenz und eine Ressource 16 00:00:44,030 --> 00:00:47,410 Material für die Überprüfung und Gehen zurück durch Material, das haben könnte 17 00:00:47,410 --> 00:00:51,230 Sie entkam beim ersten Mal, aber auch so, dass eure Köpfe können mehr 18 00:00:51,230 --> 00:00:53,740 up als unten, wenn es kommt Zeit, Vortrag, 19 00:00:53,740 --> 00:00:56,960 so dass Sie eingreifen könnten mehr nachdenklich, als 20 00:00:56,960 --> 00:00:59,170 mehr scribbly entgegen. 21 00:00:59,170 --> 00:01:02,510 >> Mit dieser sagte, was Sie finden auf die Website ist solche Dokumente wie dieses. 22 00:01:02,510 --> 00:01:04,660 Und beachtet, oben links, gibt es nicht nur ein Inhaltsverzeichnis, 23 00:01:04,660 --> 00:01:06,920 sondern auch Zeit-Codes, die Sie springt sofort 24 00:01:06,920 --> 00:01:09,077 an den entsprechenden Teil in dem Video online. 25 00:01:09,077 --> 00:01:11,410 Und was hier getan hat Chang ist im Wesentlichen dokumentiert 26 00:01:11,410 --> 00:01:13,340 was passiert ist in dieser insbesondere Vortrag. 27 00:01:13,340 --> 00:01:16,370 Und viele der Vorträge sind bereits jetzt online mit dieser URL. 28 00:01:16,370 --> 00:01:20,110 Und wir werden auch weiterhin den Rest veröffentlichen der von dem Ende der Woche, 29 00:01:20,110 --> 00:01:22,380 also nutzen Sie diese Ressource. 30 00:01:22,380 --> 00:01:25,740 >> So ohne weiteres, wir begonnen, wieder abziehen 31 00:01:25,740 --> 00:01:28,180 die Schicht, die gewesen ist String für einige Zeit. 32 00:01:28,180 --> 00:01:30,670 Und was haben wir sagen, eine Zeichenfolge tatsächlich ist in der vergangenen Woche? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 So char Stern. 35 00:01:32,900 --> 00:01:34,900 Char und Sterne, na ja, was hat das eigentlich? 36 00:01:34,900 --> 00:01:37,150 Nun, die ganze Zeit, ob wir wurde eine Funktion aufrufen, 37 00:01:37,150 --> 00:01:40,450 wie getString und Speichern die sogenannte Rück 38 00:01:40,450 --> 00:01:42,910 Wert getString in ein variable-- es heißt 39 00:01:42,910 --> 00:01:47,721 s Art string-- wir haben geschrieben die Codezeile dort oben. 40 00:01:47,721 --> 00:01:49,970 Und es ist nur, wenn ich meine Handschrift hier vergrößert 41 00:01:49,970 --> 00:01:51,930 muss ich erkennen, wie grauenhaft das ist. 42 00:01:51,930 --> 00:01:54,180 >> Aber lassen Sie uns davon ausgehen, dass, auf der rechten Seite 43 00:01:54,180 --> 00:01:57,070 ist dennoch eine sinnvolle Darstellung von dem, was 44 00:01:57,070 --> 00:01:58,880 wurde auf alles los Zeit mit getString. 45 00:01:58,880 --> 00:02:00,380 getString, natürlich, bekommt einen String. 46 00:02:00,380 --> 00:02:01,691 Aber was bedeutet das wirklich? 47 00:02:01,691 --> 00:02:04,190 Es bedeutet, dass es ein Stück bekommt Speicher vom Betriebssystem 48 00:02:04,190 --> 00:02:06,040 durch den Aufruf einer Funktion, genannt malloc. 49 00:02:06,040 --> 00:02:07,390 Aber dazu später mehr. 50 00:02:07,390 --> 00:02:09,139 Und dann füllt sie dass Teil des Speichers 51 00:02:09,139 --> 00:02:11,764 mit den Buchstaben der Benutzer eingegeben wird, gefolgt von der natürlich 52 00:02:11,764 --> 00:02:14,800 ein Null-Zeichen oder Backslash Null am Ende. 53 00:02:14,800 --> 00:02:18,280 >> Dessen auf der linken Seite dieser Geschichte, die ganze Zeit, 54 00:02:18,280 --> 00:02:20,850 wir haben eine Variable deklarieren, wie s. 55 00:02:20,850 --> 00:02:24,770 Und das ist das, was jetzt variable startet Aufruf einen Zeiger. 56 00:02:24,770 --> 00:02:29,190 Es ist nicht ein Feld, innerhalb dessen wir den String, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 sondern in diesem Feld haben wir Box auf der linken Seite, was genau? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Ja? 60 00:02:35,390 --> 00:02:37,118 >> ZIELGRUPPE: Die Adresse wo es im Speicher befindet. 61 00:02:37,118 --> 00:02:38,118 >> David J. MALAN: Genau. 62 00:02:38,118 --> 00:02:40,690 Die Adresse, wo Daven im Speicher abgelegt wird. 63 00:02:40,690 --> 00:02:44,650 Und nicht dort, wo alle Daven befindet, an sich, sondern insbesondere die Adresse 64 00:02:44,650 --> 00:02:45,150 von was? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Ja? 67 00:02:46,810 --> 00:02:47,460 >> ZIELGRUPPE: Erstes Zeichen. 68 00:02:47,460 --> 00:02:50,209 >> David J. MALAN: Das erste Zeichen in Daven, die, in diesem Fall 69 00:02:50,209 --> 00:02:53,820 Ich schlug vor, willkürlich war und unrealistisch 1, Ox1, 70 00:02:53,820 --> 00:02:55,910 das bedeutet nur, die hexadezimale Zahl von 1. 71 00:02:55,910 --> 00:02:57,993 Aber es ist wahrscheinlich um eine viel größere Zahl sein 72 00:02:57,993 --> 00:03:01,260 dass wir vielleicht ziehen mit 0x als Präfix, 73 00:03:01,260 --> 00:03:02,806 die eine hexadezimale Zeichen. 74 00:03:02,806 --> 00:03:05,930 Und weil wir nicht brauchen, zu wissen, wo der Rest der Zeichen Daven 75 00:03:05,930 --> 00:03:09,860 sind, aufgrund dessen, was einfaches Design Entscheidung, die vor vielen Jahren gemacht wurde? 76 00:03:09,860 --> 00:03:10,548 Ja? 77 00:03:10,548 --> 00:03:11,651 >> ZIELGRUPPE: 0 Backslash. 78 00:03:11,651 --> 00:03:12,900 David J. MALAN: Ja, genau. 79 00:03:12,900 --> 00:03:18,100 Der Backslash 0 können Sie, wenn auch in lineare Zeit, um die Zeichenfolge zu durchqueren, 80 00:03:18,100 --> 00:03:20,400 zu Fuß von links nach rechts, mit einer for-Schleife oder eine Weile 81 00:03:20,400 --> 00:03:22,608 Schleife, oder so ähnlich das, und zu bestimmen, oh, hier 82 00:03:22,608 --> 00:03:24,751 ist das Ende dieses bestimmten String. 83 00:03:24,751 --> 00:03:27,000 Also nur mit der Adresse der Beginn einer Zeichenfolge, 84 00:03:27,000 --> 00:03:30,290 können wir die Gesamtheit der Zugang , weil all dies, während, 85 00:03:30,290 --> 00:03:32,030 ein String hat nur ein char Stern. 86 00:03:32,030 --> 00:03:36,370 >> So ist es sicherlich in Ordnung, weiterhin mit der CS50-Bibliothek und diese Abstraktion, 87 00:03:36,370 --> 00:03:38,440 so zu sprechen, aber wir werden beginnen, um genau zu sehen, 88 00:03:38,440 --> 00:03:41,230 was los war unter dieser ganzen Zeit. 89 00:03:41,230 --> 00:03:45,260 So können Sie dieses Beispiel erinnern, Auch vom letzten Mal, zu vergleichen, 0, 90 00:03:45,260 --> 00:03:47,300 was nicht wirklich zu vergleichen. 91 00:03:47,300 --> 00:03:49,070 Aber wir begannen, diese zu lösen. 92 00:03:49,070 --> 00:03:52,020 >> Aber wie vielleicht eine Auffrischung, könnte ich jemanden interessieren 93 00:03:52,020 --> 00:03:54,261 in einem rosa Elefanten heute auch von Chang gemacht? 94 00:03:54,261 --> 00:03:55,760 Wie über Sie vor? [Unverständlich]. 95 00:03:55,760 --> 00:03:56,660 Komm auf. 96 00:03:56,660 --> 00:03:58,740 >> Und in der Zwischenzeit, wie Sie kommen, lassen Sie uns 97 00:03:58,740 --> 00:04:01,670 Betrachten wir für einen Moment, was dieser Code tatsächlich tut. 98 00:04:01,670 --> 00:04:04,917 Es erklärt sich zwei Variablen Top, s und t, und mit der Aufforderung getString. 99 00:04:04,917 --> 00:04:08,250 Dies ist nicht ein sehr benutzerfreundliches Programm, weil sie nicht sagen, was zu tun ist. 100 00:04:08,250 --> 00:04:10,541 Aber lassen Sie uns einfach mal davon aus, wir sind die sich auf die saftigen Teil. 101 00:04:10,541 --> 00:04:14,470 Und dann tun wir, wenn s gleich t entspricht, sollte es printf sagen, 102 00:04:14,470 --> 00:04:16,170 Sie tippte die gleiche Sache. 103 00:04:16,170 --> 00:04:16,670 Hallo. 104 00:04:16,670 --> 00:04:17,050 Wie heißen Sie? 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. MALAN: Janelle, Freut mich, dich kennenzulernen. 107 00:04:19,529 --> 00:04:21,800 So Ihre Herausforderung an Hand für diese Elefanten 108 00:04:21,800 --> 00:04:25,230 ist es, zuerst ziehen uns ein Bild von dem, was ist in den ersten beiden vertreten 109 00:04:25,230 --> 00:04:25,970 Linien. 110 00:04:25,970 --> 00:04:28,139 So s und t sein könnte vertreten, wie auf dem Bildschirm? 111 00:04:28,139 --> 00:04:30,680 Und Sie können einfach ziehen Sie es mit Ihren Finger auf dieser großen Leinwand. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> So gibt es zwei Hälften zu Jede Seite dieser Gleichung. 114 00:04:34,510 --> 00:04:37,760 So gibt es s auf der linken Seite, und dann getstring auf der rechten Seite. 115 00:04:37,760 --> 00:04:40,540 Und dann gibt es t auf der linken Seite, und dann getstring auf der rechten Seite. 116 00:04:40,540 --> 00:04:42,630 Also, wie könnten wir beginnen Zeichnen Sie ein Bild, 117 00:04:42,630 --> 00:04:46,340 stellt dar, was los ist hier in Erinnerung, würden Sie sagen? 118 00:04:46,340 --> 00:04:49,150 Und lassen Sie mich Ihnen erklären, was Sie tun, wie Sie gehen. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: OK. 120 00:04:49,820 --> 00:04:58,890 Nun, zunächst, es wäre zu fragen Sie die Eingabe-String zu bekommen. 121 00:04:58,890 --> 00:05:00,439 Und es wäre Speicher-- oh, sorry. 122 00:05:00,439 --> 00:05:01,230 David J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Gut. 124 00:05:01,730 --> 00:05:03,330 Und dies wird als was? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Weitermachen. 127 00:05:04,450 --> 00:05:05,575 Ich wollte nicht zu unterbrechen. 128 00:05:05,575 --> 00:05:07,060 JANELLE: Sorry. 129 00:05:07,060 --> 00:05:14,237 So würde es sie in Eingangs die Adresse von-- nicht sicher. 130 00:05:14,237 --> 00:05:17,320 Ich kann mich nicht genau erinnern, die Anzahl, aber ich glaube, es wurde mit 0 beginnend. 131 00:05:17,320 --> 00:05:18,420 >> David J. MALAN: Das ist alles richtig, weil ich die Zahlen auf, 132 00:05:18,420 --> 00:05:19,650 so gibt es keine richtige Antwort. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: Beginnend mit der 0 Lichtbogen. 134 00:05:22,105 --> 00:05:24,000 >> David J. MALAN: OK, also Element 0. 135 00:05:24,000 --> 00:05:24,765 Sicher. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: Und dann war, wenn nur wie ein zwei-letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. MALAN: OK, zurück zu Ihnen. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: Also Element 0, und dann Element 1 oder Element 2. 139 00:05:33,629 --> 00:05:36,670 David J. MALAN: Und welches Stück Bild Sie jetzt zeichnen? 140 00:05:36,670 --> 00:05:37,690 Der Aufruf von getString? 141 00:05:37,690 --> 00:05:38,830 Oder die Erklärung von s? 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: Die Erklärung von s, glaube ich. 143 00:05:42,890 --> 00:05:45,980 Oh, die getString, denn es wäre in jedem [eingegeben werden? Bereich. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. MALAN: Gut. 145 00:05:46,510 --> 00:05:47,051 Genau. 146 00:05:47,051 --> 00:05:49,300 Obwohl dies effektiv Gibt ein Array, Rückruf, 147 00:05:49,300 --> 00:05:53,300 wenn wir zurück sind eine Zeichenfolge, können wir Index in diesem String mit 01 und 2. 148 00:05:53,300 --> 00:05:56,180 Technisch sind diese wahrscheinlich von einzelnen Adressen vertreten, 149 00:05:56,180 --> 00:05:57,100 aber das ist in Ordnung. 150 00:05:57,100 --> 00:06:00,170 >> Also nehme, wenn ich nur schnell uns auf, wo wir aufgehört haben 151 00:06:00,170 --> 00:06:04,320 letzten Mal, wenn eine der die Saiten war g a b e, 152 00:06:04,320 --> 00:06:10,337 Backslash 0, so repräsentiert Gabes Eingang, wie könnten wir jetzt stellen s? 153 00:06:10,337 --> 00:06:12,670 Wenn dies der Speicher, ist wurde durch getString zurückgegeben? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> JANELLE: Wäre es durch einen Bogen repräsentiert? 156 00:06:17,610 --> 00:06:18,750 >> David J. MALAN: Mit einem Bogen? 157 00:06:18,750 --> 00:06:19,130 Nun, nein. 158 00:06:19,130 --> 00:06:21,171 Sagen wir einfach, bildhaft, lassen Sie mich einfach weitermachen 159 00:06:21,171 --> 00:06:25,710 und schlagen vor, dass, wenn das S, diese ist der Rückgabewert der getString. 160 00:06:25,710 --> 00:06:29,482 Und Sie dies als 0, 1, 2, die gezeichnet haben ist durchaus sinnvoll, denn wir 161 00:06:29,482 --> 00:06:30,940 können Index in der Zeichenfolge, die als solche. 162 00:06:30,940 --> 00:06:33,340 Aber nur um im Einklang mit der letzten Mal, lassen Sie mich gehen Sie vor 163 00:06:33,340 --> 00:06:37,310 und willkürlich schlagen vor, diese ist die Adresse 1, das ist die Adresse 2, 164 00:06:37,310 --> 00:06:39,597 Dies ist die Adresse 3 und so weiter. 165 00:06:39,597 --> 00:06:41,430 Und so, nur um sein Super- klar, was los ist 166 00:06:41,430 --> 00:06:44,580 in s als Folge der, dass zu gehen erste Codezeile, würden Sie sagen? 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: Adresse 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. MALAN: Genau. 169 00:06:46,420 --> 00:06:47,190 So adressieren 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Und in der Zwischenzeit, lassen Sie mich gehen Sie vor und duplizieren viel von dem, was Sie getan haben, 172 00:06:51,230 --> 00:06:52,740 und fügen Sie meine eigene t hier. 173 00:06:52,740 --> 00:06:56,340 Wenn ich zu geben gabe waren wieder ein zweites Mal, 174 00:06:56,340 --> 00:07:01,530 wenn sie mit getString aufgefordert werden, in denen, ist natürlich gabe hingehen? 175 00:07:01,530 --> 00:07:02,280 Nun, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: Wie hier vor? 178 00:07:05,975 --> 00:07:06,850 David J. MALAN: Ja. 179 00:07:06,850 --> 00:07:08,516 JANELLE: Oder es ist auch in den gleichen Kisten? 180 00:07:08,516 --> 00:07:11,940 David J. MALAN: Lassen Sie mich schlagen, ja, genau, so dass in diesen zusätzlichen Boxen. 181 00:07:11,940 --> 00:07:15,230 Aber was ist jetzt Schlüssel ist, dass, auch obwohl ich diese ziemlich nahe gezogen 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, diese ist in Wirklichkeit 0x2--, 183 00:07:18,650 --> 00:07:25,750 das jetzt vielleicht Adresse 0x10 sein, zum Beispiel, und 0x11 und 0x12, 184 00:07:25,750 --> 00:07:26,870 und so weiter. 185 00:07:26,870 --> 00:07:29,955 Und so, wenn das der Fall ist, was wird hier am Ende in t? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. MALAN: Genau. 188 00:07:31,830 --> 00:07:33,180 Also 0x10. 189 00:07:33,180 --> 00:07:34,570 Und jetzt, letzte Frage. 190 00:07:34,570 --> 00:07:37,510 Sie haben mit Abstand hatte, um die Arbeit härteste für einen Elefanten so weit. 191 00:07:37,510 --> 00:07:42,650 Von jetzt, wenn ich ziehen Sie den Code wieder, wenn ich in Zeile drei, 192 00:07:42,650 --> 00:07:47,630 wenn s gleich t gleich, was bin ich eigentlich Vergleichen, dass wir hier gezeichnet? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: Die beiden Adressen? 194 00:07:49,271 --> 00:07:50,270 David J. MALAN: Genau. 195 00:07:50,270 --> 00:07:53,350 Also ich sage, ist s gleich gleich t? 196 00:07:53,350 --> 00:07:56,210 In anderen Worten ist gleich 1 gleich 10? 197 00:07:56,210 --> 00:07:59,710 Und natürlich die offensichtliche Antwort ist jetzt, nein. 198 00:07:59,710 --> 00:08:02,920 Und so ist dieses Programm letztlich Drucklegung, was würden Sie sagen? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> JANELLE: Wäre es, Sie die gleiche Sache getippt? 201 00:08:08,405 --> 00:08:11,446 >> David J. MALAN: Also, wenn s 1 ist und t 10? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: Sie gaben verschiedene Dinge. 203 00:08:13,320 --> 00:08:13,570 >> David J. MALAN: Genau. 204 00:08:13,570 --> 00:08:14,480 Sie eingegeben haben verschiedene Dinge. 205 00:08:14,480 --> 00:08:14,850 In Ordnung. 206 00:08:14,850 --> 00:08:16,714 So eine Runde Applaus, Wenn wir könnten, hier. 207 00:08:16,714 --> 00:08:17,214 [Applaus] 208 00:08:17,214 --> 00:08:17,708 Das war schmerzhaft. 209 00:08:17,708 --> 00:08:18,208 Ich weiß. 210 00:08:18,208 --> 00:08:19,684 Schön gemacht. 211 00:08:19,684 --> 00:08:24,690 So, jetzt wollen wir mal sehen, ob wir es nicht können necken neben was das Update war. 212 00:08:24,690 --> 00:08:28,040 Und selbstverständlich, wenn man fest this-- Ich werde das jetzt in green-- darstellen 213 00:08:28,040 --> 00:08:29,690 wir haben ein paar Verbesserungen hier. 214 00:08:29,690 --> 00:08:32,409 Zunächst nur als Vernunft überprüfen, ich bin erste Überprüfung 215 00:08:32,409 --> 00:08:35,110 wenn s gleich null und t gleich null. 216 00:08:35,110 --> 00:08:39,440 Und nur klar zu sein, wenn vielleicht s oder t null sein in Code wie diesen? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Wann könnte s oder t null sein. 219 00:08:44,490 --> 00:08:44,990 Ja? 220 00:08:44,990 --> 00:08:45,990 >> ZIELGRUPPE: [unverständlich]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. MALAN: Genau. 223 00:08:50,510 --> 00:08:52,840 Wenn die Zeichenkette, die der Benutzer eingegeben ist viel zu lange 224 00:08:52,840 --> 00:08:56,140 um in den Speicher passen, oder einige seltsame Ecke Fall so, 225 00:08:56,140 --> 00:08:59,010 getstring, wie wir sehen werden, wörtlich heute, in der Dokumentation, 226 00:08:59,010 --> 00:09:02,330 sagt, es wird null zurück, wie eine spezielle Wächter-Wert, 227 00:09:02,330 --> 00:09:05,417 oder einfach irgendwie ein spezielles Symbol das bedeutet, dass etwas schief gelaufen ist. 228 00:09:05,417 --> 00:09:07,500 So überprüfen möchten wir dass, da es sich heraus 229 00:09:07,500 --> 00:09:09,720 dass null ist ein sehr gefährlicher Wert. 230 00:09:09,720 --> 00:09:14,250 >> Oft, wenn Sie versuchen, etwas zu tun mit null mit einer function-- Leiten 231 00:09:14,250 --> 00:09:17,470 als Eingabe für diese Funktion instance-- könnte sehr abstürzen und mit ihr, 232 00:09:17,470 --> 00:09:19,090 nehmen Sie Ihre ganze Programm. 233 00:09:19,090 --> 00:09:22,570 Also das dritte Linie ist jetzt nur eine Vernunft zu überprüfen, Fehlerprüfung, wenn man so will. 234 00:09:22,570 --> 00:09:25,450 Das ist eine gute Angewohnheit, sich jetzt für uns, in jeder Zeit erhalten wir 235 00:09:25,450 --> 00:09:28,050 versuchen, einen Wert zu verwenden, die könnte möglicherweise auch null sein. 236 00:09:28,050 --> 00:09:32,000 >> Jetzt, in der vierten Zeile hier, "Wenn strcmp (s, t):" Nun, 237 00:09:32,000 --> 00:09:33,180 was ist das bezieht? 238 00:09:33,180 --> 00:09:36,750 Nun haben wir gesagt, das war ein sehr prägnant benannte Funktion für String-Vergleich. 239 00:09:36,750 --> 00:09:40,370 Und seinen Zweck im Leben ist, zu vergleichen erstes Argument gegen sie zweite, 240 00:09:40,370 --> 00:09:44,640 aber nicht in Bezug auf ihre Adressen, wie wir unbeabsichtigt ein Moment 241 00:09:44,640 --> 00:09:48,270 vor mit dem roten Code, aber eher auf diese beiden vergleichen 242 00:09:48,270 --> 00:09:53,210 Zeichenfolgen in der menschlich intuitive Weise durch Vergleich dieser vor diesem, 243 00:09:53,210 --> 00:09:56,690 dagegen, gegen diese, und dann stoppen, ob und wann ein 244 00:09:56,690 --> 00:09:59,590 oder beide meine Finger trifft einen Backslash 0. 245 00:09:59,590 --> 00:10:04,530 So jemand vor Jahren umgesetzt strcmp für uns die Funktionalität implementieren 246 00:10:04,530 --> 00:10:08,890 dass wir hoffen, wir bekommen haben nur durch den Vergleich von zwei einfache Werte. 247 00:10:08,890 --> 00:10:14,929 >> Nun ehrlich gesagt, halte ich Zeichnung Alle diese verschiedenen Zahlen. 248 00:10:14,929 --> 00:10:17,470 Aber die Realität ist, ich habe machen diese die ganze Zeit. 249 00:10:17,470 --> 00:10:19,580 Und so lassen Sie mich einfach weitermachen und kritzeln diese aus 250 00:10:19,580 --> 00:10:23,100 um einen Punkt zu machen, dass am Ende des Tages und vorwärts, 251 00:10:23,100 --> 00:10:30,160 wir nicht wirklich zu interessieren welche Adressen sind die Dinge tatsächlich 252 00:10:30,160 --> 00:10:30,790 im Speicher. 253 00:10:30,790 --> 00:10:34,320 Also ich bin nicht dabei, diese zu zeichnen Arten von Zahlen so viel mehr, 254 00:10:34,320 --> 00:10:38,970 Ich bin nur ein abstrakter diese weg ein wenig freundlicher mit nur Pfeile. 255 00:10:38,970 --> 00:10:42,060 >> In anderen Worten, wenn s ist ein Zeiger, Nun, lassen Sie es gerade zu ziehen, buchstäblich, 256 00:10:42,060 --> 00:10:45,430 als ein Zeiger, ein Pfeil von sich selbst zu etwas anderem, 257 00:10:45,430 --> 00:10:48,280 und nicht zu viel Sorgen machen die Minutien dieser Adressen 258 00:10:48,280 --> 00:10:49,910 die wiederum habe ich sowieso. 259 00:10:49,910 --> 00:10:52,680 Aber wir werden diese Adressen sehen manchmal, wenn Debugging-Code. 260 00:10:52,680 --> 00:10:56,450 >> Jetzt inzwischen dieses Programm hier Korrekturen, natürlich, 261 00:10:56,450 --> 00:10:58,720 dieses Problem durch Vergleich diese beiden Saiten. 262 00:10:58,720 --> 00:11:00,260 Aber wir liefen in einem anderen Problem. 263 00:11:00,260 --> 00:11:03,180 Dies war von der Kopie programmieren letzten Mal, 264 00:11:03,180 --> 00:11:06,880 wobei, ich habe versucht zu kapitalisieren nur das erste Zeichen in einem String. 265 00:11:06,880 --> 00:11:09,620 Aber was war das Symptom wir letztes Mal sah, wenn 266 00:11:09,620 --> 00:11:14,150 ein Benutzer einen Wert eingegeben, wie gabe in Kleinbuchstaben, für s, 267 00:11:14,150 --> 00:11:19,310 dann haben wir zugewiesen s in t, wie in der dritten Zeile befinden, 268 00:11:19,310 --> 00:11:22,900 und dann habe ich versucht, Kapital t Halterung 0? 269 00:11:22,900 --> 00:11:25,950 Was war die Wirkung der Ändern t Halterung 0 hier? 270 00:11:25,950 --> 00:11:27,150 >> ZIELGRUPPE: Es änderte s. 271 00:11:27,150 --> 00:11:29,360 >> David J. MALAN: Ja, Ich änderte s, wie gut. 272 00:11:29,360 --> 00:11:31,050 Denn das, was wirklich los war? 273 00:11:31,050 --> 00:11:34,130 Nun, lassen Sie mich sehen, ob ich reinigen kann bis dieses Bild, wie folgt. 274 00:11:34,130 --> 00:11:41,390 >> Wenn s wieder das Wort g, a, b, e, Schrägstrich, 0 und S, 275 00:11:41,390 --> 00:11:44,084 wir Zeichnung als Feld weiter Hier, aber nicht mehr Adressen. 276 00:11:44,084 --> 00:11:45,250 Lassen Sie uns aufhören, Dinge. 277 00:11:45,250 --> 00:11:47,510 Lassen Sie uns einfach ein Bild zeichnen , um die Welt zu vereinfachen. 278 00:11:47,510 --> 00:11:52,640 >> Wenn ich erklären t mit String t, das schafft, dass Teil des Speichers. 279 00:11:52,640 --> 00:11:55,850 Platz passiert mit 32 sein Bits in den meisten Computern. 280 00:11:55,850 --> 00:11:59,530 In der Tat, wenn Sie jemals von einem gehört habe Computer mit einer 32-Bit-Architektur, 281 00:11:59,530 --> 00:12:03,000 wirklich Lust-sprechen, dass nur bedeutet dies, verwendet 32-Bit-Adressen. 282 00:12:03,000 --> 00:12:05,370 Und als technischer beiseite, Wenn Sie sich jemals gefragt haben 283 00:12:05,370 --> 00:12:09,630 warum ältere Computer, wenn Sie tatsächlich Suppe sie mit viel RAM versucht, 284 00:12:09,630 --> 00:12:12,360 konnte nur maximal haben vier Gigabyte RAM, 285 00:12:12,360 --> 00:12:14,860 auch das ist, weil buchstäblich nur Ihrem alten Computer konnte 286 00:12:14,860 --> 00:12:17,250 zählen so hoch wie 4 Milliarden, 4 Milliarden Bytes, 287 00:12:17,250 --> 00:12:20,590 denn es wurde unter Verwendung von 32-Bit- Zahlen für Adressen. 288 00:12:20,590 --> 00:12:23,260 >> Aber in jedem Fall in diesem Beispiel Geschichte ist viel einfacher. 289 00:12:23,260 --> 00:12:27,250 t ist nur ein weiterer Zeiger oder wirklich ein char Sterne, auch bekannt als String. 290 00:12:27,250 --> 00:12:30,860 Und wie will ich dieses Bild zu aktualisieren jetzt mit dieser zweite Codezeile, 291 00:12:30,860 --> 00:12:31,950 nach dem Punkt, Punkt, Punkt? 292 00:12:31,950 --> 00:12:35,845 Wenn ich String t gleich s Semikolon, wie funktioniert das Bild ändern? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Ja? 295 00:12:38,000 --> 00:12:38,916 >> ZIELGRUPPE: [unverständlich]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. MALAN: Ja. 298 00:12:42,020 --> 00:12:42,600 Genau. 299 00:12:42,600 --> 00:12:45,620 Ich habe nur einen Pfeil von der t-Box an die gleiche Adresse, 300 00:12:45,620 --> 00:12:47,570 die gleichen ersten Buchstaben gab. 301 00:12:47,570 --> 00:12:50,850 Oder technisch wenn diese Kerl noch auf 0x1, 302 00:12:50,850 --> 00:12:53,052 es ist, als hätte ich 0x1 hier und hier 0x1. 303 00:12:53,052 --> 00:12:54,760 Aber noch einmal, wer sich interessiert über die Adressen? 304 00:12:54,760 --> 00:12:56,345 Es ist nur die Idee, die jetzt zählt. 305 00:12:56,345 --> 00:12:57,720 Also das ist, was hier passiert. 306 00:12:57,720 --> 00:13:02,690 So natürlich, wenn Sie das tun t Halterung 0, der Array-Notation ist, 307 00:13:02,690 --> 00:13:05,650 von course-- und ehrlich gesagt, es sieht als gäbe es eine Reihe hier, 308 00:13:05,650 --> 00:13:07,340 aber jetzt gibt es diese seltsame Sache. 309 00:13:07,340 --> 00:13:11,160 Wissen, dass die Programmiersprache, C, bietet Ihnen diese Funktion, 310 00:13:11,160 --> 00:13:14,650 wobei, wenn t eine Zeiger oder S ist ein Zeiger, 311 00:13:14,650 --> 00:13:18,050 Sie können immer noch, dass die vertrauten, komfortable eckige Klammer 312 00:13:18,050 --> 00:13:22,520 Notation zu dem ersten Element zu gehen, oder das zweite Element oder ein Element 313 00:13:22,520 --> 00:13:26,130 dass dieser Zeiger zeigt auf, weil sie vermutlich 314 00:13:26,130 --> 00:13:29,410 ist, wie in diesem Fall, zeigt an einigen Array. 315 00:13:29,410 --> 00:13:30,340 >> So, wie wir dieses Problem beheben? 316 00:13:30,340 --> 00:13:33,660 Ehrlich gesagt, ist dies, wo es wurde ein wenig überwältigend auf den ersten Blick. 317 00:13:33,660 --> 00:13:35,340 Aber hier ist eine neue und verbesserte Version. 318 00:13:35,340 --> 00:13:37,460 >> Also zuerst, ich bin immer der CS50-Bibliothek zu befreien, 319 00:13:37,460 --> 00:13:41,170 nur um tatsächlich aussetzen, daß s ein char Sterne, nur ein Synonym. 320 00:13:41,170 --> 00:13:43,540 Und T ist auch ein Zeichen Stern. 321 00:13:43,540 --> 00:13:48,290 Aber, was los ist auf der rechten Seite dieser Linie 322 00:13:48,290 --> 00:13:49,970 wobei t ein Wert zugewiesen wird? 323 00:13:49,970 --> 00:13:50,790 >> Was ist malloc? 324 00:13:50,790 --> 00:13:51,630 Was es strlen? 325 00:13:51,630 --> 00:13:52,547 Was ist sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Warum zum Teufel tut dies Linie Blick so kompliziert? 327 00:13:54,380 --> 00:13:55,713 Wie ist es zu tun auf einem hohen Niveau? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Wie ist es zu speichern in t? 330 00:13:57,440 --> 00:13:58,646 Ja? 331 00:13:58,646 --> 00:14:01,104 ZIELGRUPPE: Es ist eine Zuweisung bestimmte Menge an Speicherplatz. 332 00:14:01,104 --> 00:14:03,032 Es ist zu speichern, glaube ich, Briefe [unverständlich]. 333 00:14:03,032 --> 00:14:04,032 >> David J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfekt. 335 00:14:04,540 --> 00:14:06,650 Es Zuweisen eines bestimmten Menge an Speicherplatz 336 00:14:06,650 --> 00:14:08,940 zu speichern, vermutlich, Zukunft Buchstaben. 337 00:14:08,940 --> 00:14:11,310 Und insbesondere malloc wird daher der Rückkehr, was? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> ZIELGRUPPE: Rückkehr auf die [unverständlich]? 340 00:14:14,851 --> 00:14:15,850 David J. MALAN: Genau. 341 00:14:15,850 --> 00:14:18,850 Rücksendung der Adresse dieses Speicher, das ist eine andere Art zu sagen, 342 00:14:18,850 --> 00:14:21,640 liefert die Adresse, die ersten Bytes dieses Speichers. 343 00:14:21,640 --> 00:14:25,460 Die Last ist auf mich zu erinnern, wie viel Speicher ich eigentlich 344 00:14:25,460 --> 00:14:27,140 zugeteilt oder fragte malloc für. 345 00:14:27,140 --> 00:14:28,384 >> Nun, wie viel ist das? 346 00:14:28,384 --> 00:14:30,550 Nun, obwohl es viele Klammern hier, 347 00:14:30,550 --> 00:14:32,970 malloc dauert nur ein einziges Argument. 348 00:14:32,970 --> 00:14:37,250 Und ich bin Angabe strlen von s, so geben mir so viele Bytes, wie es in s, 349 00:14:37,250 --> 00:14:37,800 aber eins. 350 00:14:37,800 --> 00:14:38,300 Warum? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Ja? 353 00:14:39,530 --> 00:14:40,840 >> ZIELGRUPPE: Der Backslash 0. 354 00:14:40,840 --> 00:14:41,840 David J. MALAN: Genau. 355 00:14:41,840 --> 00:14:43,423 Wir müssen ein wenig Hauswirtschaft zu tun. 356 00:14:43,423 --> 00:14:45,970 Also, da gibt es einen umgekehrten Schrägstrich 0, würden wir besser daran erinnern. 357 00:14:45,970 --> 00:14:47,310 Sonst werden wir um eine Zeichenfolge zu erstellen, die 358 00:14:47,310 --> 00:14:49,170 nicht über diese besonderen Terminator. 359 00:14:49,170 --> 00:14:52,640 >> Inzwischen, nur um sein Super- anal, ich habe sizeof (char), 360 00:14:52,640 --> 00:14:55,730 den Fall, jemand läuft mein Code nicht auf dem CS50-Appliance, 361 00:14:55,730 --> 00:14:58,220 aber vielleicht ein anderer Computer insgesamt, wo Zeichen 362 00:14:58,220 --> 00:15:01,470 sind ein Byte, durch Konvention, sondern zwei Byte, oder etwas größer als die. 363 00:15:01,470 --> 00:15:04,490 Es ist einfach super zu sein, Super abgeneigt Fehler. 364 00:15:04,490 --> 00:15:06,940 Obwohl in der Realität ist es wahrscheinlich werde eine 1. 365 00:15:06,940 --> 00:15:11,490 >> Nun, mittlerweile, ich voran gehen und kopieren Sie die String, t Bügel i gleich t s Halterung. 366 00:15:11,490 --> 00:15:14,962 Und ich werde zum letzten Woche verschieben Source-Code, um zu sehen, was los ist. 367 00:15:14,962 --> 00:15:17,670 Aber der Schlüssel zum Mitnehmen, und die Grund ich den Code jetzt in grün, 368 00:15:17,670 --> 00:15:22,520 Denn dieser letzten Zeile, t Klammer gleich 0 toupper, 369 00:15:22,520 --> 00:15:25,230 hat die Wirkung, Kapitalisierung, die Schnur? 370 00:15:25,230 --> 00:15:26,960 t und / oder s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Das letzte Codezeile. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Nur T, weil das, was ist passiert dieses Mal, 375 00:15:35,560 --> 00:15:41,500 wenn ich diesen letzten Schritt leicht rückgängig zu machen, Was ist passiert, wenn ich rufe malloc, 376 00:15:41,500 --> 00:15:45,380 Ich bekomme im Wesentlichen ein Teil des Speichers Das ist dieselbe Größe wie das Original, 377 00:15:45,380 --> 00:15:47,020 denn das ist die Arithmetik habe ich getan. 378 00:15:47,020 --> 00:15:50,920 Ich Speicherung in t der Adresse dieser Teil des Speichers. 379 00:15:50,920 --> 00:15:53,370 Auch wenn dies sieht nett aus und hübsch, schön und leer, 380 00:15:53,370 --> 00:15:56,882 die Realität ist es, was wir halten Sie fordern, Müll Werte in hier. 381 00:15:56,882 --> 00:15:59,340 Das Stück Speicher kann sehr auch wurden bereits verwendet, 382 00:15:59,340 --> 00:16:00,940 ein paar Sekunden, vor ein paar Minuten. 383 00:16:00,940 --> 00:16:04,410 So könnte es durchaus sein, Zahlen oder Buchstaben da, nur durch Zufall. 384 00:16:04,410 --> 00:16:08,580 Aber sie sind nicht gültig, bis ich mich bevölkern diese Teil des Speichers 385 00:16:08,580 --> 00:16:12,510 mit den tatsächlichen Zeichen, wie ich zu tun, dass in for-Schleife gibt. 386 00:16:12,510 --> 00:16:13,180 In Ordnung? 387 00:16:13,180 --> 00:16:16,180 >> So, jetzt der Höhepunkt der Diese drei Beispiele 388 00:16:16,180 --> 00:16:20,730 , die scheinbar letzte Mal gebrochen wurden, Dieser Swap beispielsweise die Funktion 389 00:16:20,730 --> 00:16:23,670 im Sinne gearbeitet daß sie vertauscht und b. 390 00:16:23,670 --> 00:16:25,620 Aber es hat nicht in welche anderen Sinn zu arbeiten? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Ja? 393 00:16:28,614 --> 00:16:29,612 >> ZIELGRUPPE: [unverständlich]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. MALAN: Genau. 396 00:16:36,700 --> 00:16:39,530 Wenn ich diese Funktion aufrufen another-- von etwa 397 00:16:39,530 --> 00:16:42,870 von einer Funktion wie Main, wo Ich habe eine Variable, x und y, wie ich 398 00:16:42,870 --> 00:16:46,160 letzte Woche, gleiche Code, und ich pass in x und y 399 00:16:46,160 --> 00:16:49,860 zu tauschen, und rufen Sie dann diese Swap--, Natürlich ist die richtige Version 400 00:16:49,860 --> 00:16:52,220 ist das, was wir über den du see-- es hat nicht funktioniert. 401 00:16:52,220 --> 00:16:53,770 Was ist also die Lösung? 402 00:16:53,770 --> 00:16:56,850 >> Nun, so einfach zu sein klar, lass mich gehen Sie vor 403 00:16:56,850 --> 00:17:05,450 und-- geben mir 1 Sekunde hier und sehen wenn ich Ihnen die letzte, zu zeigen, welche 404 00:17:05,450 --> 00:17:12,464 werden sehen, ob ich finden kann in-- lassen diese reale fast-- OK, [unverständlich]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, da ist es. 407 00:17:19,240 --> 00:17:21,000 So ignorieren die Befehle, die ich bin nur die Eingabe. 408 00:17:21,000 --> 00:17:23,780 Ich will, dass es bei abrufen die letzte Minute ein Beispiel 409 00:17:23,780 --> 00:17:27,960 vom letzten Mal, die ist nun nicht Swap genannt. 410 00:17:27,960 --> 00:17:30,200 >> Also kein Swap ist, wo wir aufgehört haben beim letzten Mal, 411 00:17:30,200 --> 00:17:32,930 wobei initialisiert I x 1 und y 2. 412 00:17:32,930 --> 00:17:35,840 Ich habe dann Makeln, vorbei in 1 und 2. 413 00:17:35,840 --> 00:17:37,930 Und dann diese Funktion in gewisser Weise bearbeitet, 414 00:17:37,930 --> 00:17:40,750 aber es hatte keine bleib Wirkung auf x und y. 415 00:17:40,750 --> 00:17:45,430 So ist die Frage bei der Hand ist, wie jetzt wissen wir eigentlich dieses Problem zu beheben? 416 00:17:45,430 --> 00:17:47,820 Was ist die Lösung zur Hand? 417 00:17:47,820 --> 00:17:53,150 >> Nun, in swap.c, die heute neu ist, ist, feststellen, ein paar Unterschiede. 418 00:17:53,150 --> 00:17:54,700 x und y sind gleich. 419 00:17:54,700 --> 00:17:57,250 Aber was ist eindeutig anders an Linie 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Was ist neu da, wenn Sie sich erinnern wie es aussah vor einer Sekunde? 422 00:18:01,715 --> 00:18:02,565 >> ZIELGRUPPE: [unverständlich]. 423 00:18:02,565 --> 00:18:03,440 >> David J. MALAN: Ja. 424 00:18:03,440 --> 00:18:06,680 Also die kaufmännische und-Zeichen sind ein neues Stück Syntax nicht nur in diesem Programm, 425 00:18:06,680 --> 00:18:08,560 sondern auch generell in CS50. 426 00:18:08,560 --> 00:18:10,680 Bis heute glaube ich nicht, wir haben keine Beispiele gesehen 427 00:18:10,680 --> 00:18:14,070 oder wirklich sprach über sie in jeder Detail, andere als, vielleicht, präventiv 428 00:18:14,070 --> 00:18:16,467 im Schnitt, ein kaufmännisches wie diese. 429 00:18:16,467 --> 00:18:19,300 Nun stellt sich heraus, Et-Zeichen ist eine der letzten Stücke der neuen Syntax 430 00:18:19,300 --> 00:18:20,174 wir gehen zu lernen. 431 00:18:20,174 --> 00:18:23,500 Alles, was es bedeutet, ist die Adresse einer Variablen. 432 00:18:23,500 --> 00:18:25,070 An welche Adresse muss x leben? 433 00:18:25,070 --> 00:18:26,510 Aber welche Adresse muss y leben? 434 00:18:26,510 --> 00:18:28,700 Weil, wenn der Grundproblem vor 435 00:18:28,700 --> 00:18:32,970 , dass x und y wurden bestanden Kopien, was wir wirklich tun wollen 436 00:18:32,970 --> 00:18:38,780 mit wie einen Schatz bieten Swap Karte, die in der x und y führt tatsächlich 437 00:18:38,780 --> 00:18:41,910 im RAM, so dass Swap kann diese Karte folgen 438 00:18:41,910 --> 00:18:47,760 und gehen dorthin, wo x oder y markiert die Stelle und ändern Sie die Ist-Werte 1 und 2 439 00:18:47,760 --> 00:18:48,270 da. 440 00:18:48,270 --> 00:18:50,710 >> So tauschen muss auch etwas ändern. 441 00:18:50,710 --> 00:18:53,760 Auf den ersten Blick könnte dies scheinen ein wenig ähnlich char Stern. 442 00:18:53,760 --> 00:18:54,850 Und in der Tat ist es. 443 00:18:54,850 --> 00:18:59,635 So eine ist ein Zeiger auf welche Art von Daten, auf der Grundlage dieser markierten Teil? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Es ist also ein int. 446 00:19:01,620 --> 00:19:04,880 >> So eine ist nicht mehr ein int, es ist die Adresse einer int. 447 00:19:04,880 --> 00:19:07,910 Und ähnlich, b jetzt gehen um die Adresse einer int sein. 448 00:19:07,910 --> 00:19:12,470 Also, wenn ich jetzt Makeln von Main, Ich werde nicht zu Swap 1 und 2 geben. 449 00:19:12,470 --> 00:19:15,540 Ich werde es wie geben Ochsen etwas und Ox-etwas, 450 00:19:15,540 --> 00:19:19,820 zwei Adressen, die führen wird Tauschen, um ihren tatsächlichen Standort 451 00:19:19,820 --> 00:19:21,310 im Speicher meines Computers. 452 00:19:21,310 --> 00:19:25,580 >> So, jetzt meine restlichen Umsetzung muss ein bisschen ändern. 453 00:19:25,580 --> 00:19:28,650 Was ist nun offensichtlich anders in diesen drei Zeilen Code? 454 00:19:28,650 --> 00:19:31,350 Es ist diese verdammte alle Sterne über dem Platz, alles in Ordnung? 455 00:19:31,350 --> 00:19:33,014 Also, was ist denn hier los? 456 00:19:33,014 --> 00:19:33,514 Ja? 457 00:19:33,514 --> 00:19:35,055 >> ZIELGRUPPE: Es ist offensichtlich [unverständlich]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. MALAN: Genau. 460 00:19:37,990 --> 00:19:41,560 Also in diesem context-- und das war nicht die beste Design-Entscheidung, zugegeben, 461 00:19:41,560 --> 00:19:42,530 vor Jahren. 462 00:19:42,530 --> 00:19:45,110 In diesem Zusammenhang, wo Sie müssen nur einen Stern, 463 00:19:45,110 --> 00:19:48,240 und Sie haben keinen Datentyp, wie int, sofort nach links, 464 00:19:48,240 --> 00:19:53,146 sondern Sie haben ein Gleichheitszeichen, klar, in diesem Zusammenhang, wenn Sie sagen, ein Stern, 465 00:19:53,146 --> 00:19:56,980 das bedeutet, lesen Sie den Adresse, die in einem ist. 466 00:19:56,980 --> 00:19:58,870 Folgen Sie der Schatzkarte, so zu sprechen. 467 00:19:58,870 --> 00:20:01,720 >> Und in der Zwischenzeit, in Zeile 37, es bedeutet, die gleiche Sache. 468 00:20:01,720 --> 00:20:05,460 Rufen Sie die Adresse ein, und setzen, was da? 469 00:20:05,460 --> 00:20:09,520 Was auch immer bei der ist Standort, b gibt. 470 00:20:09,520 --> 00:20:10,980 In anderen Worten, zu gehen b. 471 00:20:10,980 --> 00:20:12,130 Holen Sie sich diesen Wert. 472 00:20:12,130 --> 00:20:15,620 Gehen Sie zu einem, und je die Gleich unterzeichnen, der Zuweisungsoperator, 473 00:20:15,620 --> 00:20:17,010 setzen, dass es Wert. 474 00:20:17,010 --> 00:20:19,272 >> Ebenso ist int Temp nur ein int. 475 00:20:19,272 --> 00:20:20,730 Nichts muss über Temperatur ändern. 476 00:20:20,730 --> 00:20:24,810 Es ist nur ein Ersatzglas von Annenberg um etwas Milch oder Orangensaft. 477 00:20:24,810 --> 00:20:27,630 Aber ich muss sagen, gehen Sie zu b. 478 00:20:27,630 --> 00:20:31,449 Gehen Sie zu diesem Ziel und setzen Sie den Wert in Temp dort. 479 00:20:31,449 --> 00:20:32,490 Also, was ist dann passiert? 480 00:20:32,490 --> 00:20:36,540 Wenn ich tatsächlich Makeln dieser Zeit, wenn diese erste Fach hier stellt Main, 481 00:20:36,540 --> 00:20:42,270 Diese zweite Schale stellt Swap, wenn Ich gehe Et-Zeichen und das kaufmännische x y 482 00:20:42,270 --> 00:20:47,150 von Main zu tauschen, nur klar zu sein, was ist das Stapelrahmen Empfangs? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Ja? 485 00:20:49,200 --> 00:20:50,180 >> ZIELGRUPPE: [unverständlich]. 486 00:20:50,180 --> 00:20:51,180 David J. MALAN: Genau. 487 00:20:51,180 --> 00:20:53,129 Die Adresse x und die Adresse y. 488 00:20:53,129 --> 00:20:55,170 Und Sie von diesen denken kann wie Postanschriften. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street und 35 Oxford Street, und Sie 490 00:20:58,772 --> 00:21:01,230 wollen die beiden Gebäude zu bewegen , die an diesen Stellen sind. 491 00:21:01,230 --> 00:21:04,680 >> Es ist eine Art lächerliche Idee, aber das ist alles, was wir damit meinen Adresse. 492 00:21:04,680 --> 00:21:07,000 Wo in der Welt kann man diese zwei ints finden? 493 00:21:07,000 --> 00:21:09,470 Wo in der Welt kann man finden die beiden Gebäude? 494 00:21:09,470 --> 00:21:15,170 Also, wenn endlich, nach all dieser Zeit habe ich gehen in der heutigen Quellcode und kompilieren 495 00:21:15,170 --> 00:21:22,110 Swap-und Lauf ./swap schließlich für die ersten Mal sehen wir eigentlich, dass 496 00:21:22,110 --> 00:21:25,330 meine Werte haben in der Tat erfolgreich getauscht. 497 00:21:25,330 --> 00:21:30,860 Und jetzt können wir sogar Kenntnis von diesem in, sagen wir, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Lassen Sie mich also in die gleiche Datei zu gehen. 499 00:21:32,740 --> 00:21:35,010 Lassen Sie mich gehen Sie vor und führen Sie gdb von ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Und jetzt, im Swap, ich werde gehen voraus und einen Haltepunkt setzen in Main. 502 00:21:40,547 --> 00:21:42,630 Und jetzt werde ich gehen vor, und führen Sie das Programm. 503 00:21:42,630 --> 00:21:45,810 Und jetzt sehen wir, mein Code blieb an dieser Linie. 504 00:21:45,810 --> 00:21:48,330 >> Wenn ich weiter und Druck gehen x, was soll ich hier sehen? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Es ist eine Frage. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Wieder sagen? 509 00:21:51,530 --> 00:21:52,295 >> ZIELGRUPPE: [unverständlich]. 510 00:21:52,295 --> 00:21:53,910 >> David J. MALAN: So Zufallszahlen, vielleicht. 511 00:21:53,910 --> 00:21:56,010 Vielleicht bekomme ich das Glück, und es ist schön und einfach, wie 0. 512 00:21:56,010 --> 00:21:57,230 Aber vielleicht ist es einige Zufallszahl. 513 00:21:57,230 --> 00:21:58,090 In diesem Fall hatte ich Glück. 514 00:21:58,090 --> 00:21:59,030 Es passiert einfach zu 0 sein. 515 00:21:59,030 --> 00:22:00,780 Aber es ist in der Tat Glück, denn nicht, bis ich 516 00:22:00,780 --> 00:22:06,280 Geben Sie auf Weiter und dann print x hat, dass Code-Zeile, Zeile 19, ausgeführt wurde. 517 00:22:06,280 --> 00:22:10,942 >> Inzwischen, wenn ich schreibe nächste wieder, und Drucken Sie nun y, werde ich sehen 2. 518 00:22:10,942 --> 00:22:13,900 Nun, wenn ich schreibe nächsten, es ist zu gehen ein wenig verwirrend, denn jetzt, 519 00:22:13,900 --> 00:22:17,250 printf wird am erscheinen der Bildschirm, wie es getan hat. x 1 ist. 520 00:22:17,250 --> 00:22:18,606 >> Das machen wir wieder. 521 00:22:18,606 --> 00:22:20,480 Und jetzt, hier, wo Dinge interessant. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Bevor ich Makeln oder sogar Schritt hinein, lassen Sie uns einen kleinen Einblick. 524 00:22:26,580 --> 00:22:28,980 x ist wiederum 1. 525 00:22:28,980 --> 00:22:33,240 Y ist natürlich, schnell Vernunft überprüfen, 2, so gibt es nicht schwer. 526 00:22:33,240 --> 00:22:35,740 Aber was ist Kaufmanns-x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Antwort, es ist irgendwie funky suchen. 529 00:22:39,350 --> 00:22:43,500 Aber die int Sterne in Klammern ist nur BIP Art zu sagen, das ist eine Adresse. 530 00:22:43,500 --> 00:22:48,290 Es ist nicht ein int, es ist ein Zeiger auf eine int, oder anders als Adresse bekannt. 531 00:22:48,290 --> 00:22:49,742 >> Was ist das verrückte Sache? 532 00:22:49,742 --> 00:22:51,825 Wir haben noch nie etwas gesehen ganz so vor. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Also das ist die Adresse in meinem Computer Speicher, wobei x passiert, zu leben. 535 00:22:58,120 --> 00:22:59,040 Es ist etwas, Ox-. 536 00:22:59,040 --> 00:23:01,290 Und das ist, ehrlich gesagt, warum Ich habe Pfeile zeichnen begann, 537 00:23:01,290 --> 00:23:03,340 anstelle von Zahlen, denn wer kümmert sich wirklich 538 00:23:03,340 --> 00:23:06,890 int, dass Ihr an einem bestimmten Adresse, die so groß ist. 539 00:23:06,890 --> 00:23:12,160 Aber bffff0c4 sind diese alle Tat hexadezimalen Ziffern, 540 00:23:12,160 --> 00:23:13,720 die durch f 0 sind. 541 00:23:13,720 --> 00:23:16,590 >> Also wir gehen nicht zu wohnen lange auf das, was diese Dinge sind. 542 00:23:16,590 --> 00:23:19,400 Aber wenn ich ausdrucken y, Natürlich sehe ich 2. 543 00:23:19,400 --> 00:23:22,440 Aber Kaufmanns-y, sehe ich diese Adresse. 544 00:23:22,440 --> 00:23:26,527 Und beachtet, für die Neugierigen, Wie ist der Abstand x und y? 545 00:23:26,527 --> 00:23:27,985 Sie können die meisten der Adresse ignoriert. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Vier Bytes. 548 00:23:29,920 --> 00:23:33,510 Und das ist im Einklang mit unserer früher behaupten, dass, wie groß ist ein int? 549 00:23:33,510 --> 00:23:34,130 Vier Bytes. 550 00:23:34,130 --> 00:23:37,420 So wie es aussieht ist alles Futter bis Schön, wie Sie vielleicht hoffen, in Erinnerung. 551 00:23:37,420 --> 00:23:40,010 >> So, jetzt lassen Sie uns einfach schnell vorwärts an das Ende der Geschichte. 552 00:23:40,010 --> 00:23:43,290 Fahren wir fort und geben Schritt, in der Swap-Funktion zu tauchen. 553 00:23:43,290 --> 00:23:46,880 Jetzt bemerken, wenn ich ein Typ, es ist identisch mit der Adresse x. 554 00:23:46,880 --> 00:23:52,130 Wenn ich Typ B, es ist identisch die Adresse von y. 555 00:23:52,130 --> 00:23:57,020 Also, was soll ich sehen, ob ich sagen wir, an die Adresse einer gehen? 556 00:23:57,020 --> 00:23:58,120 So drucken Sie ein Star. 557 00:23:58,120 --> 00:24:00,130 Also Stern bedeutet, gehen dort in diesem Zusammenhang. 558 00:24:00,130 --> 00:24:02,730 Ampersand bedeutet, was ist die Adresse. 559 00:24:02,730 --> 00:24:05,000 So ein Mittel 1 Stern. 560 00:24:05,000 --> 00:24:09,590 Und Druck Sterne-B gibt mir 2. 561 00:24:09,590 --> 00:24:15,750 >> Und lassen Sie mich gehen davon aus, für den Augenblick, dass zumindest der Code, 562 00:24:15,750 --> 00:24:18,950 geht jetzt ausführen kann durch auf diese Weise begründet. 563 00:24:18,950 --> 00:24:21,150 Aber wir werden diese Idee schon bald wieder besuchen. 564 00:24:21,150 --> 00:24:23,850 Also diese Version von Swap ist jetzt richtig und ermöglicht 565 00:24:23,850 --> 00:24:26,650 uns, diese bestimmten Datentyp zu tauschen. 566 00:24:26,650 --> 00:24:29,120 >> Also Fragen dann tauschen? 567 00:24:29,120 --> 00:24:29,890 Auf Sterne? 568 00:24:29,890 --> 00:24:30,690 Am Adresse? 569 00:24:30,690 --> 00:24:33,270 Und Sie werden sehen, mit Problem-Set 4, Art, 570 00:24:33,270 --> 00:24:37,310 aber Problem Set 5, auf jeden Fall, wie diese Dinge sind nützlich und bekommen viel mehr 571 00:24:37,310 --> 00:24:39,584 wohl mit ihnen, als Ergebnis. 572 00:24:39,584 --> 00:24:40,430 Alles, was überhaupt? 573 00:24:40,430 --> 00:24:40,930 In Ordnung. 574 00:24:40,930 --> 00:24:44,350 Malloc so ist wiederum die Funktion dass nur reserviert Speicher, Speicher 575 00:24:44,350 --> 00:24:45,330 Allokation. 576 00:24:45,330 --> 00:24:47,024 Und warum ist das sinnvoll? 577 00:24:47,024 --> 00:24:48,940 Nun, die ganze Zeit, Sie habe mit malloc. 578 00:24:48,940 --> 00:24:52,230 Wenn Sie jetzt, wie betrachten getstring Werke, vermutlich ist es 579 00:24:52,230 --> 00:24:56,140 seit einem Stück jemanden fragen Speicher und jederzeit der Benutzer einen String 580 00:24:56,140 --> 00:24:59,040 in, weil wir sicher wusste nicht, wie CS50 Personal, 581 00:24:59,040 --> 00:25:02,710 wie groß diese Strings, die den Menschen gehen zu geben könnte. 582 00:25:02,710 --> 00:25:07,910 >> Lassen Sie uns also, zum ersten Mal starten, um abziehen, wie die CS50-Bibliothek Werke, 583 00:25:07,910 --> 00:25:10,990 durch eine Reihe von Beispielen das wird uns dorthin führen. 584 00:25:10,990 --> 00:25:15,300 Also, wenn ich öffnen gedit und eröffnen scanf 0, 585 00:25:15,300 --> 00:25:17,055 wir gehen, um den folgenden Code zu sehen. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, auf der Website verfügbaren Heute hat relativ wenige Zeilen Code 588 00:25:23,530 --> 00:25:25,351 hier 14 bis 20. 589 00:25:25,351 --> 00:25:26,600 Und mal sehen, was es tut. 590 00:25:26,600 --> 00:25:28,920 Es erklärt einen int, genannt x. 591 00:25:28,920 --> 00:25:30,850 Es sagt so etwas wie, Zahl bitte. 592 00:25:30,850 --> 00:25:33,940 Und jetzt heißt es, scanf% i & x. 593 00:25:33,940 --> 00:25:35,620 So gibt es eine Reihe von neuen Sachen gibt. 594 00:25:35,620 --> 00:25:38,420 >> Aber scanf, Sie Art denken können der als das Gegenteil von printf. 595 00:25:38,420 --> 00:25:40,090 printf, natürlich, Drucke auf den Bildschirm. 596 00:25:40,090 --> 00:25:44,410 scanf Art von Scans aus dem Benutzer- Tastatur etwas, das er oder sie hat getippt. 597 00:25:44,410 --> 00:25:46,550 >> % I ist genau wie printf. 598 00:25:46,550 --> 00:25:49,410 Dies bedeutet, erwarten, dass die Benutzer, ein Typ int. 599 00:25:49,410 --> 00:25:52,820 Und jetzt, warum Sie denken, ich vielleicht vorbei scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Wenn der Zweck im Leben von scanf ist es, etwas von dem Benutzer zu bekommen, 602 00:25:57,770 --> 00:26:02,480 Was ist der Sinn des Weitergabe, & x, jetzt? 603 00:26:02,480 --> 00:26:02,980 Ja? 604 00:26:02,980 --> 00:26:03,896 >> ZIELGRUPPE: [unverständlich]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. MALAN: Genau. 607 00:26:06,540 --> 00:26:12,900 Was auch immer ich, der Mensch, geben, meine Eingabe wird sich an dieser Stelle gespeichert werden. 608 00:26:12,900 --> 00:26:17,660 Es ist nicht ausreichend, daran erinnern, um nur Pass in x, weil wir bereits gesehen haben, 609 00:26:17,660 --> 00:26:21,630 immer wenn Sie nur eine rohe Variable übergeben, wie ein int, um eine andere Funktion, 610 00:26:21,630 --> 00:26:25,640 Sicher, es kann das ändern variabel, aber nicht dauerhaft. 611 00:26:25,640 --> 00:26:27,360 Es kann nicht eine Wirkung auf Main. 612 00:26:27,360 --> 00:26:29,420 Es kann nur eine lokale Kopie zu ändern. 613 00:26:29,420 --> 00:26:32,560 Aber wenn statt, brauchen Sie nicht gib mir die tatsächlichen int, 614 00:26:32,560 --> 00:26:36,640 aber du hast mich Richtungen zu geben int, dass ich jetzt, da scanf, 615 00:26:36,640 --> 00:26:41,050 sicher, ich kann das folgen Adresse und legte dort eine Nummer 616 00:26:41,050 --> 00:26:43,280 so dass Sie Zugriff darauf haben, wie gut. 617 00:26:43,280 --> 00:26:45,120 >> Also, wenn ich dieses Programm, mal sehen. 618 00:26:45,120 --> 00:26:49,660 Machen scanf 0 Punkt Schrägstrich, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Und wenn ich jetzt eine Zahl wie 50, danke für den 50. 620 00:26:54,030 --> 00:26:58,150 Wenn ich jetzt eine Zahl wie Negativ 1, 1 für die negative. 621 00:26:58,150 --> 00:27:04,200 Ich jetzt eine Zahl eingeben, wie 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Warum hat mein Programm ignorieren mich? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Nun, weil einfach, sagte ich es um einen int nur zu erwarten. 625 00:27:09,880 --> 00:27:10,380 In Ordnung. 626 00:27:10,380 --> 00:27:11,630 Also das ist eine Version davon. 627 00:27:11,630 --> 00:27:16,600 Lassen Sie uns die Dinge noch ein Stück und schlagen vor, das ist nicht gut. 628 00:27:16,600 --> 00:27:20,530 Und hierin liegt ein sehr einfaches Beispiel wie wir das Schreiben von Code beginnen 629 00:27:20,530 --> 00:27:24,450 dass andere Menschen ausnutzen können oder Kompromiss, Schlechtes zu tun. 630 00:27:24,450 --> 00:27:28,336 So Linie 16, so ähnlich im Geiste vor, 631 00:27:28,336 --> 00:27:29,960 aber ich bin nicht erklärt es dieses Mal Int. 632 00:27:29,960 --> 00:27:32,970 Ich erkläre es char Sterne, auch bekannt als String. 633 00:27:32,970 --> 00:27:35,190 >> Aber was bedeutet das wirklich? 634 00:27:35,190 --> 00:27:38,790 Also, wenn ich nicht eine address-- angeben und Ich bin es willkürlich aufrufen, Puffer, 635 00:27:38,790 --> 00:27:43,370 aber ich konnte es nennen S, simple-- zu sein und dann habe ich dies tun, erklären Sie mir, 636 00:27:43,370 --> 00:27:48,630 wenn du könntest, auf Basis des bisherigen Logik, was zu tun scanf in Zeile 18, 637 00:27:48,630 --> 00:27:55,000 wenn Pass% s und Puffer, dem eine Adresse? 638 00:27:55,000 --> 00:27:58,210 Was ist scanf, wenn Sie die Anwendung genau die gleiche Logik wie die Version 0, 639 00:27:58,210 --> 00:28:00,640 werde versuchen, hier zu tun, wenn der Benutzer etwas in? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Ja? 642 00:28:03,409 --> 00:28:04,407 >> ZIELGRUPPE: [unverständlich]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. MALAN: Genau. 645 00:28:08,890 --> 00:28:11,577 Scanf durch die Logik zuvor wird, um die Zeichenfolge zu nehmen 646 00:28:11,577 --> 00:28:13,410 dass der menschliche typisierte in-- jetzt ist es ein String ist, 647 00:28:13,410 --> 00:28:15,790 es ist nicht eine Zahl, vermutlich, wenn er oder sie cooperates-- 648 00:28:15,790 --> 00:28:19,310 und es wird versuchen, das zu setzen String im Speicher zu welcher Adresse 649 00:28:19,310 --> 00:28:20,340 Puffer angibt. 650 00:28:20,340 --> 00:28:23,870 Und das ist toll, weil Puffer tatsächlich soll eine Adresse sein. 651 00:28:23,870 --> 00:28:30,470 >> Aber ich behaupte, dieses Programm ist ein Buggy sehr ernste Weise, weil das, was Wert ist 652 00:28:30,470 --> 00:28:31,330 Puffer standardmäßig? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Was habe ich in initialisiert? 655 00:28:34,790 --> 00:28:35,770 Was Teil des Speichers? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Ich habe nicht, oder? 658 00:28:38,620 --> 00:28:42,265 >> Also auch wenn ich zuge ein char Stern, der nicht mehr aufgerufen S, 659 00:28:42,265 --> 00:28:48,030 es ist stattdessen genannt, so buffer-- Ziehen wir den Namen der Variablen 660 00:28:48,030 --> 00:28:53,380 jetzt als buffer--, wenn ich nicht genannt getString oder malloc hier, 661 00:28:53,380 --> 00:28:56,030 dass effektiv bedeutet, dass Puffer ist nur einige Müll Wert. 662 00:28:56,030 --> 00:28:57,030 >> Nun, was bedeutet das? 663 00:28:57,030 --> 00:29:00,220 Es bedeutet, dass ich gesagt scanf um einen String vom Benutzer erwartet. 664 00:29:00,220 --> 00:29:01,300 Und wissen Sie was? 665 00:29:01,300 --> 00:29:03,883 Was auch immer dieses Ding zeigen zu-- und ich ziehen Fragezeichen, 666 00:29:03,883 --> 00:29:07,060 aber in Wirklichkeit, es geht um sein so etwas wie Ox1, 2, 3, oder? 667 00:29:07,060 --> 00:29:10,730 Es ist eine falsche Wert, der nur geschieht es aus zuvor. 668 00:29:10,730 --> 00:29:13,440 Also mit anderen Worten, es ist als ob Puffer ist nur 669 00:29:13,440 --> 00:29:16,180 auf etwas in Erinnerung. 670 00:29:16,180 --> 00:29:17,610 Ich habe keine Ahnung, was. 671 00:29:17,610 --> 00:29:24,130 >> Also, wenn ich geben gabe jetzt, es geht zu versuchen, G-A-B-E / 0 Es stellen. 672 00:29:24,130 --> 00:29:25,530 Aber wer weiß, was das ist? 673 00:29:25,530 --> 00:29:27,480 Und in der Vergangenheit, einem Zeit, die wir versucht haben, berühren 674 00:29:27,480 --> 00:29:29,770 Speicher, der nicht gehört uns hat, was passiert ist? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Oder fast jeder Zeit. 677 00:29:32,870 --> 00:29:34,310 Segmentation fault, oder? 678 00:29:34,310 --> 00:29:37,829 >> Dieser Pfeil, ich habe keine Ahnung, wo es ist Zeige. es ist nur einige Zufallswert. 679 00:29:37,829 --> 00:29:40,370 Und natürlich, wenn Sie interpretieren ein Zufallswert als Adresse, 680 00:29:40,370 --> 00:29:42,610 Sie gehen zu zu gehen einige zufällige Ziel. 681 00:29:42,610 --> 00:29:46,810 So könnte in der Tat gabe Crash mein Programm in diesem Fall hier. 682 00:29:46,810 --> 00:29:50,600 >> Also, was können wir tun, das ist fast so schlimm? 683 00:29:50,600 --> 00:29:52,660 Betrachten Sie dieses dritten und letztes Beispiel für scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Diese Version ist besser, in welchem ​​Sinne? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Wenn Sie mit der ARE vorherige Problem, das ist besser. 688 00:30:01,400 --> 00:30:02,250 Warum? 689 00:30:02,250 --> 00:30:03,250 >> ZIELGRUPPE: [unverständlich]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. MALAN: Gut. 692 00:30:07,110 --> 00:30:09,970 So dass diese bei Zeile 16 besser ist, in dem Sinne, 693 00:30:09,970 --> 00:30:12,030 dass wir explizit Zuteilung etwas Speicher. 694 00:30:12,030 --> 00:30:14,190 Wir werden nicht mit malloc, wir sind mit der Woche 2 695 00:30:14,190 --> 00:30:16,060 Ansatz von nur Deklaration eines Arrays. 696 00:30:16,060 --> 00:30:18,130 Und wir vor, dass ein String gesagt haben ist nur eine Reihe von Zeichen, 697 00:30:18,130 --> 00:30:19,690 so das ist völlig legitim. 698 00:30:19,690 --> 00:30:22,910 Aber es ist natürlich, wie Sie beachten, feste Größe, 16. 699 00:30:22,910 --> 00:30:25,440 >> So ist dieses Programm völlig sicher, wenn ich schreibe 700 00:30:25,440 --> 00:30:29,760 in einem Zeichenketten, zwei Zeichen Saiten, 15 Zeichenketten. 701 00:30:29,760 --> 00:30:34,970 Aber sobald ich mit der Eingabe beginnen 16, 17, 18, 1000 Zeichenketten, 702 00:30:34,970 --> 00:30:37,390 Wo ist das String am Ende sich? 703 00:30:37,390 --> 00:30:39,570 Es wird teilweise hier am Ende. 704 00:30:39,570 --> 00:30:42,820 Aber wer weiß was noch jenseits der Grenzen 705 00:30:42,820 --> 00:30:44,270 dieser besonderen Array? 706 00:30:44,270 --> 00:30:48,015 >> Es ist, als hätte ich erklärt 16 Boxen hier. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Also anstatt ziehen alle 16, werden wir nur so tun, dass ich 16 gezogen. 709 00:30:52,690 --> 00:30:56,540 Aber wenn ich dann versuchen, einen String lesen Das ist viel mehr, wie 50 Zeichen, 710 00:30:56,540 --> 00:31:01,270 Ich werde damit beginnen, a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Und das ist vermutlich eine andere Speichersegment 712 00:31:04,916 --> 00:31:06,790 daß wiederum kann dazu führen, mein Programm zum Absturz zu bringen, 713 00:31:06,790 --> 00:31:10,600 denn ich habe nicht gefragt etwas mehr als nur 16 Byte. 714 00:31:10,600 --> 00:31:12,260 >> Also, wer sich interessiert? 715 00:31:12,260 --> 00:31:13,880 Nun, hier ist der CS50-Bibliothek. 716 00:31:13,880 --> 00:31:17,220 Und die meisten ist dies nur wie Anweisungen bis oben. 717 00:31:17,220 --> 00:31:21,670 Das CS50-Bibliothek, die ganze Zeit, hat diese Linie in der Linie 52 hatte. 718 00:31:21,670 --> 00:31:23,680 Wir haben gesehen typedef oder Sie werden sehen, typedef 719 00:31:23,680 --> 00:31:27,930 in pSoll 4, die gerade erstellt ein Synonym wobei char Stern kann mehr sein 720 00:31:27,930 --> 00:31:29,290 einfach als String bezeichnet. 721 00:31:29,290 --> 00:31:31,540 So ist dies eines der wenige Stützräder 722 00:31:31,540 --> 00:31:34,120 wir heimlich unter der Haube verwendet. 723 00:31:34,120 --> 00:31:36,490 >> Unterdessen, hier ist die Funktion, getchar. 724 00:31:36,490 --> 00:31:38,190 Nun offenbar, es gibt keinen Körper, um es. 725 00:31:38,190 --> 00:31:40,273 Und in der Tat, wenn ich halten Scrollen, ich nicht wirklich 726 00:31:40,273 --> 00:31:42,080 Sie sehen keine Implementierungen dieser Funktionen. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Als Plausibilitätsprüfung, warum ist das so? 729 00:31:45,516 --> 00:31:46,795 >> ZIELGRUPPE: [unverständlich]. 730 00:31:46,795 --> 00:31:47,670 David J. MALAN: Ja. 731 00:31:47,670 --> 00:31:48,950 Also das ist der Header-Datei. 732 00:31:48,950 --> 00:31:52,520 Und Header-Dateien enthalten Prototypen, plus einige andere Sachen, so scheint es, 733 00:31:52,520 --> 00:31:53,780 wie Typdefinitionen. 734 00:31:53,780 --> 00:31:56,910 Aber in CS50.c, die wir haben Sie geradezu nie gegeben, 735 00:31:56,910 --> 00:32:02,100 hat aber in der CS50 Gerät war alles dieses Mal tief in die Ordner, 736 00:32:02,100 --> 00:32:04,990 feststellen, dass es eine ganze Reihe von Funktionen in hier. 737 00:32:04,990 --> 00:32:06,720 >> In der Tat, wir unten scrollen. 738 00:32:06,720 --> 00:32:08,810 Ignorieren wir die meisten von ihnen, für jetzt. 739 00:32:08,810 --> 00:32:12,670 Aber unten scrollen, um getInt und sehen, wie getInt funktioniert. 740 00:32:12,670 --> 00:32:13,890 So, hier ist getInt. 741 00:32:13,890 --> 00:32:17,727 Und wenn Sie jemals wirklich interessierte, wie bekommen int funktioniert, hier ist seine Dokumentation. 742 00:32:17,727 --> 00:32:19,560 Und unter den Dingen, es sagt, ist es Ihnen sagt, 743 00:32:19,560 --> 00:32:21,340 was die Wertebereiche kann es zurück. 744 00:32:21,340 --> 00:32:24,400 Es ist im Wesentlichen negativ 2 Milliarden positive 2 Milliarden, geben oder nehmen. 745 00:32:24,400 --> 00:32:26,420 >> Und es stellt sich heraus, das alles Zeit, auch wenn wir noch nie 746 00:32:26,420 --> 00:32:28,570 Sie hatte für ihn zu überprüfen, wenn etwas schief geht, 747 00:32:28,570 --> 00:32:30,680 es stellt sich heraus, dass alle Diesmal hat getInt 748 00:32:30,680 --> 00:32:33,600 wurde die Rückgabe eines speziellen konstant, nicht null ist, 749 00:32:33,600 --> 00:32:36,760 sondern INT_MAX, das ist Konvention nur einen Programmierer. 750 00:32:36,760 --> 00:32:38,846 Es bedeutet, hier ist ein spezieller Wert. 751 00:32:38,846 --> 00:32:41,470 Achten Sie darauf, dies zu überprüfen, nur falls etwas schief geht. 752 00:32:41,470 --> 00:32:43,261 Aber wir haben nie die Mühe gemacht mit, dass bis dato 753 00:32:43,261 --> 00:32:45,200 weil wieder, dieses soll vereinfacht werden. 754 00:32:45,200 --> 00:32:46,950 >> Aber wie funktioniert getInt bekommen umgesetzt? 755 00:32:46,950 --> 00:32:48,450 Nun, eines, dauert es keine Argumente. 756 00:32:48,450 --> 00:32:49,390 Das wissen wir. 757 00:32:49,390 --> 00:32:50,820 Es gibt ein int. 758 00:32:50,820 --> 00:32:51,950 Das wissen wir. 759 00:32:51,950 --> 00:32:54,460 Also wie kann es unter der Haube arbeiten? 760 00:32:54,460 --> 00:32:58,290 >> Es gibt also offenbar eine unendliche Schleife, mindestens das Auftreten eines. 761 00:32:58,290 --> 00:33:00,290 Beachten Sie, dass wir mit getString. 762 00:33:00,290 --> 00:33:04,000 Also das ist interessant. getInt ruft unsere eigene Funktion, getString. 763 00:33:04,000 --> 00:33:05,645 Und nun, was könnte dies der Fall sein? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Warum bin ich defensiv hier in Zeile 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Was könnte passieren, im Einklang 164, nur klar zu sein? 768 00:33:15,639 --> 00:33:16,930 Es ist die gleiche Antwort wie zuvor. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Vielleicht nur aus der Erinnerung sein. 771 00:33:20,089 --> 00:33:23,130 Etwas schief geht mit getString, wir müssen in der Lage, damit umzugehen ist. 772 00:33:23,130 --> 00:33:27,070 Und der Grund, warum ich nicht zurückkehre null ist dass, technisch gesehen, ist ein Zeiger null. 773 00:33:27,070 --> 00:33:29,120 getInt muss einen int zurück. 774 00:33:29,120 --> 00:33:31,060 Also habe ich willkürlich beschlossen, im Wesentlichen, 775 00:33:31,060 --> 00:33:34,600 dass 2 Milliarden, geben oder nehmen, wird einen besonderen Wert sein, dass ich nie 776 00:33:34,600 --> 00:33:35,970 tatsächlich von dem Benutzer zu erhalten. 777 00:33:35,970 --> 00:33:39,930 Es ist nur der eine Wert werde ich zu verschwenden, um einen Fehlercode darstellen. 778 00:33:39,930 --> 00:33:41,540 >> So, jetzt werden die Dinge ein wenig Phantasie. 779 00:33:41,540 --> 00:33:44,670 Und es ist nicht ganz die gleiche Funktion wie vorher, aber es ist sehr ähnlich. 780 00:33:44,670 --> 00:33:50,120 So bemerken, erkläre ich hier, im Einklang 172, sowohl ein int n und eine char c. 781 00:33:50,120 --> 00:33:53,600 Und dann nutze ich diese flippige Linie, sscanf, die sich heraus 782 00:33:53,600 --> 00:33:55,990 scannt nicht einen String von der Tastatur. 783 00:33:55,990 --> 00:33:59,226 Es steht eine bestehende Zeichenfolge, die der Benutzer bereits eingegeben. 784 00:33:59,226 --> 00:34:02,100 Also habe ich bereits getString, genannt die bedeutet, dass ich einen String im Speicher. 785 00:34:02,100 --> 00:34:05,020 sscanf ist, was Sie möchten rufen Sie einen Parsing-Funktion. 786 00:34:05,020 --> 00:34:07,760 Es sieht an der Schnur habe ich eingegeben wird, Zeichen für Zeichen, 787 00:34:07,760 --> 00:34:09,250 und tut etwas Nützliches. 788 00:34:09,250 --> 00:34:10,969 Das String in Zeile gespeichert. 789 00:34:10,969 --> 00:34:13,560 Und ich weiß, dass nur, indem Sie Sichern Sie hier und sagen, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Ich nannte es nicht s diesmal, aber Linie. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Und jetzt ist dies ein wenig anders. 793 00:34:18,080 --> 00:34:22,480 Aber dies bedeutet effektiv, aus Gründen wir werden etwas winken uns die Hände auf der heutigen, 794 00:34:22,480 --> 00:34:26,070 dass wir überprüfen, ob der Benutzer eingetippt 795 00:34:26,070 --> 00:34:29,909 und int und vielleicht ein anderer Charakter. 796 00:34:29,909 --> 00:34:33,610 Wenn der Benutzer in einer int eingegeben haben, ist es werde in n gespeichert werden, denn ich bin 797 00:34:33,610 --> 00:34:36,739 Das Bestehen dieser nach Adresse, die neuen Trick, den wir heute gesehen haben. 798 00:34:36,739 --> 00:34:41,570 Wenn der Benutzer auch getippt in wie 123x, dass x 799 00:34:41,570 --> 00:34:45,060 wird, um am Ende ein Brief in Zeichen c. 800 00:34:45,060 --> 00:34:48,739 >> Jetzt stellt sich heraus, dass die sscanf wird mir sagen, intelligent, 801 00:34:48,739 --> 00:34:54,750 wie viele Variablen sscanf wurde erfolgreich in der Lage, zu füllen. 802 00:34:54,750 --> 00:34:58,770 Entsprechend dieser Logik, wenn die Funktion Ich bin der Umsetzung wird getInt, 803 00:34:58,770 --> 00:35:00,900 aber ich bin Prüfung, möglicherweise für den Benutzer 804 00:35:00,900 --> 00:35:04,190 in einem int eingegeben haben gefolgt von etwas anderem, 805 00:35:04,190 --> 00:35:08,580 was will ich sscanf die Rückgabewert wirklich sein? 806 00:35:08,580 --> 00:35:10,950 Wenn der Zweck ist, erhalten nur ein int vom Benutzer? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Also, wenn sscanf Renditen 2, was bedeutet das? 809 00:35:19,300 --> 00:35:21,660 Der Benutzer eingegeben so etwas wie, buchstäblich, 810 00:35:21,660 --> 00:35:24,770 123x, die nur Unsinn ist. 811 00:35:24,770 --> 00:35:27,490 Es ist ein Fehler, und Ich möchte, dass für zu überprüfen. 812 00:35:27,490 --> 00:35:32,960 >> Also, wenn der Benutzer tippt in diesem, von Diese Logik, was macht sscanf zurückkehren, 813 00:35:32,960 --> 00:35:33,740 würden Sie sagen? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Also es geht um Rück 2, weil die 123 wird sich in hier zu gehen, 816 00:35:39,130 --> 00:35:41,580 und die x wird sich hier am Ende. 817 00:35:41,580 --> 00:35:43,970 Aber ich möchte nicht, dass das X, um gefüllt zu werden. 818 00:35:43,970 --> 00:35:48,580 Ich möchte sscanf nur gelingen, Füllen des ersten seiner Variablen. 819 00:35:48,580 --> 00:35:52,490 Und damit ist, warum ich wollen sscanf 1 zurückzukehren. 820 00:35:52,490 --> 00:35:55,750 >> Und wenn dies ein bisschen über den Kopf für den Moment, das ist völlig in Ordnung. 821 00:35:55,750 --> 00:36:00,030 Erkennen, obwohl, dass einer der Werte der getInt und getString 822 00:36:00,030 --> 00:36:03,630 ist, dass wir tun, eine verdammt Viele Fehlerprüfung wie dieser so 823 00:36:03,630 --> 00:36:07,130 , dass bis heute, können Sie ziemlich viel Geben Sie nichts auf Ihrer Tastatur, 824 00:36:07,130 --> 00:36:08,490 und wir werden es zu fangen. 825 00:36:08,490 --> 00:36:10,592 Und wir sicherlich die Personal, wird auf jeden Fall nicht 826 00:36:10,592 --> 00:36:13,300 sein die Quelle eines Fehlers in Ihrer Programm, weil wir defensiv 827 00:36:13,300 --> 00:36:16,270 Prüfung für alle dumm Dinge, die ein Benutzer tun, 828 00:36:16,270 --> 00:36:18,900 wie das Schreiben einer Zeichenfolge, wenn Sie wollte wirklich Int. 829 00:36:18,900 --> 00:36:21,350 Also für now-- wir kommen zurück, dies vor long-- 830 00:36:21,350 --> 00:36:23,710 aber die ganze Zeit, getString und getInt haben 831 00:36:23,710 --> 00:36:29,950 unter der Haube mit diesem gewesen Grundidee der Adressen des Speichers. 832 00:36:29,950 --> 00:36:32,580 >> So, jetzt machen wir die Dinge ein wenig benutzerfreundlich. 833 00:36:32,580 --> 00:36:38,740 Wie Sie sich vielleicht erinnern, von Binky letzten Zeit-- wenn meine Maus wird so cooperate-- 834 00:36:38,740 --> 00:36:42,560 wir diesen Code, hatte die ehrlich gesagt, ist ziemlich unsinnig. 835 00:36:42,560 --> 00:36:45,330 Dieser Code bringt gar nichts, nützlich, aber es war das Beispiel 836 00:36:45,330 --> 00:36:48,330 dass Professor Parlante um darzustellen verwendet 837 00:36:48,330 --> 00:36:51,840 was los war in ein Programm mit Speicher. 838 00:36:51,840 --> 00:36:54,850 >> Lassen Sie uns also erzählen diese Geschichte Super kurz. 839 00:36:54,850 --> 00:36:58,720 Diese ersten zwei Zeilen, in Englisch, nicht, was, würden Sie sagen? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Nur in einigermaßen menschlich, aber Fachbegriffe leicht, einen Stich. 842 00:37:05,430 --> 00:37:06,346 ZIELGRUPPE: [unverständlich]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. MALAN: OK, du bist Gründung Adressen für Ihre Variablen x und y. 845 00:37:11,080 --> 00:37:15,520 Nicht ganz, denn x und y sind nicht Variablen im traditionellen Sinne. 846 00:37:15,520 --> 00:37:18,054 x und y-Adressen oder werden Adresse zu speichern. 847 00:37:18,054 --> 00:37:19,220 Also lassen Sie uns versuchen, diese noch einmal. 848 00:37:19,220 --> 00:37:21,010 Kein schlechter Start, wenn. 849 00:37:21,010 --> 00:37:21,510 Ja? 850 00:37:21,510 --> 00:37:22,426 >> ZIELGRUPPE: [unverständlich]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. MALAN: Gut. 853 00:37:24,840 --> 00:37:26,173 Ich denke, das ist ein wenig sauberer. 854 00:37:26,173 --> 00:37:28,630 Deklarieren zwei Zeiger, zwei ganzen Zahlen. 855 00:37:28,630 --> 00:37:30,150 Und wir fordern sie x und y. 856 00:37:30,150 --> 00:37:32,790 Oder wenn wir ziehen dies als ein Bild, wieder, 857 00:37:32,790 --> 00:37:36,410 erinnern ganz einfach, dass alle wir mit dieser ersten Zeile tun 858 00:37:36,410 --> 00:37:39,690 zeichnet eine Box wie diese, mit einigen Müll Wert darin, 859 00:37:39,690 --> 00:37:41,920 und nannte es X, und dann ein anderes Feld wie dieses, 860 00:37:41,920 --> 00:37:43,880 mit einigen Müll Wert in ihm, nannte es y. 861 00:37:43,880 --> 00:37:45,810 Wir haben zwei deklariert Hinweise, die letztlich 862 00:37:45,810 --> 00:37:47,860 wird die Adresse einer int zu speichern. 863 00:37:47,860 --> 00:37:49,170 Also das ist alles da. 864 00:37:49,170 --> 00:37:53,290 >> Also, wenn Binky tat dies, die Ton sah nur so aus. 865 00:37:53,290 --> 00:37:55,350 Und Nick nur irgendwie bis die Pfeile eingewickelt, 866 00:37:55,350 --> 00:37:57,590 als ob sie nicht überall zeigen insbesondere, weil sie einfach sind 867 00:37:57,590 --> 00:37:58,250 Müll-Werte. 868 00:37:58,250 --> 00:38:01,670 Sie sind nicht explizit initialisiert überall im Besonderen. 869 00:38:01,670 --> 00:38:03,980 >> Nun ist die nächste Zeile Code, Rückruf, war diese. 870 00:38:03,980 --> 00:38:07,510 So in maßen benutzerfreundlich, aber etwas technisches Englisch, 871 00:38:07,510 --> 00:38:09,790 was ist das Codezeile zu tun? 872 00:38:09,790 --> 00:38:10,391 Ja? 873 00:38:10,391 --> 00:38:11,333 >> ZIELGRUPPE: [unverständlich]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> David J. MALAN: Perfect. 876 00:38:13,950 --> 00:38:17,016 Es ist die Aufteilung der Brocken der Speicher, der die Größe eines int ist. 877 00:38:17,016 --> 00:38:18,140 Und das ist die Hälfte der Antwort. 878 00:38:18,140 --> 00:38:20,056 Sie beantwortet die richtige Hälfte des Ausdrucks. 879 00:38:20,056 --> 00:38:22,473 Was ist bei Eintritt linken Seite des Gleichheitszeichens? 880 00:38:22,473 --> 00:38:22,972 Ja? 881 00:38:22,972 --> 00:38:24,814 ZIELGRUPPE: und weist sie der Variablen x? 882 00:38:24,814 --> 00:38:27,690 >> David J. MALAN: und weist sie der Variablen x. 883 00:38:27,690 --> 00:38:31,650 So zu rekapitulieren, rechts ordnet genug Speicher, um einen int zu speichern. 884 00:38:31,650 --> 00:38:34,150 Aber speziell malloc gibt die Adresse 885 00:38:34,150 --> 00:38:37,270 dieser Teil des Speichers, die Sie haben, nur vorgeschlagen wird in x gespeichert. 886 00:38:37,270 --> 00:38:42,560 >> Also, was Nick beim letzten Mal mit Binky ist schleppte er den Zeiger aus, der Ton, 887 00:38:42,560 --> 00:38:46,820 jetzt auf ein weißes Stück Speicher zeigen , die gleich der Größe eines Int. 888 00:38:46,820 --> 00:38:49,360 Und in der Tat, das ist gemeint zu vier Bytes stellen. 889 00:38:49,360 --> 00:38:55,310 >> Nun, die nächste Codezeile dies tat, bekommt 42 x Sterne. 890 00:38:55,310 --> 00:38:58,530 Also 42 ist einfach auf die rechten Seite, Sinn des Lebens. 891 00:38:58,530 --> 00:39:00,500 Linke Seite bedeutet Sterne-x, was? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Das könnte zu haben gone-- das ist OK. 894 00:39:03,280 --> 00:39:04,220 Ok. 895 00:39:04,220 --> 00:39:06,875 >> ZIELGRUPPE: Grundsätzlich gehen Sie auf die [unverständlich] 896 00:39:06,875 --> 00:39:07,750 David J. MALAN: Gut. 897 00:39:07,750 --> 00:39:08,760 ZIELGRUPPE: [unverständlich]. 898 00:39:08,760 --> 00:39:09,760 David J. MALAN: Genau. 899 00:39:09,760 --> 00:39:11,979 Linken Seite bedeutet, gehen Sie zu x. 900 00:39:11,979 --> 00:39:12,520 x ist die Adresse. 901 00:39:12,520 --> 00:39:15,520 Es ist wie 33 Oxford Street, oder Ox1. 902 00:39:15,520 --> 00:39:18,690 Und Stern x bedeutet, gehen Sie zu, dass anzugehen und umzusetzen, was da? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Also in der Tat, das ist genau das, was Nick tat. 905 00:39:21,290 --> 00:39:23,740 Er begann mit durch, Wesentlichen, mental 906 00:39:23,740 --> 00:39:26,270 mit dem Finger auf x, in Pfeil 907 00:39:26,270 --> 00:39:30,670 auf dem weißen Feld auf der rechten Seite Seite, und indem die Zahl 42 gibt. 908 00:39:30,670 --> 00:39:34,120 Aber dann wurde es ein wenig gefährlich, oder? 909 00:39:34,120 --> 00:39:35,860 Binky uns über den Kopf zu verlieren. 910 00:39:35,860 --> 00:39:39,465 >> Sterne y gleich 13, Pech, bedeutet was? 911 00:39:39,465 --> 00:39:43,620 Also Sterne y Mittel gehen an die Adresse in y. 912 00:39:43,620 --> 00:39:45,630 Aber was ist die Adresse in y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Alles in Ordnung, es ist Müll Wert, oder? 915 00:39:49,440 --> 00:39:50,800 Ich zog es als Fragezeichen. 916 00:39:50,800 --> 00:39:54,850 Nick zog es als eine zusammengerollt Pfeil. 917 00:39:54,850 --> 00:39:59,600 Und sobald Sie versuchen, Sterne tun y, sagen, es gehen, 918 00:39:59,600 --> 00:40:03,872 aber es ist nicht ein legitimes Adresse, ist es einige falsche Lage, 919 00:40:03,872 --> 00:40:05,080 Das Programm geht zum Absturz zu bringen. 920 00:40:05,080 --> 00:40:08,580 Binky und den Kopf geht hier fliegen, wie es getan hat. 921 00:40:08,580 --> 00:40:12,130 >> Also am Ende, dieses Programm war einfach nur Voll Fehler. 922 00:40:12,130 --> 00:40:13,540 Es war ein fehlerhaftes Programm. 923 00:40:13,540 --> 00:40:14,760 Und es benötigt wird, um festzusetzen. 924 00:40:14,760 --> 00:40:18,260 Und der einzige Weg, wirklich, um es zu beheben wäre, zum Beispiel, diese Linie, 925 00:40:18,260 --> 00:40:21,010 die wir noch nicht einmal, um zu bekommen, weil Das Programm stürzte zu früh. 926 00:40:21,010 --> 00:40:26,170 Aber wenn wir, dies zu beheben waren, was Einfluss hat dabei y gleich x haben? 927 00:40:26,170 --> 00:40:30,010 Nun, es ist im wesentlichen Punkte y auf beliebigen Wert x an zeigen wird. 928 00:40:30,010 --> 00:40:32,430 >> Also in Nicks Geschichte, oder Binky Geschichte, sowohl 929 00:40:32,430 --> 00:40:34,640 x und y wurden mit Zeige der weiße Teil des Speichers, 930 00:40:34,640 --> 00:40:38,300 so daß schließlich beim Sie Sterne y gleich 13 wieder, 931 00:40:38,300 --> 00:40:43,080 Sie am Ende setzen 13 in die entsprechende Stelle. 932 00:40:43,080 --> 00:40:47,640 Also alle diese Linien sind perfekt legitim, außer diesem einen, 933 00:40:47,640 --> 00:40:51,730 wenn es passiert, bevor Sie y tatsächlich einen Wert zugewiesen. 934 00:40:51,730 --> 00:40:54,290 >> Jetzt Gott sei Dank, du nicht haben, um durch alle Vernunft 935 00:40:54,290 --> 00:40:56,560 dieser Art von Fragen auf eigene Faust. 936 00:40:56,560 --> 00:40:59,310 Lassen Sie mich gehen Sie vor und öffnen bis einem Terminal-Fenster hier 937 00:40:59,310 --> 00:41:03,050 und eröffnen, nur für einen Augenblick, ein super kurzes Programm, das 938 00:41:03,050 --> 00:41:04,360 auch ist eine Art sinnlos. 939 00:41:04,360 --> 00:41:05,152 Es ist hässlich. 940 00:41:05,152 --> 00:41:06,610 Es ist nicht alles sinnvoll zu erreichen. 941 00:41:06,610 --> 00:41:10,180 Aber es hat Probleme zeigen Speicher, so lassen Sie uns einen Blick. 942 00:41:10,180 --> 00:41:11,830 >> Haupt, super einfach. 943 00:41:11,830 --> 00:41:14,830 Er fordert offenbar eine Funktion, f, und dann gibt 0. 944 00:41:14,830 --> 00:41:16,310 Es ist ziemlich schwer zu Chaos dieser auf. 945 00:41:16,310 --> 00:41:18,540 So Main ist ziemlich gut, so weit. 946 00:41:18,540 --> 00:41:20,100 >> F so problematisch ist. 947 00:41:20,100 --> 00:41:22,120 Und einfach nicht allzu viel Mühe in die Namensgebung 948 00:41:22,120 --> 00:41:23,990 hier, um den Fokus auf den Code halten. 949 00:41:23,990 --> 00:41:25,740 f hat zwei Linien. 950 00:41:25,740 --> 00:41:27,610 Und mal sehen, was jetzt los ist. 951 00:41:27,610 --> 00:41:29,840 So kann einerseits hier-- und lassen Sie mich 952 00:41:29,840 --> 00:41:32,680 dies im Einklang mit der bisherigen example-- auf der einen Seite, 953 00:41:32,680 --> 00:41:35,830 Die linke Seite ist zu tun, was, auf Englisch? 954 00:41:35,830 --> 00:41:36,493 Es ist-- 955 00:41:36,493 --> 00:41:37,701 ZIELGRUPPE: Erstellen eines Zeigers. 956 00:41:37,701 --> 00:41:40,830 David J. MALAN: Erstellen eines Zeigers in einen int und nannte es x. 957 00:41:40,830 --> 00:41:43,789 So ist es die Schaffung einer dieser Boxen Ich halte, Zeichnen auf dem Touchscreen. 958 00:41:43,789 --> 00:41:45,913 Und jetzt auf der rechten Seite des Seite malloc natürlich 959 00:41:45,913 --> 00:41:47,420 ist die Zuteilung der ein Stück Erinnerung. 960 00:41:47,420 --> 00:41:49,989 Und nur klar zu sein, wie viel Speicher ist es offenbar 961 00:41:49,989 --> 00:41:52,030 Zuteilung, wenn Sie nur Mathe Art von hier? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> So ist es 40 Byte. 964 00:41:54,040 --> 00:41:57,400 Und ich weiß, dass nur weil ich weiß, ein int am CS50 Gerät zumindest 965 00:41:57,400 --> 00:41:58,060 vier Bytes. 966 00:41:58,060 --> 00:41:59,610 Also 10 mal 4 ist 40. 967 00:41:59,610 --> 00:42:04,924 So ist dies Speichern einer x die Adresse der ersten von 40 ints, dass 968 00:42:04,924 --> 00:42:07,340 wurden Raum zugeordnet zurück, nach hinten, nach hinten, nach hinten. 969 00:42:07,340 --> 00:42:08,470 >> Und das ist, was ist Schlüssel zu malloc. 970 00:42:08,470 --> 00:42:11,261 Es ist nicht wenig Speicher nehmen hier, ein wenig hier, ein wenig hier. 971 00:42:11,261 --> 00:42:14,220 Es gibt Ihnen einen Teil des Speichers, hängend, vom Betriebs 972 00:42:14,220 --> 00:42:15,240 System. 973 00:42:15,240 --> 00:42:18,500 >> Nun, was über diese, x Halterung 10 gleich 0 ist? 974 00:42:18,500 --> 00:42:19,470 Beliebige Codezeile. 975 00:42:19,470 --> 00:42:21,100 Es ist nicht alles sinnvoll zu erreichen. 976 00:42:21,100 --> 00:42:26,128 Aber es ist interessant, weil x Halterung 10--? 977 00:42:26,128 --> 00:42:26,628 Ja? 978 00:42:26,628 --> 00:42:27,912 >> ZIELGRUPPE: [unverständlich]? 979 00:42:27,912 --> 00:42:30,500 >> David J. MALAN: x Halterung 10 nicht null ist. 980 00:42:30,500 --> 00:42:35,070 Die Null Detail nur ins Spiel kommt mit Streichern, am Ende eines Strings. 981 00:42:35,070 --> 00:42:36,700 Aber ein guter Gedanke. 982 00:42:36,700 --> 00:42:39,615 >> Wie groß ist dieses Array, auch obwohl ich 40 Byte zugewiesen? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Es ist 0 bis neun, oder? 985 00:42:43,690 --> 00:42:45,120 Es ist 10 Ints, total. 986 00:42:45,120 --> 00:42:48,790 40 Bytes, aber 10 Ints, bis 0 0 indiziert. 987 00:42:48,790 --> 00:42:50,930 >> Also, was ist, dass x Halterung 10? 988 00:42:50,930 --> 00:42:53,090 Es ist eigentlich ein unbekannt Müll Wert. 989 00:42:53,090 --> 00:42:54,780 Es ist Speicher, der nicht zu mir gehört. 990 00:42:54,780 --> 00:42:59,650 Ich sollte nicht berührt werden, dass Byte-Zahl 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Ich bin etwas zu weit zu gehen. 992 00:43:01,420 --> 00:43:04,490 >> Und in der Tat, wenn ich dieses Programm, könnte es sehr gut abstürzen. 993 00:43:04,490 --> 00:43:05,790 Aber manchmal werden wir Glück haben. 994 00:43:05,790 --> 00:43:07,706 Und so einfach zu zeigen, this-- und ehrlich gesagt, 995 00:43:07,706 --> 00:43:11,000 Sie wissen nie, bevor Sie Sie es-- wir laufen diese. 996 00:43:11,000 --> 00:43:12,480 Es hat nicht wirklich abstürzen. 997 00:43:12,480 --> 00:43:15,032 >> Aber wenn ich diese, für ändern So wie 1000 sein, 998 00:43:15,032 --> 00:43:16,740 Um dies wirklich zu machen bewusste, mal sehen, 999 00:43:16,740 --> 00:43:18,710 wenn wir es bekommen können, diese Zeit abstürzen. 1000 00:43:18,710 --> 00:43:20,070 OK, es hat nicht abstürzen. 1001 00:43:20,070 --> 00:43:22,600 Wie etwa 100.000? 1002 00:43:22,600 --> 00:43:25,000 Lassen Sie uns ein Remake, und jetzt erneut ausführen. 1003 00:43:25,000 --> 00:43:25,500 Ok. 1004 00:43:25,500 --> 00:43:25,960 Puh. 1005 00:43:25,960 --> 00:43:26,460 In Ordnung. 1006 00:43:26,460 --> 00:43:29,090 Also anscheinend wieder, diese Speichersegmente, sozusagen 1007 00:43:29,090 --> 00:43:32,660 sind recht groß, so können wir bekommen immer wieder Glück. 1008 00:43:32,660 --> 00:43:36,510 Aber irgendwann, wenn man einmal lächerlich und wirklich gehen weit draußen auf dem Bildschirm, 1009 00:43:36,510 --> 00:43:39,120 Sie Speicher berühren, die wirklich, wirklich nicht zu euch gehören. 1010 00:43:39,120 --> 00:43:40,870 >> Aber ehrlich gesagt, diese Arten von Bugs gehen 1011 00:43:40,870 --> 00:43:43,020 härter und härter zu sein auf eigene Faust herauszufinden. 1012 00:43:43,020 --> 00:43:47,880 Aber Gott sei Dank, als Programmierer, haben wir Werkzeuge, die uns, dies für uns zu tun erlauben. 1013 00:43:47,880 --> 00:43:50,140 Also das ist vielleicht einer der hässlichsten Programme, 1014 00:43:50,140 --> 00:43:52,060 noch hässlicher als gdb Ausgang. 1015 00:43:52,060 --> 00:43:55,670 Aber es hat immer eine Linie oder zwei, die super nützlich sind. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind ist ein Programm, das hilft, Sie ein Programm debuggen nicht per se 1017 00:44:00,310 --> 00:44:03,500 aber Sie finden hier speicherbezogene Probleme, speziell. 1018 00:44:03,500 --> 00:44:07,590 Es wird automatisch der Code für RUN Sie und suchen Sie nach mindestens zwei Dinge. 1019 00:44:07,590 --> 00:44:10,680 Eine, hast du etwas zu tun versehentliche wie Touch Memory 1020 00:44:10,680 --> 00:44:11,980 das hat nicht Ihnen gehören? 1021 00:44:11,980 --> 00:44:13,590 Es wird Ihnen helfen, die Fälle zu finden. 1022 00:44:13,590 --> 00:44:15,710 >> Und zwei, wird es helfen Sie finden so genannte 1023 00:44:15,710 --> 00:44:19,270 Speicherlecks, die wir haben völlig ignoriert, naiv, 1024 00:44:19,270 --> 00:44:21,380 für einige Zeit und selig. 1025 00:44:21,380 --> 00:44:23,140 Aber es stellt sich heraus, die alle Diesmal, wenn 1026 00:44:23,140 --> 00:44:26,620 Sie getString gerufen haben so viele unserer Programme, 1027 00:44:26,620 --> 00:44:28,930 Sie fragen das Betriebs sind System für Speicher, 1028 00:44:28,930 --> 00:44:32,070 aber Sie haben keine Erinnerung der jemals die ihm 1029 00:44:32,070 --> 00:44:36,169 zurück, tut UNALLOC oder frei, wie es heißt. 1030 00:44:36,169 --> 00:44:37,960 Nein, denn wir haben noch nie Sie gebeten, dies zu tun. 1031 00:44:37,960 --> 00:44:41,250 >> Aber die ganze Zeit, die Programme Sie habe in C geschrieben 1032 00:44:41,250 --> 00:44:43,800 wurden undicht Speicher, fragt das Betriebs 1033 00:44:43,800 --> 00:44:46,190 System für mehr Speicher für Streicher und so weiter, 1034 00:44:46,190 --> 00:44:47,870 aber nie reichte es zurück. 1035 00:44:47,870 --> 00:44:50,080 Und das ist jetzt ein bisschen einer Vereinfachung, 1036 00:44:50,080 --> 00:44:53,550 aber wenn Sie jemals haben laufen Ihrem Mac oder Ihr PC für einige Zeit, die Öffnung 1037 00:44:53,550 --> 00:44:55,790 viele Programme, vielleicht Programme schließen, 1038 00:44:55,790 --> 00:44:57,795 und auch wenn Ihr Computer nicht abgestürzt ist, 1039 00:44:57,795 --> 00:45:01,690 es ist immer so viel langsamer, als ob es wirklich 1040 00:45:01,690 --> 00:45:04,290 mit viel Speicher oder Ressourcen, auch wenn, 1041 00:45:04,290 --> 00:45:06,070 wenn Sie nicht selbst Berühren der Tastatur, 1042 00:45:06,070 --> 00:45:10,430 dass aber BE-- konnte nicht always-- konnte sein, dass die Programme, die Sie laufen 1043 00:45:10,430 --> 00:45:11,920 haben sich Speicherlecks. 1044 00:45:11,920 --> 00:45:15,645 Und sie immer wieder die OS für mehr und mehr Speicher, sondern um es zu vergessen, 1045 00:45:15,645 --> 00:45:18,470 nicht wirklich mit, aber daher unter Speicher entfernt 1046 00:45:18,470 --> 00:45:20,500 aus anderen Programmen, die es möchten. 1047 00:45:20,500 --> 00:45:23,940 Also das ist eine gemeinsame Erklärung. 1048 00:45:23,940 --> 00:45:25,940 Jetzt ist hier, wo die Valgrind Ausgang vollständig 1049 00:45:25,940 --> 00:45:29,290 grauenhaft, um die weniger und bequemer gleichermaßen. 1050 00:45:29,290 --> 00:45:32,690 Aber die interessante Zeug ist bis hier. 1051 00:45:32,690 --> 00:45:37,060 Es sagt mir, einen ungültigen Schreib von Größe vier geschieht in diesem Programm, 1052 00:45:37,060 --> 00:45:40,640 insbesondere in Zeile 21 der memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Wenn ich in die Linie 21, hm, gibt in der Tat ist ein ungültiger Schreib der Größe vier. 1054 00:45:45,450 --> 00:45:46,250 Warum Size? 1055 00:45:46,250 --> 00:45:49,500 Nun, dieses number-- und es könnte anything-- sein ist ein int. 1056 00:45:49,500 --> 00:45:50,450 So ist es vier Byte. 1057 00:45:50,450 --> 00:45:52,550 Also ich bin dass vier Bytes wo sie nicht hingehören. 1058 00:45:52,550 --> 00:45:55,080 Das ist, was Valgrind ist mir eigentlich erzählen. 1059 00:45:55,080 --> 00:45:57,600 Darüber hinaus wird es auch sagen Sie mir, wie wir sehen werden, 1060 00:45:57,600 --> 00:46:01,490 wie Sie dies in einer zukünftigen pSoll laufen, wenn und wenn Sie die Speicher, die ja zugespielt haben 1061 00:46:01,490 --> 00:46:05,300 Ich habe, weil ich genannt habe malloc, aber ich habe nicht wirklich 1062 00:46:05,300 --> 00:46:08,010 genannt wird, in diesem Fall frei, was wir sehen, schließlich 1063 00:46:08,010 --> 00:46:09,830 ist das Gegenteil von malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> So, jetzt, glaube ich, ein letztes Beispiel. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Also das hier ist ein wenig mehr geheimnisvoll, aber es ist vielleicht 1068 00:46:16,690 --> 00:46:19,180 der wichtigste Grund, um Vorsicht mit Speicher, 1069 00:46:19,180 --> 00:46:24,490 und der Grund dafür, daß viele Programme und / oder Web-Server, bis auf diesen Tag, 1070 00:46:24,490 --> 00:46:28,200 werden von bösen Jungs irgendwo genommen im Internet, die irgendwie sind 1071 00:46:28,200 --> 00:46:33,390 gefälschte Pakete senden Ihren Server versuchen, Ihre Konten gefährden, 1072 00:46:33,390 --> 00:46:36,420 oder nehmen Ihre Daten, oder einfach nur in der Regel über eine Maschine zu nehmen. 1073 00:46:36,420 --> 00:46:38,910 Pufferüberlauf, da die Name schon sagt, mittels 1074 00:46:38,910 --> 00:46:40,740 Überlaufen nicht ein int, aber einen Puffer. 1075 00:46:40,740 --> 00:46:43,490 Und einen Puffer ist nur eine andere Art zu sagen, es ist ein Haufen von Speicher. 1076 00:46:43,490 --> 00:46:46,710 >> Und in der Tat, rief ich ein String vor Puffer anstelle von S. 1077 00:46:46,710 --> 00:46:49,234 Denn wenn es einen Puffer, wie in der YouTube-Sinn, 1078 00:46:49,234 --> 00:46:52,400 oder jede Zeit, die Sie gerade ein Video, Sie könnte das Wort Pufferung gesehen haben, 1079 00:46:52,400 --> 00:46:53,040 Punkt, Punkt, Punkt. 1080 00:46:53,040 --> 00:46:54,240 Es ist unglaublich ärgerlich. 1081 00:46:54,240 --> 00:46:55,990 Und das bedeutet nur, dass Ihre Video-Player 1082 00:46:55,990 --> 00:46:58,710 versucht, viele downloaden von Bytes, viele Bytes 1083 00:46:58,710 --> 00:47:00,170 von einem Video aus dem Internet. 1084 00:47:00,170 --> 00:47:02,920 Aber es ist langsam, so dass es versucht , eine Reihe von ihnen downloaden 1085 00:47:02,920 --> 00:47:06,430 einen Puffer, einen Behälter zu füllen, so dass Sie genug Bytes haben, dass sie dann 1086 00:47:06,430 --> 00:47:09,174 zeigen Sie das Video, ohne Pause ständig. 1087 00:47:09,174 --> 00:47:11,340 Aber es stellt sich heraus, können Sie haben einen Puffer, um dieses groß. 1088 00:47:11,340 --> 00:47:15,710 Aber versuchen Sie, so viel Daten in setzen , und sehr schlechte Dinge passieren können. 1089 00:47:15,710 --> 00:47:22,780 So zum Beispiel, schauen wir uns an Dieser letzte Teaser Beispiel. 1090 00:47:22,780 --> 00:47:24,720 Dies ist ein weiterer Programm dass auf den ersten Blick, 1091 00:47:24,720 --> 00:47:26,540 nichts super nützlich machen. 1092 00:47:26,540 --> 00:47:29,590 Es ist eine Hauptfunktion bekam dass nennt diese Funktion, f. 1093 00:47:29,590 --> 00:47:36,640 Und diese Funktion, f, hier oben, hat ein char-Array, genannt c, der Größe 12. 1094 00:47:36,640 --> 00:47:39,340 Und dann ist es mit diesem neue Funktion strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Es stellt sich heraus, dass mit diesem einfachen, einfache Code-Zeile, nur zwei Linien, 1097 00:47:45,190 --> 00:47:49,130 wir haben mein ganzes Programm gemacht, und deshalb meine gesamte Computer, 1098 00:47:49,130 --> 00:47:54,000 und mein Benutzerkonto, und meine Fest fahren potentiell anfällig für jedermann 1099 00:47:54,000 --> 00:47:58,170 wer weiß, und ist gut genug zu laufen dieses Programm mit einem bestimmten Befehlszeile 1100 00:47:58,170 --> 00:47:58,900 Argument. 1101 00:47:58,900 --> 00:48:03,400 In anderen Worten, wenn diese schlechte Kerl legt innerhalb von argvargv [1], indem Sie 1102 00:48:03,400 --> 00:48:08,750 an der Tastatur einen sehr speziell gestaltete String, nicht abc, 123, aber im Wesentlichen, 1103 00:48:08,750 --> 00:48:15,180 binären Symbolen, die ausführbare Datei darstellen Code, ein Programm, das er oder sie schrieb, 1104 00:48:15,180 --> 00:48:19,190 mit diesem einfachen Programm, das ist Vertreter der Tausende von Programmen 1105 00:48:19,190 --> 00:48:23,610 , die ähnlich gefährdet sind, wage zu behaupten, er oder sie kann letztlich alles löschen 1106 00:48:23,610 --> 00:48:26,680 die Dateien auf meiner Festplatte, erhalten eine blinkende Eingabeaufforderung, so dass er oder sie 1107 00:48:26,680 --> 00:48:30,170 Geben Sie Befehle auf ihre eigenen, per E-Mail alle Dateien für mich. 1108 00:48:30,170 --> 00:48:34,660 Alles, was ich tun kann, er oder sie mit diesem Code zu tun. 1109 00:48:34,660 --> 00:48:36,575 >> Wir werden nicht ganz lösen diese noch. 1110 00:48:36,575 --> 00:48:38,700 Und in der Tat, es geht um beinhalten ein kleines Bild 1111 00:48:38,700 --> 00:48:41,470 wie diese, die wir bald kommen zu verstehen, umso besser. 1112 00:48:41,470 --> 00:48:44,480 Aber für heute, wir enden am was ist, hoffentlich, eine etwas 1113 00:48:44,480 --> 00:48:48,360 verständlich XKCD Witz, bis wir wieder beim nächsten Mal. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 In Ordnung. 1116 00:48:51,600 --> 00:48:53,446 Wir sehen uns am Mittwoch. 1117 00:48:53,446 --> 00:48:54,754 >> [Musik zu spielen] 1118 00:48:54,754 --> 00:48:57,790 >> SPRECHER: Und jetzt, tief Gedanken, von Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Das Gedächtnis ist wie ein Sprung in einen Haufen goldenen Blätter an einem Sonntag Nachmittag. 1121 00:49:04,770 --> 00:49:09,000 Wind weht, werfen Sie Ihre hair-- oh, ich vermisse die Tage when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Gelächter] 1124 00:49:12,650 --> 00:49:13,750