1 00:00:00,000 --> 00:00:03,381 >> [Musikwiedergabe] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO PLAYBACK] 4 00:00:11,610 --> 00:00:13,640 >> -Er lügt. 5 00:00:13,640 --> 00:00:14,380 >> -Worüber? 6 00:00:14,380 --> 00:00:17,182 >> -Ich weiß es nicht. 7 00:00:17,182 --> 00:00:19,990 >> -SO Was wissen wir? 8 00:00:19,990 --> 00:00:23,145 >> -Das Um 9:15, Ray Santoya war bei der ATM. 9 00:00:23,145 --> 00:00:23,644 -Ja. 10 00:00:23,644 --> 00:00:27,030 Die Frage ist also, was tat er, um 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Die 9 Millimeter auf etwas. 12 00:00:29,720 --> 00:00:31,540 Vielleicht sah er den Scharfschützen. 13 00:00:31,540 --> 00:00:33,412 >> -oder Mit ihm arbeiten. 14 00:00:33,412 --> 00:00:34,340 >> -wait. 15 00:00:34,340 --> 00:00:36,200 Gehen Sie zurück ein. 16 00:00:36,200 --> 00:00:36,975 >> -Was siehst du? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bringen Sein Gesicht Vollbild. 19 00:00:47,805 --> 00:00:48,680 >> -His Brille. 20 00:00:48,680 --> 00:00:50,060 >> -Es Ist eine Reflexion. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Es Ist das Nuevitas Baseball-Team. 23 00:01:02,280 --> 00:01:03,110 Das ist ihr Logo. 24 00:01:03,110 --> 00:01:05,820 >> -Und Er zu sprechen wer trägt diese Jacke. 25 00:01:05,820 --> 00:01:06,670 >> [END PLAYBACK] 26 00:01:06,670 --> 00:01:07,628 >> DAVID MALAN: Alles klar. 27 00:01:07,628 --> 00:01:11,210 Dies CS50 und dies ist ein wenig von [unverständlich], mit dem Sie 28 00:01:11,210 --> 00:01:12,890 Dilettantismus mit Problem stellte vier ein. 29 00:01:12,890 --> 00:01:16,606 Heute starten wir ein wenig mehr suchen tief auf diese Dinge genannt Zeigern, 30 00:01:16,606 --> 00:01:18,480 welches, obwohl es eine ziemlich obskure Thema, 31 00:01:18,480 --> 00:01:20,813 es stellt sich heraus, dass es geht das Mittel sein, mit dem wir 32 00:01:20,813 --> 00:01:24,320 kann mit dem Bau und Montage viel mehr anspruchsvolle Programme. 33 00:01:24,320 --> 00:01:28,150 Aber wir haben es am vergangenen Mittwoch anhand einiger claymation zuerst. 34 00:01:28,150 --> 00:01:30,190 Also das, Rückruf ist Binky und wir haben ihn benutzt 35 00:01:30,190 --> 00:01:33,148 um einen Blick auf ein Programm zu nehmen, dass nicht wirklich etwas Interessantes zu tun, 36 00:01:33,148 --> 00:01:34,950 aber es hat ein paar Probleme zu offenbaren. 37 00:01:34,950 --> 00:01:38,570 Also heute, um zu beginnen, warum nicht wir zu Fuß schnell durch einige dieser Schritte, 38 00:01:38,570 --> 00:01:41,920 versuchen, in Bezug auf die Menschen destillieren genau das, was hier vor sich geht 39 00:01:41,920 --> 00:01:45,410 und warum dies schlecht ist, und fahren Sie dann und tatsächlich beginnen etwas zu bauen, 40 00:01:45,410 --> 00:01:46,309 mit dieser Technik? 41 00:01:46,309 --> 00:01:48,350 So waren die ersten zwei Zeilen in diesem Programm 42 00:01:48,350 --> 00:01:51,340 und in juristischer Hinsicht, was werden diese beiden Linien zu tun? 43 00:01:51,340 --> 00:01:55,600 Jemand, der recht komfortabel ist mit dem, was auf dem Bildschirm erklärt? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Was sind diese beiden Linien zu tun? 46 00:02:00,120 --> 00:02:02,070 Es ist nicht alles, unterscheidet sich von Woche eins, 47 00:02:02,070 --> 00:02:03,611 aber es gibt einige neue Sonderzeichen. 48 00:02:03,611 --> 00:02:04,152 Ja? 49 00:02:04,152 --> 00:02:05,628 Zurück gibt. 50 00:02:05,628 --> 00:02:07,092 >> ZIELGRUPPE: Deklarieren von Zeigern? 51 00:02:07,092 --> 00:02:08,050 DAVID MALAN: Sagen Sie wieder? 52 00:02:08,050 --> 00:02:08,860 ZIELGRUPPE: Deklarieren von Zeigern? 53 00:02:08,860 --> 00:02:11,776 DAVID MALAN: Deklarieren von Zeigern und Lassen Sie uns zu verfeinern es ein bisschen mehr. 54 00:02:11,776 --> 00:02:14,050 ZIELGRUPPE: [unverständlich] Adresse x und y. 55 00:02:14,050 --> 00:02:15,300 DAVID MALAN: Und dann anzugehen. 56 00:02:15,300 --> 00:02:18,550 So gesagt, was wir tun wird uns erklärt, zwei Variablen. 57 00:02:18,550 --> 00:02:21,252 Diese Variablen allerdings gehen um vom Typ int Sterne, werden, 58 00:02:21,252 --> 00:02:23,210 Genauer gesagt bedeutet sie gehen, um zu speichern 59 00:02:23,210 --> 00:02:26,450 die Adresse eines int, jeweils x und y. 60 00:02:26,450 --> 00:02:27,660 Jetzt gibt es irgendwelche Werte? 61 00:02:27,660 --> 00:02:32,621 Gibt es irgendwelche tatsächlichen Adressen in diesen zwei Variablen an diesem Punkt in der Zeit? 62 00:02:32,621 --> 00:02:33,120 Nein. 63 00:02:33,120 --> 00:02:35,030 Es ist nur so genannte Garbage-Werte. 64 00:02:35,030 --> 00:02:38,120 Wenn Sie nicht wirklich zuweisen ein variable, was auch immer in RAM war 65 00:02:38,120 --> 00:02:42,224 zuvor wird sich mit Nullen zu füllen und diejenigen, beide dieser Variablen. 66 00:02:42,224 --> 00:02:44,140 Aber wir wissen noch nicht, was sie sind, und das ist, 67 00:02:44,140 --> 00:02:47,060 gehen Schlüssel, warum Binky zu sein den Kopf verloren letzte Woche. 68 00:02:47,060 --> 00:02:49,980 >> So war dies die claymation Inkarnation dieses 69 00:02:49,980 --> 00:02:53,580 wobei Sie nur zwei Variablen, kleine kreisförmige Stücke aus Ton, 70 00:02:53,580 --> 00:02:57,330 dass Variablen speichern, sondern als die eingewickelt Pfeile deuten darauf hin, 71 00:02:57,330 --> 00:03:00,640 sie sind nicht wirklich zeigen überall bekannt. 72 00:03:00,640 --> 00:03:03,670 Also mussten wir diese Linie, und das neu war in der vergangenen Woche, malloc für Speicher 73 00:03:03,670 --> 00:03:07,130 Allokation, die nur eine andere Art ist zu sagen, das Betriebssystem, Linux 74 00:03:07,130 --> 00:03:09,750 oder Mac OS oder Windows, hey, geben Sie mir einige Speicher, 75 00:03:09,750 --> 00:03:11,780 und alles, was Sie zu sagen, das Betriebssystem 76 00:03:11,780 --> 00:03:14,699 ist das, was bei der Beantragung es für Speicher. 77 00:03:14,699 --> 00:03:16,990 Es wird nicht zu kümmern, was Sie gehen damit zu tun, 78 00:03:16,990 --> 00:03:19,786 aber Sie brauchen, um die Betriebs sagen Systems, was durch malloc. 79 00:03:19,786 --> 00:03:20,286 Ja? 80 00:03:20,286 --> 00:03:21,078 >> Publikum: Wie viel? 81 00:03:21,078 --> 00:03:21,994 DAVID MALAN: Wie viel? 82 00:03:21,994 --> 00:03:25,280 Wieviel in Bytes, und so diese wieder eine erfundene Beispiel ist nur zu sagen, 83 00:03:25,280 --> 00:03:27,360 geben Sie mir die Größe eines int. 84 00:03:27,360 --> 00:03:30,550 Nun wird die Größe eines int vier Bytes oder 32 Bits. 85 00:03:30,550 --> 00:03:32,850 Also das ist nur eine Möglichkeit, sagen, hey, Betriebssystem, 86 00:03:32,850 --> 00:03:37,290 gib mir vier Byte, dass ich zu meiner Verfügung zu verwenden, 87 00:03:37,290 --> 00:03:40,560 und gesagt, was bedeutet malloc Rendite gegen 88 00:03:40,560 --> 00:03:41,795 in diesem Stück von vier Bytes? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 ZIELGRUPPE: Adresse? 91 00:03:44,860 --> 00:03:45,901 DAVID MALAN: Die Adresse. 92 00:03:45,901 --> 00:03:47,580 Die Adresse dieser Brocken von vier Bytes. 93 00:03:47,580 --> 00:03:48,190 Genau. 94 00:03:48,190 --> 00:03:51,430 Und so das ist, was letztendlich gespeichert in x und das ist, warum wir nicht wirklich 95 00:03:51,430 --> 00:03:55,240 egal, was die Anzahl der, dass Adresse ist, ob es sich um ox1 oder OX2 96 00:03:55,240 --> 00:03:57,110 oder eine kryptische hexadezimale Adresse. 97 00:03:57,110 --> 00:03:59,850 Wir kümmern uns nur bildhaft daß die Variable x ist jetzt 98 00:03:59,850 --> 00:04:01,630 zeigt auf diesem Teil des Speichers. 99 00:04:01,630 --> 00:04:05,570 So der Pfeil repräsentiert einen Zeiger oder Genauer gesagt wird eine Speicheradresse. 100 00:04:05,570 --> 00:04:09,120 Aber noch einmal, wir in der Regel nicht kümmern was die eigentlichen Adressen sind. 101 00:04:09,120 --> 00:04:11,780 Nun, sagt dieser Linie was in juristischer Hinsicht? 102 00:04:11,780 --> 00:04:14,330 Sterne x erhält 42 Semikolon. 103 00:04:14,330 --> 00:04:17,390 Was bedeutet das? 104 00:04:17,390 --> 00:04:18,200 Du willst gehen? 105 00:04:18,200 --> 00:04:20,102 Nicht zerkratzen den Hals. 106 00:04:20,102 --> 00:04:22,360 >> ZIELGRUPPE: Die Adresse von x ist am 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID MALAN: Die Adresse von x ist 42. 108 00:04:24,300 --> 00:04:25,190 Nicht ganz. 109 00:04:25,190 --> 00:04:28,485 So nah, aber nicht ganz, denn es gibt der Stern, ist diese Voran x. 110 00:04:28,485 --> 00:04:29,860 Also müssen wir ein wenig zwicken. 111 00:04:29,860 --> 00:04:31,032 Ja? 112 00:04:31,032 --> 00:04:36,044 >> Publikum: Der Wert, den der Zeiger x ist, die auf 42. 113 00:04:36,044 --> 00:04:36,710 DAVID MALAN: OK. 114 00:04:36,710 --> 00:04:40,840 Der Wert, den der Zeiger x zeigt auf, sagen wir, sind 42, 115 00:04:40,840 --> 00:04:44,165 oder anders gesagt, die Sterne x sagt, gehen Sie zu was auch immer-Adresse 116 00:04:44,165 --> 00:04:48,340 ist in x, ob es sich um 1 Oxford Straße oder 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 oder ox1 oder OX33, was auch immer dass numerische Adresse ist, 118 00:04:51,850 --> 00:04:54,380 Sterne x die dereferenzierenden von x. 119 00:04:54,380 --> 00:04:57,297 So gehen Sie an diese Adresse und dann legte die Zahl 42 gibt. 120 00:04:57,297 --> 00:04:59,380 Also das wäre ein gleichwertige Art zu sagen, dass. 121 00:04:59,380 --> 00:05:01,860 Also das ist alles schön und dann wir würden das Bild darstellen 122 00:05:01,860 --> 00:05:05,370 wie folgt, wo wir hinzugefügt haben der 42 in diesem Stück von vier 123 00:05:05,370 --> 00:05:09,370 Byte auf der rechten Seite, aber Diese Linie wurde, wo die Dinge schiefgegangen 124 00:05:09,370 --> 00:05:11,120 und Binky den Kopf geknallt an diesem Punkt, 125 00:05:11,120 --> 00:05:15,290 weil schlechte Dinge passieren, wenn Sie dereferenzieren Müllwerte 126 00:05:15,290 --> 00:05:18,210 oder Sie dereferenzieren ungültig Zeiger, und ich sage ungültig 127 00:05:18,210 --> 00:05:21,020 da zu diesem Zeitpunkt in der Geschichte, was innerhalb von y? 128 00:05:21,020 --> 00:05:24,440 Was ist der Wert von y auf der Basis auf den letzten paar Schritte? 129 00:05:24,440 --> 00:05:25,360 Ja? 130 00:05:25,360 --> 00:05:26,115 Was ist das? 131 00:05:26,115 --> 00:05:26,990 >> Publikum: Eine Adresse. 132 00:05:26,990 --> 00:05:28,460 DAVID MALAN: Eine Adresse. 133 00:05:28,460 --> 00:05:31,910 Es sollte eine Adresse sein aber ich habe es initialisiert? 134 00:05:31,910 --> 00:05:32,800 So habe ich noch nicht. 135 00:05:32,800 --> 00:05:35,430 Also, was ist bekannt, dass in es geben? 136 00:05:35,430 --> 00:05:37,590 Es ist nur einige Müll Wert. 137 00:05:37,590 --> 00:05:41,500 Es könnte eine beliebige Adresse von Null zu sein 2000000000, wenn Sie zwei GB RAM haben, 138 00:05:41,500 --> 00:05:44,289 oder null bis 4 Milliarden Wenn Sie auch bekam vier Gigabyte RAM. 139 00:05:44,289 --> 00:05:46,080 Es ist einige Müllwert, aber das Problem ist 140 00:05:46,080 --> 00:05:48,200 dass das Betriebssystem, wenn es Ihnen nicht gegeben 141 00:05:48,200 --> 00:05:51,140 dass Teil des Speichers spezifisch dass Sie versuchen, zu gehen, 142 00:05:51,140 --> 00:05:54,650 es ist in der Regel werde, was dazu führen, wir als Segmentierungsfehler gesehen habe. 143 00:05:54,650 --> 00:05:57,810 Also in der Tat, jeder von Ihnen, haben bei Problemen bei der Bürozeiten kämpfte 144 00:05:57,810 --> 00:06:00,393 oder Probleme, die mehr ist in der Regel mit versuchen, herauszufinden, 145 00:06:00,393 --> 00:06:02,150 einen Segmentation Fault, dass in der Regel bedeutet, 146 00:06:02,150 --> 00:06:05,017 Du bist ein Segment zu berühren Speicher, die Sie sollte nicht sein. 147 00:06:05,017 --> 00:06:07,350 Sie berühren Speicher, das Betriebssystem nicht 148 00:06:07,350 --> 00:06:10,450 erlaubt Ihnen, zu berühren, egal ob es durch zu weit zu gehen in Ihrem Array 149 00:06:10,450 --> 00:06:12,870 oder ab jetzt, ob es ist, weil Sie zu berühren 150 00:06:12,870 --> 00:06:14,780 Speicher, der nur einige Müll Wert. 151 00:06:14,780 --> 00:06:18,230 >> Dabei Sterne x hier Art von undefinierten Verhalten. 152 00:06:18,230 --> 00:06:22,030 Sie sollten niemals tun, weil die Quoten werden, ist das Programm nur gehen zum Absturz zu bringen, 153 00:06:22,030 --> 00:06:24,050 weil du sagst, gehen Sie zu dieser Adresse 154 00:06:24,050 --> 00:06:27,000 und Sie haben keine Ahnung, wo diese Adresse tatsächlich ist. 155 00:06:27,000 --> 00:06:30,300 Also das Betriebssystem ist wahrscheinlich, gehen, um Ihr Programm zum Absturz bringen 156 00:06:30,300 --> 00:06:33,840 als Ergebnis ja ist, dass was da passiert ist, um Binky. 157 00:06:33,840 --> 00:06:37,210 Also letztendlich, Binky Fest Dieses Problem mit diesem. 158 00:06:37,210 --> 00:06:38,909 So dass Programm selbst war fehlerhaft. 159 00:06:38,909 --> 00:06:41,450 Aber wenn Sie eine Art vorantreiben und diese Zeile ausführen, anstatt, 160 00:06:41,450 --> 00:06:45,580 y gleich x bedeutet nur, was auch immer Adresse ist eine x, legte es auch in y. 161 00:06:45,580 --> 00:06:48,740 >> Und so bildhaft, wir haben vertreten diese mit zwei Pfeilen 162 00:06:48,740 --> 00:06:51,570 von x und von y Zeige an der gleichen Stelle. 163 00:06:51,570 --> 00:06:55,760 So semantisch, gleich x y, da beide von denen 164 00:06:55,760 --> 00:07:00,300 werden zum Speichern derselben Adresse, ergo zeigt auf 42, 165 00:07:00,300 --> 00:07:04,910 und jetzt, wenn Sie sagen, Sterne y, an die Adresse gehen in y, 166 00:07:04,910 --> 00:07:06,790 dies hat einen interessanten Nebeneffekt. 167 00:07:06,790 --> 00:07:10,320 So ist die Adresse in y ist die dasselbe wie die Adresse in x. 168 00:07:10,320 --> 00:07:15,060 Also, wenn Sie sagen, gehen Sie an die Adresse in y und ändern Sie den Wert bis 13, 169 00:07:15,060 --> 00:07:17,140 Wer ist betroffen? 170 00:07:17,140 --> 00:07:21,100 X ist, Punkt D, so zu sprechen, sollten ebenso betroffen sein. 171 00:07:21,100 --> 00:07:24,340 >> Und in der Tat, wie Nick zeichnete dieses Bild in claymation war genau das. 172 00:07:24,340 --> 00:07:28,665 Auch wenn wir folgen dem Zeiger y, landeten wir an der gleichen Stelle, 173 00:07:28,665 --> 00:07:32,780 und so, wenn wir zu drucken waren aus X oder Y ist pointee, 174 00:07:32,780 --> 00:07:35,720 dann würden wir den Wert von 13 zu sehen. 175 00:07:35,720 --> 00:07:37,927 Nun, ich sage pointee zu sein konsistent mit dem Video. 176 00:07:37,927 --> 00:07:39,760 Programmierer, meiner Wissen, nie wirklich 177 00:07:39,760 --> 00:07:42,460 sagen, das Wort pointee, das, was gezeigt wird 178 00:07:42,460 --> 00:07:44,650 an, sondern auch für die Konsistenz mit dem Video, erkennen 179 00:07:44,650 --> 00:07:47,520 das ist alles, war in dieser Situation bestimmt. 180 00:07:47,520 --> 00:07:54,190 Also irgendwelche Fragen über claymation oder Zeiger oder malloc jetzt noch? 181 00:07:54,190 --> 00:07:54,850 Nein? 182 00:07:54,850 --> 00:07:55,470 Gut. 183 00:07:55,470 --> 00:07:58,560 >> So ohne weiteres Umschweife, lassen Sie uns einen Blick 184 00:07:58,560 --> 00:08:00,700 bei denen dies eigentlich seit einiger Zeit verwendet. 185 00:08:00,700 --> 00:08:03,580 Also haben wir diesen CS50-Bibliothek hatte das ist all diese Funktionen hat. 186 00:08:03,580 --> 00:08:06,810 Wir haben getint verwendet eine Menge, GetString, wahrscheinlich früher GetLongLong 187 00:08:06,810 --> 00:08:09,840 in meinem PSet ein oder so, aber was eigentlich los ist auf? 188 00:08:09,840 --> 00:08:12,920 Nun, lassen Sie uns einen kurzen Blick unter der Haube auf einem Programm, das 189 00:08:12,920 --> 00:08:17,017 inspiriert, warum geben wir Ihnen die CS50 Bibliothek, und in der Tat, wie in der vergangenen Woche, 190 00:08:17,017 --> 00:08:18,850 wir begonnen, diejenigen, Stützräder ab. 191 00:08:18,850 --> 00:08:21,080 Also das ist nun sortiert einer Obduktion, was 192 00:08:21,080 --> 00:08:23,690 gibt es schon innerhalb der CS50-Bibliothek, 193 00:08:23,690 --> 00:08:27,250 auch wenn wir jetzt beginnt sich zu bewegen weg von den meisten Programmen. 194 00:08:27,250 --> 00:08:29,460 >> Das ist also ein Programm scanf 0 bezeichnet. 195 00:08:29,460 --> 00:08:30,510 Es ist super kurz. 196 00:08:30,510 --> 00:08:33,909 Es hat nur diese Zeilen, aber es stellt eine Funktion namens scanf 197 00:08:33,909 --> 00:08:36,909 dass wir eigentlich vor sich geht um zu sehen ein Moment innerhalb der CS50-Bibliothek, 198 00:08:36,909 --> 00:08:38,600 wenn auch in etwas anderer Form. 199 00:08:38,600 --> 00:08:41,330 So ist dieses Programm auf der Leitung 16 ist eine Variable deklarieren x. 200 00:08:41,330 --> 00:08:43,150 Also gib mir vier Bytes für ein int. 201 00:08:43,150 --> 00:08:45,750 Es wird erzählt, Benutzer, Nummer bitte, und dann 202 00:08:45,750 --> 00:08:49,010 das ist eine interessante Linie, letzte Woche tatsächlich miteinander verbindet 203 00:08:49,010 --> 00:08:49,790 Und dies. 204 00:08:49,790 --> 00:08:53,230 Scanf, und dann feststellen, es dauert ein Format-String, wie printf, 205 00:08:53,230 --> 00:08:57,480 % i bedeutet einen int, und dann dauert es ein zweite Argument, die ein wenig aussieht 206 00:08:57,480 --> 00:08:58,260 flippig. 207 00:08:58,260 --> 00:09:01,880 Es ist Et-Zeichen x, und daran zu erinnern, sahen wir dies einmal in der vergangenen Woche nur. 208 00:09:01,880 --> 00:09:03,465 Was bedeutet Et-Zeichen x dar? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Was bedeutet Et-Zeichen in C tun? 211 00:09:08,450 --> 00:09:08,950 Ja? 212 00:09:08,950 --> 00:09:10,024 >> ZIELGRUPPE: Die Adresse. 213 00:09:10,024 --> 00:09:11,190 DAVID MALAN: Die Adresse. 214 00:09:11,190 --> 00:09:13,190 So ist es das Gegenteil der Sternoperator, 215 00:09:13,190 --> 00:09:17,270 während die Sterne Betreiber sagt, zu gehen Adresse, das kaufmännische Betreiber 216 00:09:17,270 --> 00:09:20,280 sagt, herauszufinden, die Adresse dieses variable, 217 00:09:20,280 --> 00:09:23,530 und so ist dies Taste, denn Zweck scanf im Leben 218 00:09:23,530 --> 00:09:26,320 ist zum Scannen des Benutzers Eingabe von der Tastatur, 219 00:09:26,320 --> 00:09:29,970 je nachdem, was auch immer er oder sie Typen, und lesen Sie dann Eingabe des Benutzers 220 00:09:29,970 --> 00:09:32,970 in eine variable, aber wir sah in den vergangenen zwei Wochen 221 00:09:32,970 --> 00:09:36,080 dass diese Swap-Funktion, die wir mühelos versucht, umzusetzen 222 00:09:36,080 --> 00:09:37,110 war nur gebrochen. 223 00:09:37,110 --> 00:09:42,470 Daran erinnern, dass die Swap-Funktion, wenn wir so wie ints deklariert A und B, 224 00:09:42,470 --> 00:09:47,040 wir haben erfolgreich tauschen die zwei Variablen innerhalb der Swap- 225 00:09:47,040 --> 00:09:50,080 Genau wie bei der Milch und Orangensaft, aber sobald Swap zurück 226 00:09:50,080 --> 00:09:55,200 was war das Ergebnis in Bezug x und y sind die ursprünglichen Werte? 227 00:09:55,200 --> 00:09:55,700 Gar nichts. 228 00:09:55,700 --> 00:09:56,200 Ja. 229 00:09:56,200 --> 00:09:59,754 Nichts ist passiert, dass die Zeit, denn Swaps nur die lokalen Kopien ändern, 230 00:09:59,754 --> 00:10:01,670 was zu sagen, alles ist dieses Mal, wenn wir haben 231 00:10:01,670 --> 00:10:04,010 wurde in Argumenten vorbei auf Funktionen, wir sind 232 00:10:04,010 --> 00:10:05,939 nur auf der Durch Kopien dieser Argumente. 233 00:10:05,939 --> 00:10:07,980 Sie können mit dem zu tun was Sie wollen mit ihnen, 234 00:10:07,980 --> 00:10:10,890 aber sie gehen nicht zu haben, Wirkung auf die ursprünglichen Werte zurück. 235 00:10:10,890 --> 00:10:13,650 Also das ist problematisch, wenn Sie möchte eine Funktion wie scanf haben 236 00:10:13,650 --> 00:10:17,170 im Leben, ist deren Zweck zu scannen die Eingabe des Anwenders von der Tastatur 237 00:10:17,170 --> 00:10:22,010 und dann die Lücken zu füllen, so zu zu sprechen, das heißt, geben Sie eine Variable wie x 238 00:10:22,010 --> 00:10:25,410 ein Wert, denn wenn ich nur passieren x zu scanf, 239 00:10:25,410 --> 00:10:28,790 wenn Sie die Logik des vergangenen betrachten Woche können scanf tun, was es will, 240 00:10:28,790 --> 00:10:33,100 mit einer Kopie von x, aber es konnte nicht x dauerhaft zu ändern, es sei denn wir geben 241 00:10:33,100 --> 00:10:37,120 scanf eine Schatzkarte, so zu sprechen, wobei x markiert die Stelle, wobei 242 00:10:37,120 --> 00:10:41,860 wir in der Adresse von x, so dass übergeben scanf kann es und tatsächlich Veränderung gehen 243 00:10:41,860 --> 00:10:42,920 der Wert von x. 244 00:10:42,920 --> 00:10:45,080 Und so in der Tat, alle dass dieses Programm funktioniert 245 00:10:45,080 --> 00:10:53,180 wenn ich scanf 0, in meinem Source- 5m Verzeichnis, stellen scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot Slash scanf, Nummer bitte 50, danke für den 50. 247 00:10:57,730 --> 00:11:01,020 >> Also ist es nicht so interessant, Aber was ist wirklich passiert 248 00:11:01,020 --> 00:11:04,820 ist, dass, sobald ich nennen scanf Hier wird der Wert von x 249 00:11:04,820 --> 00:11:06,410 wird nachhaltig verändert. 250 00:11:06,410 --> 00:11:08,335 Jetzt scheint diese schöne und gut, und in der Tat ist es 251 00:11:08,335 --> 00:11:11,200 scheint, wie wir nicht wirklich brauchen der CS50-Bibliothek überhaupt nicht mehr. 252 00:11:11,200 --> 00:11:13,960 Zum Beispiel lassen Sie uns laufen dies noch einmal hier. 253 00:11:13,960 --> 00:11:15,750 Lassen Sie mich für eine Sekunde wieder zu öffnen. 254 00:11:15,750 --> 00:11:20,600 Lassen Sie uns versuchen eine Reihe bitte und anstatt zu sagen, 50 wie zuvor, 255 00:11:20,600 --> 00:11:22,810 lassen Sie uns einfach nein sagen. 256 00:11:22,810 --> 00:11:24,000 OK, das ist ein wenig seltsam. 257 00:11:24,000 --> 00:11:25,270 OK. 258 00:11:25,270 --> 00:11:28,680 Und nur einige Unsinn hier. 259 00:11:28,680 --> 00:11:31,170 So dass es nicht zu scheinen, handfehlerhaften Situationen. 260 00:11:31,170 --> 00:11:33,620 Also müssen wir Beginn minimal Hinzufügen einiger Fehlerprüfung 261 00:11:33,620 --> 00:11:37,460 um sicherzustellen, dass der Benutzer in einer tatsächlichen Zahl eingegeben haben, wie 50, 262 00:11:37,460 --> 00:11:40,720 denn anscheinend einzutippen wird nicht als problematisch erkannt, 263 00:11:40,720 --> 00:11:42,020 aber es wird wahrscheinlich sein sollte. 264 00:11:42,020 --> 00:11:46,450 >> Lassen Sie uns an dieser Version Nun, das ist mein Versuch, GetString neu implementieren. 265 00:11:46,450 --> 00:11:48,437 Wenn scanf hat all dies Funktionalität eingebaut, 266 00:11:48,437 --> 00:11:51,270 Deshalb haben wir uns mit diesen wurden Dilettantismus Stützräder wie GetString? 267 00:11:51,270 --> 00:11:55,450 Nun, hier ist vielleicht meine eigene einfache Version GetString 268 00:11:55,450 --> 00:12:00,766 wobei vor einer Woche hätte ich gesagt haben, geben Sie mir eine Zeichenfolge und nennen es puffern. 269 00:12:00,766 --> 00:12:03,390 Heute werde ich einfach starten sagen char Sterne, die, Rückruf, 270 00:12:03,390 --> 00:12:04,400 es ist nur ein Synonym. 271 00:12:04,400 --> 00:12:06,629 Es sieht aus, gruseliger, aber es ist genau dasselbe. 272 00:12:06,629 --> 00:12:09,420 So geben Sie mir eine Variable namens Puffer das wird eine Zeichenfolge zu speichern, 273 00:12:09,420 --> 00:12:12,780 sagen Sie dem Benutzer String bitte, und dann, wie zuvor, 274 00:12:12,780 --> 00:12:17,760 wollen wir versuchen, diese Lektion zu leihen scanf % s diesmal und dann in Puffer übergeben. 275 00:12:17,760 --> 00:12:19,310 Jetzt eine schnelle Plausibilitätsprüfung. 276 00:12:19,310 --> 00:12:22,120 Warum bin ich nicht sagen, Und-Zeichen-Puffer dieses Mal? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Folgern aus dem vorherigen Beispiel. 279 00:12:26,625 --> 00:12:28,000 ZIELGRUPPE: Char Sterne ist ein Zeiger. 280 00:12:28,000 --> 00:12:29,920 DAVID MALAN: Genau, denn dieses Mal, char 281 00:12:29,920 --> 00:12:34,080 Stern ist bereits ein Zeiger, eine Adresse, durch Definition dieser Stern dort zu sein. 282 00:12:34,080 --> 00:12:37,530 Und wenn scanf erwartet eine Adresse, es genügt, einfach nur, um in Puffer übergeben. 283 00:12:37,530 --> 00:12:39,260 Ich brauche nicht zu sagen, Und-Zeichen-Puffer. 284 00:12:39,260 --> 00:12:42,177 Für die Neugierigen, könnten Sie tun so etwas wie dieses. 285 00:12:42,177 --> 00:12:43,510 Es wäre unterschiedliche Bedeutung haben. 286 00:12:43,510 --> 00:12:47,240 Dies würde Ihnen einen Zeiger einem Zeiger, der eigentlich 287 00:12:47,240 --> 00:12:50,050 eine gültige Sache in C, aber für Jetzt, lassen Sie es einfach halten 288 00:12:50,050 --> 00:12:51,750 und halten Sie die Geschichte konsequent. 289 00:12:51,750 --> 00:12:54,100 Ich werde einfach weitergeben müssen in Puffer und das ist richtig. 290 00:12:54,100 --> 00:12:56,487 Das Problem ist aber, diese. 291 00:12:56,487 --> 00:12:58,820 Lassen Sie mich gehen Sie vor und führen Sie diese Programm nach dem Kompilieren. 292 00:12:58,820 --> 00:13:00,902 Machen scanf 1. 293 00:13:00,902 --> 00:13:02,610 Verdammt, mein Compiler fangen meine Fehler. 294 00:13:02,610 --> 00:13:04,090 Gib mir eine Sekunde. 295 00:13:04,090 --> 00:13:05,460 Clang. 296 00:13:05,460 --> 00:13:06,990 Nehmen wir an, scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 OK. 299 00:13:11,380 --> 00:13:12,720 Da gehen wir. 300 00:13:12,720 --> 00:13:14,280 Ich brauche es. 301 00:13:14,280 --> 00:13:16,750 CS50-ID verfügt über verschiedene Konfigurationseinstellungen 302 00:13:16,750 --> 00:13:18,280 dass Sie zum Schutz vor sich selbst. 303 00:13:18,280 --> 00:13:21,300 Ich brauchte, um diejenigen, die durch deaktivieren Laufklang manuell diesmal. 304 00:13:21,300 --> 00:13:22,140 So String bitte. 305 00:13:22,140 --> 00:13:25,560 Ich werde weitermachen und geben Sie meine Lieblings Hallo Welt. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 Das ist nicht das, was ich getippt. 308 00:13:27,700 --> 00:13:29,690 So ist es bezeichnend für etwas, falsch. 309 00:13:29,690 --> 00:13:33,920 Lassen Sie mich gehen Sie vor und geben Sie in eine wirklich lange Zeichenfolge. 310 00:13:33,920 --> 00:13:37,210 Vielen Dank für die null und ich weiß nicht, wenn ich in der Lage sein, um es zum Absturz bringen können. 311 00:13:37,210 --> 00:13:40,240 Lassen Sie uns versuchen, ein wenig Kopie und fügen Sie ihn und sehen, ob das hilft. 312 00:13:40,240 --> 00:13:43,290 Fügen Sie einfach eine Menge von dieser. 313 00:13:43,290 --> 00:13:47,310 Es ist definitiv eine größere String als üblich. 314 00:13:47,310 --> 00:13:51,450 Lassen Sie uns gerade richtig schreiben. 315 00:13:51,450 --> 00:13:51,950 Nein. 316 00:13:51,950 --> 00:13:52,650 Verdammt. 317 00:13:52,650 --> 00:13:53,480 Befehl nicht gefunden. 318 00:13:53,480 --> 00:13:54,550 Also das ist, in keinem Zusammenhang. 319 00:13:54,550 --> 00:13:56,440 Das ist, weil ich eingefügt einige schlechte Charaktere, 320 00:13:56,440 --> 00:13:59,780 aber dies stellt sich heraus, ist nicht zur Arbeit gehen. 321 00:13:59,780 --> 00:14:03,510 >> Versuchen wir diesen Punkt nochmals, denn es macht mehr Spaß, wenn wir tatsächlich abstürzen es. 322 00:14:03,510 --> 00:14:09,116 Lassen Sie uns geben Sie dies und jetzt bin ich gehen, um eine wirklich lange Zeichenfolge kopieren 323 00:14:09,116 --> 00:14:10,990 und jetzt ist, wenn wir uns sehen lassen kann diese Sache zum Absturz bringen. 324 00:14:10,990 --> 00:14:14,235 Beachten Sie, ich weggelassen Räume und neue Linien und Strichpunkte 325 00:14:14,235 --> 00:14:16,035 und alle flippig Zeichen. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 Und jetzt ist einfach nur das Netzwerk langsam. 329 00:14:22,880 --> 00:14:27,460 Ich gedrückter Befehlstaste-V zu lang ist, deutlich. 330 00:14:27,460 --> 00:14:28,190 Verdammt! 331 00:14:28,190 --> 00:14:29,260 Befehl nicht gefunden. 332 00:14:29,260 --> 00:14:29,780 >> OK. 333 00:14:29,780 --> 00:14:32,240 Nun, das ist der Punkt, dennoch die folgende. 334 00:14:32,240 --> 00:14:36,910 Also, was ist eigentlich los Auf dieser Erklärung 335 00:14:36,910 --> 00:14:39,240 Saiblings Sterne-Puffer in Zeile 16? 336 00:14:39,240 --> 00:14:41,820 So Was bekomme ich wenn ich erklären, einen Zeiger? 337 00:14:41,820 --> 00:14:47,440 Alles, was ich bin immer ist ein Vier-Byte-Wert genannte Puffer, aber was ist innerhalb der IT 338 00:14:47,440 --> 00:14:49,540 Im Moment? 339 00:14:49,540 --> 00:14:50,930 Es ist nur einige Müll Wert. 340 00:14:50,930 --> 00:14:54,170 Da jederzeit Sie eine Variable deklarieren in C, es ist nur einige Müll Wert, 341 00:14:54,170 --> 00:14:56,220 und wir sind in die Ausgangs Fahrt über diese Realität. 342 00:14:56,220 --> 00:14:59,720 Nun, wenn ich sagen, scanf, gehen Sie zu dieser Adresse 343 00:14:59,720 --> 00:15:01,520 und setzen, was die Benutzertypen in. 344 00:15:01,520 --> 00:15:06,400 Wenn der Benutzer in hallo Welt, na ja, wo finde ich es? 345 00:15:06,400 --> 00:15:07,750 Buffer ist ein Müllwert. 346 00:15:07,750 --> 00:15:11,510 >> Also das ist ein bisschen wie ein Pfeil das ist zeigt wer weiß, wo. 347 00:15:11,510 --> 00:15:13,880 Vielleicht ist es zeigen hier in meinem Speicher. 348 00:15:13,880 --> 00:15:16,560 Und so, wenn der Benutzer Typen in Hallo Welt, 349 00:15:16,560 --> 00:15:22,380 das Programm versucht, die setzen String Hallo Welt Backslash 0 350 00:15:22,380 --> 00:15:23,910 in diesem Teil des Speichers. 351 00:15:23,910 --> 00:15:27,070 Aber mit einer hohen Wahrscheinlichkeit, aber eindeutig nicht 100% Wahrscheinlichkeit, 352 00:15:27,070 --> 00:15:30,440 der Computer wird sich dann zum Absturz das Programm, da dies nicht 353 00:15:30,440 --> 00:15:32,490 Speicher I erlaubt sein sollte, berührt werden. 354 00:15:32,490 --> 00:15:36,330 Also kurz gesagt, ist dieses Programm genau aus diesem Grund fehlerhaft. 355 00:15:36,330 --> 00:15:38,070 Ich bin grundsätzlich nicht zu tun, was? 356 00:15:38,070 --> 00:15:42,366 Welche Schritte muss ich weggelassen, ebenso wie wir mit Binky erste Beispiel weggelassen? 357 00:15:42,366 --> 00:15:42,866 Ja? 358 00:15:42,866 --> 00:15:43,710 >> ZIELGRUPPE: Speicherzuweisung? 359 00:15:43,710 --> 00:15:45,001 >> DAVID MALAN: Speicherzuweisung. 360 00:15:45,001 --> 00:15:48,400 Ich habe nicht wirklich zugeordnet Jeder Speicher für diesen String. 361 00:15:48,400 --> 00:15:50,270 So können wir dies in ein paar Möglichkeiten zu beheben. 362 00:15:50,270 --> 00:15:52,700 Eines können wir es einfach zu halten und in der Tat, jetzt bist du 363 00:15:52,700 --> 00:15:55,116 gehen zu beginnen, um eine Verwischung sehen der Leitungen zwischen dem, was 364 00:15:55,116 --> 00:15:58,520 ein Array ist, was ein String ist, was für ein char Stern ist, was ein Array von Zeichen 365 00:15:58,520 --> 00:15:59,020 ist. 366 00:15:59,020 --> 00:16:02,450 Hier ist ein zweites Beispiel mit Streichern und Bekanntmachung 367 00:16:02,450 --> 00:16:05,690 alles, was ich auf der Leitung durchgeführt 16 ist, anstatt zu sagen, 368 00:16:05,690 --> 00:16:09,530 dass Puffer wird ein char Stern, ein Zeiger auf einen Teil des Speichers, 369 00:16:09,530 --> 00:16:14,057 Ich werde sehr proaktiv geben mir einen Puffer für 16 Zeichen, 370 00:16:14,057 --> 00:16:16,390 und in der Tat, wenn Sie nicht vertraut sind mit dem Begriff Pufferung 371 00:16:16,390 --> 00:16:20,570 wahrscheinlich aus der Welt der Videos, wo ein Video ist Puffern, Puffern, 372 00:16:20,570 --> 00:16:21,175 Pufferung. 373 00:16:21,175 --> 00:16:22,550 Nun, was ist die Verbindung hier? 374 00:16:22,550 --> 00:16:24,960 Nun, Innerhalb von YouTube und im Inneren des Video-Player 375 00:16:24,960 --> 00:16:27,200 Regel ist ein Array das ist größer als 16. 376 00:16:27,200 --> 00:16:30,340 Es könnte eine Reihe von Größe sein Megabyte, vielleicht 10 Megabyte, 377 00:16:30,340 --> 00:16:34,330 und in diesem Array unterstützt Ihr Browser laden Sie eine ganze Reihe von Bytes, 378 00:16:34,330 --> 00:16:37,500 eine ganze Reihe von Megabytes Video- und der Video-Player, 379 00:16:37,500 --> 00:16:40,930 YouTube oder wer auch immer ist, beginnt Lesen der Bytes aus dem Array, 380 00:16:40,930 --> 00:16:43,530 und jedes Mal, wenn die sehen, Wort Pufferung Pufferung 381 00:16:43,530 --> 00:16:46,350 das bedeutet, dass der Spieler bis zum Ende des Arrays geworden. 382 00:16:46,350 --> 00:16:50,430 Das Netzwerk ist so langsam, dass es nicht nachgefüllt das Array mit mehr Bytes 383 00:16:50,430 --> 00:16:55,610 und so du aus Bits sind um dem Benutzer anzuzeigen. 384 00:16:55,610 --> 00:16:59,430 >> So Puffer ist eine treffende Begriff hier, dass es ist nur ein Array, ein Teil des Speichers. 385 00:16:59,430 --> 00:17:02,530 Und das wird es zu beheben denn es stellt sich heraus, 386 00:17:02,530 --> 00:17:07,410 dass Sie Arrays behandeln, als ob sie sind Adressen, obwohl Puffer 387 00:17:07,410 --> 00:17:10,710 ist nur ein Symbol, es ist ein Folge von Zeichen, Puffer, 388 00:17:10,710 --> 00:17:14,760 das ist nützlich für mich, der Programmierer, können Sie den Namen der Umgebung übergeben 389 00:17:14,760 --> 00:17:17,079 als wäre es ein Zeiger, als ob es 390 00:17:17,079 --> 00:17:21,000 waren die Adresse eines Chunk Speicher für 16 Zeichen. 391 00:17:21,000 --> 00:17:24,530 Also das ist, zu sagen, ich passieren kann die scanf genau das Wort 392 00:17:24,530 --> 00:17:30,670 und so jetzt, wenn ich dieses Programm, machen scanf 2, Punkt Schrägstrich scanf 2, 393 00:17:30,670 --> 00:17:35,386 und geben Sie in Hallo Welt, Geben Sie, dass Zeit-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, was ist passiert? 395 00:17:37,590 --> 00:17:39,340 String bitte. 396 00:17:39,340 --> 00:17:41,430 Was habe ich falsch gemacht? 397 00:17:41,430 --> 00:17:43,800 Hallo Welt, Puffer. 398 00:17:43,800 --> 00:17:44,705 Hallo Welt. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, ich weiß, was es tut. 401 00:17:49,420 --> 00:17:49,920 OK. 402 00:17:49,920 --> 00:17:51,628 So ist es zu lesen up bis zum ersten Platz. 403 00:17:51,628 --> 00:17:55,680 Lassen Sie uns also betrügen nur für einen Augenblick und sagen, ich wollte nur etwas geben 404 00:17:55,680 --> 00:18:01,408 wirklich lange, wie dies ein langer Satz das ist einer, zwei, drei, vier, fünf, 405 00:18:01,408 --> 00:18:04,420 sechs, sieben, acht, neun, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 OK. 407 00:18:05,300 --> 00:18:07,600 Es ist in der Tat ein langer Satz. 408 00:18:07,600 --> 00:18:10,710 So ist dieser Satz länger als 16 Zeichen 409 00:18:10,710 --> 00:18:13,670 und so, wenn ich drücken Sie die Eingabetaste, was wird passieren? 410 00:18:13,670 --> 00:18:16,940 Nun, in diesem Fall von der Geschichte, ich erklärt hatte Puffer 411 00:18:16,940 --> 00:18:22,190 um tatsächlich als ein Array mit 16 Zeichen bereit zu gehen. 412 00:18:22,190 --> 00:18:27,426 So ein, zwei, drei, vier, fünf, sechs, sieben, acht, neun, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 So 16 Zeichen, und jetzt, wenn ich in etwas zu lesen, wie das ist ein langer 415 00:18:34,410 --> 00:18:43,950 Satz, was passieren wird dass ich gehe, um in diese zu lesen ist ein lang 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, Satz. 417 00:18:49,660 --> 00:18:52,270 >> Das ist also absichtlich eine schlechte Sache ist, dass ich 418 00:18:52,270 --> 00:18:55,060 halten das Schreiben über die Grenzen meines Array, 419 00:18:55,060 --> 00:18:56,660 über die Grenzen meiner Puffer. 420 00:18:56,660 --> 00:19:00,100 Ich konnte das Glück und das Programm zu erhalten wird am Laufen zu halten und nicht zu kümmern, 421 00:19:00,100 --> 00:19:03,450 aber allgemein gesprochen, diese wird in der Tat stürzt mein Programm, 422 00:19:03,450 --> 00:19:06,440 und es ist ein Fehler in mein Kodex der Moment, als ich Schritt 423 00:19:06,440 --> 00:19:08,576 über die Grenzen dieses Arrays, weil ich 424 00:19:08,576 --> 00:19:10,450 weiß nicht, ob es notwendigerweise zum Absturz 425 00:19:10,450 --> 00:19:12,120 oder wenn ich werde einfach glücklich zu erhalten. 426 00:19:12,120 --> 00:19:15,750 So ist dies problematisch, da in diesem Fall ist es nicht zu funktionieren scheint, 427 00:19:15,750 --> 00:19:20,931 und lassen Sie uns das Schicksal herausfordern hier, auch wenn die IDE scheint einiges vertragen 428 00:19:20,931 --> 00:19:21,430 von-- 429 00:19:21,430 --> 00:19:22,040 >> Da gehen wir. 430 00:19:22,040 --> 00:19:23,240 Endlich. 431 00:19:23,240 --> 00:19:26,470 Also ich bin der einzige, der diese sehen können. 432 00:19:26,470 --> 00:19:29,630 Also musste ich einfach nur eine Menge Spaß Typisierung out eine wirklich lange eigentlichen Begriff 433 00:19:29,630 --> 00:19:32,800 dass es mit Sicherheit überschritten 16 Bytes, weil ich 434 00:19:32,800 --> 00:19:38,050 in dieser verrückten lange multi-Zeile eingegeben Phrase, und dann feststellen, was passiert ist. 435 00:19:38,050 --> 00:19:41,110 Das Programm versucht, ihn zu drucken und dann bekam einen Segmentation Fault 436 00:19:41,110 --> 00:19:44,430 und Segmentierung Fehler ist, wenn so etwas passiert 437 00:19:44,430 --> 00:19:47,650 und das Betriebssystem, sagt nein, nicht berühren können, dass der Speicher. 438 00:19:47,650 --> 00:19:49,570 Wir werden töten das Programm überhaupt. 439 00:19:49,570 --> 00:19:51,180 >> So scheint dies problematisch. 440 00:19:51,180 --> 00:19:54,540 Ich habe das Programm, wobei verbesserte zumindest haben einige Speicher, 441 00:19:54,540 --> 00:19:58,000 dies würde jedoch zu beschränken scheinen die Funktion GetString zu bekommen 442 00:19:58,000 --> 00:20:00,780 Saiten der endlichen Länge 16. 443 00:20:00,780 --> 00:20:04,200 Also, wenn Sie mehr unterstützen wollen, Sätze als 16 Zeichen, 444 00:20:04,200 --> 00:20:04,880 Wie geht's? 445 00:20:04,880 --> 00:20:07,970 Nun, man kann die Zunahme Größe dieses Puffers zu 32 446 00:20:07,970 --> 00:20:09,190 oder das scheint Art Kurz. 447 00:20:09,190 --> 00:20:12,260 Warum wir nicht einfach machen es 1000 aber zurückschieben. 448 00:20:12,260 --> 00:20:17,100 Was ist die Antwort intuitiv von einfach vermeiden dieses Problem, indem sie 449 00:20:17,100 --> 00:20:20,660 meinem Puffer größer, wie 1.000 Zeichen? 450 00:20:20,660 --> 00:20:23,470 Durch die Implementierung von GetString diese Weise. 451 00:20:23,470 --> 00:20:27,130 Was ist gut oder schlecht hier? 452 00:20:27,130 --> 00:20:28,033 Ja? 453 00:20:28,033 --> 00:20:30,574 Publikum: Wenn Sie binden eine Menge von Raum und Sie sie nicht benutzen, 454 00:20:30,574 --> 00:20:33,500 dann können Sie diesen Raum nicht umzuschichten. 455 00:20:33,500 --> 00:20:34,500 DAVID MALAN: Absolut. 456 00:20:34,500 --> 00:20:38,480 Es ist eine Verschwendung, sofern wenn Sie nicht tun wirklich brauchen 900 dieser Bytes 457 00:20:38,480 --> 00:20:41,057 und du fragst 1000 insgesamt wie auch immer, 458 00:20:41,057 --> 00:20:44,140 Sie gerade verbrauchen mehr Speicher auf Computer des Benutzers als Sie benötigen, 459 00:20:44,140 --> 00:20:45,740 und immerhin einige Sie bereits erlebt habe 460 00:20:45,740 --> 00:20:47,620 im Leben, dass, wenn Sie laufen viele Programme 461 00:20:47,620 --> 00:20:50,470 und sie essen bis viel Speicher, Dies kann tatsächlich die Leistung auswirken 462 00:20:50,470 --> 00:20:52,220 und die Erfahrung des Benutzers auf dem Computer. 463 00:20:52,220 --> 00:20:56,090 Also das ist ein bisschen eine faule Lösung, sicher, und umgekehrt, 464 00:20:56,090 --> 00:21:00,140 es ist nicht nur verschwenderisch, welches Problem bleibt, auch wenn ich meinen Puffer 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Ja? 467 00:21:02,600 --> 00:21:04,475 >> Publikum: Der String ist Länge 1.001. 468 00:21:04,475 --> 00:21:05,350 DAVID MALAN: Genau. 469 00:21:05,350 --> 00:21:08,280 Wenn Ihr String Länge 1001, Sie haben genau das gleiche Problem, 470 00:21:08,280 --> 00:21:10,705 und durch meine Argumentation, würde ich nur dann machen es 2000 471 00:21:10,705 --> 00:21:12,830 aber Sie wissen nicht, in voranzubringen, wie groß es sein sollte, 472 00:21:12,830 --> 00:21:16,890 und doch, ich muss mein Programm zu kompilieren bevor er Menschen nutzen und Download 473 00:21:16,890 --> 00:21:17,390 es. 474 00:21:17,390 --> 00:21:21,490 Also das ist genau die Art von Zeug, dass die CS50-Bibliothek versucht 475 00:21:21,490 --> 00:21:24,750 um uns mit zu helfen und wir nur einen Blick auf einige der zugrunde liegenden Implementierung 476 00:21:24,750 --> 00:21:29,790 Hier, aber dies ist CS50 Punkt C. Diese ist die Datei, die auf CS50 IDE gewesen ist 477 00:21:29,790 --> 00:21:31,420 alle diese Wochen, die Sie verwendet haben. 478 00:21:31,420 --> 00:21:34,280 Es ist vorkompilierte und Sie haben benutze es automatisch 479 00:21:34,280 --> 00:21:38,780 von Natur aus mit der dash L CS50 Flagge mit Klang, 480 00:21:38,780 --> 00:21:42,300 aber wenn ich scrollen Sie durch alle Diese Funktionen, hier ist GetString, 481 00:21:42,300 --> 00:21:44,636 und nur, um Ihnen eine geben Geschmack von, was los ist, 482 00:21:44,636 --> 00:21:46,760 lassen Sie uns einen kurzen Blick auf die relative Komplexität. 483 00:21:46,760 --> 00:21:48,870 Es ist nicht eine super lange Funktion, aber wir haben nicht die 484 00:21:48,870 --> 00:21:52,530 müssen alle hart zu denken wie man über das Erhalten Saiten zu gehen. 485 00:21:52,530 --> 00:21:55,660 >> Also hier meine Puffer und ich offenbar initialisieren Sie sie auf null. 486 00:21:55,660 --> 00:21:57,990 Dabei ist natürlich die Gleiche wie char Sterne, 487 00:21:57,990 --> 00:22:00,585 aber ich beschloss, in Umsetzung der CS50-Bibliothek 488 00:22:00,585 --> 00:22:02,460 dass, wenn wir gehen, um vollständig dynamisch, 489 00:22:02,460 --> 00:22:05,770 Ich weiß nicht im Voraus wie groß von einem wissen, String-Benutzer gehen zu wollen, zu bekommen. 490 00:22:05,770 --> 00:22:08,140 Also werde ich anfangen mit nur einem leeren String 491 00:22:08,140 --> 00:22:11,507 und ich werde den Aufbau so viel Speicher als ich brauche, um den Benutzer String passen 492 00:22:11,507 --> 00:22:13,340 und wenn ich nicht haben genug, ich werde fragen 493 00:22:13,340 --> 00:22:15,010 das Betriebssystem für mehr Speicher. 494 00:22:15,010 --> 00:22:17,510 Ich werde ihren String bewegen in einen größeren Teil des Speichers 495 00:22:17,510 --> 00:22:21,847 und ich werde zu lösen oder zu befreien die ausreichend großen Teil des Speichers 496 00:22:21,847 --> 00:22:23,680 und wir sind gerade dabei dies iterativ zu tun. 497 00:22:23,680 --> 00:22:25,570 >> So ein kurzer Blick, Hier ist nur eine Variable 498 00:22:25,570 --> 00:22:28,780 , mit dem werde ich den Überblick zu behalten der Fähigkeit meiner Puffer. 499 00:22:28,780 --> 00:22:30,071 Wie viele Bytes kann ich ein? 500 00:22:30,071 --> 00:22:32,070 Hier ist eine Variable n mit das werde ich halten 501 00:22:32,070 --> 00:22:36,200 verfolgt, wie viele Bytes tatsächlich der Puffer oder die der Benutzer eingegeben hat. 502 00:22:36,200 --> 00:22:39,900 Wenn Sie das nicht vorher gesehen haben, können Sie können angeben, dass eine Variable, wie ein int 503 00:22:39,900 --> 00:22:46,370 nicht signiert ist, die wie der Name andeutet, bedeutet, es ist nicht negativ ist, und warum sollte 504 00:22:46,370 --> 00:22:50,590 I zur Angabe stören wollen immer dass ein int ist nicht nur ein int, 505 00:22:50,590 --> 00:22:52,540 aber es ist ein unsigned int? 506 00:22:52,540 --> 00:22:55,064 Es ist eine nicht-negative Int. 507 00:22:55,064 --> 00:22:56,355 Was bedeutet die [unverständlich] das? 508 00:22:56,355 --> 00:22:58,910 >> ZIELGRUPPE: Es beschreibt einen Betrag des Speichers, der sein kann, [unverständlich]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID MALAN: Ja. 510 00:22:59,660 --> 00:23:03,710 Also, wenn ich sage, ohne Vorzeichen, das ist eigentlich so dass Sie ein Bit der zusätzlichen Speicher 511 00:23:03,710 --> 00:23:07,440 und es scheint irgendwie albern, aber wenn Sie haben eine Zusatzspeicher, dass 512 00:23:07,440 --> 00:23:09,940 bedeutet, dass Sie so viele haben doppelt Werte, die Sie stellen können, 513 00:23:09,940 --> 00:23:11,570 denn es kann eine 0 oder eine 1 sein. 514 00:23:11,570 --> 00:23:14,660 So standardmäßig, kann ein int grob sein negativen 2 Milliarden den ganzen Weg 515 00:23:14,660 --> 00:23:16,030 bis zu positiven 2 Milliarden. 516 00:23:16,030 --> 00:23:18,540 Das sind große Reichweiten, aber es ist immer noch Art von Verschwendung 517 00:23:18,540 --> 00:23:21,280 wenn Sie kümmern sich nur um Größen, die nur intuitiv 518 00:23:21,280 --> 00:23:24,620 sollte nicht negativ sein oder positiv oder 0, auch dann, 519 00:23:24,620 --> 00:23:28,884 warum sind Sie verschwenden 2 Mrd. mögliche Werte für negative Zahlen 520 00:23:28,884 --> 00:23:30,300 wenn Sie nie, sie zu benutzen? 521 00:23:30,300 --> 00:23:35,350 So sagen, unsigned, jetzt meine int kann zwischen 0 und etwa 4 Milliarden. 522 00:23:35,350 --> 00:23:39,280 >> Also hier ist nur ein int C aus Gründen werden wir nicht gerade jetzt, wie in zu erhalten 523 00:23:39,280 --> 00:23:42,280 warum es ein int statt eines char, aber hier ist 524 00:23:42,280 --> 00:23:44,630 das Wesentliche, was los ist auf, und einige von euch 525 00:23:44,630 --> 00:23:48,340 verwenden könnte, zum Beispiel, die fgetc Funktion auch PSet vier 526 00:23:48,340 --> 00:23:51,580 oder danach, werden wir es sehen, wieder in Problem stellte fünf, 527 00:23:51,580 --> 00:23:55,410 fgetc ist nett, weil, wie der Name Art, Art arcanely schon sagt, 528 00:23:55,410 --> 00:23:57,940 es ist eine Funktion, bekommt einen Charakter und so, 529 00:23:57,940 --> 00:24:00,690 was ist grundlegend anders über das, was wir tun, in GetString 530 00:24:00,690 --> 00:24:03,110 ist, dass wir sie nicht verwenden Scanf in der gleichen Weise. 531 00:24:03,110 --> 00:24:07,550 Wir sind nur kriechend entlang Schritt-für-Schritt über alles, was der Benutzer eingetippt, 532 00:24:07,550 --> 00:24:10,970 denn wir können immer zuzuweisen einem char, und so können wir immer sicher 533 00:24:10,970 --> 00:24:15,599 Blick auf einen char zu einem Zeitpunkt, und der Zauber beginnt hier geschehen. 534 00:24:15,599 --> 00:24:17,890 Ich werde nach unten zu scrollen Mitte dieser Funktion 535 00:24:17,890 --> 00:24:20,360 nur um kurz vorstellen diese Funktion. 536 00:24:20,360 --> 00:24:22,670 Ähnlich wie es gibt eine malloc-Funktion, gibt es 537 00:24:22,670 --> 00:24:27,740 a realloc-Funktion, wo realloc lässt Sie einen Teil des Speichers umzuschichten 538 00:24:27,740 --> 00:24:29,570 und machen es größer oder kleiner. 539 00:24:29,570 --> 00:24:33,060 So lange Geschichte kurz und mit eine Welle von Hand für heute, 540 00:24:33,060 --> 00:24:35,620 wissen, dass das, was GetString tut, ist es sort 541 00:24:35,620 --> 00:24:39,720 der magisch wachsen oder Schrumpfen der Puffer als Benutzer 542 00:24:39,720 --> 00:24:41,440 Typen in seiner Zeichenfolge. 543 00:24:41,440 --> 00:24:43,962 >> Also, wenn der Benutzer ein kurze Zeichenfolge, dieser Code 544 00:24:43,962 --> 00:24:45,920 nur ordnet genug Speicher, um die Zeichenfolge zu passen. 545 00:24:45,920 --> 00:24:48,086 Wenn der Benutzer hält Typisierung wie ich es wieder und wieder 546 00:24:48,086 --> 00:24:50,330 wieder gut, wenn die Puffers anfänglich dieses große 547 00:24:50,330 --> 00:24:53,310 und das Programm erkennt, um warten Sie eine Minute, ich bin aus dem Raum, 548 00:24:53,310 --> 00:24:55,410 es geht um das Doppelte die Größe des Puffer 549 00:24:55,410 --> 00:24:59,110 und dann die doppelte Größe des Puffers und der Code, die Verdoppelung der Fall ist, 550 00:24:59,110 --> 00:25:03,170 Wenn wir uns hier, es ist nur diese clevere Einzeiler. 551 00:25:03,170 --> 00:25:06,830 Sie können diese Syntax nicht gesehen haben vor, aber wenn Sie sagen, Sterne gleich, 552 00:25:06,830 --> 00:25:10,470 dies ist dasselbe wie sagen Kapazität mal 2. 553 00:25:10,470 --> 00:25:13,390 So ist es einfach immer verdoppelt die Kapazität des Puffer 554 00:25:13,390 --> 00:25:17,480 und dann erzählte realloc zu geben selbst, dass viel mehr Speicher. 555 00:25:17,480 --> 00:25:19,720 >> Nun Nebenbei gibt weitere Funktionen hier 556 00:25:19,720 --> 00:25:23,680 dass wir nicht ins Detail aussehen außer in getint zeigen, 557 00:25:23,680 --> 00:25:26,150 verwenden wir in GetString getint. 558 00:25:26,150 --> 00:25:28,192 Wir überprüfen, dass es nicht null, die, Rückruf, 559 00:25:28,192 --> 00:25:30,400 ist der besondere Wert, bedeutet etwas schief gelaufen ist. 560 00:25:30,400 --> 00:25:31,233 Wir sind aus der Erinnerung. 561 00:25:31,233 --> 00:25:32,310 Besser überprüfen dafür. 562 00:25:32,310 --> 00:25:33,710 Und wir haben eine Wächter Wert zurück. 563 00:25:33,710 --> 00:25:37,850 Aber ich werde auf die Bemerkungen wie zu verschieben warum und dann verwenden wir diese Cousin von scanf 564 00:25:37,850 --> 00:25:42,100 genannt Sscanf und es stellt sich heraus, dass sscanf oder String scanf, 565 00:25:42,100 --> 00:25:45,310 lässt Sie einen Blick auf die Linie zu nehmen, dass der Benutzer eingetippt und lassen Sie sich 566 00:25:45,310 --> 00:25:49,610 analysieren sie im Wesentlichen und was ich bin denn hier ist Ich sage sscanf, 567 00:25:49,610 --> 00:25:54,440 zu analysieren, was der Benutzer eingegeben und stellen Sie sicher,% i, 568 00:25:54,440 --> 00:25:59,250 gibt es eine ganze Zahl in ihr, und wir werden nicht gelangen in heute genau, warum gibt es auch 569 00:25:59,250 --> 00:26:03,760 a% c hier, aber das auf den Punkt erlaubt uns zu erkennen, ob der Benutzer eingegeben hat 570 00:26:03,760 --> 00:26:06,050 in etwas Schein nach der Nummer. 571 00:26:06,050 --> 00:26:11,766 Also der Grund, dass getint und GetString Ihnen sagen, es nochmal zu versuchen, versuchen, versuchen Sie es erneut 572 00:26:11,766 --> 00:26:13,640 Wegen all der dass Code, den wir geschrieben haben, 573 00:26:13,640 --> 00:26:17,900 es ist Art von Blick auf die Eingabe des Benutzers dafür zu sorgen, ist es durchaus Ziffern 574 00:26:17,900 --> 00:26:21,700 oder es ist eine tatsächliche Floating- Punktwert oder dergleichen, 575 00:26:21,700 --> 00:26:24,233 je nachdem, welchen Wert funktionieren Sie verwenden. 576 00:26:24,233 --> 00:26:25,060 >> Puh. 577 00:26:25,060 --> 00:26:25,710 OK. 578 00:26:25,710 --> 00:26:27,592 Das war ein Schluck aber der Punkt ist hier, 579 00:26:27,592 --> 00:26:29,550 dass der Grund, wir hatten diese Stützräder auf 580 00:26:29,550 --> 00:26:32,880 Denn auf der untersten Ebene, es gibt einfach so viele Dinge, die 581 00:26:32,880 --> 00:26:35,674 schief gehen kann, dass wir wollten, präventiv zu behandeln 582 00:26:35,674 --> 00:26:38,090 diese Dinge sicherlich in der frühesten Wochen der Klasse, 583 00:26:38,090 --> 00:26:42,230 aber jetzt mit PSet vier und fünf und PSet darüber hinaus werden Sie sehen, dass es mehr zu 584 00:26:42,230 --> 00:26:45,570 Sie aber auch Sie besser in der Lage sind zur Lösung dieser Art von Problemen 585 00:26:45,570 --> 00:26:47,180 selbst. 586 00:26:47,180 --> 00:26:51,770 Irgendwelche Fragen zu GetString oder getint? 587 00:26:51,770 --> 00:26:52,630 Ja? 588 00:26:52,630 --> 00:26:55,130 >> Publikum: Warum würden Sie verdoppeln die Kapazität des Puffer 589 00:26:55,130 --> 00:26:57,630 anstatt nur steigende es wird von dem genauen Betrag? 590 00:26:57,630 --> 00:26:58,100 >> DAVID MALAN: Gute Frage. 591 00:26:58,100 --> 00:27:00,474 Warum sollten wir verdoppeln die Kapazität des Puffers im Gegensatz 592 00:27:00,474 --> 00:27:02,800 nur zunehmende es von einigen konstanten Wert? 593 00:27:02,800 --> 00:27:03,900 Es war eine Design-Entscheidung. 594 00:27:03,900 --> 00:27:08,590 Wir haben gerade beschlossen, dass, da es dazu neigt, ein wenig teuer zeitlich zu fragen, 595 00:27:08,590 --> 00:27:10,440 das Betriebssystem für Speicher, haben wir nicht 596 00:27:10,440 --> 00:27:13,210 wollen am Ende immer in eine Situation, für große Zeichenfolgen 597 00:27:13,210 --> 00:27:14,960 dass wir uns fragen, das Betriebssystem wieder 598 00:27:14,960 --> 00:27:17,500 und wieder und wieder in schneller Folge für Speicher. 599 00:27:17,500 --> 00:27:20,387 So haben wir gerade beschlossen, etwas beliebig, aber wir hoffen angemessen, 600 00:27:20,387 --> 00:27:22,720 dass, weißt du was, lassen Sie uns versuchen, vorgreifen 601 00:27:22,720 --> 00:27:25,520 und einfach weiter zu verdoppeln, so dass Wir minimieren die Höhe der Zeit 602 00:27:25,520 --> 00:27:29,010 wir müssen malloc anrufen oder realloc, aber insgesamt Urteil 603 00:27:29,010 --> 00:27:31,820 rufen Sie in der Abwesenheit von zu wissen, was die Nutzer möchten Sie vielleicht geben. 604 00:27:31,820 --> 00:27:33,600 Beide Wege könnte fraglich sein. 605 00:27:33,600 --> 00:27:35,430 Die wohl gut. 606 00:27:35,430 --> 00:27:39,240 >> Werfen wir also einen Blick auf ein paar andere Nebenwirkungen des Gedächtnisses, 607 00:27:39,240 --> 00:27:41,610 Dinge, die schief gehen können und Tools, die Sie 608 00:27:41,610 --> 00:27:43,880 verwenden, um diese Art von Fehler zu fangen. 609 00:27:43,880 --> 00:27:47,800 Es stellt sich heraus alle von euch, auch wenn check50 hat dir nicht gesagt, so viel, 610 00:27:47,800 --> 00:27:50,050 wurden schriftlich buggy Code da Woche ein, 611 00:27:50,050 --> 00:27:53,630 selbst wenn alle check50 Tests übergeben, und selbst wenn Sie und Ihre TF 612 00:27:53,630 --> 00:27:56,010 sind super zuversichtlich, dass Ihr Code funktioniert wie vorgesehen. 613 00:27:56,010 --> 00:27:59,190 Ihr Code ist Buggy oder dass alle von Ihnen fehlerhaft, 614 00:27:59,190 --> 00:28:02,540 bei der Verwendung der CS50-Bibliothek, wurden undicht Speicher. 615 00:28:02,540 --> 00:28:06,040 Sie haben uns gefragt, das Betriebssystem für Speicher in den meisten Programmen 616 00:28:06,040 --> 00:28:08,850 Sie geschrieben haben, aber Sie haben, nie es tatsächlich zurück gegeben. 617 00:28:08,850 --> 00:28:12,110 Sie haben GetString genannt und getint und GetFloat, 618 00:28:12,110 --> 00:28:15,270 jedoch mit GetString, haben Sie nie unGetString oder Give genannt 619 00:28:15,270 --> 00:28:19,890 String zurück oder dergleichen, aber wir gesehen haben, dass GetString tut Speicher zuweisen 620 00:28:19,890 --> 00:28:22,810 durch malloc oder dieser Funktion realloc, das nur 621 00:28:22,810 --> 00:28:25,670 im Geiste sehr ähnlich, und doch, wir waren 622 00:28:25,670 --> 00:28:28,629 fragt das Betriebssystem für Speicher und Speicher wieder und wieder 623 00:28:28,629 --> 00:28:29,670 aber nie geben es zurück. 624 00:28:29,670 --> 00:28:33,550 >> Nun, so nebenbei, stellt sich heraus, dass wenn ein Programm beendet wird, wird der gesamte Speicher 625 00:28:33,550 --> 00:28:34,870 wird automatisch freigegeben. 626 00:28:34,870 --> 00:28:36,150 So ist es nicht eine große Sache. 627 00:28:36,150 --> 00:28:38,590 Es wird nicht zum Bruch IDE oder Dinge verlangsamen, 628 00:28:38,590 --> 00:28:40,670 aber wenn Programme zu tun Regel undicht Speicher 629 00:28:40,670 --> 00:28:42,170 und sie für eine lange Zeit laufen. 630 00:28:42,170 --> 00:28:45,640 Wenn Sie jemals die dummen kleinen gesehen haben Beach-Ball in Mac OS oder die Sanduhr 631 00:28:45,640 --> 00:28:51,160 unter Windows, wo es eine Art ist Verlangsamung oder denken oder denken 632 00:28:51,160 --> 00:28:53,770 oder einfach nur richtig los um auf ein Schneckentempo verlangsamen, 633 00:28:53,770 --> 00:28:56,960 es sehr wahrscheinlich sein könnte das Ergebnis eines Speicherverlusts. 634 00:28:56,960 --> 00:28:59,970 Die Programmierer, die schrieb, die Software, die Sie verwenden 635 00:28:59,970 --> 00:29:03,570 fragen Sie das Betriebssystem für das Gedächtnis alle paar Minuten, jede Stunde. 636 00:29:03,570 --> 00:29:05,570 Aber wenn Sie laufen die Software, auch wenn es 637 00:29:05,570 --> 00:29:08,680 in Ihrem Computer minimiert für Stunden oder Tage auf Ende, 638 00:29:08,680 --> 00:29:11,980 Sie könnte für immer mehr fragen Speicher und eigentlich nie benutzen 639 00:29:11,980 --> 00:29:15,180 und so Ihren Code sein könnte, oder Programme könnten undicht sein Gedächtnis, 640 00:29:15,180 --> 00:29:18,350 und wenn Sie ein Speicherleck zu starten, gibt es weniger Speicher für andere Programme, 641 00:29:18,350 --> 00:29:21,220 und die Wirkung ist, langsam alles auf. 642 00:29:21,220 --> 00:29:23,600 >> Nun, dies ist mit Abstand einer der die grausamsten Programme 643 00:29:23,600 --> 00:29:26,350 Sie Möglichkeiten haben in CS50 laufen, sofern 644 00:29:26,350 --> 00:29:31,650 als seine Ausgabe ist noch esoterischer als Klang oder machen oder jeder der Befehls 645 00:29:31,650 --> 00:29:35,930 Zeilenprogramme, bevor wir laufen haben, aber Gott sei Dank, in seine Ausgabe eingebettet 646 00:29:35,930 --> 00:29:39,810 es einige Tipps, die sehr hilfsbereit wird nützlich entweder für PSet vier sein 647 00:29:39,810 --> 00:29:41,510 oder sicher PDie fünf. 648 00:29:41,510 --> 00:29:44,250 So valgrind ist ein Werkzeug die verwendet werden können, um zu suchen 649 00:29:44,250 --> 00:29:46,930 für Speicherlecks in Ihrem Programm. 650 00:29:46,930 --> 00:29:48,570 Es ist relativ einfach zu laufen. 651 00:29:48,570 --> 00:29:51,420 Sie führen valgrind und dann, auch aber es ist ein wenig ausführlicher, 652 00:29:51,420 --> 00:29:54,440 dash dash Leckprüfung ist gleich voll, und dann dot 653 00:29:54,440 --> 00:29:56,320 Schrägstrich und den Namen Ihres Programms. 654 00:29:56,320 --> 00:30:00,010 So valgrind dann führen Sie Ihr Programm und ganz am Ende des Programms 655 00:30:00,010 --> 00:30:02,240 ausgeführt wird, bevor es beendet wird und gibt Ihnen eine weitere Eingabeaufforderung 656 00:30:02,240 --> 00:30:04,980 es geht zu analysieren Ihre Programm, während es bereits läuft 657 00:30:04,980 --> 00:30:07,740 und Ihnen sagen, hast du lecken Jeder Speicher und noch besser, 658 00:30:07,740 --> 00:30:10,610 haben Sie Speicher Note, nicht Ihnen gehören? 659 00:30:10,610 --> 00:30:13,700 Es kann nicht alles zu fangen, aber es ist ziemlich gut fangen die meisten Dinge. 660 00:30:13,700 --> 00:30:19,700 >> Also hier ist ein Beispiel für meine mit Lauf Dieses Programm, mit Lauf valgrind, 661 00:30:19,700 --> 00:30:21,470 ein Programm namens Gedächtnis, und ich werde 662 00:30:21,470 --> 00:30:24,730 um die Linien, die sich hervorheben letztlich für uns von Interesse. 663 00:30:24,730 --> 00:30:27,690 Es gibt also noch mehr Ablenkungen dass ich von der Folie gelöscht. 664 00:30:27,690 --> 00:30:30,930 Aber lasst uns einfach sehen, was diese Programm ist in der Lage, uns zu sagen. 665 00:30:30,930 --> 00:30:34,800 Es ist in der Lage, uns mitzuteilen, was wie ungültige Schreib der Größe 4. 666 00:30:34,800 --> 00:30:38,020 Mit anderen Worten, wenn Sie Speicher berühren, speziell 4 Bytes des Speichers 667 00:30:38,020 --> 00:30:40,350 dass Sie nicht haben sollte, valgrind kann Ihnen sagen, dass. 668 00:30:40,350 --> 00:30:41,660 Ungültige Schreib der Größe 4. 669 00:30:41,660 --> 00:30:43,640 Sie berührte vier Bytes dass Sie nicht haben sollte. 670 00:30:43,640 --> 00:30:44,840 Wo hast du das gemacht? 671 00:30:44,840 --> 00:30:45,900 Das ist die Schönheit. 672 00:30:45,900 --> 00:30:50,000 Speicher dot c Linie 21 ist, wo Sie vermasselt, und das ist, warum es ist hilfreich. 673 00:30:50,000 --> 00:30:53,410 Ähnlich wie GDB, kann es helfen, Punkt, den Sie bei der aktuellen Fehler. 674 00:30:53,410 --> 00:30:57,170 >> Jetzt ist dieses ein wenig mehr verbose, wenn nicht verwirrend. 675 00:30:57,170 --> 00:31:01,307 40 Bytes in 1 Blöcke sind auf jeden Fall Verlust Posten 1 von 1 verloren. 676 00:31:01,307 --> 00:31:02,140 Was bedeutet das? 677 00:31:02,140 --> 00:31:05,920 Nun, es bedeutet nur, Sie gefragt 40 Byte und Sie nie gab es zurück. 678 00:31:05,920 --> 00:31:08,930 Sie nannte malloc oder Sie aufgerufen GetString und das Betriebssystem 679 00:31:08,930 --> 00:31:12,450 gab Ihnen 40 Bytes, aber man kann nie freigegeben oder freigegeben, dass der Speicher, 680 00:31:12,450 --> 00:31:15,400 und fair zu sein, haben wir nie zeigen Ihnen, wie Sie zurück Speicher geben. 681 00:31:15,400 --> 00:31:17,910 Stellt sich heraus, es ist ein Super- einfache Funktion frei bezeichnet. 682 00:31:17,910 --> 00:31:21,170 Nimmt ein Argument, das Ding Sie befreien oder zurückgeben möchten, 683 00:31:21,170 --> 00:31:23,430 aber 40 Bytes, offenbar, in diesem Programm 684 00:31:23,430 --> 00:31:27,300 haben in Zeile verloren 20 von Speicher Punkt c. 685 00:31:27,300 --> 00:31:28,650 >> Also mal sehen, dieses Programm. 686 00:31:28,650 --> 00:31:31,020 Es ist super nutzlos. 687 00:31:31,020 --> 00:31:33,980 Es zeigt nur Dieser spezielle Fehler. 688 00:31:33,980 --> 00:31:34,920 Werfen wir also einen Blick. 689 00:31:34,920 --> 00:31:39,920 Hier ist Haupt-und Haupt, bemerken, Anrufe eine Funktion namens f und dann zurückkehrt. 690 00:31:39,920 --> 00:31:41,550 Also nicht so interessant. 691 00:31:41,550 --> 00:31:42,664 Was bedeutet f zu tun? 692 00:31:42,664 --> 00:31:44,330 Beachten Sie, ich habe nicht mit einem Prototyp zu stören. 693 00:31:44,330 --> 00:31:46,520 Ich wollte, um den Code zu halten so gering wie möglich. 694 00:31:46,520 --> 00:31:49,530 Also setzte ich f oben Haupt- und das ist in Ordnung, natürlich, 695 00:31:49,530 --> 00:31:51,500 für kurze Programme wie dieses. 696 00:31:51,500 --> 00:31:56,910 So f nichts zurückgibt und tut nichts nehmen, aber es tun. 697 00:31:56,910 --> 00:31:59,620 Es erklärt, ähnlich wie in der Binky Beispiel 698 00:31:59,620 --> 00:32:02,682 ein Zeiger namens x, das wird um die Adresse eines int speichern. 699 00:32:02,682 --> 00:32:03,890 Das ist also der linken Seite. 700 00:32:03,890 --> 00:32:07,230 In Englisch, was ist das rechten Seite gerade? 701 00:32:07,230 --> 00:32:09,770 Anyone? 702 00:32:09,770 --> 00:32:13,665 Was ist dies für uns tun? 703 00:32:13,665 --> 00:32:14,651 Ja? 704 00:32:14,651 --> 00:32:16,623 >> ZIELGRUPPE: [unverständlich] mal so groß wie ein Int 705 00:32:16,623 --> 00:32:19,175 das ist 10-mal, dass [unverständlich] 706 00:32:19,175 --> 00:32:20,800 DAVID MALAN: Gut und lassen Sie mich zusammenfassen. 707 00:32:20,800 --> 00:32:25,480 Also genug Platz zuzuweisen für 10 ganze Zahlen oder 10, was ist die Größe eines int, 708 00:32:25,480 --> 00:32:29,340 es ist vier Bytes, also 10 mal 4 40, so dass die rechte Seite, die ich 709 00:32:29,340 --> 00:32:33,930 markiert ist mir 40 Byte und Speichern der Adresse des ersten Bytes 710 00:32:33,930 --> 00:32:34,940 in x. 711 00:32:34,940 --> 00:32:38,380 Und jetzt endlich, und hier ist, wo dieses Programm ist fehlerhaft, was ist 712 00:32:38,380 --> 00:32:41,540 falsch mit Linie 21 auf der Grundlage dieser Logik? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Was ist los mit der Leitung 21? 715 00:32:46,280 --> 00:32:46,780 Ja? 716 00:32:46,780 --> 00:32:49,550 ZIELGRUPPE: Sie können nicht Index in x [unverständlich]. 717 00:32:49,550 --> 00:32:50,300 DAVID MALAN: Ja. 718 00:32:50,300 --> 00:32:52,270 Ich sollte nicht Index in x so. 719 00:32:52,270 --> 00:32:53,850 So syntaktisch, das ist OK. 720 00:32:53,850 --> 00:32:56,990 Was ist schön ist, genauso wie Sie kann der Name eines Arrays zu behandeln 721 00:32:56,990 --> 00:33:01,080 als ob es ein Zeiger ähnlich können Sie einen Zeiger zu behandeln, als ob es 722 00:33:01,080 --> 00:33:06,425 ein Array, und so kann ich syntaktisch sagen x Halterung etwas, x Halterung i, 723 00:33:06,425 --> 00:33:07,800 aber die 10 ist problematisch. 724 00:33:07,800 --> 00:33:09,096 Warum? 725 00:33:09,096 --> 00:33:10,910 >> ZIELGRUPPE: Weil es nicht im Inneren. 726 00:33:10,910 --> 00:33:12,390 >> DAVID MALAN: Es ist nicht innerhalb dieser Teil des Speichers. 727 00:33:12,390 --> 00:33:15,306 Was ist der größte Wert, ich sollte Putting in den eckigen Klammern? 728 00:33:15,306 --> 00:33:16,870 9, 0 bis 9. 729 00:33:16,870 --> 00:33:18,160 Da Null Indizierung. 730 00:33:18,160 --> 00:33:20,190 So 0 bis 9 wäre in Ordnung. 731 00:33:20,190 --> 00:33:23,960 Bracket 10 ist nicht gut, und aber jedes Mal, wenn erinnern 732 00:33:23,960 --> 00:33:27,017 Ich glaube mich zu versuchen, CS50 IDE machen Absturz, indem Sie in falsche Werte, 733 00:33:27,017 --> 00:33:29,100 es muss nicht immer zusammenwirken, und in der Tat, Sie oft 734 00:33:29,100 --> 00:33:31,460 Glück nur, weil die Betriebssystem nicht 735 00:33:31,460 --> 00:33:35,467 feststellen, dass Sie immer so leicht passieren einige Teil des Speichers, 736 00:33:35,467 --> 00:33:38,300 weil Sie in technisch blieb Ihr Segment, aber mehr dazu 737 00:33:38,300 --> 00:33:40,940 in einem Betriebssystem-Klasse, und so etwas wie dieses 738 00:33:40,940 --> 00:33:43,000 könnte sehr leicht unentdeckt bleiben. 739 00:33:43,000 --> 00:33:48,120 Ihr Programm wird nie zum Absturz konsequent, aber vielleicht einmal in eine Weile. 740 00:33:48,120 --> 00:33:50,610 >> Und so wollen wir versuchen valgrind auf dieser, und hier ist, 741 00:33:50,610 --> 00:33:52,870 wo wir überwältigt erhalten durch das Ausgangssignal vorübergehend. 742 00:33:52,870 --> 00:34:00,810 So stellen Speicher valgrind Leckprüfung gleich Vollpunktstrich Speicher. 743 00:34:00,810 --> 00:34:03,040 Und hier ist, warum ich verspreche, dies würde zu überwältigen. 744 00:34:03,040 --> 00:34:05,700 Hier ist, was valgrind, hier ist was ein Programmierer, ein paar Jahre AGO 745 00:34:05,700 --> 00:34:08,469 beschlossen, es wäre eine gute Idee, Für die Ausgabe aussehen. 746 00:34:08,469 --> 00:34:09,750 Lassen Sie uns also einen Sinn dafür. 747 00:34:09,750 --> 00:34:13,120 Also den ganzen Weg auf der linken Seite für keinen guten Grund 748 00:34:13,120 --> 00:34:16,620 die Prozess-ID des Programms wir gerade laufen, die eindeutige Kennung 749 00:34:16,620 --> 00:34:18,030 für das Programm, das wir gerade lief. 750 00:34:18,030 --> 00:34:19,738 Wir gelöscht, dass aus der Schieber, aber es 751 00:34:19,738 --> 00:34:22,190 einige nützliche Informationen hier. 752 00:34:22,190 --> 00:34:24,684 >> Lassen Sie uns nach oben an die Spitze. 753 00:34:24,684 --> 00:34:25,600 Hier ist, wo wir begannen. 754 00:34:25,600 --> 00:34:27,040 Es ist also gar nicht so viel ausgegeben. 755 00:34:27,040 --> 00:34:30,429 Hier ist, dass ungültige Schreib der Größe 4 in Zeile 21. 756 00:34:30,429 --> 00:34:31,760 Nun, was war die Leitung 21? 757 00:34:31,760 --> 00:34:34,500 Zeile 21 war genau das, Diese und es ist sinn 758 00:34:34,500 --> 00:34:37,290 dass ich in rechtsgültig Schreiben 4 Bytes, weil ich 759 00:34:37,290 --> 00:34:40,389 versuchen, diese ganze Zahl ausgedrückt, was alles sein könnte, 760 00:34:40,389 --> 00:34:42,370 es passiert einfach zu sein, Null, aber ich versuche, 761 00:34:42,370 --> 00:34:44,940 um es an einer Stelle setzen das nicht zu mir gehören. 762 00:34:44,940 --> 00:34:50,900 Darüber hinaus hier unten, 40 Bytes in einem Blöcke werden auf jeden Fall in Rekord 1 verloren. 763 00:34:50,900 --> 00:34:56,500 Das ist, weil, wenn ich rufe malloc hier, ich nie wirklich den Speicher frei. 764 00:34:56,500 --> 00:34:58,140 >> Wie können wir dieses Problem beheben? 765 00:34:58,140 --> 00:35:02,970 Lassen Sie mich voran gehen und ein wenig sicherer und tun es 9 und lassen Sie mich hier kostenlos x. 766 00:35:02,970 --> 00:35:04,820 Dies ist die neue Funktion für heute. 767 00:35:04,820 --> 00:35:11,520 Wenn ich nun erneut stellen Speicherpunktstrich, lassen Sie uns laufen valgrind darauf wieder, 768 00:35:11,520 --> 00:35:14,990 maximieren meinem Fenster und drücken Sie Enter. 769 00:35:14,990 --> 00:35:16,900 Nun, es ist gut. 770 00:35:16,900 --> 00:35:19,590 Sie begraben die gute Nachricht in all diesen Ausgang. 771 00:35:19,590 --> 00:35:20,810 Alle Haufen blockiert waren frei. 772 00:35:20,810 --> 00:35:23,604 Wir kommen wieder zu dem, was dem Heap kommen ist, aber keine Lecks sind möglich. 773 00:35:23,604 --> 00:35:25,520 So ist das nur eine Werkzeug für Ihren Werkzeugkasten 774 00:35:25,520 --> 00:35:30,220 mit denen Sie zu starten Finde jetzt Fehler so. 775 00:35:30,220 --> 00:35:34,532 >> Aber mal sehen, was mehr kann schief gehen. 776 00:35:34,532 --> 00:35:38,890 Lassen Sie uns nun auf Übergangs tatsächlich ein Problem zu lösen. 777 00:35:38,890 --> 00:35:42,440 Nebenbei bemerkt, wenn dadurch eine Linderung wenig Verwirrung oder Spannung, 778 00:35:42,440 --> 00:35:43,430 das ist jetzt lustig. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Ja. 781 00:35:46,900 --> 00:35:49,040 Das ist ziemlich gut. 782 00:35:49,040 --> 00:35:50,890 Da Zeiger sind Adressen und Adressen 783 00:35:50,890 --> 00:35:53,098 sind in der Regel durch Konvention mit hexadezimal geschrieben. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, das ist jetzt lustig. 785 00:35:54,650 --> 00:35:58,390 Wie auch immer, also lassen Sie uns jetzt tatsächlich ein Problem zu lösen. 786 00:35:58,390 --> 00:36:00,840 Dies war super, Super-Low-Level so weit, 787 00:36:00,840 --> 00:36:03,950 und wir können wirklich nützlich machen Dinge mit diesen Low-Level-Details. 788 00:36:03,950 --> 00:36:06,710 >> So haben wir ein paar Wochen Vor der Begriff eines Arrays. 789 00:36:06,710 --> 00:36:09,177 Ein Array war schön, weil es ist schwer zu bereinigen, unseren Code 790 00:36:09,177 --> 00:36:11,760 denn wenn wir auf ein Schreiben wollte Programm mit mehreren Studenten 791 00:36:11,760 --> 00:36:15,270 oder mehrere Namen und Häuser und Schlafsäle und Fachhochschulen und all das, 792 00:36:15,270 --> 00:36:19,430 wir alles mehr speichern könnte sauber innerhalb eines Arrays. 793 00:36:19,430 --> 00:36:23,039 Aber schlagen ein Nachteil eines Arrays bisher. 794 00:36:23,039 --> 00:36:26,080 Selbst wenn Sie noch nicht gelitten it yourself in einem Programm, nur instinktiv, 795 00:36:26,080 --> 00:36:30,870 Was ist eine schlechte Sache zu einem Array, vielleicht? 796 00:36:30,870 --> 00:36:32,337 Ich habe gehört, einige Murmeln. 797 00:36:32,337 --> 00:36:34,170 Publikum: Es ist schwierig, um die Größe zu ändern. 798 00:36:34,170 --> 00:36:36,128 DAVID MALAN: Es ist schwierig, um die Größe zu ändern. 799 00:36:36,128 --> 00:36:38,660 Sie können die Größe nicht ändern einer Anordnung, in der Tat an sich 800 00:36:38,660 --> 00:36:43,040 in C. Sie können ein anderes Array zuzuordnen, bewegen alles, was von der alten 801 00:36:43,040 --> 00:36:45,380 in die neue, jetzt haben etwas mehr Platz, 802 00:36:45,380 --> 00:36:47,469 aber es ist nicht wie ein Sprache wie Java oder Python 803 00:36:47,469 --> 00:36:49,760 oder eine beliebige Anzahl anderer Sprachen, mit denen einige von euch 804 00:36:49,760 --> 00:36:52,070 vielleicht kennen, wo Sie kann nur halten das Hinzufügen Dinge 805 00:36:52,070 --> 00:36:53,930 Überdruss an das Ende eines Arrays. 806 00:36:53,930 --> 00:36:57,880 Wenn Sie ein Array von haben Größe 6, die seine Größe ist, 807 00:36:57,880 --> 00:37:01,970 und so sehr wie die Idee früher mit einem Puffer einer bestimmten Größe, 808 00:37:01,970 --> 00:37:05,940 Sie aus dem Tor erraten welche Größe Sie wollen, dass es sein? 809 00:37:05,940 --> 00:37:07,880 Wenn Sie zu groß denke, Sie verschwenden Speicherplatz sind. 810 00:37:07,880 --> 00:37:10,950 Wenn Sie zu klein raten, du kann, dass die Daten nicht zu speichern, zumindest 811 00:37:10,950 --> 00:37:12,940 ohne viel mehr Arbeit. 812 00:37:12,940 --> 00:37:18,180 >> So heute, dank Zeiger, können wir beginnen Zusammennähen eigene benutzerdefinierte 813 00:37:18,180 --> 00:37:20,989 Datenstrukturen und der Tat, hier ist etwas, 814 00:37:20,989 --> 00:37:23,030 , dass ein wenig mehr sieht kryptische auf den ersten Blick 815 00:37:23,030 --> 00:37:26,440 aber das ist, was wir nennen eine verknüpfte Liste, und sein Name Art fasst zusammen 816 00:37:26,440 --> 00:37:26,940 es. 817 00:37:26,940 --> 00:37:29,550 Es ist eine Liste von Zahlen, oder in diesem Fall wird eine Liste von Zahlen, 818 00:37:29,550 --> 00:37:33,480 aber es könnte eine Liste der alles sein, aber es miteinander über einen Pfeil verbunden, 819 00:37:33,480 --> 00:37:36,380 und nehmen Sie nur eine Vermutung, mit welcher Technik 820 00:37:36,380 --> 00:37:38,310 wir werden zu können zusammen zu nähen, 821 00:37:38,310 --> 00:37:42,540 Art wie Popcorn mit einem Gewinde, eine verkettete Listen Recht hier? 822 00:37:42,540 --> 00:37:43,936 Seine Zahlen? 823 00:37:43,936 --> 00:37:45,560 Was ist die zugrunde liegende Sprache-Funktion? 824 00:37:45,560 --> 00:37:46,350 >> Publikum: Ein Zeiger. 825 00:37:46,350 --> 00:37:47,308 >> DAVID MALAN: Ein Zeiger. 826 00:37:47,308 --> 00:37:51,700 So jede dieser Pfeile stellt hier ein Zeiger oder einfach nur eine Adresse. 827 00:37:51,700 --> 00:37:54,590 Also mit anderen Worten, wenn ich will, um eine Liste von Nummern zu speichern, 828 00:37:54,590 --> 00:37:59,040 Ich kann nicht einfach speichern Sie es, wenn ich will die Fähigkeit zu wachsen und schrumpfen 829 00:37:59,040 --> 00:38:00,990 Mein-Datenstruktur in einem Array. 830 00:38:00,990 --> 00:38:03,000 Also muss ich ein wenig haben mehr Raffinesse, 831 00:38:03,000 --> 00:38:05,720 aber feststellen, dass dieses Bild Art schlägt 832 00:38:05,720 --> 00:38:08,650 dass, wenn Sie gerade wenig Threads habe alles miteinander verbindet, 833 00:38:08,650 --> 00:38:13,100 ist wahrscheinlich nicht so schwer, Platz zu schaffen zwischen zwei von diesen Recht 834 00:38:13,100 --> 00:38:16,750 oder zwei dieser Knoten, wie wir starten indem er sie in einen neuen Knoten setzen, 835 00:38:16,750 --> 00:38:19,547 und dann mit einigen neuen Thread, nur Graben die drei Knoten zusammen, 836 00:38:19,547 --> 00:38:22,880 die erste, die letzte und die eine dass Sie gerade in die Mitte eingesetzt. 837 00:38:22,880 --> 00:38:26,000 >> Und in der Tat eine verkettete Liste, Im Gegensatz zu einer Anordnung, ist dynamisch. 838 00:38:26,000 --> 00:38:27,840 Es kann wachsen und es kann schrumpfen und Sie dies nicht tun 839 00:38:27,840 --> 00:38:32,434 müssen wissen oder Pflege im Voraus, wie viele Daten Sie gehst zu speichern, 840 00:38:32,434 --> 00:38:35,600 aber es stellt sich heraus, wir müssen ein wenig vorsichtig sein, wie dies zu implementieren. 841 00:38:35,600 --> 00:38:39,070 Also lassen Sie uns zuerst überlegen, wie wir implementieren eine dieser kleinen Rechtecken. 842 00:38:39,070 --> 00:38:40,690 Es ist einfach, einen int zu implementieren. 843 00:38:40,690 --> 00:38:44,000 Sie sagen, nur int n und dann erhalten Sie 4 Byte für ein int, 844 00:38:44,000 --> 00:38:49,089 aber wie kann ich einen int zu erhalten, rufen Sie n, und dann ein Zeiger, nennen wir es nächsten. 845 00:38:49,089 --> 00:38:50,880 Wir könnten diese nennen Dinge, was wir wollen 846 00:38:50,880 --> 00:38:53,590 aber ich brauche eine benutzerdefinierte Datenstruktur. 847 00:38:53,590 --> 00:38:54,257 Ja? 848 00:38:54,257 --> 00:38:57,020 >> ZIELGRUPPE: Ampersand [unverständlich]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID MALAN: So kaufmännisches Und wir werden zu bedienen Holen Sie sich die Adresse eines Knotens möglicherweise. 850 00:39:00,940 --> 00:39:02,740 Aber wir brauchen eine andere Merkmal C, um 851 00:39:02,740 --> 00:39:06,700 mir die Möglichkeit zu schaffen, um zu geben dieser Brauch Rechteck, dieser Brauch 852 00:39:06,700 --> 00:39:08,919 variable wenn man so will, in Erinnerung. 853 00:39:08,919 --> 00:39:09,710 Publikum: Ein struct. 854 00:39:09,710 --> 00:39:10,626 DAVID MALAN: Eine Struktur. 855 00:39:10,626 --> 00:39:14,310 Daran erinnern, aus der vergangenen Woche führten wir struct, diese relativ einfache Schlüsselwort 856 00:39:14,310 --> 00:39:16,254 dass lässt uns die Dinge wie diese. 857 00:39:16,254 --> 00:39:18,420 C nicht mit einer Daten kommen Struktur namens Student. 858 00:39:18,420 --> 00:39:22,190 Es kommt mit int und float und Saibling und solche, jedoch nicht mit Studenten kommen, 859 00:39:22,190 --> 00:39:26,750 aber wir können einen Studenten-Datentyp zu erstellen, Student-Struktur, mit dieser Syntax 860 00:39:26,750 --> 00:39:27,250 Hier. 861 00:39:27,250 --> 00:39:28,350 Und Sie werden das immer wieder zu sehen. 862 00:39:28,350 --> 00:39:30,426 Seien Sie also nicht zu befürchten Speichern der Keywords, 863 00:39:30,426 --> 00:39:33,300 aber das Schlüsselwort, das wichtige ist nur die Tatsache, dass wir die Struktur 864 00:39:33,300 --> 00:39:37,590 und dann riefen wir Studenten und innen des Studenten war ein Name und ein Haus 865 00:39:37,590 --> 00:39:39,390 oder ein Wohnheim oder dergleichen. 866 00:39:39,390 --> 00:39:41,980 >> Und nun heute, lassen Sie schlagen diese. 867 00:39:41,980 --> 00:39:45,240 Ich habe ein paar Worte hinzugefügt, aber wenn ich will, dieses Rechtecks, das ist zu implementieren 868 00:39:45,240 --> 00:39:48,440 erhielt sowohl einen int und eine Zeiger, weißt du was, ich bin 869 00:39:48,440 --> 00:39:51,540 gehen, um eine Struktur namens Knoten erklären. 870 00:39:51,540 --> 00:39:55,630 Ich bin auch, in der es, sagen dass ein Knoten, dieses Rechteck, eine int 871 00:39:55,630 --> 00:39:59,730 und wir nennen es n und es hat eine nächste Zeiger. 872 00:39:59,730 --> 00:40:02,540 Und das ist ein wenig ausführlicher, aber wenn man darüber nachdenkt, 873 00:40:02,540 --> 00:40:07,300 Die Pfeile, die im Bild waren vor einem Augenblick sind von dem, was Datentyp? 874 00:40:07,300 --> 00:40:12,330 Wo jeder dieser Pfeile wird zeigen um welche Art von Datenstruktur? 875 00:40:12,330 --> 00:40:14,332 Es ist nicht nur in ein int an sich zeigt. 876 00:40:14,332 --> 00:40:16,165 Es ist, um die Zeige ganze rechteckige Ding 877 00:40:16,165 --> 00:40:18,720 und das rechteckige Ding, wir gesagt, wird als ein Knoten. 878 00:40:18,720 --> 00:40:21,720 Und so haben wir Art müssen rekursiv definieren diese wie 879 00:40:21,720 --> 00:40:26,270 dass ein Knoten, sagen wir mal, wird einen int namens n enthalten 880 00:40:26,270 --> 00:40:31,070 und einen Zeiger namens nächsten und der Art der Datenstruktur, an welche 881 00:40:31,070 --> 00:40:35,770 dass Zeiger ist offenbar werde struct Knoten sein. 882 00:40:35,770 --> 00:40:41,550 >> Also das ist ärgerlich verbose und nur pedantisch zu sein, 883 00:40:41,550 --> 00:40:44,100 der Grund, warum wir es nicht können nur sagen, das, was ehrlich gesagt 884 00:40:44,100 --> 00:40:46,860 sieht viel besser lesbar, Denn daran erinnern, dass zu lesen C 885 00:40:46,860 --> 00:40:48,710 Dinge, von oben nach unten, von links nach rechts. 886 00:40:48,710 --> 00:40:54,120 Es ist nicht, bis wir das Semikolon zu bekommen dass das Schlüsselwort Knoten tatsächlich existiert. 887 00:40:54,120 --> 00:40:57,980 Also, wenn wir wollen, dass diese Art von haben zyklischen Verweis innerhalb des Daten 888 00:40:57,980 --> 00:41:02,120 Struktur, um dies zu tun müssen wir gegebenen wir sagen struct Knoten an der Spitze, die 889 00:41:02,120 --> 00:41:06,770 gibt uns einen längeren Weg zur Beschreibung dieses Sache, dann im Inneren wir sagen struct node, 890 00:41:06,770 --> 00:41:09,560 und dann an der letzten Zeile wir sagen, alles in Ordnung, C, übrigens, 891 00:41:09,560 --> 00:41:12,060 dieses ganze verdammte rufen Sie einfach was ein Knoten und zu stoppen 892 00:41:12,060 --> 00:41:14,360 mit dem Schlüsselwort struct insgesamt. 893 00:41:14,360 --> 00:41:18,030 Also das ist einfach irgendwie eine syntaktische Trick, schließlich lässt uns erstellen 894 00:41:18,030 --> 00:41:21,370 etwas, das genau so aussieht. 895 00:41:21,370 --> 00:41:25,010 >> Wenn wir nun an, wir können implementieren diese Sache in C, 896 00:41:25,010 --> 00:41:28,040 wie können wir tatsächlich Start durchqueren das? 897 00:41:28,040 --> 00:41:32,360 Nun, in der Tat ist alles, was wir tun müssen, Iteration von links nach rechts und einfach 898 00:41:32,360 --> 00:41:35,960 Art von Knoten einfügen oder Knoten zu löschen oder suchen Sie nach Dingen, wo immer wir wollen, 899 00:41:35,960 --> 00:41:39,560 aber um dies zu tun, gehen Sie voran und machen die Dinge ein wenig mehr real, weil diese 900 00:41:39,560 --> 00:41:42,560 hat Super-Low-Level war so weit. 901 00:41:42,560 --> 00:41:45,700 Würde jemand buchstäblich wie Erste sein? 902 00:41:45,700 --> 00:41:46,200 OK. 903 00:41:46,200 --> 00:41:47,092 Komm auf. 904 00:41:47,092 --> 00:41:47,800 Wie heißen Sie? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID MALAN: David. 907 00:41:49,290 --> 00:41:49,998 Nett, dich zu treffen. 908 00:41:49,998 --> 00:41:50,960 Ich auch. 909 00:41:50,960 --> 00:41:52,450 Gut. 910 00:41:52,450 --> 00:41:53,990 Und wir brauchen eine Nummer 9. 911 00:41:53,990 --> 00:41:55,240 Nicht so gut wie erste, vielleicht. 912 00:41:55,240 --> 00:41:56,430 OK, Nummer 9. 913 00:41:56,430 --> 00:41:59,667 Eine Reihe 17, bitte. 914 00:41:59,667 --> 00:42:01,000 Lassen Sie mich gehen zurück ein wenig weiter. 915 00:42:01,000 --> 00:42:03,980 Number 22, bitte, und wie wäre es weiter zurück 916 00:42:03,980 --> 00:42:06,344 wenn ich keine Hände zu sehen mit all dem Licht oder nicht. 917 00:42:06,344 --> 00:42:08,010 Jemand wird genau dort freiwillig. 918 00:42:08,010 --> 00:42:08,968 Wollen Sie kommen? 919 00:42:08,968 --> 00:42:10,450 Unterarm zwangsweise nach oben entwickelt. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 herab. 923 00:42:15,120 --> 00:42:18,450 Würde jemand gerne forcefully-- Komm up. 924 00:42:18,450 --> 00:42:21,030 Eine tatsächliche Freiwilligen. 925 00:42:21,030 --> 00:42:23,330 >> So sehr schnell, wenn euch könnte arrangieren 926 00:42:23,330 --> 00:42:26,550 euch genau wie die Knoten auf dem Bildschirm. 927 00:42:26,550 --> 00:42:27,510 Danke. 928 00:42:27,510 --> 00:42:29,234 Und Sie werden 26 sein. 929 00:42:29,234 --> 00:42:30,650 Alle rechte und schnelle Einführungen. 930 00:42:30,650 --> 00:42:32,139 Also ich bin David und Sie auch? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID MALAN: Und Sie sind? 933 00:42:33,721 --> 00:42:34,229 JAKE: Jake. 934 00:42:34,229 --> 00:42:34,729 SUE: Sue. 935 00:42:34,729 --> 00:42:35,229 Alex: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Raphael. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID MALAN: Taylor. 939 00:42:37,466 --> 00:42:37,590 Ausgezeichnet. 940 00:42:37,590 --> 00:42:39,810 Das sind unsere Freiwilligen für heute und gehen Sie voran 941 00:42:39,810 --> 00:42:43,090 und Schicht ein wenig so, und gehen Sie einfach weiter und halten Sie 942 00:42:43,090 --> 00:42:47,024 Halten Sie Ihre Zahlen, wie Sie sind oder Ihr erste Zeichen und mit der linken Hand, 943 00:42:47,024 --> 00:42:48,940 gehen Sie voran und einfach zu implementieren diese Pfeile, nur 944 00:42:48,940 --> 00:42:51,360 so dass Ihre linke Hand ist buchstäblich zeigt auf, was Sie möchte darauf hinweisen, 945 00:42:51,360 --> 00:42:54,610 an, und etwas Raum, damit geben Sie sich können wir visuell sehen Sie die Arme tatsächlich 946 00:42:54,610 --> 00:42:58,120 zeigen, und Sie müssen nur darauf hinweisen können Art auf den Boden ist in Ordnung. 947 00:42:58,120 --> 00:43:03,040 >> Hier haben wir also eine verknüpfte Liste von ein, zwei, drei, vier, fünf Knoten anfänglich 948 00:43:03,040 --> 00:43:05,860 und bemerken wir diesen speziellen Zeiger auf den Anfang, wer 949 00:43:05,860 --> 00:43:09,770 Schlüssel, denn wir haben den Überblick zu behalten der Gesamtlänge Liste irgendwie. 950 00:43:09,770 --> 00:43:13,590 Diese Jungs, auch wenn sie sind links nach rechts, zurück auf im Speicher sichern, 951 00:43:13,590 --> 00:43:15,950 sie können tatsächlich überall sein in den Speicher des Computers. 952 00:43:15,950 --> 00:43:18,240 Also diese Jungs könnten stehen überall auf der Bühne 953 00:43:18,240 --> 00:43:20,960 und das ist in Ordnung, so lange, wie sie sind tatsächlich einander zeigen, 954 00:43:20,960 --> 00:43:22,770 sondern um die Dinge sauber und einfach, wir 955 00:43:22,770 --> 00:43:25,728 nur ziehen sie von links nach rechts, wie dies, aber es könnte massiven Lücken 956 00:43:25,728 --> 00:43:26,790 zwischen diesen Knoten. 957 00:43:26,790 --> 00:43:30,710 >> Nun, wenn ich tatsächlich einzufügen einige neuen Wert, gehen Sie vor und tun dies. 958 00:43:30,710 --> 00:43:33,720 Wir haben die Chance jetzt einen anderen Knoten zu wählen. 959 00:43:33,720 --> 00:43:39,820 Sagen lassen Sie uns beginnen mit mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Würde jemand dagegen, malloc? 961 00:43:41,320 --> 00:43:42,280 OK, komm herauf. 962 00:43:42,280 --> 00:43:42,992 Wie heißen Sie? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Regenbogen. 964 00:43:43,700 --> 00:43:44,050 DAVID MALAN: Regenbogen? 965 00:43:44,050 --> 00:43:44,810 Gut. 966 00:43:44,810 --> 00:43:46,600 Malloc Regenbogen. 967 00:43:46,600 --> 00:43:47,450 Komm auf. 968 00:43:47,450 --> 00:43:51,610 So, jetzt haben wir uns fragen, algorithmisch, wo wir 55 gesetzt. 969 00:43:51,610 --> 00:43:53,610 So wissen wir alle, offensichtlich, wo sie wahrscheinlich 970 00:43:53,610 --> 00:43:55,401 gehört, wenn wir versuchen, halten diese sortiert 971 00:43:55,401 --> 00:43:58,299 und wenn euch könnte man nehmen Schritt zurück, so dass wir fallen nicht ab 972 00:43:58,299 --> 00:43:59,590 die Bühne, das wäre toll. 973 00:43:59,590 --> 00:44:01,420 Also eigentlich, Regenbogen, vorne beginnen hier bei mir, 974 00:44:01,420 --> 00:44:04,200 weil wir wie der Computer können nun nur eine Variable sehen, zu einer Zeit. 975 00:44:04,200 --> 00:44:05,190 So dass, wenn dies der erste Knoten. 976 00:44:05,190 --> 00:44:07,160 Beachten Sie, dass er nicht ein Knoten, er ist nur ein Zeiger, 977 00:44:07,160 --> 00:44:10,270 und das ist, warum er gezogen zu sein nur die Größe eines Zeigers nicht 978 00:44:10,270 --> 00:44:11,780 einer jener vollen Rechtecke. 979 00:44:11,780 --> 00:44:16,650 So werden wir bei jedem Check Iteration 55 weniger als 9? 980 00:44:16,650 --> 00:44:17,150 Nein. 981 00:44:17,150 --> 00:44:19,060 55 weniger als 17? 982 00:44:19,060 --> 00:44:19,720 Nein. 983 00:44:19,720 --> 00:44:20,800 Weniger als 22? 984 00:44:20,800 --> 00:44:22,020 Weniger als 26? 985 00:44:22,020 --> 00:44:23,390 Weniger als 34? 986 00:44:23,390 --> 00:44:25,890 Und nun, offensichtlich Regenbogen gehört am Ende. 987 00:44:25,890 --> 00:44:27,270 So klar zu sein, und was war Ihr Name, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID MALAN: So unter Taylors linke Hand und Regenbogen-Hände hier, 990 00:44:32,510 --> 00:44:38,324 dessen Hand braucht, um über das, was in Punkt um Beiträge in dieser Liste einfügen 55? 991 00:44:38,324 --> 00:44:39,240 Was müssen wir tun? 992 00:44:39,240 --> 00:44:39,700 Ja? 993 00:44:39,700 --> 00:44:41,140 >> ZIELGRUPPE: Taylor Hand muss links zeigen. 994 00:44:41,140 --> 00:44:41,680 >> DAVID MALAN: Genau. 995 00:44:41,680 --> 00:44:43,800 So Einfügen eines Knotens in das Ende der Liste 996 00:44:43,800 --> 00:44:47,140 ist ziemlich einfach, weil Taylor gerade muss an den Massepunkt anstelle 997 00:44:47,140 --> 00:44:49,640 oder wir nennen es null, null ist eine Art der Abwesenheit 998 00:44:49,640 --> 00:44:51,640 eines Zeigers oder eines speziellen Null-Zeiger, du bist 999 00:44:51,640 --> 00:44:53,740 gehen, um mit dem linken Punkt Hand an der Regenbogen und Regenbogen, 1000 00:44:53,740 --> 00:44:55,910 wo soll der linken Hand wahrscheinlich zeigen? 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Es ist nicht gut, wenn ihre Hand ist eine Art des Zeigens weg hier, oder jede Art von 1003 00:45:00,140 --> 00:45:00,640 welche Richtung. 1004 00:45:00,640 --> 00:45:02,407 Das wäre in Betracht gezogen werden ein Müllwert, 1005 00:45:02,407 --> 00:45:04,240 aber wenn sie verweist auf einige bekannte Wert, werden wir 1006 00:45:04,240 --> 00:45:07,360 nennen es null oder null, das ist OK, denn wir haben eine Laufzeit in diesem 1007 00:45:07,360 --> 00:45:09,390 und wir wissen, die Liste ist nun abgeschlossen. 1008 00:45:09,390 --> 00:45:11,550 >> Also, was ist ein weiterer relativ einfachen Fall? 1009 00:45:11,550 --> 00:45:13,125 Könnten wir malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Komm auf. 1011 00:45:14,010 --> 00:45:14,782 Wie heißen Sie? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID MALAN: Es tut mir leid? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID MALAN: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 Gut. 1017 00:45:17,110 --> 00:45:19,071 Tiffany wurde malloced mit dem Wert 5. 1018 00:45:19,071 --> 00:45:19,570 Komm auf. 1019 00:45:19,570 --> 00:45:23,820 Das hier ist relativ einfach, auch, aber laßt uns überlegen Reihenfolge der Operationen jetzt. 1020 00:45:23,820 --> 00:45:25,820 Es war recht einfach mit Taylor am Ende. 1021 00:45:25,820 --> 00:45:30,302 Nummer 5 ist natürlich weniger als 9, und so haben wir David, wir haben Tiffany, 1022 00:45:30,302 --> 00:45:31,260 und was war Ihr Name? 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: Jake. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID MALAN: Jake. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Jake und David. 1026 00:45:34,300 --> 00:45:36,580 Dessen Hand sollte zuerst aktualisiert werden? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Was wollen Sie hier? 1029 00:45:40,590 --> 00:45:45,244 Es gibt ein paar Möglichkeiten, aber es gibt auch eine oder mehrere falsche Wege. 1030 00:45:45,244 --> 00:45:46,620 >> ZIELGRUPPE: Beginnen Sie mit ganz links. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID MALAN: Beginnen Sie mit der am weitesten links. 1032 00:45:47,800 --> 00:45:49,008 Wer ist der am weitesten links dann hier? 1033 00:45:49,008 --> 00:45:49,700 ZIELGRUPPE: Erstens. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID MALAN: OK. 1035 00:45:50,366 --> 00:45:53,781 Also mit zum ersten Mal starten und wo sehen Sie aktualisieren möchten Davids Händen zu sein? 1036 00:45:53,781 --> 00:45:54,780 Publikum: Auf dem Weg zur 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID MALAN: OK. 1038 00:45:55,446 --> 00:45:59,026 Und David, zeigen an fünf oder Tiffany hier, und jetzt? 1039 00:45:59,026 --> 00:46:01,072 >> ZIELGRUPPE: Tiffany weist auf die 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID MALAN: Perfect, außer Binkys Kopf nur irgendwie fiel, nicht wahr? 1041 00:46:04,030 --> 00:46:06,820 Denn was ist los mit Dieses Bild wörtlich? 1042 00:46:06,820 --> 00:46:08,070 ZIELGRUPPE: Nichts zeigt. 1043 00:46:08,070 --> 00:46:09,945 DAVID MALAN: Nichts ist zeigt auf Jake jetzt. 1044 00:46:09,945 --> 00:46:13,360 Wir haben buchstäblich verwaiste 9 und 17, und wir haben buchstäblich 1045 00:46:13,360 --> 00:46:18,450 durchgesickert all dieses Speichers, denn durch Aktualisieren ersten Davids Hand, das ist, 1046 00:46:18,450 --> 00:46:21,660 Fein soweit sie korrekt ist zeigt auf Tiffany jetzt, 1047 00:46:21,660 --> 00:46:25,410 aber wenn niemand hatte die Weitsicht, um Jake hinweisen, 1048 00:46:25,410 --> 00:46:27,490 dann haben wir verloren haben, die Gesamtheit dieser Liste. 1049 00:46:27,490 --> 00:46:28,200 Lassen Sie uns also rückgängig zu machen. 1050 00:46:28,200 --> 00:46:30,950 Das war also eine gute Sache, stolpern, aber lassen Sie uns jetzt zu korrigieren. 1051 00:46:30,950 --> 00:46:33,624 Was sollen wir tun ersten statt? 1052 00:46:33,624 --> 00:46:34,124 Ja? 1053 00:46:34,124 --> 00:46:35,791 >> ZIELGRUPPE: Tiffany sollte an der 9-Punkt? 1054 00:46:35,791 --> 00:46:37,582 DAVID MALAN: Ich kann nicht bekommen, dass in Ihrer Nähe. 1055 00:46:37,582 --> 00:46:38,720 Wer sollte an der 9-Punkt? 1056 00:46:38,720 --> 00:46:39,220 >> ZIELGRUPPE: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID MALAN: Alles klar. 1058 00:46:39,390 --> 00:46:41,200 So sollte Tiffany ersten Punkt an der 9. 1059 00:46:41,200 --> 00:46:43,550 So Tiffany nehmen sollte auf einem identischen Wert 1060 00:46:43,550 --> 00:46:45,820 David, die scheint, redundanten für einen Moment, 1061 00:46:45,820 --> 00:46:48,820 aber das ist in Ordnung, denn jetzt, die zweite Schritt können wir Davids Hand aktualisieren 1062 00:46:48,820 --> 00:46:52,680 bei Tiffany Punkt, und dann, wenn wir nur irgendwie saubere Dinge 1063 00:46:52,680 --> 00:46:55,740 als ob dies Art von federartigen, nun, das ist eine korrekte Insertion. 1064 00:46:55,740 --> 00:46:56,700 So ausgezeichnet. 1065 00:46:56,700 --> 00:46:57,970 So, jetzt wir sind fast da. 1066 00:46:57,970 --> 00:47:01,075 Lassen Sie uns stecken Sie ein Abschluss Wert wie der Wert 20. 1067 00:47:01,075 --> 00:47:03,010 Wenn wir eine letzte Freiwilligen malloc? 1068 00:47:03,010 --> 00:47:04,140 Komm auf. 1069 00:47:04,140 --> 00:47:06,224 Also das hier ist ein wenig komplizierter. 1070 00:47:06,224 --> 00:47:08,390 Aber wirklich, der Code sind wir Schreiben, wenn auch mündlich, 1071 00:47:08,390 --> 00:47:10,610 ist genau wie mit einem Bündel der, wenn die Bedingungen jetzt, nicht wahr? 1072 00:47:10,610 --> 00:47:12,318 Wir hatten eine Bedingung Überprüfung, ob sie gehört 1073 00:47:12,318 --> 00:47:13,840 am Ende, vielleicht Anfang. 1074 00:47:13,840 --> 00:47:15,940 Wir brauchen eine Art Schleife finden Sie den Punkt in der Mitte. 1075 00:47:15,940 --> 00:47:17,400 Lassen Sie uns so tun, mit dem, was ist Ihr Name? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID MALAN: Eric? 1078 00:47:18,340 --> 00:47:18,660 Eric. 1079 00:47:18,660 --> 00:47:19,368 Nett, dich zu treffen. 1080 00:47:19,368 --> 00:47:20,490 Wir haben also 20. 1081 00:47:20,490 --> 00:47:21,220 Weniger als fünf? 1082 00:47:21,220 --> 00:47:21,530 Nein. 1083 00:47:21,530 --> 00:47:22,160 Weniger als neun? 1084 00:47:22,160 --> 00:47:22,410 Nein. 1085 00:47:22,410 --> 00:47:23,050 Weniger als 17? 1086 00:47:23,050 --> 00:47:23,550 Nein. 1087 00:47:23,550 --> 00:47:23,740 OK. 1088 00:47:23,740 --> 00:47:25,701 Er gehört hier und Ihre Namen sind wieder? 1089 00:47:25,701 --> 00:47:26,200 SUE: Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID MALAN: Sue. 1091 00:47:26,880 --> 00:47:27,379 Alex: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID MALAN: Sue, Alex, und? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID MALAN: Eric. 1095 00:47:30,120 --> 00:47:32,140 Deren Hände müssen zuerst aktualisiert? 1096 00:47:32,140 --> 00:47:32,930 >> ZIELGRUPPE: Eric. 1097 00:47:32,930 --> 00:47:33,429 OK. 1098 00:47:33,429 --> 00:47:35,200 So Erics sollte in dem Punkt? 1099 00:47:35,200 --> 00:47:35,930 22. 1100 00:47:35,930 --> 00:47:36,430 Gut. 1101 00:47:36,430 --> 00:47:38,180 Und jetzt, was kommt als nächstes? 1102 00:47:38,180 --> 00:47:40,800 Sue kann dann an der Eric-Punkt und jetzt, wenn Sie Kerle gerade 1103 00:47:40,800 --> 00:47:44,077 machen einige Zimmer, was in Ordnung ist visuell, jetzt haben wir das Einsetzen durchgeführt. 1104 00:47:44,077 --> 00:47:47,160 Also lassen Sie uns betrachten nun eine Frage, aber danke Ihnen so sehr für unsere Freiwilligen. 1105 00:47:47,160 --> 00:47:48,090 Sehr gut gemacht. 1106 00:47:48,090 --> 00:47:50,831 Sie können diejenigen zu halten, wenn Sie möchten. 1107 00:47:50,831 --> 00:47:54,140 Und wir haben ein schönes Abschiedsgeschenk, wenn Sie würden jeder gerne eine Stress-Ball statt. 1108 00:47:54,140 --> 00:47:56,030 Lassen Sie mich nur leiten Sie diese nach unten. 1109 00:47:56,030 --> 00:47:58,430 Also, was ist das Mitnehmen von diesem? 1110 00:47:58,430 --> 00:48:02,430 Das scheint unglaublich zu sein insofern, als wir jetzt haben, 1111 00:48:02,430 --> 00:48:06,360 um ein eingeführtes eine alternative Array, das nicht so eingeschlossen ist 1112 00:48:06,360 --> 00:48:07,780 einem Array von einigen feste Größe. 1113 00:48:07,780 --> 00:48:09,380 Sie können dynamisch wachsen. 1114 00:48:09,380 --> 00:48:13,220 >> Aber so wie wir in Wochen gesehen Vergangenheit haben wir nie etwas bekommen kostenlos, 1115 00:48:13,220 --> 00:48:15,740 wie sicher es ist ein Trade-off hier. 1116 00:48:15,740 --> 00:48:18,890 So mit einem Kopf einer Linked Liste, das ist Dynamik? 1117 00:48:18,890 --> 00:48:21,590 Diese Fähigkeit zu wachsen und ehrlich gesagt, könnten wir löschen getan haben 1118 00:48:21,590 --> 00:48:23,570 und wir konnten zu schrumpfen, wie gebraucht. 1119 00:48:23,570 --> 00:48:24,710 Welchen Preis zahlen wir? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Doppelt so viel Platz, in erster Linie. 1122 00:48:30,340 --> 00:48:34,010 Wenn Sie das Bild betrachten, nicht mehr Ich bin Speichern einer Liste von Zahlen. 1123 00:48:34,010 --> 00:48:36,740 Ich Speichern einer Liste von Zahlen und Zeiger. 1124 00:48:36,740 --> 00:48:38,240 Also ich bin eine Verdoppelung der Menge an Speicherplatz. 1125 00:48:38,240 --> 00:48:40,740 Nun, vielleicht ist das nicht so eine große Sache, 4 Bytes, 8 Bytes, 1126 00:48:40,740 --> 00:48:43,160 aber es könnte sicherlich hinzufügen up für große Datenmengen. 1127 00:48:43,160 --> 00:48:45,570 Was ist ein weiterer Nachteil? 1128 00:48:45,570 --> 00:48:46,070 Ja? 1129 00:48:46,070 --> 00:48:48,010 >> Publikum: Wir müssen queren sie einen nach dem anderen. 1130 00:48:48,010 --> 00:48:48,760 DAVID MALAN: Ja. 1131 00:48:48,760 --> 00:48:50,260 Wir müssen sie durchlaufen einen nach dem anderen. 1132 00:48:50,260 --> 00:48:53,860 Weißt du was, gaben wir auf diese super praktische Funktion der eckigen Klammer 1133 00:48:53,860 --> 00:48:57,240 Notation, mehr korrekt wie Random Access bekannt, 1134 00:48:57,240 --> 00:48:59,280 wo wir gerade springen zu einem einzelnen Element 1135 00:48:59,280 --> 00:49:01,470 aber jetzt, wenn ich hatte immer noch meine Freiwillige hier, 1136 00:49:01,470 --> 00:49:04,660 wenn ich wollte, das zu finden Nummer 22, kann ich nicht einfach 1137 00:49:04,660 --> 00:49:06,620 springe zur Halterung etwas etwas. 1138 00:49:06,620 --> 00:49:10,530 Ich muss über die Liste aussehen, viel wie unsere Suchbeispiele linear, 1139 00:49:10,530 --> 00:49:12,260 um die Zahl 22 zu finden. 1140 00:49:12,260 --> 00:49:14,340 So scheinen wir einen Preis gibt bezahlt haben. 1141 00:49:14,340 --> 00:49:16,430 Aber wir können trotzdem lösen andere Probleme. 1142 00:49:16,430 --> 00:49:18,587 >> In der Tat, lassen Sie mich vorstellen nur ein paar Visuals. 1143 00:49:18,587 --> 00:49:20,920 Also, wenn Sie haben bis zu gewesen Mathers Dining Hall vor kurzem, 1144 00:49:20,920 --> 00:49:23,320 Sie, denn erinnern an ihre Stapel von Schalen wie diese, 1145 00:49:23,320 --> 00:49:26,300 wir geliehen diese aus Annenberg vor der Klasse. 1146 00:49:26,300 --> 00:49:28,930 Also dieser Stapel von Ablagen, obwohl, ist repräsentativ tatsächlich 1147 00:49:28,930 --> 00:49:30,860 eines Informatik-Datenstruktur. 1148 00:49:30,860 --> 00:49:32,910 Es ist eine Datenstruktur in der Informatik 1149 00:49:32,910 --> 00:49:38,010 als Stapel bekannt, die sehr schön eignet sich für genau diese Sicht. 1150 00:49:38,010 --> 00:49:41,380 Also, wenn jeder dieser Schalen ist kein Tablett, sondern wie eine Nummer, und ich wollte 1151 00:49:41,380 --> 00:49:45,010 das Speichern von Rufnummern, I Hier könnte man niedergeschlagen, 1152 00:49:45,010 --> 00:49:48,320 und ich konnte ein weiterer hier unten setzen, und weiter Stapelnummern 1153 00:49:48,320 --> 00:49:53,180 übereinander, und was möglicherweise hilfreich zu diesem 1154 00:49:53,180 --> 00:49:55,450 ist, dass, was die Implikation dieser Datenstruktur? 1155 00:49:55,450 --> 00:49:58,045 Welche Zahl kann ich herausziehen zunächst am einfachsten? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Die zuletzt einen Put auf es. 1158 00:50:03,030 --> 00:50:06,430 >> Also das ist, was wir nennen würde in Informatik eine LIFO-Datenstruktur. 1159 00:50:06,430 --> 00:50:08,070 Last in, first out. 1160 00:50:08,070 --> 00:50:10,800 Und wir werden bald sehen, warum das könnte nützlich sein, aber für jetzt, 1161 00:50:10,800 --> 00:50:12,200 man denke nur an die Immobilie. 1162 00:50:12,200 --> 00:50:15,158 Und es ist ziemlich blöd, wenn Sie denken darüber, wie der Speisesaal tut es. 1163 00:50:15,158 --> 00:50:17,910 Jedes Mal, wenn sie sauber und Schalen legte die frischesten diejenigen an der Spitze, 1164 00:50:17,910 --> 00:50:22,160 Sie eine zuvor sauber haben könnte aber schließlich sehr schmutzig und staubig 1165 00:50:22,160 --> 00:50:24,360 Tablett ganz unten wenn Sie nie 1166 00:50:24,360 --> 00:50:26,820 auf den Grund dessen, Stapel, weil Sie gerade 1167 00:50:26,820 --> 00:50:29,380 halten Inbetriebnahme der neuen und die saubere diejenigen oben drauf. 1168 00:50:29,380 --> 00:50:31,840 Das gleiche kann passieren, in einem Supermarkt zu. 1169 00:50:31,840 --> 00:50:35,450 Wenn Sie eine Vitrine haben Milch und jedes Mal, wenn CVS 1170 00:50:35,450 --> 00:50:37,610 oder wer bekommt mehr Milch, einfach schieben Sie die Milch 1171 00:50:37,610 --> 00:50:39,880 Sie haben bereits auf den Rücken und Sie setzen die neuen vorne, 1172 00:50:39,880 --> 00:50:43,088 Sie gehen ein paar ziemlich gemein zu haben sind Milch am Ende der Datenstruktur, 1173 00:50:43,088 --> 00:50:46,390 weil es immer am Boden oder äquivalent ist es immer an der Rückseite. 1174 00:50:46,390 --> 00:50:50,407 >> Aber es gibt noch einen anderen Weg, um darüber nachzudenken Schlange Daten und zum Beispiel dafür. 1175 00:50:50,407 --> 00:50:53,490 Wenn Sie einer jener Menschen sind, die gerne außerhalb der Apple Stores line up 1176 00:50:53,490 --> 00:50:55,610 wenn ein neues Produkt kommt Sie, sind Sie wahrscheinlich 1177 00:50:55,610 --> 00:50:58,780 nicht mit einem Stapel Daten Struktur, weil Sie 1178 00:50:58,780 --> 00:51:03,070 würde entfremden alle anderen, ist Futter bis etwas neues Spielzeug zu kaufen. 1179 00:51:03,070 --> 00:51:06,610 Eher wahrscheinlich mit du bist welche Art von Datenstruktur 1180 00:51:06,610 --> 00:51:10,050 oder welche Art von System in der realen Welt? 1181 00:51:10,050 --> 00:51:13,493 Hoffentlich ist es eine Linie, oder mehr richtig oder mehrere britische artig, eine Warteschlange. 1182 00:51:13,493 --> 00:51:17,700 Und es zeigt sich eine Warteschlange ist auch eine Datenstruktur in der Informatik, 1183 00:51:17,700 --> 00:51:19,700 aber eine Warteschlange hat eine sehr andere Eigenschaft. 1184 00:51:19,700 --> 00:51:20,820 Es ist nicht LIFO. 1185 00:51:20,820 --> 00:51:21,990 Last in, first out. 1186 00:51:21,990 --> 00:51:22,800 Gott bewahre. 1187 00:51:22,800 --> 00:51:24,280 Es ist stattdessen FIFO. 1188 00:51:24,280 --> 00:51:26,110 Als Erster rein, als erster raus. 1189 00:51:26,110 --> 00:51:27,970 Und das ist eine gute Sache, Fairness willen 1190 00:51:27,970 --> 00:51:30,428 sicherlich, wenn Sie Futter sind up Super früh am Morgen. 1191 00:51:30,428 --> 00:51:33,400 Wenn Sie es zuerst zu erhalten, können Sie wollen ersten als auch raus. 1192 00:51:33,400 --> 00:51:35,880 >> Und so all diese Daten Strukturen, Warteschlangen und Stacks 1193 00:51:35,880 --> 00:51:39,220 und Trauben von anderen, stellt sich heraus, die Sie kann dieser nur als ein Array zu denken. 1194 00:51:39,220 --> 00:51:41,820 Dies ist ein Array, vielleicht eine feste Größe 4, aber es würde 1195 00:51:41,820 --> 00:51:44,990 sein ganz nett, wenn wir nur anhäufen könnten Schalen fast unendlich groß, wenn wir 1196 00:51:44,990 --> 00:51:46,780 haben, dass viele Schalen oder Zahlen. 1197 00:51:46,780 --> 00:51:48,840 Vielleicht wollen wir verwenden eine verkettete Liste hier, 1198 00:51:48,840 --> 00:51:51,800 aber der Kompromiss sein wird möglicherweise, dass wir mehr Speicher, 1199 00:51:51,800 --> 00:51:55,930 dauert ein wenig mehr Zeit, aber wir nicht die Höhe des Stapels zu begrenzen, 1200 00:51:55,930 --> 00:51:59,550 ähnlich wie Mathers Vitrine könnte die Größe des Stapels zu begrenzen, 1201 00:51:59,550 --> 00:52:03,117 und so sind diese Design-Entscheidungen oder Möglichkeiten, die uns letztendlich. 1202 00:52:03,117 --> 00:52:04,950 Also mit diesen Daten Strukturen, die wir begonnen haben, 1203 00:52:04,950 --> 00:52:09,360 Sehen Sie neue obere Schranken potenziell auf welcher zuvor war super schnell 1204 00:52:09,360 --> 00:52:11,260 und wo wir verlassen off heute und wo 1205 00:52:11,260 --> 00:52:13,200 wir hoffen, zu bekommen, ist am Mittwoch, werden wir 1206 00:52:13,200 --> 00:52:15,740 beginnen mit einer Daten suchen Struktur, die uns suchen können 1207 00:52:15,740 --> 00:52:18,260 durch die Daten in Protokollende immer wieder. 1208 00:52:18,260 --> 00:52:21,470 Und wir sahen, dass, erinnern, in Woche null und eines mit binäre Suche oder dividieren 1209 00:52:21,470 --> 00:52:22,180 und zu erobern. 1210 00:52:22,180 --> 00:52:26,240 Es ist noch zurück und besser kommen, der heilige Gral für diesen Mittwoch 1211 00:52:26,240 --> 00:52:29,510 wird es sein, sich mit der Datenstruktur, die wirklich läuft 1212 00:52:29,510 --> 00:52:32,070 oder theoretisch in konstante Zeit, wobei 1213 00:52:32,070 --> 00:52:34,760 es spielt keine Rolle, wie viele Millionen oder Milliarden von Dingen 1214 00:52:34,760 --> 00:52:38,470 die in der Datenstruktur haben, wird es nehmen Sie uns konstante Zeit, vielleicht einen Schritt 1215 00:52:38,470 --> 00:52:41,387 oder in zwei Schritten oder Stufen 10, aber konstante Anzahl von Schritten 1216 00:52:41,387 --> 00:52:42,970 um durch diese Datenstruktur zu suchen. 1217 00:52:42,970 --> 00:52:46,300 Dass in der Tat wird der Heilige Gral sein aber mehr dazu am Mittwoch. 1218 00:52:46,300 --> 00:52:49,045 Wir sehen uns dann. 1219 00:52:49,045 --> 00:52:53,704 >> [Musikwiedergabe] 1220 00:52:53,704 --> 00:56:08,448