1 00:00:00,000 --> 00:00:11,242 >> [Musik spielt] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN: All right dies CS50 und das ist der Beginn der fünften Woche. 3 00:00:16,630 --> 00:00:21,480 Also heute, unter Ihrem Sitzkissen, Sie werden nichts finden. 4 00:00:21,480 --> 00:00:24,790 Aber oben, sollten Sie diese ein kleines Zeichen unserer Wertschätzung für 5 00:00:24,790 --> 00:00:26,970 all der Arbeit, die Sie setzen in das Spiel der Fünfzehn. 6 00:00:26,970 --> 00:00:30,290 Entfernen Sie einfach den kleinen Kreis auf die Boden und spielen für die 7 00:00:30,290 --> 00:00:31,680 Rest der Klasse. 8 00:00:31,680 --> 00:00:38,930 >> So erinnern, dass dieses Problem oder weiß eingestellt vier, die ging an diesem Wochenende, 9 00:00:38,930 --> 00:00:40,340 beinhaltet das Schreiben ein anderes Spiel. 10 00:00:40,340 --> 00:00:43,740 Aber diesmal ist es beinhaltet die Verwendung einer tatsächliche grafische Benutzeroberfläche, nicht ein 11 00:00:43,740 --> 00:00:46,310 textuelle Schnittstelle wie Game of Fifteen war. 12 00:00:46,310 --> 00:00:50,210 Und das Spiel, das vor Ihnen liegt, wenn du noch nicht diese nächste gesehen, 13 00:00:50,210 --> 00:00:52,310 sieht ein wenig so etwas wie dieses. 14 00:00:52,310 --> 00:00:55,170 Ich werde in meinem Terminal gehen Fenster hier in GDB. 15 00:00:55,170 --> 00:00:58,600 Und ich werde weitermachen und führen Sie das Personal-Lösung, die Sie zugreifen können 16 00:00:58,600 --> 00:01:01,010 nach dem Ausführen Update 50 wie gewohnt. 17 00:01:01,010 --> 00:01:04,090 >> Aber ich werde es in ein wenig setzen Geheim-Modus, ein wenig Osterei, 18 00:01:04,090 --> 00:01:08,480 sogenannte Gott-Modus, durch Putting Gott in argv1. 19 00:01:08,480 --> 00:01:12,920 Und ich habe meinen eigenen Anweisungen zu folgen, läuft es in meinem eigenen 20 00:01:12,920 --> 00:01:14,220 Problem eingestellt Verzeichnis. 21 00:01:14,220 --> 00:01:19,190 So, jetzt sehen Sie eine vollständige Version des Spiels von Breakout. 22 00:01:19,190 --> 00:01:21,090 In der Tat ist dies keine-hands-Modus. 23 00:01:21,090 --> 00:01:24,850 So ist es tatsächlich - 24 00:01:24,850 --> 00:01:26,470 begeisterte obwohl Sie vielleicht - 25 00:01:26,470 --> 00:01:30,850 ziemlich trivial zu Gott-Modus in Umsetzung Breakout, im Gegensatz zu Game of Fifteen, 26 00:01:30,850 --> 00:01:33,590 die einige von euch vielleicht angegangen haben für die Hacker-Ausgabe. 27 00:01:33,590 --> 00:01:37,890 >> In Breakout genügt es in Gott Modus, einfach tun, was, 28 00:01:37,890 --> 00:01:41,220 intuitiv mit dem Paddel? 29 00:01:41,220 --> 00:01:45,630 Machen Sie es gleich unabhängig von der horizontale Position des Balles. 30 00:01:45,630 --> 00:01:49,220 Und so lange, wie Sie dies tun im Gleichschritt mit dem Ball bewegt dieses Spiel 31 00:01:49,220 --> 00:01:53,100 nie, nie, nie verpassen den Ball und du wirst jedes Mal gewinnen. 32 00:01:53,100 --> 00:01:55,430 >> Aber in dieser Woche die Ausgabe Hacker es gibt mehr als nur Gott-Modus. 33 00:01:55,430 --> 00:01:56,720 Es gibt eine Reihe von anderen Funktionen. 34 00:01:56,720 --> 00:01:58,140 Unter ihnen, Lasern. 35 00:01:58,140 --> 00:02:01,070 So dass, wenn Sie wirklich ungeduldig Sie beginnen können Abschuss die Steine 36 00:02:01,070 --> 00:02:02,120 und ein paar andere. 37 00:02:02,120 --> 00:02:04,560 Und für diejenigen unter euch, die gerne würde Standard kalibrieren gegen Hacker 38 00:02:04,560 --> 00:02:08,750 Auflage, kann ich sehen, dass diese Woche Hacker Ausgabe bewusst ist 39 00:02:08,750 --> 00:02:12,830 wenig mehr machbar, sagen wir, als Gott Modus war mit Game of Fifteen. 40 00:02:12,830 --> 00:02:15,300 >> Also, wenn Sie für eine Strecke suchen und Sie für einige zusätzliche Spaß suchen 41 00:02:15,300 --> 00:02:18,400 Features tun tauchen, wenn von Interesse. 42 00:02:18,400 --> 00:02:21,280 Jetzt mehr praktisch, möchte ich darauf out eine Sache als gut. 43 00:02:21,280 --> 00:02:24,780 GDB, die einige von euch vielleicht noch nicht berührt persönlich, was in Ordnung ist. 44 00:02:24,780 --> 00:02:28,530 Aber jetzt ist wirklich die Zeit zu gewöhnen dies und komfortabel mit diesem Tool 45 00:02:28,530 --> 00:02:31,510 denn es wird Ihr Leben viel einfacher, wirklich. 46 00:02:31,510 --> 00:02:34,900 >> Per Rob Vortrag über GDB ein paar von Wochen, erinnern 47 00:02:34,900 --> 00:02:36,810 dass GDB ist ein Debugger. 48 00:02:36,810 --> 00:02:41,230 Es ist ein Werkzeug, das Sie laufen lässt Ihre Programm, sondern führen Sie es für Schritt, Zeile Schritt 49 00:02:41,230 --> 00:02:45,680 durch die Linie, so dass Sie rund stecken, so dass Sie die Dinge geschehen seht, so 50 00:02:45,680 --> 00:02:47,310 dass Sie ausdrucken können Werte der Variablen. 51 00:02:47,310 --> 00:02:50,580 Kurz gesagt, es gibt Ihnen so viel mehr Macht als printDef tut. 52 00:02:50,580 --> 00:02:52,900 >> Jetzt freilich, die Schnittstelle ist ziemlich obskure. 53 00:02:52,900 --> 00:02:55,180 Black and white Textschnittstelle in den meisten Fällen. 54 00:02:55,180 --> 00:02:57,400 Die Befehle sind etwas hart auf den ersten erinnern. 55 00:02:57,400 --> 00:03:01,230 Aber auch wenn es vielleicht nehmen Sie die Hälfte eine Stunde, eine Stunde, zu setzen, dass im Voraus 56 00:03:01,230 --> 00:03:02,940 Investition von Zeit hinein, vertraue mir. 57 00:03:02,940 --> 00:03:06,440 Sicher durch Semester Ende wird es retten Ihnen eine Größenordnung mehr 58 00:03:06,440 --> 00:03:07,600 Zeit als die. 59 00:03:07,600 --> 00:03:09,200 >> So früh in der Woche tauchen in. 60 00:03:09,200 --> 00:03:13,200 Und in Bezug auf Breakout, wissen, dass Sie kann dies so lange tun, wie Sie 61 00:03:13,200 --> 00:03:18,230 die Verteilung Code oder Ihren eigenen Code in Fortschritte in Ihrem Pst4 Verzeichnis. 62 00:03:18,230 --> 00:03:21,680 Wissen, dass man gdb laufen. / Ausbruch. 63 00:03:21,680 --> 00:03:23,490 >> Das wird zu öffnen ein Fenster wie dieses. 64 00:03:23,490 --> 00:03:25,530 Lassen Sie mich mich mehr von einem Terminal-Fenster. 65 00:03:25,530 --> 00:03:27,770 Und dann, was ich werde weitermachen und zu tun, ist es nicht nur ausführen. 66 00:03:27,770 --> 00:03:30,690 Ich werde zunächst einen Haltepunkt Rückruf, die Sie pausieren erlaubt 67 00:03:30,690 --> 00:03:32,500 Ausführung an einem bestimmten Ort. 68 00:03:32,500 --> 00:03:35,750 >> Nur um die Dinge einfach halten, ich werde auf Leitung eins nur brechen, indem Sie 69 00:03:35,750 --> 00:03:37,000 die Nummer eins. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Lassen Sie mich tatsächlich wieder öffnen dieses Fenster weil es immer ein 72 00:03:43,250 --> 00:03:45,700 etwas klein da. 73 00:03:45,700 --> 00:03:53,270 Also, was ich nun zu tun ist wenn ich öffne meine Terminal-Fenster. 74 00:03:53,270 --> 00:03:53,910 Komm, es geht los. 75 00:03:53,910 --> 00:03:59,850 >> So jetzt, wenn ich gehe zurück zu Dropbox, Pst4 und führen Sie gdb. / Breakout geben, bemerken 76 00:03:59,850 --> 00:04:02,600 Ich werde zu brechen, um eine ein Haltepunkt in Zeile eins. 77 00:04:02,600 --> 00:04:04,840 Und jetzt werde ich gehen voraus und Art laufen. 78 00:04:04,840 --> 00:04:07,370 Und wenn ich es tue, merke nichts scheint zu passieren. 79 00:04:07,370 --> 00:04:08,120 >> Es gibt keine Pop-up. 80 00:04:08,120 --> 00:04:09,790 Es gibt keine grafische Benutzeroberfläche noch. 81 00:04:09,790 --> 00:04:13,340 Aber das ist verständlich, denn ich bin buchstäblich in Zeile in meinem Programm. 82 00:04:13,340 --> 00:04:17,110 Und feststellen, dass ich schnell weitergeleitet, speziell jetzt auf 62, weil alle 83 00:04:17,110 --> 00:04:20,600 das Zeug an der Spitze dieser Datei ist Dinge wie Kommentare und Konstanten und 84 00:04:20,600 --> 00:04:22,460 uninteressante Sachen für jetzt. 85 00:04:22,460 --> 00:04:25,840 >> So jetzt bin ich in der Hauptsache wie es scheint, in Zeile 62. 86 00:04:25,840 --> 00:04:27,960 Und das ist nur die Verteilung Code Rückruf. 87 00:04:27,960 --> 00:04:33,810 Wenn ich diese öffnen sich, indem Sie, ähnlich, in meine Dropbox-Verzeichnis in Pst4, 88 00:04:33,810 --> 00:04:35,450 in breakout.c. 89 00:04:35,450 --> 00:04:40,670 Und wenn ich nach unten scrollen und runter und runter, und lassen Sie mich gehen, und schalten Sie 90 00:04:40,670 --> 00:04:44,990 meine Zeilennummern. 91 00:04:44,990 --> 00:04:50,300 >> Was werde ich sehen, wenn ich nach unten scrollen, um Leitung 62 ist genau die Linie, 92 00:04:50,300 --> 00:04:50,910 wir haben auf Pause. 93 00:04:50,910 --> 00:04:53,720 Also diese Linie hier, 62, ist wo wir zu sein sind. 94 00:04:53,720 --> 00:04:57,470 So, jetzt in GDB, wenn ich gehen Sie vor und geben nun neben, geben Sie es zu gehen 95 00:04:57,470 --> 00:04:58,450 führen diese Zeile. 96 00:04:58,450 --> 00:05:00,610 Und voila, wir haben die sogenannte g-Fenster. 97 00:05:00,610 --> 00:05:02,800 Falls Sie nicht wissen, was ein GWindow ist, sich nicht zu sorgen. 98 00:05:02,800 --> 00:05:05,740 Die Spezifikation wird Ihnen, es einzuführen, wie sowie eine Reihe von exemplarischen Videos 99 00:05:05,740 --> 00:05:06,830 eingebettet in die spec. 100 00:05:06,830 --> 00:05:08,610 >> Aber jetzt lasst uns diese eine wenig interessanter. 101 00:05:08,610 --> 00:05:10,960 Lassen Sie mich dieses Fenster verschieben über an der Seite ein wenig. 102 00:05:10,960 --> 00:05:13,480 Lassen Sie mich das Fenster ein wenig größer, so kann ich mehr sehen. 103 00:05:13,480 --> 00:05:16,140 >> Und jetzt lassen Sie mich gehen und im nächsten wieder tun. 104 00:05:16,140 --> 00:05:17,550 Und es sind meine Steine. 105 00:05:17,550 --> 00:05:20,490 Wenn ich als nächstes schreiben wieder jetzt sehe ich den Ball. 106 00:05:20,490 --> 00:05:23,520 Und wenn ich als nächstes schreiben wieder jetzt sehe ich das Paddel. 107 00:05:23,520 --> 00:05:26,690 >> Und zum Glück ist nicht gedit wirklich kooperierenden indem sie mir 108 00:05:26,690 --> 00:05:27,660 alles was ich will. 109 00:05:27,660 --> 00:05:30,820 Aber jetzt, wenn ich als nächstes tun wieder, nächste wieder, ich bin nur 110 00:05:30,820 --> 00:05:32,260 erklärt einige Variablen. 111 00:05:32,260 --> 00:05:34,750 Und ich kann eine beliebige ausdrucken dieser Jungs. 112 00:05:34,750 --> 00:05:37,170 Print Ziegel, Drucke Leben. 113 00:05:37,170 --> 00:05:39,910 >> Und nun, wenn ich weiterhin tun nächsten, bemerken, dass ich bald 114 00:05:39,910 --> 00:05:40,870 innerhalb dieser Schleife. 115 00:05:40,870 --> 00:05:43,380 Aber der Code wird ausgeführt genau so, wie ich erwartet. 116 00:05:43,380 --> 00:05:45,810 Also, wenn ich diese Funktion getroffen, Warten für Click, es zu tun 117 00:05:45,810 --> 00:05:46,830 es wörtlich, dass. 118 00:05:46,830 --> 00:05:48,870 So schien ich die Kontrolle verloren haben über das Programm. 119 00:05:48,870 --> 00:05:50,480 >> GDB ist nicht so dass mir noch prompt. 120 00:05:50,480 --> 00:05:51,500 Aber keine Sorge. 121 00:05:51,500 --> 00:05:53,720 Gehen Sie zu meinem Spiel, irgendwo auf. 122 00:05:53,720 --> 00:05:56,270 >> Und voila, jetzt geht sie in die Linie 86. 123 00:05:56,270 --> 00:05:59,460 Also noch einmal, dann ist es von unschätzbarem Wert, schließlich zum Debuggen Probleme. 124 00:05:59,460 --> 00:06:03,050 Da kann man buchstäblich durch Schritt Ihr Code, Print Dinge und noch viel, 125 00:06:03,050 --> 00:06:03,640 viel, mehr. 126 00:06:03,640 --> 00:06:07,210 Aber jetzt, diese Werkzeuge allein sollten Sie ziemlich weit kommen. 127 00:06:07,210 --> 00:06:10,050 >> So sind wir natürlich einen Blick bei Graphics jetzt, ganz plötzlich. 128 00:06:10,050 --> 00:06:12,350 Und jetzt unsere Welt wird ein wenig mehr interessant. 129 00:06:12,350 --> 00:06:15,680 Und weißt du, vielleicht von einigen der Videos online, dass wir diese haben 130 00:06:15,680 --> 00:06:18,280 Shorts, die Sie beobachtet haben als Teil Problemstellungen. 131 00:06:18,280 --> 00:06:20,460 >> Und sie haben geschossen worden, bewusst, vor einem weißen Hintergrund. 132 00:06:20,460 --> 00:06:23,380 Und einige von ihnen haben die Lehre Fellows zeichnen etwas Text auf der 133 00:06:23,380 --> 00:06:25,490 Bildschirm, ist überlagert auf der Seite des ihnen. 134 00:06:25,490 --> 00:06:27,760 Aber natürlich ist das nicht alles, was interessant in der realen Welt. 135 00:06:27,760 --> 00:06:30,520 Dies ist nur ein Hörsaal mit einem großen weißen Bildschirm und eine Kulisse. 136 00:06:30,520 --> 00:06:33,330 Und unsere erstaunliche Produktionsteam Art der macht alles schön aussehen 137 00:06:33,330 --> 00:06:36,620 nach der Tat durch Zuschneiden aus oder überlagert alles 138 00:06:36,620 --> 00:06:37,840 wir tun oder nicht wollen. 139 00:06:37,840 --> 00:06:41,560 >> Jetzt brauchen Sie nur zu motivieren, in dieser Woche und wirklich, wo Sie gehen können, letztlich 140 00:06:41,560 --> 00:06:42,560 mit Informatik. 141 00:06:42,560 --> 00:06:44,260 Nicht nur nach dem Problem stellen vier. 142 00:06:44,260 --> 00:06:48,240 Aber nach einem anderen Kurs oder einer ganzen Lehrplan, es ist erstaunlich, was man 143 00:06:48,240 --> 00:06:51,090 zu tun in diesen Tagen in Bezug auf Grafiken im Besonderen. 144 00:06:51,090 --> 00:06:53,440 >> Einige von euch haben vielleicht gesehen haben umströmt online. 145 00:06:53,440 --> 00:06:56,240 Aber ich dachte, ich würde Ihnen zu zeigen, für die nur ein paar Minuten, einen Einblick in das, was 146 00:06:56,240 --> 00:07:01,890 Computer-Technologie und was CGI, Computergrafik tun können, in diesen Tagen 147 00:07:01,890 --> 00:07:04,510 mit einer vertrauten Song und vielleicht Film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Jung und schön] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> Sprecher 1: Es ist nur ein bisschen erstaunlich, vielleicht, wie 151 00:10:52,470 --> 00:10:52,857 allgegenwärtig - 152 00:10:52,857 --> 00:10:57,040 >> [Applaus] 153 00:10:57,040 --> 00:10:59,230 >> Sprecher 1: Ich habe es heruntergeladen. 154 00:10:59,230 --> 00:11:02,920 Aber es ist wirklich erstaunlich, wie ich glaube, nur wie allgegenwärtig und Software-Code und 155 00:11:02,920 --> 00:11:04,230 Tools wie diese wirklich sind. 156 00:11:04,230 --> 00:11:07,685 Also das ist ein Vorgeschmack auf die Richtung in denen man gehen kann. 157 00:11:07,685 --> 00:11:10,620 Oh, nicht mehr Appliance heute. 158 00:11:10,620 --> 00:11:14,640 Nun, das ist eigentlich tragisch Timing angesichts der Punkt, den ich gerade versucht zu machen. 159 00:11:14,640 --> 00:11:18,670 >> Alles klar, also lasst uns starten Fusion wieder. 160 00:11:18,670 --> 00:11:20,800 Später erinnern. 161 00:11:20,800 --> 00:11:24,190 Alles klar, und Sie sollten haben ein E-Mail als beiseite, wenn Sie eine haben 162 00:11:24,190 --> 00:11:25,460 bemerken so. 163 00:11:25,460 --> 00:11:29,940 Alles klar, so erinnern, dass letzte Woche haben wir begonnen, diese abziehen 164 00:11:29,940 --> 00:11:31,380 später als String bekannt. 165 00:11:31,380 --> 00:11:34,700 >> String erinnert einen Datentyp, ist erklärte in der CS50-Bibliothek. 166 00:11:34,700 --> 00:11:37,740 Und es ist Teil der Stützräder das wird jetzt damit beginnen, sich zu entfernen. 167 00:11:37,740 --> 00:11:41,280 Es war ein nützliches Konzept früh. 168 00:11:41,280 --> 00:11:43,750 Aber jetzt wird es mehr zu bekommen interessanter und stärker zu 169 00:11:43,750 --> 00:11:48,330 tatsächlich sehen, daß unterhalb der Haube, ein String ist genau das, was haben wir gesagt? 170 00:11:48,330 --> 00:11:50,500 >> Ja, so ist es eine sogenannte char *. 171 00:11:50,500 --> 00:11:53,860 Und das bedeutet, dass es * gibt es eine Art Adresse beteiligt. 172 00:11:53,860 --> 00:11:58,690 Und so, wenn Sie sagen, Sie char * nur bedeuten, eine Variable, deren Datentyp ist eine 173 00:11:58,690 --> 00:11:59,290 Zeiger jetzt. 174 00:11:59,290 --> 00:12:01,770 Die Tatsache, dass es der Stern dort bedeutet nur, dass Sie sich über die Vereinbarkeit eines 175 00:12:01,770 --> 00:12:03,020 sogenannte Zeiger. 176 00:12:03,020 --> 00:12:06,220 Und dass Zeiger auf scheinbar gehen speichern Sie die Adresse, von 177 00:12:06,220 --> 00:12:07,810 natürlich ein char. 178 00:12:07,810 --> 00:12:08,960 >> Nun, warum ist das sinnvoll? 179 00:12:08,960 --> 00:12:11,200 Nun, was ist ein String unter der Haube? 180 00:12:11,200 --> 00:12:15,130 Nun, seit einiger Zeit haben wir gesagt dass eine Zeichenfolge unter der Haube ist 181 00:12:15,130 --> 00:12:18,460 nur h-e-l-l-o, zum Beispiel. 182 00:12:18,460 --> 00:12:21,585 >> Aber wir haben darüber gesprochen, wie wobei im Wesentlichen ein Array. 183 00:12:21,585 --> 00:12:25,410 Und ein Array würde dann schauen ein wenig mehr davon, wobei jeder von diesen 184 00:12:25,410 --> 00:12:26,460 Aufnahme einen Bissen. 185 00:12:26,460 --> 00:12:28,710 Und dann haben wir gesagt, dass es etwas Besonderes hierher zurück, die 186 00:12:28,710 --> 00:12:31,270 Backslash 0 oder null Terminator. 187 00:12:31,270 --> 00:12:35,230 >> Also all dieser Zeit, das hier ist ein String. 188 00:12:35,230 --> 00:12:38,320 Aber wirklich, ist ein String tatsächlich eine Adresse. 189 00:12:38,320 --> 00:12:43,210 Und Adressen, wie wir sehen werden, sind oft mit dem Präfix 0x durch Konvention. 190 00:12:43,210 --> 00:12:44,540 Was macht 0x bezeichnen? 191 00:12:44,540 --> 00:12:45,970 Kennt jemand? 192 00:12:45,970 --> 00:12:47,320 >> Also es bedeutet nur hexadezimal. 193 00:12:47,320 --> 00:12:52,360 So erinnern sich vielleicht, eigentlich von Pst 1. Ich glaube, einer der Warm-up 194 00:12:52,360 --> 00:12:55,740 Fragen tatsächlich gefragt Hexadezimalnotation zusätzlich zu 195 00:12:55,740 --> 00:12:57,100 binäre und decimal. 196 00:12:57,100 --> 00:13:00,460 Und die Motivation ist hier, dass mit hexadezimalen Sie haben 16 197 00:13:00,460 --> 00:13:01,770 Ziffern zur Verfügung. 198 00:13:01,770 --> 00:13:07,900 0, gefolgt 1, 2, 3, 4, 5, 6, 7, 8, 9, von a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> Und wenn Sie zählen all jene auf, Sie erhalten insgesamt 16. 200 00:13:10,430 --> 00:13:13,200 Dies ist also im Gegensatz Nachkommastelle, wo wir 10 201 00:13:13,200 --> 00:13:14,690 Ziffern 0 bis neun. 202 00:13:14,690 --> 00:13:17,750 Es ist im Gegensatz zu binären wo wir nur noch 0 und 1. 203 00:13:17,750 --> 00:13:21,450 >> Aber am Ende des Tages können Sie einfach die gleichen Zahlen, aber 204 00:13:21,450 --> 00:13:22,500 etwas anders. 205 00:13:22,500 --> 00:13:25,840 Und hexadezimal ist üblich, weil, wie es stellt sich heraus - und wir werden das sehen 206 00:13:25,840 --> 00:13:28,790 später im Verlauf - auch wenn wir auf dem Web-Programmierung im Zusammenhang mit 207 00:13:28,790 --> 00:13:32,100 HTML und Farbcodes, Hexadezimal ist schön. 208 00:13:32,100 --> 00:13:36,390 Weil jeder Ziffer, entpuppt, stellt vier Bits perfekt. 209 00:13:36,390 --> 00:13:39,280 So ist es nur eine Art von Linien auf den Punkt Als wir schließlich sehen. 210 00:13:39,280 --> 00:13:44,720 So könnte dies sein oder etwas Ox123 so, bezeichnen Adresse 123 211 00:13:44,720 --> 00:13:47,050 irgendwo in meiner Arbeitsspeicher des Computers. 212 00:13:47,050 --> 00:13:50,600 >> Aber natürlich ergeben sich einige Probleme wegen dieser zugrunde liegenden 213 00:13:50,600 --> 00:13:51,520 Umsetzung. 214 00:13:51,520 --> 00:13:55,930 Und daran erinnern, dass ich einen Stich an nahm Implementierung einer Funktion wie diese - 215 00:13:55,930 --> 00:14:00,260 Vergleichen 0 dash dot c letzte Woche, dass obwohl es sah aus wie es war 216 00:14:00,260 --> 00:14:04,270 richtig, es ist einfach nicht zu vergleichen zwei Strings richtig. 217 00:14:04,270 --> 00:14:07,470 >> Ich habe entfernt main, geworfen und ich habe geworfen entfernt die Kommentare nur in sich konzentrieren 218 00:14:07,470 --> 00:14:08,970 der Code, der von Interesse ist hier. 219 00:14:08,970 --> 00:14:10,660 Und es ist in rot, weil es buggy ist. 220 00:14:10,660 --> 00:14:11,670 Aus welchem ​​Grund? 221 00:14:11,670 --> 00:14:15,890 >> Nun, an der Spitze gibt, als ich erklärte, ein String ist, war das, was wirklich vor sich geht 222 00:14:15,890 --> 00:14:17,260 unter der Haube? 223 00:14:17,260 --> 00:14:19,530 Nun, lassen Sie mich gehen über die screenen und hier ziehen, dass. 224 00:14:19,530 --> 00:14:23,230 So erklärte ich, wieder, string s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Also werde ich weitermachen und jetzt s ziehen für das, was es wirklich ist. 226 00:14:26,640 --> 00:14:28,590 Es wird ein Quadrat hier zu sein. 227 00:14:28,590 --> 00:14:30,490 Und ich werde Anspruch , dass ist 32 Bit. 228 00:14:30,490 --> 00:14:32,890 Zumindest ist es in der Regel, zumindest auf der CS50 229 00:14:32,890 --> 00:14:34,520 Gerät in einer Menge von Computern. 230 00:14:34,520 --> 00:14:35,980 Ich werde es nennen s. 231 00:14:35,980 --> 00:14:39,070 >> Aber jetzt daran erinnern, dass wir genannt GetString. 232 00:14:39,070 --> 00:14:41,430 So GetString Renditen natürlich eine Zeichenfolge. 233 00:14:41,430 --> 00:14:45,790 Wenn der Benutzer in h-e-l-l-o geben die Zeichenkette hallo wird zurückgegeben. 234 00:14:45,790 --> 00:14:51,010 Und das String, wie wir gerade gesagt, endet irgendwo in den Arbeitsspeicher Ihres Computers 235 00:14:51,010 --> 00:14:53,240 mit einem Backslash 0 am Ende. 236 00:14:53,240 --> 00:14:56,650 Ich werde dies wie die Array ziehen - oder zusammenhängenden Block von Zeichen - 237 00:14:56,650 --> 00:14:58,330 dass es tatsächlich ist. 238 00:14:58,330 --> 00:15:01,790 >> Und jetzt, was ist GetString eigentlich wieder? 239 00:15:01,790 --> 00:15:04,340 Was hat GetString worden Rückkehr all dieser Zeit? 240 00:15:04,340 --> 00:15:07,520 Nun, sagen wir, in den Wochen vor, es gibt einen String zurück. 241 00:15:07,520 --> 00:15:10,250 Aber technisch, was tut GetString Rückkehr offenbar? 242 00:15:10,250 --> 00:15:11,610 >> ZUSCHAUER: Eine Adresse. 243 00:15:11,610 --> 00:15:12,600 >> Sprecher 1: Eine Adresse. 244 00:15:12,600 --> 00:15:16,630 Konkret gibt die Adresse das erste Biss, was immer es ist. 245 00:15:16,630 --> 00:15:18,830 Ich einfach weiter mit einer, zwei, drei denn es ist bequem. 246 00:15:18,830 --> 00:15:21,380 >> Es gibt die Adresse des ersten Zeichen in der Zeichenfolge. 247 00:15:21,380 --> 00:15:23,510 Und wir letzte Woche gesagt, dass das ist ausreichend. 248 00:15:23,510 --> 00:15:26,710 Denn wir können immer herausfinden, wo das Ende der Schnur nur durch 249 00:15:26,710 --> 00:15:30,150 Iteration über sie, vielleicht, mit einem für Schleife oder eine while-Schleife oder so ähnlich 250 00:15:30,150 --> 00:15:34,990 dass gerade auf der Suche für "Backslash 0" die spezielle Wächter Charakter. 251 00:15:34,990 --> 00:15:37,220 >> Und dann wissen wir, dass die Zeichenfolge passiert mit der Länge sein - 252 00:15:37,220 --> 00:15:37,980 in diesem Fall - 253 00:15:37,980 --> 00:15:38,670 fünf. 254 00:15:38,670 --> 00:15:43,800 So technisch was tut GetString es gibt Ox123 in diesem Fall. 255 00:15:43,800 --> 00:15:53,670 Und was dann passiert, technisch ist dass wir speichern, innerhalb von s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Am Ende des Tages, obwohl dies wird neues Konzept, Zeiger, sind sie 257 00:15:56,460 --> 00:15:57,350 nur Variablen. 258 00:15:57,350 --> 00:16:00,440 Aber sie passieren, um Bits zu speichern, dass kollektiv eine Adresse. 259 00:16:00,440 --> 00:16:03,700 So technisch alles, was sie bekommt gespeichert in s ist Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Aber wir als Menschen - 261 00:16:04,680 --> 00:16:06,020 einschließlich heute an - 262 00:16:06,020 --> 00:16:09,290 sind wirklich nicht zu kümmern, in der Regel, was die eigentliche Adresse 263 00:16:09,290 --> 00:16:10,520 einiger Teil des Speichers. 264 00:16:10,520 --> 00:16:14,040 Es ist nur zu niedrigen Detail intellektuell interessant. 265 00:16:14,040 --> 00:16:15,440 Also werde ich dies rückgängig zu machen. 266 00:16:15,440 --> 00:16:19,810 Und anstatt, mehr High-Level, nur sagen, dass, wenn wir über Hinweise sprechen 267 00:16:19,810 --> 00:16:22,170 Ich werde einfach ziehen mehr benutzerfreundliche Pfeil, der vermittelt 268 00:16:22,170 --> 00:16:26,060 gleiche Idee und Abstracts entfernt die Einzelheiten, was die eigentliche 269 00:16:26,060 --> 00:16:27,700 zugrunde liegenden Adresse ist. 270 00:16:27,700 --> 00:16:33,290 >> Nun, wenn wir wieder nach dem Code, was letzte Woche passiert, wenn wir String t haben 271 00:16:33,290 --> 00:16:34,510 gleich GetString? 272 00:16:34,510 --> 00:16:38,630 Nun, wenn ich wieder in Typ hallo Dieses Mal werde ich bekommen habe 273 00:16:38,630 --> 00:16:40,460 ein weiterer Teil des Speichers. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o Backslash 0. 275 00:16:44,820 --> 00:16:48,320 >> Aber weil ich genannt GetString ein zweites Mal - 276 00:16:48,320 --> 00:16:51,100 und ich weiß, dass dies aus der Betrachtung der Quellcode für GetString - auch 277 00:16:51,100 --> 00:16:54,350 obwohl es Zufall, dass hallo war tippte zweimal ist nicht GetString 278 00:16:54,350 --> 00:16:55,890 werde versuchen, zu optimieren und klug sein. 279 00:16:55,890 --> 00:16:58,550 Es ist gerade dabei, ein anderes Stück zu bekommen Speicher vom Computer, das ist 280 00:16:58,550 --> 00:16:59,640 gehen, um an einer anderen Adresse. 281 00:16:59,640 --> 00:17:02,330 Lasst uns einfach sagen, 456 willkürlich. 282 00:17:02,330 --> 00:17:04,079 >> Und dann, was es wird, zurückzukehren? 283 00:17:04,079 --> 00:17:08,030 Es geht um 456 zurück und speichern Sie es in t. 284 00:17:08,030 --> 00:17:12,010 Also, was wirklich vor sich geht, auf die linken Seite ist, ich habe ein anderes Stück 285 00:17:12,010 --> 00:17:14,260 Speicher, 32 Bit typisch. 286 00:17:14,260 --> 00:17:16,720 Und es geht um Ox456 gehen. 287 00:17:16,720 --> 00:17:20,140 Aber noch einmal, ich bin nicht an diesen interessiert Insbesondere Zahlen mehr. 288 00:17:20,140 --> 00:17:23,069 Ich werde einfach zu abstrakt ziehen Sie es wie ein Pfeil. 289 00:17:23,069 --> 00:17:25,202 >> Also das ist jetzt eine neue Erklärung. 290 00:17:25,202 --> 00:17:28,735 Aber es ist genau die gleiche Idee, die ist geschehen die ganze Zeit. 291 00:17:28,735 --> 00:17:33,150 Und so der Grund dann, dass diese erste Version des Vergleichs war buggy 292 00:17:33,150 --> 00:17:34,480 letzte Woche ist, warum? 293 00:17:34,480 --> 00:17:38,000 Wenn Sie das tun, wenn s gleich gleich t, was sind Sie wirklich 294 00:17:38,000 --> 00:17:40,550 unter die Haube Vergleich? 295 00:17:40,550 --> 00:17:41,910 >> Sie vergleichen die Adressen. 296 00:17:41,910 --> 00:17:47,950 Und gerade intuitiv klar, Ox123 wird nicht gleich Ox456. 297 00:17:47,950 --> 00:17:49,380 Diese Zahlen, diese Bits sind einfach anders. 298 00:17:49,380 --> 00:17:53,220 >> Und so konsequent, letzte Woche gesagt Sie geben verschiedene Dinge, auch wenn die 299 00:17:53,220 --> 00:17:55,360 Worte waren wortwörtlich das gleiche. 300 00:17:55,360 --> 00:17:58,770 Also haben wir dieses Problem beheben. 301 00:17:58,770 --> 00:18:00,120 In juristischer Hinsicht, was war die Lösung? 302 00:18:00,120 --> 00:18:02,110 >> ZUSCHAUER: Verwenden Sie eine Funktion. 303 00:18:02,110 --> 00:18:02,870 >> Sprecher 1: Verwenden Sie eine Funktion. 304 00:18:02,870 --> 00:18:05,190 Oder Sterne sind auf jeden Fall beteiligt, aber eine Funktion verwenden, um was zu tun? 305 00:18:05,190 --> 00:18:05,962 >> ZUSCHAUER: Um die Zeichenfolgen zu vergleichen. 306 00:18:05,962 --> 00:18:07,390 >> Sprecher 1: Um die Zeichenfolgen zu vergleichen. 307 00:18:07,390 --> 00:18:11,030 Also das grundlegende Problem war hier dass ich nur in Anbetracht der 308 00:18:11,030 --> 00:18:15,870 Qualität der Saiten durch definiert werden Vergleich der Adressen. 309 00:18:15,870 --> 00:18:18,540 Und natürlich ist das nur dumm jetzt einmal Sie verstehen, was los ist 310 00:18:18,540 --> 00:18:19,510 unter der Haube. 311 00:18:19,510 --> 00:18:23,270 Um wirklich vergleichen Strings zu sehen, ob sie sind gleich in der Weise, dass ein Mensch 312 00:18:23,270 --> 00:18:26,680 hielte zwei Strings gleich sein müssen wir vergleichen sie Zeichen für 313 00:18:26,680 --> 00:18:28,070 Zeichen für Zeichen. 314 00:18:28,070 --> 00:18:30,020 >> Jetzt könnte ich getan haben dies sehr mühsam. 315 00:18:30,020 --> 00:18:32,240 Aber vertraut, wir sind mit einer for-Schleife. 316 00:18:32,240 --> 00:18:36,050 Und genau vergleichen s Halterung i gegen t i Halterung. 317 00:18:36,050 --> 00:18:39,590 s Halterung i plus 1 gegen t Halterung i + 1, und so weiter, in 318 00:18:39,590 --> 00:18:40,580 eine Art Schleife. 319 00:18:40,580 --> 00:18:44,950 Und wenn ich vor Ort keine zwei Zeichen, die unterscheiden, oder ob ich das ooh realisieren, ist s 320 00:18:44,950 --> 00:18:48,410 kürzer ist als t oder länger als t Ich kann sofort sagen, falsch, 321 00:18:48,410 --> 00:18:49,390 sie sind nicht das gleiche. 322 00:18:49,390 --> 00:18:55,370 >> Aber wenn ich durch s und t und sagen same, same, same, same, gleichen, Ende 323 00:18:55,370 --> 00:18:58,520 beide Zeichenfolgen, kann ich sagen, wahr, sind sie gleich. 324 00:18:58,520 --> 00:19:01,040 Nun, zum Glück, vor Jahren jemand schrieb, dass Code für uns. 325 00:19:01,040 --> 00:19:03,790 >> Und sie nannten es StrComp for string vergleichen. 326 00:19:03,790 --> 00:19:11,900 Und obwohl es ein wenig Zähler intuitive, kehrt StrComp 0, wenn die 327 00:19:11,900 --> 00:19:14,520 zwei Saiten, sind s und t gleich. 328 00:19:14,520 --> 00:19:18,090 Aber es gibt negativen Wert, wenn s sollte vor t alphabetisch oder kommen 329 00:19:18,090 --> 00:19:20,610 positiven Wert, wenn sie kommen sollte, nach t alphabetisch. 330 00:19:20,610 --> 00:19:24,030 >> Also, wenn Sie schon immer einmal etwas zu sortieren, es stellt sich heraus, dass StrComp nützlich ist. 331 00:19:24,030 --> 00:19:26,660 Weil es nicht nur sagen, ja oder nein, gleich oder nicht. 332 00:19:26,660 --> 00:19:30,440 Es gibt Ihnen ein Gefühl der Bestellung wie ein Wörterbuch Macht. 333 00:19:30,440 --> 00:19:33,770 So StrComp entspricht s Komma t gleich 0 bedeutet, dass die 334 00:19:33,770 --> 00:19:35,200 Strings sind wirklich gleich sind. 335 00:19:35,200 --> 00:19:38,680 Denn wer schrieb diese Funktion Jahren vermutlich eine for-Schleife verwendet 336 00:19:38,680 --> 00:19:42,840 oder eine while-Schleife oder so ähnlich über die Charaktere wieder integrieren 337 00:19:42,840 --> 00:19:45,270 und immer wieder. 338 00:19:45,270 --> 00:19:47,300 >> Aber zwei Problem entstand hier. 339 00:19:47,300 --> 00:19:48,750 Dies war copy0.c. 340 00:19:48,750 --> 00:19:51,680 Und die zwei in rot denn es ist fehlerhaft. 341 00:19:51,680 --> 00:19:52,800 Und was haben wir hier? 342 00:19:52,800 --> 00:19:54,310 Nun, zunächst einmal rief ich GetString. 343 00:19:54,310 --> 00:19:56,255 Und ich den Rückgabewert in s gespeichert. 344 00:19:56,255 --> 00:20:00,260 Also das ist so ziemlich das gleiche wie diese oberen Teil des Bildes. 345 00:20:00,260 --> 00:20:01,490 >> Aber was kommt danach? 346 00:20:01,490 --> 00:20:04,980 Nun, lassen Sie mich gehen und loszuwerden von einem ganzen Bündel von dieser. 347 00:20:04,980 --> 00:20:09,650 Wir werden in der Zeit, wo wir einfach zurückspulen s haben, die nun im Einklang mit 348 00:20:09,650 --> 00:20:10,940 Zeile eins dort oben. 349 00:20:10,940 --> 00:20:11,400 >> Ich überprüfe. 350 00:20:11,400 --> 00:20:13,450 Wenn s gleich gleich 0 ist. 351 00:20:13,450 --> 00:20:18,670 Nun, eine kurze Randnotiz, wenn vielleicht GetString 0 zurückgeben? 352 00:20:18,670 --> 00:20:19,580 Es ist nicht genügend Speicher vorhanden. 353 00:20:19,580 --> 00:20:19,880 Right? 354 00:20:19,880 --> 00:20:22,310 >> Es ist selten, dass dies passieren wird, sicherlich auf einem Computer, ist 355 00:20:22,310 --> 00:20:24,740 ich Hunderte megs oder sogar GB RAM. 356 00:20:24,740 --> 00:20:27,080 Aber es könnte in der Theorie zurück 0, insbesondere wenn die 357 00:20:27,080 --> 00:20:28,080 Benutzer nicht kooperieren. 358 00:20:28,080 --> 00:20:31,640 Es gibt Möglichkeiten, so zu tun, wie Sie nicht haben eingegebenen alles und Trick 359 00:20:31,640 --> 00:20:34,100 GetString zur Rückkehr 0 wirksam. 360 00:20:34,100 --> 00:20:35,470 >> Also es geht um, dass der Check. 361 00:20:35,470 --> 00:20:39,430 Denn wenn einer von euch haben damit begonnen, bekommen schon, Segmentation Faults - 362 00:20:39,430 --> 00:20:42,280 das war wohl eine Quelle einiger Frustration - 363 00:20:42,280 --> 00:20:46,150 das sind fast immer das Ergebnis der Fehlermeldung bezüglich des Speichers. 364 00:20:46,150 --> 00:20:50,440 Irgendwie durcheinander im Hinblick auf eine Zeiger, auch wenn Sie nicht erkennen, 365 00:20:50,440 --> 00:20:51,530 Es war ein Zeiger. 366 00:20:51,530 --> 00:20:55,260 Sie könnten also Segmentierung induziert haben Fehler so früh wie eine Woche mit 367 00:20:55,260 --> 00:21:02,100 so etwas wie eine for-Schleife oder eine Weile Schleife und eine Reihe von zu weit gehen 368 00:21:02,100 --> 00:21:05,900 über die Begrenzungen von einigen Array, Sie erklärten, in der zweiten Woche in 369 00:21:05,900 --> 00:21:06,690 Besonderen. 370 00:21:06,690 --> 00:21:09,220 >> Man könnte es auch in Problem getan haben Set mit vier Breakout. 371 00:21:09,220 --> 00:21:12,910 Auch wenn Sie wahrscheinlich noch nicht gesehen haben Alle Sterne in der Distribution-Code für 372 00:21:12,910 --> 00:21:17,410 Breakout, stellt sich heraus, dass diejenigen, GRect und Goval und andere solche Dinge, 373 00:21:17,410 --> 00:21:19,650 das sind eigentlich Zeiger unter der Haube. 374 00:21:19,650 --> 00:21:23,430 >> Aber Stanford, wie wir, eine Art von Häuten dass mindestens Angaben für die Bibliotheken 375 00:21:23,430 --> 00:21:26,540 Zwecke, ähnlich wie wir tun für String und char *. 376 00:21:26,540 --> 00:21:30,060 Aber GRect und Goval und all jene, Dinge, die Sie Jungs sind oder werden mit 377 00:21:30,060 --> 00:21:32,630 diese Woche sind letztlich Speicheradressen. 378 00:21:32,630 --> 00:21:33,650 Sie wissen einfach nicht, es. 379 00:21:33,650 --> 00:21:37,240 >> So ist es nicht verwunderlich, vielleicht, Sie könnten stolpern einige 380 00:21:37,240 --> 00:21:38,580 Segmentierung Fehler. 381 00:21:38,580 --> 00:21:41,290 Aber was ist interessant, hier, jetzt, wenn, nachdem wir für 0 wir überprüfen 382 00:21:41,290 --> 00:21:43,460 String t s bekommt. 383 00:21:43,460 --> 00:21:44,690 Nun, lassen Sie mich erklären, t. 384 00:21:44,690 --> 00:21:47,730 Ich werde es wie ein Quadrat zu zeichnen, 32 Bit, nennen Sie es t. 385 00:21:47,730 --> 00:21:49,740 Und dann werde ich zu tun bekommt s. 386 00:21:49,740 --> 00:21:51,130 >> Nun, was bedeutet das? 387 00:21:51,130 --> 00:21:53,280 Nun, es ist ein wenig schwer zu glauben, darüber vorstellen klug. 388 00:21:53,280 --> 00:21:55,025 Aber lassen Sie uns darüber nachdenken, was drin ist von x? 389 00:21:55,025 --> 00:21:59,430 Was ist buchstäblich innerhalb dieser Variablen? 390 00:21:59,430 --> 00:22:01,500 Der Wert Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Wenn ich also sage String t s bekommt, dass nur bedeutet wörtlich nehmen Sie die Anzahl 392 00:22:05,815 --> 00:22:10,070 in s, ist die Ox123 und steckte es Ox123. 393 00:22:10,070 --> 00:22:13,740 Oder bildhaft, wenn ich irgendwie abstrakt weg von diesem Detail hat die 394 00:22:13,740 --> 00:22:16,600 Wirkung buchstäblich tun diese als gut. 395 00:22:16,600 --> 00:22:22,110 >> So, jetzt denke zurück an letzte Woche, als begaben wir uns zur kapitalistischen T. I 396 00:22:22,110 --> 00:22:23,800 tat T Klammer 0. 397 00:22:23,800 --> 00:22:27,150 Nun, T 0 Halterung, auch wenn es ein Zeiger, können Sie es behandeln, als ob 398 00:22:27,150 --> 00:22:29,220 es ist ein Array mit einem quadratischen Klammer-Notation. 399 00:22:29,220 --> 00:22:31,550 >> Also, wo ist T Klammer 0? 400 00:22:31,550 --> 00:22:32,990 Nun, es ist die h. 401 00:22:32,990 --> 00:22:36,800 Und so, wenn wir diese Codezeile verwenden, zwei obere, die in diesem c type.h ist 402 00:22:36,800 --> 00:22:38,460 Header-Datei, das ist, wo es erklärt. 403 00:22:38,460 --> 00:22:44,410 Du Kapitalisierung dieses H. Aber Natürlich, das ist exakt das gleiche, das ist h 404 00:22:44,410 --> 00:22:46,540 innerhalb von s, so zu sprechen. 405 00:22:46,540 --> 00:22:51,930 Und so jetzt haben Sie oder geändert aktiviert sowohl das Original und die 406 00:22:51,930 --> 00:22:53,120 sogenannte Kopie. 407 00:22:53,120 --> 00:22:56,620 Weil du nicht eine Kopie in die Weise, dass ein Mensch würde es haben wollen. 408 00:22:56,620 --> 00:22:59,710 >> Also, was war das Update hier, copy1.c in der vergangenen Woche? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funktionen, und so konnten wir tatsächlich kopieren Sie die Zeichenfolge. 411 00:23:05,580 --> 00:23:08,700 Und grundsätzlich, was wir brauchen, um tun, um die Zeichenfolge zu kopieren? 412 00:23:08,700 --> 00:23:12,070 >> Nun, in dieser grünen Version hier bin ich werde es recht niedrigen Niveau zu tun. 413 00:23:12,070 --> 00:23:14,260 Es gibt tatsächlich Funktionen sie könnte dabei helfen. 414 00:23:14,260 --> 00:23:17,710 Aber die grundlegendste und die meisten vertraut man, zumindest, bald 415 00:23:17,710 --> 00:23:19,600 uns vertraut, ist die folgende - 416 00:23:19,600 --> 00:23:21,910 so dass man in der ersten Zeile Code in grün jetzt. 417 00:23:21,910 --> 00:23:23,970 >> Ich schrieb s als char *. 418 00:23:23,970 --> 00:23:25,250 Es gibt keine funktionalen Unterschied gibt. 419 00:23:25,250 --> 00:23:28,790 Ich warf den CS50-Bibliothek und Ich rufe es, was es ist ein char *. 420 00:23:28,790 --> 00:23:31,640 >> Jetzt Punkt, Punkt, Punkt, denn es gab einige Fehler geprüft, das ist nicht 421 00:23:31,640 --> 00:23:33,200 interessant, darüber zu sprechen wieder. 422 00:23:33,200 --> 00:23:34,710 So, jetzt t deklariert ist. 423 00:23:34,710 --> 00:23:35,780 Es ist auch ein char *. 424 00:23:35,780 --> 00:23:38,280 Also zog ich einen kleinen Platz auf der Bildschirm wie vorher. 425 00:23:38,280 --> 00:23:41,870 >> Aber auf der rechten Seite, malloc, wir sagen, ist Speicher zuzuweisen. 426 00:23:41,870 --> 00:23:44,130 So etwas zuteilen Teil des Speichers. 427 00:23:44,130 --> 00:23:48,830 Und wie viele Bytes brauchen wir eigentlich zuweisen möchten, es scheint? 428 00:23:48,830 --> 00:23:50,340 >> Nun, die String-Länge von s. 429 00:23:50,340 --> 00:23:52,310 Also, wenn es das ist, hallo gehen bis fünf sein. 430 00:23:52,310 --> 00:23:53,950 Wir sagen, h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Also fünf Bytes. 432 00:23:55,090 --> 00:23:57,960 >> Aber dann plus 1, 1, warum? 433 00:23:57,960 --> 00:23:58,830 Das 0-Zeichen. 434 00:23:58,830 --> 00:24:03,640 Wenn wir keinen Raum für diesen Kerl, den wir möglicherweise versehentlich eine Situation schaffen, 435 00:24:03,640 --> 00:24:05,600 wobei die Zeichenfolge h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 Und dann das nächste Mal ist GetString genannt und Typ I in, zum Beispiel, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, der Computer wird zu denken, dass s tatsächlich ist 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d, weil es nicht zwischen diesen Worten brechen. 439 00:24:18,900 --> 00:24:19,810 >> Also müssen wir diese Pause. 440 00:24:19,810 --> 00:24:20,720 So wollen wir nicht fünf. 441 00:24:20,720 --> 00:24:22,100 Wir wollen sechs Bytes. 442 00:24:22,100 --> 00:24:23,110 >> Und bytes, sage ich. 443 00:24:23,110 --> 00:24:25,220 Aber es ist wirklich an der Zeit eine Größe von char. 444 00:24:25,220 --> 00:24:28,040 Technisch char ist fast immer ein einziges Byte. 445 00:24:28,040 --> 00:24:31,030 >> Aber nur, um unseren Code tragbar, so zu sprechen, so dass es auf funktioniert 446 00:24:31,030 --> 00:24:33,750 verschiedenen Computern, auch wenn sie vielleicht etwas anders unterhalb der 447 00:24:33,750 --> 00:24:36,590 Haube, ich bin zu generisch gehen sagen Größe char so dass 448 00:24:36,590 --> 00:24:37,660 mein Code immer funktioniert. 449 00:24:37,660 --> 00:24:40,610 Und ich weiß nicht, es zu kompilieren nur weil ich mein Computer oder verwenden 450 00:24:40,610 --> 00:24:42,140 einige andere Plattform. 451 00:24:42,140 --> 00:24:45,300 >> Also habe ich 6 mal die Größe des ein char, die auf 1 werden passiert. 452 00:24:45,300 --> 00:24:47,440 Damit konnte mittels malloc Gib mir sechs Bytes. 453 00:24:47,440 --> 00:24:49,140 Was ist das eigentlich? 454 00:24:49,140 --> 00:24:52,810 Nun, lassen Sie mich ein Rollback in der Zeit hier wo wir sind in der Geschichte. 455 00:24:52,810 --> 00:24:57,620 >> Also, wenn ich wieder hier, habe ich erklärt ein char * t genannt. 456 00:24:57,620 --> 00:25:00,280 Ich habe jetzt genannt malloc für sechs Bytes. 457 00:25:00,280 --> 00:25:06,400 Und jetzt werde ich zu denen sechs Remis Byte wie das Array zuvor. 458 00:25:06,400 --> 00:25:10,570 Aber ich weiß wirklich nicht, was in diesem Array. 459 00:25:10,570 --> 00:25:14,640 >> Wenn Sie Speicher zuzuweisen es stellt sich heraus, dass Sie können nicht darauf vertrauen, dass es einige 460 00:25:14,640 --> 00:25:15,810 bekannte Wert gibt. 461 00:25:15,810 --> 00:25:18,400 Es könnte durch etwas verwendet wurden anderes, eine andere Funktion, eine andere 462 00:25:18,400 --> 00:25:19,630 Codezeile, die Sie geschrieben haben. 463 00:25:19,630 --> 00:25:22,870 Also werden wir in der Regel rufen diese Müll Werte und ziehen sie, vielleicht, wie 464 00:25:22,870 --> 00:25:26,170 Fragezeichen, nur darauf hinweist, dass wir weiß nicht, was ist eigentlich da. 465 00:25:26,170 --> 00:25:30,390 Und das ist keine große Sache, so lange wir sind intelligent genug, um diejenigen zu überschreiben 466 00:25:30,390 --> 00:25:34,550 Müll Werte mit Zahlen oder Zeichen, dass wir zu kümmern. 467 00:25:34,550 --> 00:25:36,340 >> Also in diesem Fall, was soll ich tun? 468 00:25:36,340 --> 00:25:38,670 Nun, mein Code Zeile Als nächstes habe ich vier. 469 00:25:38,670 --> 00:25:41,350 int i erhalten 0, n erhält die String-Länge von s. 470 00:25:41,350 --> 00:25:42,750 So eine vertraute for-Schleife. 471 00:25:42,750 --> 00:25:45,875 I weniger als oder gleich n ist, die in der Regel höher. 472 00:25:45,875 --> 00:25:47,500 >> Aber dieses Mal ist es gewollt. 473 00:25:47,500 --> 00:25:51,890 I + +, und dann habe ich einfach tun t Halterung i s bekommt. 474 00:25:51,890 --> 00:25:56,320 Weil mein Bild aussieht wie dieses an Dieses Moment, in t gespeichert ist 475 00:25:56,320 --> 00:25:59,530 Adresse dieser zufälligen Teil des Speichers deren Werte unbekannt sind. 476 00:25:59,530 --> 00:26:03,030 Aber sobald ich t Halter tun 0 bringt mich hier. 477 00:26:03,030 --> 00:26:07,430 >> Und was endet immer dort gezogen? 478 00:26:07,430 --> 00:26:08,740 Wir Ende setzen h. 479 00:26:08,740 --> 00:26:11,170 Denn das ist, was auf dem Bügel s 0. 480 00:26:11,170 --> 00:26:14,300 Und dann das Gleiche für e und l und l und o. 481 00:26:14,300 --> 00:26:17,930 >> n, warum ich gehen durch ein gleich n? 482 00:26:17,930 --> 00:26:19,200 Aufgrund der 0-Zeichen. 483 00:26:19,200 --> 00:26:23,580 Also nur klar zu sein, dann, wenn ich eigentlich löschen diese unabhängig Müll 484 00:26:23,580 --> 00:26:28,870 Werte sind und dann tatsächlich in zeichnen was ich erwarte, ist diese Halterung s 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, zuzüglich das ist Hinterkante neuen Charakter. 486 00:26:32,440 --> 00:26:36,080 >> Und nun, wenn wir weiter vorbei an der dot, Punkt, Punkt in diesem richtige Version 487 00:26:36,080 --> 00:26:41,930 und aktivierte t Klammer 0 Ich würde von Natürlich werden gerade diese Kapitalisierung 488 00:26:41,930 --> 00:26:47,050 Kerl hier, die konzeptionell, war schließlich das Ziel. 489 00:26:47,050 --> 00:26:48,040 Also das ist alles, der Zeiger. 490 00:26:48,040 --> 00:26:51,430 >> Und Sie haben mit ihnen seit Wochen jetzt im Rahmen der Saiten. 491 00:26:51,430 --> 00:26:53,530 Aber unter der Haube sind sie ein wenig komplizierter. 492 00:26:53,530 --> 00:26:57,520 Aber wenn Sie denken über sie in diese Bildform Ich schlage vor, sie sind 493 00:26:57,520 --> 00:27:01,720 wahrscheinlich gar nicht so gefährlich, wie sie vielleicht zuerst auf den ersten Blick scheinen mag, 494 00:27:01,720 --> 00:27:04,730 insbesondere mit solchen neuen Syntax. 495 00:27:04,730 --> 00:27:07,290 Irgendwelche Fragen zu Zeigern Strings oder Zeichen? 496 00:27:07,290 --> 00:27:07,580 Ja? 497 00:27:07,580 --> 00:27:09,252 >> ZUSCHAUER: Können Sie gehen zurück der [unverständlich]? 498 00:27:09,252 --> 00:27:10,502 >> Sprecher 1: Sicher. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> ZUSCHAUER: So wie in Ihrem letzten kommen Linie, die Sie nicht haben einen * t Linie 501 00:27:19,525 --> 00:27:21,513 und a * s in der Leitung? 502 00:27:21,513 --> 00:27:23,004 Haben Sie nicht den Verweis auf die - 503 00:27:23,004 --> 00:27:24,640 >> Sprecher 1: Ah, eine wirklich gute Frage. 504 00:27:24,640 --> 00:27:26,800 Warum kann ich nicht haben * t und * s? 505 00:27:26,800 --> 00:27:30,340 Weil kurz, letzte Woche, wie in unserem Swap-Funktion, habe ich gesagt, dass, wenn 506 00:27:30,340 --> 00:27:33,350 du hast einen Zeiger das Mittel, durch die Sie dorthin gehen wie wir 507 00:27:33,350 --> 00:27:36,590 physisch auf der Bühne, war es tatsächlich Mit der Stern-Operator. 508 00:27:36,590 --> 00:27:40,570 >> Es stellt sich heraus, dass diese eckigen Klammer Notation ist das, was wir nennen syntaktischen 509 00:27:40,570 --> 00:27:44,190 Zucker, die nur ein sexy Weg ist sagen, es ist für Kurzschrift 510 00:27:44,190 --> 00:27:45,950 genau das, was Sie beschreiben. 511 00:27:45,950 --> 00:27:49,385 Aber es ist ein wenig mehr intuitiv. 512 00:27:49,385 --> 00:27:53,510 Und auf die Gefahr hin dass diese scheinen mehr komplizierter als es sein muss, 513 00:27:53,510 --> 00:27:56,990 was wirklich los ist hier ist die folgende - 514 00:27:56,990 --> 00:28:01,450 Wenn ich sage, das heißt * t gehen die Adresse in t gespeichert. 515 00:28:01,450 --> 00:28:04,350 >> So wörtlich, wenn t speichert die Adresse dieser h 516 00:28:04,350 --> 00:28:07,300 zunächst, * t bedeutet hier. 517 00:28:07,300 --> 00:28:10,730 Nun, was t Klammer 0 bedeuten? 518 00:28:10,730 --> 00:28:11,560 Genau dasselbe. 519 00:28:11,560 --> 00:28:13,510 Es ist nur ein wenig mehr Benutzer freundlich zu schreiben. 520 00:28:13,510 --> 00:28:14,430 >> Aber ich bin noch nicht fertig. 521 00:28:14,430 --> 00:28:17,800 Ich kann nicht einfach sagen: * t * s bekommt. 522 00:28:17,800 --> 00:28:19,440 Denn was würde ich dann tun? 523 00:28:19,440 --> 00:28:22,950 Ich würde Putting h, h, h, h, h während der ganzen Sache. 524 00:28:22,950 --> 00:28:22,995 Right? 525 00:28:22,995 --> 00:28:26,020 >> Weil * t ist an die Adresse in t gehen. 526 00:28:26,020 --> 00:28:27,580 Aber wir sind in einer Schleife. 527 00:28:27,580 --> 00:28:32,150 Und welchen Wert ich Inkrementieren natürlich bei jeder Iteration? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Aber es gibt eine Chance hier, nicht wahr? 530 00:28:34,590 --> 00:28:37,870 Auch wenn sich das anfühlt, wie es immer ist ein wenig anspruchsvoller 531 00:28:37,870 --> 00:28:40,730 als der eckigen Klammer-Notation wir haben für längere Zeit nicht benutzt - 532 00:28:40,730 --> 00:28:43,840 lassen Sie mich meine rückgängig h Veränderung gibt - 533 00:28:43,840 --> 00:28:48,870 obwohl dies ist jetzt immer ein wenig Züchter, die Grundidee, wenn * t 534 00:28:48,870 --> 00:28:53,630 bedeutet hier, und * t ist nur rufen Sie die Adresse in t. 535 00:28:53,630 --> 00:28:54,990 >> Aber was war die Adresse in t? 536 00:28:54,990 --> 00:28:56,850 Die Zahl halten wir mit? 537 00:28:56,850 --> 00:29:00,540 Wie Ox456, lasst uns zurück zu bringen, dass nur wegen der Diskussion. 538 00:29:00,540 --> 00:29:05,380 Nun, wenn ich an der e in zu bekommen t Zeichenfolge, ich möchte nur zu gehen, 539 00:29:05,380 --> 00:29:06,460 Wesentlichen, 456. 540 00:29:06,460 --> 00:29:09,230 >> Oder besser gesagt, 457. 541 00:29:09,230 --> 00:29:10,590 Ich brauche nur einen hinzufügen. 542 00:29:10,590 --> 00:29:11,790 Aber ich kann das tun, nicht wahr? 543 00:29:11,790 --> 00:29:14,680 Da t, obwohl ich halten Zeichnung es jetzt wie ein Pfeil, ist es nur eine 544 00:29:14,680 --> 00:29:16,570 Anzahl, Ox456. 545 00:29:16,570 --> 00:29:21,400 Und wenn ich hinzufügen, dass man, oder mehr Im Allgemeinen, wenn ich hinzufügen, ich, dass ich 546 00:29:21,400 --> 00:29:24,350 tatsächlich genau dort, wo ich will. 547 00:29:24,350 --> 00:29:26,260 Also, wenn ich tatsächlich tun dies - 548 00:29:26,260 --> 00:29:28,970 und dies ist, was jetzt genannt Pointer-Arithmetik - 549 00:29:28,970 --> 00:29:30,375 Ich kann entfernen Sie diese Zeile. 550 00:29:30,375 --> 00:29:33,550 Welches ist, ehrlich gesagt, ich glaube, klarer und ein wenig benutzerfreundlicher zu lesen. 551 00:29:33,550 --> 00:29:35,970 Aber dies ist nicht weniger richtig. 552 00:29:35,970 --> 00:29:38,570 >> Diese Codezeile wird nun mit Pointer-Arithmetik. 553 00:29:38,570 --> 00:29:40,920 Es ist selbstverständlich, um die folgender Adresse - 554 00:29:40,920 --> 00:29:44,670 was auch immer der Beginn von t, die ist t plus i, die zunächst 555 00:29:44,670 --> 00:29:45,730 0 ist, was toll ist. 556 00:29:45,730 --> 00:29:49,280 Denn das bedeutet den Beginn der t plus 1, plus 2, plus 3, und so weiter. 557 00:29:49,280 --> 00:29:51,030 Und das gleiche Angebot mit s. 558 00:29:51,030 --> 00:29:52,750 >> So syntaktischen Zucker für diese. 559 00:29:52,750 --> 00:29:55,900 Aber zu verstehen, was wirklich vor sich geht unter der Haube, würde ich behaupten, 560 00:29:55,900 --> 00:29:57,410 tatsächlich an sich nützlich. 561 00:29:57,410 --> 00:30:00,620 Weil es bedeutet, jetzt gibt es nicht viel mehr Magie los 562 00:30:00,620 --> 00:30:01,620 unter der Haube. 563 00:30:01,620 --> 00:30:03,920 Es sind nicht zu viele sein Schichten, die wir Peeling für Sie eine Sicherungskopie. 564 00:30:03,920 --> 00:30:04,810 Dies ist c. 565 00:30:04,810 --> 00:30:06,410 Und dies ist die Programmierung. 566 00:30:06,410 --> 00:30:08,002 Wirklich gute Frage. 567 00:30:08,002 --> 00:30:11,570 >> Alles klar, so war dies, dass Buggy Programm, das ich früher bezog. 568 00:30:11,570 --> 00:30:12,650 Swap war fehlerhaft. 569 00:30:12,650 --> 00:30:14,070 Wenn schien zu funktionieren. 570 00:30:14,070 --> 00:30:17,390 Daran erinnern, dass nur mit der Milch mögen und der Orangensaft - die ich begonnen 571 00:30:17,390 --> 00:30:18,660 trinken heutigen Demonstration. 572 00:30:18,660 --> 00:30:22,220 So wie mit dem Orangensaft und die Milch, wir haben eine Verwendung 573 00:30:22,220 --> 00:30:26,200 temporäre Variable, tmp, zu halten, ein vorübergehend, so dass wir dann 574 00:30:26,200 --> 00:30:28,820 ändern Sie seinen Wert und aktualisieren Sie dann b. 575 00:30:28,820 --> 00:30:32,870 >> Aber diese Funktion, sagten wir, oder diese Programm, in dem diese Funktion war 576 00:30:32,870 --> 00:30:35,670 geschrieben war falsch und fehlerhaft, warum? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Ja? 579 00:30:39,090 --> 00:30:42,471 >> ZUSCHAUER: [unverständlich]. 580 00:30:42,471 --> 00:30:44,940 >> Sprecher 1: Genau, wenn Sie Makeln - 581 00:30:44,940 --> 00:30:47,820 oder allgemeiner, wenn man nennen die meisten keine Funktion - 582 00:30:47,820 --> 00:30:51,210 wenn die Argumente dieser Funktion sind primitiv, so zu sprechen, ints und chars 583 00:30:51,210 --> 00:30:56,740 und Doppelzimmer und Schwimmern, die Dinge ohne Sterne, sind Sie in einer Kopie der Weitergabe 584 00:30:56,740 --> 00:30:57,540 das Argument. 585 00:30:57,540 --> 00:31:01,580 Also, wenn x und y 1 war war 2 ist ein gehen 1 sein und b wird 2 sein. 586 00:31:01,580 --> 00:31:05,250 Aber sie gehen, um verschiedene Stücke sein von Bits verschiedenen Stücke 587 00:31:05,250 --> 00:31:07,540 Speicher, die geschehen, um die Speicherung identische Werte. 588 00:31:07,540 --> 00:31:12,160 >> Also dieser Code ist super perfekt bei Austausch a und b. 589 00:31:12,160 --> 00:31:13,850 Es ist nicht gut bei Swapping - 590 00:31:13,850 --> 00:31:15,290 in der vergangenen Woche beispielsweise - 591 00:31:15,290 --> 00:31:16,390 x und y. 592 00:31:16,390 --> 00:31:18,780 Denn wieder sind sie, in den falschen Bereich. 593 00:31:18,780 --> 00:31:21,310 >> Nun, wie wir über die Festsetzung dies gehen? 594 00:31:21,310 --> 00:31:23,140 Wir hatten, um die Funktion zu schauen ein wenig hässlicher. 595 00:31:23,140 --> 00:31:25,250 Aber noch einmal überlegen, was bedeutet dies einfach. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Und tatsächlich, lass mich, für Konsistenz, ändern eine Sache so ist es identisch ist 598 00:31:31,500 --> 00:31:33,200 was wir gerade getan. 599 00:31:33,200 --> 00:31:35,690 Wie ich letzte Woche erwähnt, ist es nicht egal, wohin es geht. 600 00:31:35,690 --> 00:31:38,120 In der Tat, in der Regel würden Sie setzen die Sterne neben dem variablen Namen. 601 00:31:38,120 --> 00:31:40,750 Aber ich denke, es wäre ein wenig leichter die * neben dem betrachten 602 00:31:40,750 --> 00:31:44,910 Datentyp dahin ist es ein Zeiger in einen int in diesem Fall. 603 00:31:44,910 --> 00:31:46,270 >> Also, was mache ich hier? 604 00:31:46,270 --> 00:31:49,590 Ich sage nicht, mir einen int gefolgt von einem weiteren int, 605 00:31:49,590 --> 00:31:50,810 ruft sie a und b. 606 00:31:50,810 --> 00:31:52,460 Gib mir die Adresse einer int. 607 00:31:52,460 --> 00:31:53,960 Gib mir die Adresse eines anderen int. 608 00:31:53,960 --> 00:31:56,330 Rufen Sie die Adressen a und b. 609 00:31:56,330 --> 00:32:00,860 >> Und dann mit der *-Notation unten nachfolgend auf jede dieser Adressen gehen 610 00:32:00,860 --> 00:32:05,290 nach Bedarf, um entweder oder setzen Sie seinen Wert. 611 00:32:05,290 --> 00:32:07,400 Aber es gibt eine Ausnahme. 612 00:32:07,400 --> 00:32:11,130 Warum habe ich nicht ein * neben tmp? 613 00:32:11,130 --> 00:32:15,070 Warum muss ich das nicht tun, zum Beispiel? 614 00:32:15,070 --> 00:32:19,370 Es fühlt sich an, wie ich gerade gehen sollte alle aus und korrigieren Sie die ganze Sache. 615 00:32:19,370 --> 00:32:19,752 Ja? 616 00:32:19,752 --> 00:32:21,002 >> ZUSCHAUER: [unverständlich]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> Sprecher 1: Ich habe nicht erklärt tmp als String zurück. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 So würde erklären, in diesem Fall a tmp die Adresse einer int sein. 621 00:32:34,950 --> 00:32:37,380 Aber das ist nicht ganz das, was ich will, für eine Reihe von Gründen. 622 00:32:37,380 --> 00:32:38,616 >> ZUSCHAUER: Sie wollen nicht, um sie auszutauschen. 623 00:32:38,616 --> 00:32:41,800 >> Sprecher 1: Genau, ich will nicht zu tauschen nichts mit tmp. tmp ist nur 624 00:32:41,800 --> 00:32:42,790 Woche-ein Zeug. 625 00:32:42,790 --> 00:32:45,150 Alles was ich will ist eine Variable um etwas zu speichern. 626 00:32:45,150 --> 00:32:47,330 Ich weiß nicht einmal über Adressen kümmern in diesem Moment. 627 00:32:47,330 --> 00:32:50,530 >> Ich brauche nur 32 Bit oder so zu lagern einen int. 628 00:32:50,530 --> 00:32:56,690 Und ich möchte in diesen 32 Bit setzen Was nicht in eine, so zu sprechen, aber 629 00:32:56,690 --> 00:33:01,260 was auf eine, nur um genauer zu sein. 630 00:33:01,260 --> 00:33:06,420 Denn wenn eine ist eine Adresse, * a bedeutet dorthin gehen und erhalten den Wert 1. 631 00:33:06,420 --> 00:33:10,560 Zum Beispiel in der vergangenen Woche beispielsweise oder b der Fall, erhalten Sie den Wert von 2. 632 00:33:10,560 --> 00:33:11,750 >> Also, was ist wirklich los? 633 00:33:11,750 --> 00:33:15,070 Lassen Sie mich ein Bild zeichnen, das hier wird nur necken neben Teil von heute. 634 00:33:15,070 --> 00:33:18,580 Aber dies wird weiterhin angezeigt seit geraumer Zeit. 635 00:33:18,580 --> 00:33:22,430 >> Dies, behaupte ich, ist das, was Ihres Computers Speicher aussieht, wenn Sie eine 636 00:33:22,430 --> 00:33:24,060 Programm, ein Programm. 637 00:33:24,060 --> 00:33:28,340 Wenn Sie ein Programm ausführen, an der Spitze der Arbeitsspeicher Ihres Computers - so denken 638 00:33:28,340 --> 00:33:33,530 dieses Rechteck, wahrlich, wie Ihre Arbeitsspeicher des Computers oder Speicher, die alle 101 639 00:33:33,530 --> 00:33:36,920 Milliarde Byte davon, alle zwei Milliarden bytes, alle zwei Gigabyte es, 640 00:33:36,920 --> 00:33:39,910 unabhängig von der Menge, die Sie haben, ist, wir ziehen es als Rechteck. 641 00:33:39,910 --> 00:33:43,260 Und ich behaupte, dass, wenn Sie ein Programm ausführen wie Microsoft Word oder Chrome 642 00:33:43,260 --> 00:33:49,220 oder so etwas, dass die Bits Microsoft oder Google, dass schrieb - 643 00:33:49,220 --> 00:33:50,910 in den Fällen von diesen Programmen - 644 00:33:50,910 --> 00:33:54,490 werden in den Arbeitsspeicher Ihres Computers geladen wo sie mehr ausgeführt werden 645 00:33:54,490 --> 00:33:57,520 schnell und in die CPU, die ist das Gehirn des Computers. 646 00:33:57,520 --> 00:34:00,940 >> Und in TAM sie ganz am gespeichert Anfang des Programms, so zu sprechen. 647 00:34:00,940 --> 00:34:03,300 Mit anderen Worten, wenn dies ein Stück Speicher, wenn Sie einen Doppelklick auf klicken 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, kommen die Bits von der Festplatte. 649 00:34:05,740 --> 00:34:06,680 Sie bekommen in den Arbeitsspeicher geladen. 650 00:34:06,680 --> 00:34:10,330 Und wir schieben sie bis an die Spitze dieses Rechtecks ​​konzeptionell. 651 00:34:10,330 --> 00:34:13,010 >> Nun, das ist der Rest von Ihrem Gedächtnis verwendet für verschiedene Dinge. 652 00:34:13,010 --> 00:34:16,460 Ganz oben sehen Sie initialisieren Daten und deinitialisieren Daten. 653 00:34:16,460 --> 00:34:20,500 Dies zu tun hat, zum größten Teil mit Konstanten oder globale Variablen 654 00:34:20,500 --> 00:34:21,340 das haben Werte. 655 00:34:21,340 --> 00:34:22,980 Aber mehr auf die andere Zeit. 656 00:34:22,980 --> 00:34:25,150 >> Dann haben Sie die Haufen, welche wir kommen zurück auf. 657 00:34:25,150 --> 00:34:28,420 Aber im Grunde ist das Teil, das ist gerade jetzt Germane. 658 00:34:28,420 --> 00:34:30,210 Es ist die so genannte Stapel. 659 00:34:30,210 --> 00:34:33,850 Also einfach in fast jeder Halle D hier gefallen Campus, müssen Sie diese Tabletts, dass 660 00:34:33,850 --> 00:34:37,210 nur auf der jeweils anderen, auf dem Stapel Sie können die Lebensmittel und so weiter. 661 00:34:37,210 --> 00:34:40,139 Der Stapel in einem Computersystem, sehr ähnlich ist. 662 00:34:40,139 --> 00:34:42,679 Außer während der Schale, wie wir in der Speisesaal, natürlich, soll 663 00:34:42,679 --> 00:34:45,710 zu tragen Dinge die Fächer oder die Rahmen - 664 00:34:45,710 --> 00:34:49,469 wie wir sie nennen - in einem Computer Speicher verwendet zu halten, 665 00:34:49,469 --> 00:34:51,610 Variablen und Werte. 666 00:34:51,610 --> 00:34:53,929 >> Also, was wirklich geht unter der Haube? 667 00:34:53,929 --> 00:34:55,820 Nun, lassen Sie mich umdrehen auf den Bildschirm hier. 668 00:34:55,820 --> 00:34:58,370 Und lasst uns nur auf die konzentrieren Unterteil für einen Moment. 669 00:34:58,370 --> 00:35:02,770 Ist dies der Bodenabschnitt meiner Arbeitsspeicher des Computers stellt sich heraus, wenn ich 670 00:35:02,770 --> 00:35:05,350 Aufruf der Funktion main - was passiert, ehrlich gesagt, 671 00:35:05,350 --> 00:35:06,950 automatisch für mich - 672 00:35:06,950 --> 00:35:10,510 Ich bekomme einen Teil des Speichers bei der Unterseite meines RAM sozusagen. 673 00:35:10,510 --> 00:35:13,390 Und das ist, wo wichtigsten ist lokalen Variablen gehen. 674 00:35:13,390 --> 00:35:16,770 Es ist, wo argc und argv vielleicht gehen, und alle Variablen, die ich 675 00:35:16,770 --> 00:35:18,170 erklären innerhalb von main. 676 00:35:18,170 --> 00:35:20,260 Sie enden am unteren Rand meines Computers RAM. 677 00:35:20,260 --> 00:35:25,040 >> Nehmen wir nun an, dass die wichtigsten Anrufe eine Funktion wie swap, wie es letzte Woche tat? 678 00:35:25,040 --> 00:35:30,620 Nun, wir setzen im Wesentlichen ein neues Fach, ein neuen Rahmen, auf meinem Teil des Speichers. 679 00:35:30,620 --> 00:35:34,160 Und ich werde dies so beschreiben aus der Swap-Funktion. 680 00:35:34,160 --> 00:35:35,770 >> Nun, was drin ist der Swap? 681 00:35:35,770 --> 00:35:39,240 Nun, letzte Woche auf dem Programm basiert und das, was wir gerade gesehen, einen Auszug aus, 682 00:35:39,240 --> 00:35:46,590 innerhalb von Swap-Rahmen oder auf Swaps Fach sind, was Variablen? 683 00:35:46,590 --> 00:35:47,970 Well, a und b. 684 00:35:47,970 --> 00:35:51,850 Denn das waren seine lokale Argumente, plus eine dritte tmp. 685 00:35:51,850 --> 00:35:54,470 Also wirklich, ich könnte zeichnen diese ein wenig mehr sauber. 686 00:35:54,470 --> 00:35:56,680 Lassen Sie mich gehen und rückgängig das Etikett. 687 00:35:56,680 --> 00:35:58,520 Und lassen Sie mich behaupten, dass Sie wissen, was? 688 00:35:58,520 --> 00:36:00,560 >> a ist wahrscheinlich zu Ende hier. 689 00:36:00,560 --> 00:36:02,160 B wird hier enden. 690 00:36:02,160 --> 00:36:03,810 Und tmp wird hier enden. 691 00:36:03,810 --> 00:36:05,160 Nun könnte die Reihenfolge ein wenig unterschiedlich sein. 692 00:36:05,160 --> 00:36:06,840 Aber konzeptionell das ist die Idee. 693 00:36:06,840 --> 00:36:11,490 >> Und nur gemeinsam, das ist, was wir nennen Swap-Rahmen, oder 694 00:36:11,490 --> 00:36:12,136 Speisesaal Fach. 695 00:36:12,136 --> 00:36:13,150 Und das gleiche Angebot mit main. 696 00:36:13,150 --> 00:36:14,040 Aber ich werde nicht neu zu zeichnen, dass. 697 00:36:14,040 --> 00:36:17,810 Aber das ist, wo argc und argv und jede der lokalen Variablen wie x und y 698 00:36:17,810 --> 00:36:18,940 könnte genauso gut sein. 699 00:36:18,940 --> 00:36:22,170 >> So, jetzt überlegen, was wirklich passiert Wenn Sie Swap nennen. 700 00:36:22,170 --> 00:36:26,370 Wenn Sie Swap nennen, wie die Ausführung von Code Damit sind Sie im Vorbeigehen, in der 701 00:36:26,370 --> 00:36:30,670 Buggy-Version, a und b als Kopien von x und y. 702 00:36:30,670 --> 00:36:34,300 Also, wenn ich jetzt zeichnen diese auf dem Bildschirm - 703 00:36:34,300 --> 00:36:36,700 habe, um besser auf diese - 704 00:36:36,700 --> 00:36:40,850 so dass die Geschichte, die ich zu mir selbst sagen, war in dieser buggy Version, wenn wir 705 00:36:40,850 --> 00:36:46,130 Makeln vorbei in buchstäblich a und b als ganze Zahlen, was ist wirklich passiert? 706 00:36:46,130 --> 00:36:48,250 >> Nun, was wirklich passiert ist. 707 00:36:48,250 --> 00:36:52,850 Lassen Sie mich gehen und nur rückgängig zu klären, etwas Platz hier. 708 00:36:52,850 --> 00:36:54,720 Also das ist meine Arbeitsspeicher des Computers. 709 00:36:54,720 --> 00:36:57,510 >> Also, wenn ich zum Beispiel - 710 00:36:57,510 --> 00:36:58,910 eigentlich machen wir es auf diese Weise - 711 00:36:58,910 --> 00:37:02,690 wenn ich behaupten, dass dies x ist, Speicherung der Wert 1 genau wie letzte Woche. 712 00:37:02,690 --> 00:37:05,930 Und dies ist y, Speichern des Wertes 2 genau wie letzte Woche. 713 00:37:05,930 --> 00:37:11,370 Und dies ist hauptsächlich, wenn ich Swap nennen, wodurch selbst Zugriff auf ein und 714 00:37:11,370 --> 00:37:15,150 b und tmp, werde ich behaupten, dass Dies ist ein, und das ist 1. 715 00:37:15,150 --> 00:37:16,080 >> Dies ist b. 716 00:37:16,080 --> 00:37:17,010 Dies ist 2. 717 00:37:17,010 --> 00:37:18,370 Dies nennt man tmp. 718 00:37:18,370 --> 00:37:23,360 >> Und anfangs hat es einige Müll Wert bis ich tatsächlich in es ein Geschäft, 719 00:37:23,360 --> 00:37:24,450 Das ist 1. 720 00:37:24,450 --> 00:37:28,320 Dann habe ich voran gehen und ändern ein, was sein? 721 00:37:28,320 --> 00:37:29,720 B den Wert. 722 00:37:29,720 --> 00:37:31,980 >> Und so habe ich jetzt zwei hier. 723 00:37:31,980 --> 00:37:34,050 Und dann haben wir gesagt bekommt b tmp. 724 00:37:34,050 --> 00:37:37,670 Wiederum nur als Plausibilitätsprüfung, die dritte Codezeile hier ist einfach dies 725 00:37:37,670 --> 00:37:39,440 ein, bekommt b tmp. 726 00:37:39,440 --> 00:37:41,730 >> Und so schließlich, was soll ich tun? 727 00:37:41,730 --> 00:37:46,800 Ich voran gehen und ändern b zu sein, was der Wert von tmp ist, die 1 ist. 728 00:37:46,800 --> 00:37:48,390 Ich weiß nicht berühren tmp wieder. 729 00:37:48,390 --> 00:37:54,100 >> Aber jetzt ist das Problem so schnell wie Swap kehrt, weil es nicht die Übergabe 730 00:37:54,100 --> 00:37:57,540 Sichern gewissen Wert, es gibt keine Rückkehr Aussage explizit in sie. 731 00:37:57,540 --> 00:37:59,080 Was ist eigentlich passiert? 732 00:37:59,080 --> 00:38:03,480 Nun, im Wesentlichen alle diese Erinnerung - 733 00:38:03,480 --> 00:38:07,410 OK, scheinbar der Radiergummi mag nur einen Finger zu einer Zeit - 734 00:38:07,410 --> 00:38:08,180 gerade verschwindet. 735 00:38:08,180 --> 00:38:10,070 >> Jetzt in Wirklichkeit ist es nicht überall. 736 00:38:10,070 --> 00:38:11,810 Aber man kann davon halten Jetzt als Fragezeichen. 737 00:38:11,810 --> 00:38:14,040 Weil es nicht mehr tatsächlich in Gebrauch ist. 738 00:38:14,040 --> 00:38:17,470 Und nichts wird mit diesen Werten durchgeführt. 739 00:38:17,470 --> 00:38:21,920 >> So wurden bei der grüne Version dieser Code ist das, was ist stattdessen 740 00:38:21,920 --> 00:38:24,640 übergeben Swap? 741 00:38:24,640 --> 00:38:25,770 So befasst. 742 00:38:25,770 --> 00:38:28,520 Also die Adresse von x und die Adresse von y. 743 00:38:28,520 --> 00:38:35,790 Also, wenn wir diese Geschichte ein letztes neu erzählen Zeit, und ich eigentlich ziehen Swap wieder 744 00:38:35,790 --> 00:38:44,620 aber mit Zeigern, wobei diese a, diese wobei b, und dies ist tmp, was ist 745 00:38:44,620 --> 00:38:49,080 tatsächlich in eine in dieser grünen gespeichert Version von meinem Code, wo ich vorbei 746 00:38:49,080 --> 00:38:52,110 in Adressen? 747 00:38:52,110 --> 00:38:53,780 >> Es wird ein Zeiger auf x. 748 00:38:53,780 --> 00:38:54,890 So konnte ich einen Pfeil zeichnen. 749 00:38:54,890 --> 00:38:57,310 Aber lassen Sie uns den gleichen willkürlichen Beispiel wie zuvor. 750 00:38:57,310 --> 00:39:01,220 Lassen Sie uns sagen, dass dies etwas wie Ox123. 751 00:39:01,220 --> 00:39:04,970 Und das wird Ox127 sein, weil es ist vier Bytes weg, weil es ist ein 752 00:39:04,970 --> 00:39:07,370 int, so Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Und wieder nehme ich einige Freiheiten mit den Zahlen. 754 00:39:09,080 --> 00:39:11,430 Sie sind viel kleiner, als sie es tatsächlich werden und in einer anderen Reihenfolge. 755 00:39:11,430 --> 00:39:14,350 Aber das ist, wie das Bild ist nun anders. 756 00:39:14,350 --> 00:39:19,060 >> Aber wenn ich dieses grünen Code und ich weiß int tmp bekommen * a. 757 00:39:19,060 --> 00:39:25,010 * Ein Mittel, um die folgenden tun, nehmen Sie die anzugehen, das ist in ein und gehen Sie zu ihm, 758 00:39:25,010 --> 00:39:26,190 Das ist 1. 759 00:39:26,190 --> 00:39:28,480 Und das ist, was ich dann legte in tmp. 760 00:39:28,480 --> 00:39:32,480 In der Zwischenzeit in der nächsten Zeile der Code hier * a b bekommt, was bedeutet das? 761 00:39:32,480 --> 00:39:36,910 >> Nun, * a, so hier gehen wird * b, was bedeutet, dorthin zu gehen. 762 00:39:36,910 --> 00:39:39,310 Und das bedeutet, setzen Sie den Wert auf es. 763 00:39:39,310 --> 00:39:43,670 Schließlich ist die letzte Codezeile einfach gesagt * b bekommt tmp. 764 00:39:43,670 --> 00:39:48,900 >> So sagt es b gehen und überschreiben ihn mit tmp die, in diesem Fall wird 765 00:39:48,900 --> 00:39:51,520 um wiederum 1. 766 00:39:51,520 --> 00:39:54,920 Und das ist, warum die grüne Version unser Code funktioniert, während die rote 767 00:39:54,920 --> 00:39:56,010 Version nie getan. 768 00:39:56,010 --> 00:39:59,020 Es ist alles nur darauf an, wie der Speicher verwaltet wird und wo es 769 00:39:59,020 --> 00:40:02,580 tatsächlich in Ihrer platziert Arbeitsspeicher des Computers. 770 00:40:02,580 --> 00:40:07,270 Und jetzt, das ist eines der Dinge, daß der Stapel wird verwendet. 771 00:40:07,270 --> 00:40:09,225 >> Fragen zu dem Layout? 772 00:40:09,225 --> 00:40:10,380 Am Zeiger? 773 00:40:10,380 --> 00:40:11,630 Oder auf Swap? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Alles klar, so malloc, Rückruf, habe so etwas wie dies. 776 00:40:17,043 --> 00:40:18,260 Dies war ein super einfaches Beispiel. 777 00:40:18,260 --> 00:40:20,550 Und das war die eine, die Binky stellte uns, wenn auch recht 778 00:40:20,550 --> 00:40:21,870 schnell, am Ende der Klasse. 779 00:40:21,870 --> 00:40:24,480 Verdammt, es geht wieder los. 780 00:40:24,480 --> 00:40:28,780 >> So erinnern, dass dies das Beispiel war, dass Binky stellte uns, wenn auch 781 00:40:28,780 --> 00:40:30,360 etwas schnell am Ende der Klasse. 782 00:40:30,360 --> 00:40:33,640 Und hier haben wir wirklich verwendet malloc für die zweite Zeit. 783 00:40:33,640 --> 00:40:37,330 Da wir zum ersten Mal benutzte es, um schaffen genug RAM, RAM zuweisen genug 784 00:40:37,330 --> 00:40:38,340 zum Speichern einer Zeichenfolge. 785 00:40:38,340 --> 00:40:40,250 >> Diesmal Binky hielt es einfach. 786 00:40:40,250 --> 00:40:42,465 So ist es nur speichern ein int, anscheinend. 787 00:40:42,465 --> 00:40:43,510 Und das ist völlig in Ordnung. 788 00:40:43,510 --> 00:40:46,560 Es ist ein bisschen komisch, ehrlich gesagt, zu verwenden malloc einem int zuzuweisen. 789 00:40:46,560 --> 00:40:50,650 Aber der Punkt von Nicks claymation war wirklich nur die Geschichte erzählen von dem, was 790 00:40:50,650 --> 00:40:53,830 geschieht oder geschieht nicht, wenn Sie misshandeln Speicher. 791 00:40:53,830 --> 00:40:56,520 >> So dass in diesem Fall das Programm habe ein paar Dinge. 792 00:40:56,520 --> 00:41:01,580 Im ersten Fall wird hier erklärt, es ein Zeiger namens x in einen int. 793 00:41:01,580 --> 00:41:04,480 Dann deklariert einen Zeiger genannt y auf int. 794 00:41:04,480 --> 00:41:06,150 Es speichert dann in x, was? 795 00:41:06,150 --> 00:41:07,110 Jemand anders jetzt. 796 00:41:07,110 --> 00:41:09,685 Was wird in x nach gespeicherten die dritte Zeile von diesem Programm? 797 00:41:09,685 --> 00:41:12,380 >> ZUSCHAUER: [unverständlich]. 798 00:41:12,380 --> 00:41:14,130 >> Sprecher 1: Nun, nicht ganz Bytes pro sagen. 799 00:41:14,130 --> 00:41:16,760 Seien Sie genauere jetzt. 800 00:41:16,760 --> 00:41:18,325 Was wird in x gespeichert? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Eine Adresse, ich glaube, ich hörte es. 803 00:41:22,060 --> 00:41:23,570 >> Also, was bedeutet malloc zurückkehren? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorally ordnet ein Teil des Speichers. 805 00:41:26,030 --> 00:41:27,850 Aber wie kommt es Ihnen darauf zugreifen? 806 00:41:27,850 --> 00:41:29,460 Es gibt was? 807 00:41:29,460 --> 00:41:32,000 Die Adresse des ersten Bytes in dem Teil des Speichers. 808 00:41:32,000 --> 00:41:33,020 >> Nun, dies ist super einfach. 809 00:41:33,020 --> 00:41:35,380 Es ist nur ein Byte, was bedeutet, das adressieren wir immer wieder die 810 00:41:35,380 --> 00:41:37,300 Adresse der ganzen Sache. 811 00:41:37,300 --> 00:41:42,070 So in x dann gespeichert, ist die Adresse dieser Teil des Speichers. 812 00:41:42,070 --> 00:41:43,400 Unterdessen was passiert als nächstes? 813 00:41:43,400 --> 00:41:45,890 Also eigentlich, lasst uns gehen Sie vor und zeichnen dieses heraus wirklich schnell. 814 00:41:45,890 --> 00:41:52,490 >> Also, wenn wir gehen über den Bildschirm hier und Wir spielen dieses out int * x und int * y 815 00:41:52,490 --> 00:41:53,740 wird, was für mich tun? 816 00:41:53,740 --> 00:41:58,280 Ich behaupte, dass es nur geht zu tun so etwas wie dieses und nennen es x und 817 00:41:58,280 --> 00:42:00,010 dies und nennen es y. 818 00:42:00,010 --> 00:42:03,110 Inzwischen ist in der dritten Zeile der Code gehen, um die Größe eines int zuweisen, 819 00:42:03,110 --> 00:42:06,160 was passiert zu sein - sorry, wenn ich sagte ein, bevor ich bedeutete eine int - 820 00:42:06,160 --> 00:42:08,280 vier Bytes auf einem typischen Computersystem. 821 00:42:08,280 --> 00:42:09,720 Zumindest mit dem CS50 Gerät. 822 00:42:09,720 --> 00:42:11,490 >> Also das wird vergeben es, wer weiß? 823 00:42:11,490 --> 00:42:12,800 Irgendwo hier draußen. 824 00:42:12,800 --> 00:42:15,780 Und dies ist bei einigen gespeichert Adresse Ox, wer weiß? 825 00:42:15,780 --> 00:42:18,330 Aber was wird zurückgegeben bekommen ist, dass Adresse. 826 00:42:18,330 --> 00:42:22,270 Aber wir werden diese bildhaft zeichnen als nur ein Pfeil so. 827 00:42:22,270 --> 00:42:25,430 >> Jetzt in der nächsten Zeile * x 42 bekommt. 828 00:42:25,430 --> 00:42:29,400 Was bedeutet * x bedeuten, in juristischer Hinsicht? 829 00:42:29,400 --> 00:42:30,040 Gehen Sie dort hin. 830 00:42:30,040 --> 00:42:30,960 Gehe zu dieser Adresse. 831 00:42:30,960 --> 00:42:35,900 Oder in anderen Worten, folgen Sie den Pfeil und legte 42 gibt. 832 00:42:35,900 --> 00:42:38,140 Doch dann geschah etwas Schlimmes passiert zu Binky, nicht wahr? 833 00:42:38,140 --> 00:42:43,950 >> Daran erinnern, dass Linie fünf hier bekommt * y 13, in der Tat eine Unglückszahl, 834 00:42:43,950 --> 00:42:44,760 tat, was für uns? 835 00:42:44,760 --> 00:42:47,320 Nun, gehen * y Mittel gibt. 836 00:42:47,320 --> 00:42:50,460 Nun, dieses nicht gegeben ein Wert vorhanden, richtig? 837 00:42:50,460 --> 00:42:54,090 Der Code muss nicht y initialisiert zu nichts. 838 00:42:54,090 --> 00:42:56,120 Wir hatten x initialisiert eine Adresse. 839 00:42:56,120 --> 00:42:57,640 Aber y wurde oben erklärt. 840 00:42:57,640 --> 00:43:00,250 Aber dann ein Semikolon, kein Wert wurde tatsächlich in sie setzen. 841 00:43:00,250 --> 00:43:02,330 Also, es ist fair zu dieser Aufforderung a garbage Wert. 842 00:43:02,330 --> 00:43:03,430 Wer weiß, was ist da? 843 00:43:03,430 --> 00:43:07,160 Es sind die Reste von Bits, die verwendet wurden von einigen vorherigen Codezeile in 844 00:43:07,160 --> 00:43:08,300 mein Programm. 845 00:43:08,300 --> 00:43:13,250 >> Also, wenn ich sage, es gehen, das ist wie, Ich habe keine Ahnung, wo dieser Pfeil ist 846 00:43:13,250 --> 00:43:14,490 gehen, um am Ende. 847 00:43:14,490 --> 00:43:17,720 Und das ist, wenn Sie in der Regel bekommen einen Segmentation Fault. 848 00:43:17,720 --> 00:43:22,430 Wenn Sie versehentlich dereference, so zu sprechen, oder gehen Sie zu einer Adresse, die nicht ist 849 00:43:22,430 --> 00:43:25,400 tatsächlich eine legitime Adresse, schlimme Dinge passieren. 850 00:43:25,400 --> 00:43:27,550 >> Und das ist genau das, was passiert zu Binky denken. 851 00:43:27,550 --> 00:43:31,060 So erinnern daran, dass die Geschichte, die Nick war erzählt hier war die gleiche Idee wie das, was 852 00:43:31,060 --> 00:43:34,050 Ich habe mit der Illusion gezogen Kreide auf dem Brett gibt. 853 00:43:34,050 --> 00:43:35,960 X und Y erklärt. 854 00:43:35,960 --> 00:43:39,690 >> Dann haben wir die Größe der zugeteilten ein int und lagerte sie in x. 855 00:43:39,690 --> 00:43:42,130 Dann wird die nächste Linie haben wir x *. 856 00:43:42,130 --> 00:43:46,070 Dies war Nicks Zauberstab von Dereferenzierung. 857 00:43:46,070 --> 00:43:49,780 Das setzte 42 in dem Speicher von x hingewiesen. 858 00:43:49,780 --> 00:43:51,600 >> Aber das ist, wo die Dinge ging schief. 859 00:43:51,600 --> 00:43:51,820 Right? 860 00:43:51,820 --> 00:43:53,550 Wir haben versucht, dereference y. 861 00:43:53,550 --> 00:43:55,620 Aber y hatte einige falsche Wert, nicht wahr? 862 00:43:55,620 --> 00:43:57,720 >> Dass Pfeil in der linken unteren Ecke, ist nicht 863 00:43:57,720 --> 00:43:58,950 tatsächlich zeigt auf nichts. 864 00:43:58,950 --> 00:44:01,520 Es ist eine Art zu tun, was ich habe hier im Board. 865 00:44:01,520 --> 00:44:05,900 So schlimme Dinge passieren, Segmentierung Fehler oder Binky Fehler in diesem Fall. 866 00:44:05,900 --> 00:44:10,800 >> Aber wenn wir dann fix, dass dadurch x bekommt y wie funktioniert die Geschichte ändern? 867 00:44:10,800 --> 00:44:15,760 Nun, wenn ich x y bekommt, das ist effektiv das gleiche wie zu sagen 868 00:44:15,760 --> 00:44:19,235 was auch immer das ist, Ox-etwas wird gleich hier sein, 869 00:44:19,235 --> 00:44:20,080 Ox-etwas. 870 00:44:20,080 --> 00:44:22,970 Oder bildhaft zeichnen wir einen Pfeil. 871 00:44:22,970 --> 00:44:25,530 >> Also hier auf dem Brett mit Binky, mit der nächsten Zeile des 872 00:44:25,530 --> 00:44:28,350 Code bedeutet * y dorthin gehen. 873 00:44:28,350 --> 00:44:29,400 Wo gibt es denn? 874 00:44:29,400 --> 00:44:30,820 Es bedeutet hier. 875 00:44:30,820 --> 00:44:36,050 >> Und wenn wir aktualisieren, die 13 sein es nur geht und gehen 876 00:44:36,050 --> 00:44:39,470 Schreiben 13 jetzt hier. 877 00:44:39,470 --> 00:44:44,130 Also vielleicht nicht ganz einfach auf den ersten Blick. 878 00:44:44,130 --> 00:44:47,740 Aber zur Erinnerung und um den gleichen Jargon das Binky wurde hier mit, so 879 00:44:47,740 --> 00:44:50,485 die ersten beiden verteilen die Zeiger, x und y, aber nicht die pointees. 880 00:44:50,485 --> 00:44:54,750 Und pointees ist kein allgemein verwendeter Begriff. 881 00:44:54,750 --> 00:44:56,120 Aber Zeiger ist absolut. 882 00:44:56,120 --> 00:44:59,200 Aber es ist, was gerade darauf bei in Binkys Nomenklatur. 883 00:44:59,200 --> 00:45:01,660 >> Die nächste Linie natürlich ordnet eine int pointee. 884 00:45:01,660 --> 00:45:04,840 So ein Teil des Speichers - wie ich über zog auf der rechten Seite gibt es - und Satz 885 00:45:04,840 --> 00:45:06,470 x gleich auf ihn verweisen. 886 00:45:06,470 --> 00:45:11,350 Diese dereferenziert x bis 42 in speichern die Erinnerung, dass es an zeigt. 887 00:45:11,350 --> 00:45:13,380 Und dann natürlich war eine schlechte Sache. 888 00:45:13,380 --> 00:45:15,600 Da y nicht zeigen bei noch nichts. 889 00:45:15,600 --> 00:45:16,530 Dies behebt es. 890 00:45:16,530 --> 00:45:18,240 Also das ist immer noch buggy Programm. 891 00:45:18,240 --> 00:45:21,580 Nur weil wir durch das Einblasen Code Zeile für Zeile und sagen, na ja, 892 00:45:21,580 --> 00:45:22,690 lassen Sie es dort abstürzen. 893 00:45:22,690 --> 00:45:23,420 Das ist eine schlechte Sache. 894 00:45:23,420 --> 00:45:26,790 Quoten sind das Programm ist nur los, um abbrechen insgesamt bei dieser Linie. 895 00:45:26,790 --> 00:45:30,550 Aber wenn Sie zu entfernen waren abgestürzt Zeile und ersetzen Sie es mit den letzten beiden 896 00:45:30,550 --> 00:45:32,470 Linien dort zuweisen - 897 00:45:32,470 --> 00:45:35,310 mit Zeiger Zuordnung - y um x als Punkt t zeigen. 898 00:45:35,310 --> 00:45:39,280 Und dann dereference y in einer sehr sicheren Weise. 899 00:45:39,280 --> 00:45:41,520 >> Also, wo führt uns das? 900 00:45:41,520 --> 00:45:45,350 Nun, stellt sich heraus, dass unter der Haube in der CS50-Bibliothek, sind Zeiger 901 00:45:45,350 --> 00:45:46,320 durchgehend verwendet. 902 00:45:46,320 --> 00:45:48,910 Und wir werden tatsächlich zu schälen beginnen zurück, dass lange Schicht vor. 903 00:45:48,910 --> 00:45:51,740 Aber es stellt sich auch, einen Ausdruck, einige von euch vielleicht bekannt sein, 904 00:45:51,740 --> 00:45:54,580 insbesondere diejenigen, komfortabler, ist eigentlich, dass von einer sehr beliebten 905 00:45:54,580 --> 00:45:56,390 Website oder Stack-Überlauf, in diesen Tagen. 906 00:45:56,390 --> 00:45:58,720 >> Aber das hat eigentlich sehr technische Bedeutung. 907 00:45:58,720 --> 00:46:00,160 Wir wissen jetzt, was ein Stack ist. 908 00:46:00,160 --> 00:46:02,550 Es ist wie ein Stapel von Ablagen innerhalb eines Speisesaal. 909 00:46:02,550 --> 00:46:05,140 >> Oder im Inneren Ihres Computers Speicher its diese Frames 910 00:46:05,140 --> 00:46:06,900 , die durch Funktionen verwendet. 911 00:46:06,900 --> 00:46:10,760 Nun stellt sich heraus, dass aus diesem Grund sehr einfache Implementierung 912 00:46:10,760 --> 00:46:14,970 Speicher und die Rahmen auf der sogenannten stapeln, können Sie tatsächlich die Kontrolle 913 00:46:14,970 --> 00:46:17,050 eines Computersystems ziemlich leicht. 914 00:46:17,050 --> 00:46:22,180 Sie können in ein System zu hacken, wenn die Menschen wie wir haben nicht unser Code geschrieben 915 00:46:22,180 --> 00:46:23,300 besonders gut. 916 00:46:23,300 --> 00:46:26,670 >> Wenn Leute wie uns nutzen Brocken von Speicher-Arrays oder Verwendung - 917 00:46:26,670 --> 00:46:27,810 sogar häufiger - 918 00:46:27,810 --> 00:46:31,800 aber manchmal vergessen, die überprüfen Grenzen unserer Reihe, wie Sie vielleicht 919 00:46:31,800 --> 00:46:38,470 haben Sie sich manchmal, und wiederholt viel zu weit über das Ende ein Array. 920 00:46:38,470 --> 00:46:40,520 Im besten Fall, das Programm vielleicht einfach abstürzen. 921 00:46:40,520 --> 00:46:42,280 Segmentation fault, Art peinlich. 922 00:46:42,280 --> 00:46:45,480 Nicht so toll, aber es ist nicht unbedingt eine äusserst schlechte Sache. 923 00:46:45,480 --> 00:46:49,480 >> Aber wenn Ihr Programm ist eigentlich auf realen Computern der Benutzer, wenn es läuft 924 00:46:49,480 --> 00:46:53,070 auf einer Website, dass die tatsächlichen random people im Internet sind Schlagen, ließ 925 00:46:53,070 --> 00:46:56,690 Menschen induzieren schlechte Dinge über Ihr Code in der Regel nicht eine gute Sache, weil 926 00:46:56,690 --> 00:46:59,930 es bedeutet, eine Gelegenheit zu ergreifen, Steuerung des Computers. 927 00:46:59,930 --> 00:47:01,350 Und das wird aussehen ein wenig kryptisch. 928 00:47:01,350 --> 00:47:04,570 Aber ich dachte, ich würde dich erschrecken mit Dieses letzte Beispiel hier. 929 00:47:04,570 --> 00:47:05,650 >> Hier ist ein Beispiel des Codes. 930 00:47:05,650 --> 00:47:07,370 Und es gibt eine gute Wikipedia Artikel, die durch Spaziergänge 931 00:47:07,370 --> 00:47:08,530 dies näher. 932 00:47:08,530 --> 00:47:13,890 Ich habe wichtigsten auf der Unterseite Berufung foo, vorbei in argv von 1. 933 00:47:13,890 --> 00:47:15,750 Und das ist nur so, dass man starten Sie das Programm und geben 934 00:47:15,750 --> 00:47:17,080 eine beliebige Eingabe. 935 00:47:17,080 --> 00:47:20,180 >> Und dann foo wird oben erklärt wie die Annahme eines String oder mehr 936 00:47:20,180 --> 00:47:21,700 genau, ein char *. 937 00:47:21,700 --> 00:47:23,860 Dann deklariert ein Array von Zeichen. 938 00:47:23,860 --> 00:47:27,130 Nennen Sie es einen Puffer, ganz allgemein, von Größe 12. 939 00:47:27,130 --> 00:47:30,900 So können 12 Zeichen hineinpassen dieses Array namens c. 940 00:47:30,900 --> 00:47:33,510 >> Und dann wird diese neue Funktion, was ist neu, aber nicht schwer zu 941 00:47:33,510 --> 00:47:34,930 verstehen, Speicher zu kopieren. 942 00:47:34,930 --> 00:47:39,290 Er kopiert den Speicher von Bar, das war die Variable letzten n, unabhängig von der 943 00:47:39,290 --> 00:47:42,080 Benutzer in argv 1 in c getippt. 944 00:47:42,080 --> 00:47:43,090 Wie viele Bytes? 945 00:47:43,090 --> 00:47:44,260 Die String-Länge des Stabes. 946 00:47:44,260 --> 00:47:48,380 >> Mit anderen Worten, wenn der Benutzer in h-e-l-l-o eingeben, wird der String-Länge 947 00:47:48,380 --> 00:47:49,260 von hello ist fünf. 948 00:47:49,260 --> 00:47:52,790 Also fünf dieser Bytes wird erhalten kopiert in das Array mit Namen C, das 949 00:47:52,790 --> 00:47:54,110 ist von Größe 12. 950 00:47:54,110 --> 00:47:58,710 Aber was die Benutzer in eine viel längere Wort, das 13 Zeichen oder 14 ist 951 00:47:58,710 --> 00:48:01,250 Zeichen oder 100 Zeichen oder mehr? 952 00:48:01,250 --> 00:48:02,660 >> Wo sind sie hin? 953 00:48:02,660 --> 00:48:06,090 Nun, dass der Rahmen, das Fach in den Speisesaal Stapel, 954 00:48:06,090 --> 00:48:06,930 sie gehen, um dorthin zu gehen. 955 00:48:06,930 --> 00:48:10,080 Und es ist einfach anfangen zu überschreiben andere Sachen, die sich bereits 956 00:48:10,080 --> 00:48:12,880 auf diesem Stapel, Überlaufen der Stapel, so zu sprechen. 957 00:48:12,880 --> 00:48:14,780 >> So bildhaft, es auf diese Weise zu denken. 958 00:48:14,780 --> 00:48:17,970 Dies ist nur eine bunte Version das Bild, das wir schon seit Zeichnung. 959 00:48:17,970 --> 00:48:20,060 Am unteren Ende, sagen wir, ist main. 960 00:48:20,060 --> 00:48:24,690 Und auf der Spitze, was Sie jetzt sehen ist der Rahmen, Farbe jetzt für ein codiert 961 00:48:24,690 --> 00:48:26,090 Funktion namens foo. 962 00:48:26,090 --> 00:48:30,170 Aber was ist interessant, hier zu foo ist, dass hier dem Rahmen. 963 00:48:30,170 --> 00:48:32,860 So ist es, so wie ich gezeichnet tat, aber in hellblau. 964 00:48:32,860 --> 00:48:35,220 Und das ist jetzt, wo c Halterung 0 geht. 965 00:48:35,220 --> 00:48:37,410 Und das ist, wo c Halterung 11 wird am Ende. 966 00:48:37,410 --> 00:48:39,670 >> Mit anderen Worten, es geschieht als Quadrat dargestellt werden. 967 00:48:39,670 --> 00:48:42,320 Aber wenn Sie nur halten Plopp bytes down - oder Zeichen - sie gehen zu Ende 968 00:48:42,320 --> 00:48:46,070 bis an der Stelle 0 den ganzen Weg bis bis 11, weil es null indexiert. 969 00:48:46,070 --> 00:48:49,170 >> Aber wo ist das 13. Zeichen gehen, um am Ende? 970 00:48:49,170 --> 00:48:50,310 Wo ist der 14.? 971 00:48:50,310 --> 00:48:52,430 Wo ist der 50. Charakter gehen, um am Ende? 972 00:48:52,430 --> 00:48:54,070 >> Es wird immer nach unten. 973 00:48:54,070 --> 00:48:57,350 Denn obwohl wir die gezogene Bild mit dem Stapel aufwachsen, die 974 00:48:57,350 --> 00:48:59,920 Adressen, es stellt sich heraus, aus gehen kleiner Adressen, kleine 975 00:48:59,920 --> 00:49:01,830 Zeiger, große Adressen. 976 00:49:01,830 --> 00:49:03,540 So ist es einfach immer weiter steigt und steigt. 977 00:49:03,540 --> 00:49:05,660 >> Also, wenn der Benutzer in hallo, das ist großartig. 978 00:49:05,660 --> 00:49:08,650 Kein Fehler, kein Problem, jeder ist sicher. 979 00:49:08,650 --> 00:49:11,940 Aber wenn der Benutzer in was wir rufen kontradiktorischen Code, vertreten 980 00:49:11,940 --> 00:49:16,040 allgemein als ein, Angriff, Angriff, Angriff, Angriff, was kann passieren? 981 00:49:16,040 --> 00:49:19,760 >> Nun, wenn alle Eingaben, die der Benutzer eingetippt ist nicht nur eine freundliche 982 00:49:19,760 --> 00:49:21,540 oder offensive Zeichenfolge. 983 00:49:21,540 --> 00:49:24,050 Es ist eigentlich eine Folge von Zeichen dass, wenn Sie es zusammengestellt, 984 00:49:24,050 --> 00:49:26,050 es ist eigentlich Code. 985 00:49:26,050 --> 00:49:29,570 Vielleicht ist es, dass Code löscht alle Dateien auf Ihrer Festplatte oder versendet Spam 986 00:49:29,570 --> 00:49:30,810 oder so ähnlich. 987 00:49:30,810 --> 00:49:35,110 Beachten Sie, dass das, was ist der Schlüssel hier ist, dass wenn der Bösewicht hatte Glück genug, um 988 00:49:35,110 --> 00:49:37,830 überschreiben Sie den roten Teil des Speichers - 989 00:49:37,830 --> 00:49:41,080 was ich nicht auf mein Bild aber zeichnen Dieses Bild hier hat Wikipedia - 990 00:49:41,080 --> 00:49:42,890 seine sogenannte Absenderadresse. 991 00:49:42,890 --> 00:49:47,470 >> Wenn die Nahrung Renditen, wenn Swap-Renditen wie funktioniert der Computer wissen aus gehen 992 00:49:47,470 --> 00:49:49,790 bis hier, um hier unten? 993 00:49:49,790 --> 00:49:52,920 Oder in der Tech-Segment oben, wie weiß er aus dem Swap gehen 994 00:49:52,920 --> 00:49:54,870 Code - die 0 und 1 ist das komponieren Swap - 995 00:49:54,870 --> 00:49:56,020 zurück zur Hauptansicht? 996 00:49:56,020 --> 00:50:00,450 Es gibt eine sogenannte Rücksprungadresse gespeichert in demselben Stapelrahmen auf 997 00:50:00,450 --> 00:50:02,140 das gleiche Cafeteria-Tablett. 998 00:50:02,140 --> 00:50:06,080 >> Also, wenn der Bösewicht ist klug genug, um legte Angriff Code, Code Angriff, Angriff 999 00:50:06,080 --> 00:50:07,960 Code, und mit etwas Glück genug - 1000 00:50:07,960 --> 00:50:11,630 oft durch Versuch und Irrtum - zu überschreiben, dass rot Rücksprungadresse, 1001 00:50:11,630 --> 00:50:14,360 mit der Adresse und Bekanntmachung ganz oben. 1002 00:50:14,360 --> 00:50:16,830 Unsere 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Es steht geschrieben rückwärts bis oben für Gründen wir vielleicht überdenken. 1004 00:50:20,650 --> 00:50:22,050 Dies ist die Nummer. 1005 00:50:22,050 --> 00:50:25,790 >> Also, wenn der Bösewicht bekommt das Glück oder ist intelligent genug, um den roten überschreiben 1006 00:50:25,790 --> 00:50:29,480 Streifen der Speicher mit der Adresse Code, dass er oder sie muss irgendwie 1007 00:50:29,480 --> 00:50:34,980 eingespritzt in Ihren Computer, schätze deren Code wird zurückgegeben werden 1008 00:50:34,980 --> 00:50:38,260 sobald foo erfolgt die Ausführung? 1009 00:50:38,260 --> 00:50:39,440 >> Der Bösewicht den Code. 1010 00:50:39,440 --> 00:50:43,610 Also dieses Angriffs-Code, AAA, wieder Macht Spam, vielleicht löschen Sie alle Dateien 1011 00:50:43,610 --> 00:50:44,500 auf Ihrer Festplatte. 1012 00:50:44,500 --> 00:50:48,740 Aber das ist, was wirklich ein Stack-Überlauf ist, oder ein Pufferüberlauf oder eine 1013 00:50:48,740 --> 00:50:51,060 Pufferüberlauf Angriff. 1014 00:50:51,060 --> 00:50:54,400 >> Und es ist unglaublich, unglaublich weit verbreitet bis zum heutigen Tag mit Programmen geschrieben in 1015 00:50:54,400 --> 00:50:58,220 C, C + +, und auch einige andere Sprachen. 1016 00:50:58,220 --> 00:51:02,275 Auf dieser beängstigend beachten, werden wir Ende mit einem Witz. 1017 00:51:02,275 --> 00:51:03,230 >> [Gelächter] 1018 00:51:03,230 --> 00:51:04,550 >> Wir sehen uns am Mittwoch. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 An der nächsten CS50 - 1021 00:51:10,310 --> 00:51:15,920 Also ich bin ganz aus Festplattenspeicher Lampen heute aber warten, fettfreie Milch, die Hälfte der Telefon 1022 00:51:15,920 --> 00:51:17,850 Buch, das Orangensaft dass ich trank heute. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB-Kabel, ein Schraubenschlüssel. 1025 00:51:22,780 --> 00:51:24,800 >> [Musik spielt]