1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Woche 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [Dies ist CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Dies ist CS50, Woche 5. 5 00:00:09,740 --> 00:00:12,900 Heute und in dieser Woche stellen wir ein wenig von der Welt der Forensik 6 00:00:12,900 --> 00:00:14,850 im Rahmen des Problems Set 4. 7 00:00:14,850 --> 00:00:18,480 Heute wird eine gekürzte Vortrages sein, weil es ein besonderes Ereignis hier hinterher. 8 00:00:18,480 --> 00:00:21,940 So nehmen wir einen Blick und necken sowohl Studenten und Eltern gleichermaßen heute 9 00:00:21,940 --> 00:00:24,600 mit einigen der Dinge, die am Horizont. 10 00:00:24,600 --> 00:00:29,050 >> Unter ihnen ab Montag, haben Sie noch ein paar Klassenkameraden. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard und MIT das neue Online-Initiative für OpenCourseWare und mehr, 12 00:00:32,980 --> 00:00:36,730 auf Harvard-Campus startet am Montag, die kommen Montag bedeutet 13 00:00:36,730 --> 00:00:40,930 Sie haben, wie der letzten Zählung, 86.000 zusätzliche Klassenkameraden 14 00:00:40,930 --> 00:00:43,680 wer wird nach zusammen mit CS50 Vorlesungen und Sektionen 15 00:00:43,680 --> 00:00:45,890 und Komplettlösungen und Problem-Sets. 16 00:00:45,890 --> 00:00:51,870 Und als Teil dieser, werden Sie Mitglied der konstituierenden Klasse von CS50 und jetzt CS50x werden. 17 00:00:51,870 --> 00:00:56,150 Als Teil dieser jetzt erkennen, dass es einige upsides als gut. 18 00:00:56,150 --> 00:01:00,620 Um bereit für diese, für die große Anzahl von Studenten, 19 00:01:00,620 --> 00:01:03,820 es genügt zu sagen, dass, obwohl wir 108 TFs und CAs 20 00:01:03,820 --> 00:01:07,560 es ist nicht ganz der beste Schüler-Lehrer-Verhältnis, wenn wir 80.000 der Studenten getroffen. 21 00:01:07,560 --> 00:01:09,830 Wir gehen nicht zu einem Gehalt so viele Probleme setzt manuell 22 00:01:09,830 --> 00:01:13,050 eingeführt, so in dieser Woche das Problem Set wird CS50 prüfen sein, 23 00:01:13,050 --> 00:01:15,410 was wird ein Befehlszeilen-Dienstprogramm innerhalb des Gerätes 24 00:01:15,410 --> 00:01:17,880 dass Sie bekommen, wenn Sie es später aktualisieren an diesem Wochenende. 25 00:01:17,880 --> 00:01:21,030 Du wirst in der Lage sein, um einen Befehl, check50, auf eigene Faust pset laufen, 26 00:01:21,030 --> 00:01:24,770 und du wirst eine sofortige Rückmeldung zu bekommen, ob das Programm richtig oder falsch ist 27 00:01:24,770 --> 00:01:27,980 nach verschiedenen Design-Spezifikationen, die wir zur Verfügung gestellt haben. 28 00:01:27,980 --> 00:01:30,310 Mehr dazu in dem Problem set-Spezifikation. 29 00:01:30,310 --> 00:01:34,220 Die CS50x Klassenkameraden verwenden werden diese als gut. 30 00:01:34,220 --> 00:01:36,170 >> Problem Set 4 dreht sich alles um Forensik, 31 00:01:36,170 --> 00:01:38,630 und dies pset war wirklich von einigen realen Sachen inspirieren 32 00:01:38,630 --> 00:01:41,210 wodurch dann, wenn ich in Graduiertenschule war ich interniert für eine Weile 33 00:01:41,210 --> 00:01:45,270 mit Middlesex County District Attorney Büro zu tun forensische Arbeit 34 00:01:45,270 --> 00:01:47,660 mit ihren Blei Forensiker. 35 00:01:47,660 --> 00:01:50,280 Was diese beliefen sich auf, wie ich glaube, ich erwähnte ein paar Wochen vorbei, 36 00:01:50,280 --> 00:01:52,720 ist die Masse State Police oder andere würde kommen, 37 00:01:52,720 --> 00:01:56,150 sie würden Drop-off Dinge wie Festplatten und CDs und Disketten und dergleichen, 38 00:01:56,150 --> 00:01:58,770 und dann das Ziel der Forensik Büro war, zu bestimmen 39 00:01:58,770 --> 00:02:01,470 ob es war oder nicht Beweise einiger sortieren. 40 00:02:01,470 --> 00:02:04,730 Dies war der Special Investigations Unit, so war es von Wirtschaftskriminalität. 41 00:02:04,730 --> 00:02:10,949 Es war mehr beunruhigende Art von Verbrechen, nichts mit irgendeine Art von digitalen Medien. 42 00:02:10,949 --> 00:02:16,450 Es stellt sich heraus, dass nicht so viele Leute eine E-Mail zu sagen schreiben, "ich es tat." 43 00:02:16,450 --> 00:02:20,490 So oft hatten diese forensische Suchbegriffe nicht erscheinen, dass alle viel Obst, 44 00:02:20,490 --> 00:02:22,820 aber manchmal Leute schreiben würden solche E-Mails. 45 00:02:22,820 --> 00:02:25,240 Also manchmal wurden die Bemühungen belohnt. 46 00:02:25,240 --> 00:02:31,210 >> Aber zu führen bis zu diesem forensischen pset, wir in pset4 vorstellen ein bisschen von Grafiken. 47 00:02:31,210 --> 00:02:35,410 Sie wahrscheinlich diese Dinge für selbstverständlich - JPEGs, GIFs und dergleichen - in diesen Tagen. 48 00:02:35,410 --> 00:02:38,320 Aber wenn du wirklich darüber nachdenken, ein Bild, ähnlich wie Rob Gesicht, 49 00:02:38,320 --> 00:02:41,270 konnte als eine Sequenz von Punkten oder Pixeln modelliert werden. 50 00:02:41,270 --> 00:02:43,380 Im Falle der Rob Gesicht, gibt es alle Arten von Farben, 51 00:02:43,380 --> 00:02:46,760 und wir damit begonnen, die einzelnen Punkte, die auch als Pixel bezeichnet sehen, 52 00:02:46,760 --> 00:02:48,610 sobald wir angefangen zu vergrößern in. 53 00:02:48,610 --> 00:02:54,660 Aber wenn wir zu vereinfachen, die Welt ein wenig und nur sagen, dass dies hier ist Rob in schwarz und weiß, 54 00:02:54,660 --> 00:02:57,490 auf Schwarz und Weiß darstellen, können wir einfach binär. 55 00:02:57,490 --> 00:03:01,660 Und wenn wir gehen, um binäre verwenden, 1 oder 0, können wir ausdrücken dieses gleiche Bild 56 00:03:01,660 --> 00:03:06,140 von Rob lächelndes Gesicht mit diesem Muster von Bits. 57 00:03:06,140 --> 00:03:12,100 11000011 stellt weiß, weiß, schwarz, schwarz, schwarz, schwarz, weiß, weiß. 58 00:03:12,100 --> 00:03:16,150 Und so ist es nicht ein großer Sprung dann darüber zu sprechen bunten Fotografien, 59 00:03:16,150 --> 00:03:18,600 Dinge, die man auf Facebook sehen oder mit einer Digitalkamera hatte. 60 00:03:18,600 --> 00:03:21,410 Aber sicherlich, wenn es um Farben geht, brauchen Sie mehr Bits. 61 00:03:21,410 --> 00:03:25,690 Und recht häufig in der Welt der Fotos ist nicht 1-Bit-Farbe zu verwenden, 62 00:03:25,690 --> 00:03:29,560 da dies nahe legt, aber. 24-Bit-Farbe, wo Sie tatsächlich Millionen von Farben 63 00:03:29,560 --> 00:03:32,250 So wie in dem Fall, wenn wir uns auf Rob Auge gezoomt, 64 00:03:32,250 --> 00:03:36,370 das war eine beliebige Anzahl von Millionen von verschiedenen bunten Möglichkeiten. 65 00:03:36,370 --> 00:03:39,040 Also werden wir dies Problem Set 4 sowie in der exemplarischen Vorgehensweise einzuführen, 66 00:03:39,040 --> 00:03:43,370 die wird heute um 3:30 Uhr statt der üblichen 02.30 aufgrund Freitag Vortrag hier. 67 00:03:43,370 --> 00:03:46,620 Aber Video online sein wird wie gewohnt morgen. 68 00:03:46,620 --> 00:03:48,820 >> Wir werden auch eine Einführung in ein anderes Dateiformat. 69 00:03:48,820 --> 00:03:51,270 Dies ist absichtlich soll auf den ersten Blick einschüchternd, 70 00:03:51,270 --> 00:03:55,670 aber das ist nur Teil der Dokumentation für eine C-Struktur. 71 00:03:55,670 --> 00:03:58,940 Es stellt sich heraus, dass Microsoft vor Jahren geholfen zu popularisieren dieses Format 72 00:03:58,940 --> 00:04:05,150 als die Bitmap-Datei-Format, bmp, und dies war ein super einfache, bunte grafische Dateiformat 73 00:04:05,150 --> 00:04:10,150 Das war für einige Zeit verwendet und manchmal noch für Tapeten auf Desktops. 74 00:04:10,150 --> 00:04:14,760 Wenn Sie glauben, zurück zu Windows XP und den sanften Hügeln und den blauen Himmel, 75 00:04:14,760 --> 00:04:17,170 das war in der Regel ein BMP-oder Bitmap-Bild. 76 00:04:17,170 --> 00:04:19,959 Bitmaps sind ein Spaß für uns, weil sie ein bisschen mehr Komplexität zu haben. 77 00:04:19,959 --> 00:04:22,610 Es ist nicht ganz so einfach, wie dieses Netz von 0s und 1s. 78 00:04:22,610 --> 00:04:27,510 Stattdessen müssen Sie Dinge wie ein Header am Anfang einer Datei. 79 00:04:27,510 --> 00:04:31,990 Also mit anderen Worten, innerhalb eines. Bmp-Datei ist ein ganzes Bündel von 0 und 1, 80 00:04:31,990 --> 00:04:34,910 aber es gibt einige zusätzliche 0s und 1s drin. 81 00:04:34,910 --> 00:04:38,220 Und es stellt sich heraus, dass das, was wir haben wahrscheinlich gemacht für für Jahre gewährt - 82 00:04:38,220 --> 00:04:45,170 Dateiformate wie. doc oder. xls oder. mp3,. mp4, unabhängig von den Dateiformaten 83 00:04:45,170 --> 00:04:48,480 dass Sie vertraut sind - was bedeutet das sogar bedeuten, ein Dateiformat, 84 00:04:48,480 --> 00:04:52,480 denn am Ende des Tages alle diese Dateien benutzen wir haben nur 0 und 1. 85 00:04:52,480 --> 00:04:56,810 Und vielleicht die 0 und 1 stellen ABC über ASCII oder dergleichen, 86 00:04:56,810 --> 00:04:58,820 aber am Ende des Tages, es ist immer noch nur 0 und 1. 87 00:04:58,820 --> 00:05:02,100 So Mensch nur gelegentlich entscheiden, ein neues Dateiformat erfinden 88 00:05:02,100 --> 00:05:06,420 wo sie zu standardisieren, was Abfolgen von Bits wird eigentlich bedeuten. 89 00:05:06,420 --> 00:05:09,220 Und in diesem Fall hier, die Leute, die konzipiert die Bitmap-Datei-Format 90 00:05:09,220 --> 00:05:15,620 sagte, dass bei der ersten Byte in einer Bitmap-Datei, wie Offset 0 gibt bezeichnet, 91 00:05:15,620 --> 00:05:18,940 es wird einige kryptisch benannten Variable namens bfType sein, 92 00:05:18,940 --> 00:05:23,080 die gerade steht für Bitmap-Datei-Typ, welche Art von Bitmap-Datei ist. 93 00:05:23,080 --> 00:05:27,700 Sie können vielleicht folgern aus der zweiten Reihe, dass 2 Offset-Byte-Zahl 2, 94 00:05:27,700 --> 00:05:33,740 ein Muster von 0 und 1, was bedeutet? Die Größe von etwas. 95 00:05:33,740 --> 00:05:35,310 Und es geht weiter von dort. 96 00:05:35,310 --> 00:05:37,410 Also Problem Set 4, werden Sie durch einige dieser Dinge begangen werden. 97 00:05:37,410 --> 00:05:39,520 Wir werden am Ende nicht die Sorge um alle von ihnen. 98 00:05:39,520 --> 00:05:47,510 Aber merkt es beginnt zu umgehen Byte 54 interessant: rgbtBlue, Grün und Rot. 99 00:05:47,510 --> 00:05:52,110 Wenn Sie jemals gehört habe die Abkürzung RGB - rot, grün, blau - das ist ein Hinweis auf, dass 100 00:05:52,110 --> 00:05:54,610 weil sich herausstellt, können Sie malen alle Farben des Regenbogens 101 00:05:54,610 --> 00:05:58,180 mit einer Kombination aus rot und blau und grün. 102 00:05:58,180 --> 00:06:03,320 Und in der Tat, könnte Eltern im Zimmer erinnern an einige der frühesten Projektoren. 103 00:06:03,320 --> 00:06:05,890 In diesen Tagen, die Sie gerade sehen ein helles Licht, das aus einer Linse, 104 00:06:05,890 --> 00:06:09,800 aber wieder in den Tag hatten Sie die rote Linse, die blaue Linse, und die grüne Linse, 105 00:06:09,800 --> 00:06:13,380 und gemeinsam ausgerichtet auf einen Bildschirm und bildeten ein buntes Bild. 106 00:06:13,380 --> 00:06:16,270 Und ziemlich oft, würde Mittelschulen und Gymnasien haben diese Linsen 107 00:06:16,270 --> 00:06:19,720 immer so leicht schief, so dass Sie waren irgendwie sehen doppelt oder dreifach Bildern. 108 00:06:19,720 --> 00:06:24,100 Aber das war die Idee. Sie hatten rote, grüne und blaue Licht ein Bild zu malen. 109 00:06:24,100 --> 00:06:26,590 Und das gleiche Prinzip wird bei Computern verwendet. 110 00:06:26,590 --> 00:06:30,230 >> So gehören zu den Herausforderungen dann für Sie in Problem Set 4 gehen, um ein paar Dinge zu sein. 111 00:06:30,230 --> 00:06:34,800 Eines ist, um tatsächlich die Größe eines Bildes, die in einem Muster von 0 und 1 annehmen, 112 00:06:34,800 --> 00:06:40,200 herauszufinden, welche Brocken von 0 und 1, was in einer Struktur wie folgt darstellen, 113 00:06:40,200 --> 00:06:43,630 und dann herausfinden, wie man die Pixel replizieren - die Roten, die Blues, die Greens - 114 00:06:43,630 --> 00:06:46,660 innen, so dass, wenn ein Bild so aussieht zunächst 115 00:06:46,660 --> 00:06:49,210 Es könnte wie folgt statt zu suchen danach. 116 00:06:49,210 --> 00:06:53,640 Zu den weiteren Herausforderungen zu sein wird, dass Sie eine forensische werde übergeben werden 117 00:06:53,640 --> 00:06:56,030 einer tatsächlichen Datei von einer Digitalkamera. 118 00:06:56,030 --> 00:06:58,960 Und auf dieser Kamera, einmal eine Zeit, da waren eine ganze Reihe von Fotos. 119 00:06:58,960 --> 00:07:03,760 Das Problem ist, dass wir versehentlich gelöscht oder hatten das Bild verfälscht irgendwie. 120 00:07:03,760 --> 00:07:05,750 Schlimme Dinge passieren mit digitalen Kameras. 121 00:07:05,750 --> 00:07:09,150 Und so haben wir schnell alle 0s und 1s aus dieser Karte für Sie kopiert, 122 00:07:09,150 --> 00:07:13,610 rettete sie alle in eine große Datei, und dann werden wir sie Ihnen Hand in Problem-Set 4 123 00:07:13,610 --> 00:07:19,320 so dass Sie ein Programm schreiben, in C, mit denen all diese JPEGs erholen, ideal. 124 00:07:19,320 --> 00:07:23,330 Und es stellt sich heraus, dass die JPEGs, obwohl sie etwas sind ein komplexes Dateiformat - 125 00:07:23,330 --> 00:07:26,360 sie sind viel komplexer als dieses lächelnde Gesicht hier - 126 00:07:26,360 --> 00:07:31,160 es stellt sich heraus, dass jeder JPEG mit den gleichen Mustern von 0 und 1 beginnt. 127 00:07:31,160 --> 00:07:35,630 Also mit letztlich eine while-Schleife oder einer for-Schleife oder ähnliches, 128 00:07:35,630 --> 00:07:38,880 Sie können über alle 0s und 1s in diesem forensische durchlaufen, 129 00:07:38,880 --> 00:07:43,150 und jedes Mal, wenn Sie das spezielle Muster, die in dem Problem set-Spezifikation definiert ist, 130 00:07:43,150 --> 00:07:47,880 Sie können hier davon ist, mit sehr hoher Wahrscheinlichkeit, der Beginn eines JPEG. 131 00:07:47,880 --> 00:07:51,230 Und sobald Sie das gleiche Muster findet eine gewisse Anzahl von Bytes 132 00:07:51,230 --> 00:07:55,430 oder Kilobyte oder Megabyte später, können Sie hier annehmen können, ist eine zweite JPEG, 133 00:07:55,430 --> 00:07:57,380 das Foto nahm ich nach dem ersten ein. 134 00:07:57,380 --> 00:08:01,370 Lassen Sie mich aufhören zu lesen, dass die erste Datei, mit dem Schreiben beginnen dieses neue, 135 00:08:01,370 --> 00:08:06,310 und die Ausgabe des Programms für pset4 wird, so viele wie 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 Und wenn es nicht 50 JPEGs, müssen Sie ein bisschen einer Schleife. 137 00:08:09,270 --> 00:08:12,490 Wenn Sie eine unendliche Anzahl von JPEGs haben, haben Sie eine Endlosschleife. 138 00:08:12,490 --> 00:08:14,910 Damit auch Sie eine ganz gewöhnliche Fall sein. 139 00:08:14,910 --> 00:08:16,600 Also das ist, was am Horizont. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 hinter uns, pro meine E-Mail erkennen, dass immer gibt es Leute, die beide glücklich sind, 141 00:08:21,310 --> 00:08:23,640 Art neutral, traurig und rund Quiz 0 mal. 142 00:08:23,640 --> 00:08:26,800 Und bitte erreichen, um mich, der Kopf TF Zamyla, Ihr eigenes TF, 143 00:08:26,800 --> 00:08:31,180 oder eine der CAs, die Sie, wenn Sie möchten, zu diskutieren, wie es ging kennen. 144 00:08:31,180 --> 00:08:35,539 >> So um die Eltern hier beeindrucken im Raum, was ist der CS50-Bibliothek? 145 00:08:36,429 --> 00:08:40,390 [Gelächter] Good job. 146 00:08:40,390 --> 00:08:48,340 Was ist der CS50-Bibliothek? Yeah. >> [Schüler] Es ist ein pre-geschriebenen Satz von Code [unverständlich] 147 00:08:48,340 --> 00:08:49,750 Okay, gut. 148 00:08:49,750 --> 00:08:53,240 Es ist ein pre-geschriebenen Satz von Code, dass wir das Personal schrieb, bieten wir Ihnen, 149 00:08:53,240 --> 00:08:55,030 das bietet einige gemeinsame Funktionalität, 150 00:08:55,030 --> 00:08:59,020 Sachen wie mir ein String, hol mir einen int - alle Funktionen, die hier aufgelistet sind. 151 00:08:59,020 --> 00:09:02,260 >> Ab sofort beginnen wir wirklich diese Stützräder aus. 152 00:09:02,260 --> 00:09:05,050 Wir werden beginnen, nehmen einen String von Ihnen, 153 00:09:05,050 --> 00:09:08,870 die Rückrufaktion war nur ein Synonym für das, was tatsächliche Datentyp? >> [Mehrere Schüler] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Für die Eltern, das war wahrscheinlich [macht whooshing sound]. Das ist gut. 155 00:09:12,730 --> 00:09:17,550 Char * wir beginnen, auf dem Bildschirm umso sehen, wie wir Zeichenfolge zu entfernen aus unserem Wortschatz, 156 00:09:17,550 --> 00:09:19,730 zumindest wenn es darum geht, tatsächlich das Schreiben von Code. 157 00:09:19,730 --> 00:09:22,840 Ebenso werden wir aufhören, einige dieser Funktionen so viel 158 00:09:22,840 --> 00:09:25,280 weil unsere Programme bekommen werden immer ausgefeilter. 159 00:09:25,280 --> 00:09:28,480 Anstatt nur Programme schreiben, die dort sitzen mit einem Prompt blinkt, 160 00:09:28,480 --> 00:09:31,870 Wartezeit für den Benutzer etwas eintippen, werden Ihnen Ihre Eingaben von anderswo zu bekommen. 161 00:09:31,870 --> 00:09:35,490 Zum Beispiel werden Sie sie aus einer Reihe von Bits auf der lokalen Festplatte zu bekommen. 162 00:09:35,490 --> 00:09:38,580 Sie stattdessen bekommen sie in Zukunft von einem Netzwerk-Anschluss, 163 00:09:38,580 --> 00:09:40,230 einige Website irgendwo. 164 00:09:40,230 --> 00:09:44,110 >> Also lasst uns abziehen dieser Schicht zum ersten Mal und ziehen Sie den CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 und diese Datei mit dem Namen cs50.h, die Sie schon # habe auch für Wochen, 166 00:09:49,010 --> 00:09:51,140 aber wir tatsächlich sehen, was drin ist dafür. 167 00:09:51,140 --> 00:09:54,430 Der Anfang der Datei in blau ist nur eine ganze Reihe von Kommentaren: 168 00:09:54,430 --> 00:09:57,050 Informationen zur Garantie und Lizenzierung. 169 00:09:57,050 --> 00:09:59,050 Dies ist eine Art gemeinsames Paradigma in der Software 170 00:09:59,050 --> 00:10:01,580 weil eine Menge von Software in diesen Tagen ist, was Open Source genannt, 171 00:10:01,580 --> 00:10:05,220 was bedeutet, dass jemand den Code geschrieben und machte es frei verfügbar 172 00:10:05,220 --> 00:10:10,470 nicht nur zu laufen und zu bedienen, aber tatsächlich zu lesen und zu verändern und zu integrieren in Ihre eigene Arbeit. 173 00:10:10,470 --> 00:10:14,660 Also das ist, was Sie bisher über Open-Source-Software, wenn auch in einem sehr kleinen Form. 174 00:10:14,660 --> 00:10:18,560 Wenn ich mich an den Kommentaren zu blättern, aber wir beginnen, einige weitere vertraute Dinge zu sehen. 175 00:10:18,560 --> 00:10:25,010 Hinweis am Anfang hier, dass die cs50.h Datei eine ganze Reihe von Header-Dateien enthält. 176 00:10:25,010 --> 00:10:28,560 Die meisten von ihnen haben wir nicht gesehen, aber man kennt. 177 00:10:28,560 --> 00:10:32,270 Welche davon haben wir gesehen, wenn auch nur kurz, so weit? >> [Student] Standard-Bibliothek. 178 00:10:32,270 --> 00:10:35,810 Yeah, Standard-Bibliothek. stdlib.h hat malloc. 179 00:10:35,810 --> 00:10:38,320 Sobald wir kamen ins Gespräch über die dynamische Speicherzuweisung, 180 00:10:38,320 --> 00:10:41,650 welche wir kommen zurück, um nächste Woche sowie begannen wir mit dieser Datei. 181 00:10:41,650 --> 00:10:46,640 Es stellt sich heraus, dass bool und wahr und falsch nicht wirklich in C per se existiert 182 00:10:46,640 --> 00:10:49,440 es sei denn, Sie gehören diese Datei hier. 183 00:10:49,440 --> 00:10:52,710 Wir haben seit Wochen einschließlich stdbool.h 184 00:10:52,710 --> 00:10:55,620 so dass man mit dem Begriff des a bool, true oder false. 185 00:10:55,620 --> 00:10:58,620 Ohne diese müsste man von gefälschten zu sortieren und verwenden Sie ein int 186 00:10:58,620 --> 00:11:02,610 und nur willkürlich annehmen, dass 0 falsch ist und 1 wahr ist. 187 00:11:02,610 --> 00:11:07,150 Wenn wir weiter nach unten scrollen, hier ist unsere Definition einer Zeichenkette. 188 00:11:07,150 --> 00:11:11,390 Es stellt sich heraus, wie wir schon gesagt, dass dort, wo dieser Stern ist nicht wirklich wichtig. 189 00:11:11,390 --> 00:11:13,720 Sie können sogar Platz rundherum. 190 00:11:13,720 --> 00:11:16,740 Wir in diesem Semester wurden fördern, da dies deutlich zu machen, 191 00:11:16,740 --> 00:11:18,620 dass der Stern hat mit der Art zu tun, 192 00:11:18,620 --> 00:11:21,700 aber erkennen, wie üblich, wenn nicht ein wenig mehr gemeinsam, 193 00:11:21,700 --> 00:11:24,430 ist es dort setzen, aber funktional ist es das Gleiche. 194 00:11:24,430 --> 00:11:27,720 Aber jetzt, wenn wir unten weiter lesen, lassen Sie uns einen Blick auf GetInt 195 00:11:27,720 --> 00:11:32,190 weil wir, dass vielleicht zuerst, bevor irgendetwas anderes in diesem Semester verwendet. 196 00:11:32,190 --> 00:11:37,440 Hier ist GetInt. Dies ist, was? >> [Schüler] Ein Prototyp. >> Das ist nur ein Prototyp. 197 00:11:37,440 --> 00:11:41,410 Oft haben wir Prototypen an den Spitzen unserer setzen. C Dateien, 198 00:11:41,410 --> 00:11:46,690 aber du kannst auch Prototypen in Header-Dateien,. h-Dateien, wie dieses hier 199 00:11:46,690 --> 00:11:50,840 so dass, wenn Sie einige Funktionen schreiben, dass Sie möchten, dass andere Menschen in der Lage sein zu verwenden, 200 00:11:50,840 --> 00:11:53,550 Das ist genau der Fall mit der CS50 Bibliothek, 201 00:11:53,550 --> 00:11:57,040 Sie nicht nur die Umsetzung Ihrer Funktionen in so etwas wie cs50.c, 202 00:11:57,040 --> 00:12:02,790 Sie auch setzen die Prototypen nicht an der Spitze dieser Datei aber an der Spitze einer Header-Datei. 203 00:12:02,790 --> 00:12:07,170 Dann, dass die Header-Datei ist, was Freunde und Kollegen sind 204 00:12:07,170 --> 00:12:09,760 mit # in ihren eigenen Code. 205 00:12:09,760 --> 00:12:12,210 So all dieser Zeit, Sie haben auch alle diese Prototypen, 206 00:12:12,210 --> 00:12:16,580 effektiv bei der Anfang der Datei, sondern über diese # include-Mechanismus, 207 00:12:16,580 --> 00:12:20,070 die im Wesentlichen Kopien und Pasten diese Datei in Ihre eigenen. 208 00:12:20,070 --> 00:12:23,070 Hier finden Sie einige ziemlich detaillierte Dokumentation. 209 00:12:23,070 --> 00:12:25,640 Wir haben ziemlich viel für selbstverständlich, dass GetInt einen int bekommt, 210 00:12:25,640 --> 00:12:27,640 aber es stellt sich heraus, es gibt einige Grenzfälle sind. 211 00:12:27,640 --> 00:12:31,810 Was, wenn der Benutzer in einer Zahl, die viel zu groß ist, eine Trillion, 212 00:12:31,810 --> 00:12:35,490 das kann einfach nicht innerhalb eines int passen? Was ist das erwartete Verhalten? 213 00:12:35,490 --> 00:12:38,020 Im Idealfall ist es vorhersehbar. 214 00:12:38,020 --> 00:12:40,280 Also in diesem Fall, wenn Sie tatsächlich das Kleingedruckte lesen, 215 00:12:40,280 --> 00:12:44,500 Sie tatsächlich sehen, dass, wenn die Leitung nicht gelesen werden kann, diese Renditen INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Wir haben nie darüber gesprochen, aber auf der Grundlage ihrer Marktkapitalisierung, was ist es wohl? 217 00:12:48,320 --> 00:12:50,640 [Schüler] A konstant. >> Es ist eine Konstante. 218 00:12:50,640 --> 00:12:54,770 Es gibt einige spezielle Konstante, die wahrscheinlich in einem dieser Header-Dateien deklariert ist 219 00:12:54,770 --> 00:13:00,090 das ist bis oben in der Datei, und INT_MAX ist wahrscheinlich so etwas wie rund 2 Mrd. 220 00:13:00,090 --> 00:13:04,990 Die Idee ist, dass, weil wir irgendwie bedeuten, dass etwas brauchen schief ging, 221 00:13:04,990 --> 00:13:10,700 wir, ja, 4 Milliarden Nummern zur Verfügung: -2 Milliarden bis zu 2 Milliarden, geben oder nehmen. 222 00:13:10,700 --> 00:13:14,710 Nun, was ist üblich in der Programmierung Sie stehlen nur eine von diesen Zahlen, 223 00:13:14,710 --> 00:13:18,920 maybe 0, vielleicht 2 Milliarden, vielleicht -2000000000, 224 00:13:18,920 --> 00:13:23,280 so verbringen Sie eine Ihrer möglichen Werte, so dass Sie in die Welt begehen kann 225 00:13:23,280 --> 00:13:26,820 dass, wenn etwas schief geht, werde ich zurückkehren diese super großen Wert. 226 00:13:26,820 --> 00:13:31,030 Aber Sie wollen nicht der Benutzer Eingabe etwas kryptisch wie 234 ..., eine wirklich große Nummer. 227 00:13:31,030 --> 00:13:34,060 Sie verallgemeinern statt als Konstante. 228 00:13:34,060 --> 00:13:38,060 Also wirklich, wenn Sie als wurden anal in den vergangenen Wochen, jedes Mal, wenn als GetInt, 229 00:13:38,060 --> 00:13:42,900 Sie sollten mit einem wurden überprüft, wenn die Bedingung haben die Benutzer in INT_MAX, 230 00:13:42,900 --> 00:13:46,590 oder, genauer gesagt, tat GetInt Rückkehr INT_MAX, denn wenn doch, 231 00:13:46,590 --> 00:13:51,830 das tatsächlich bedeutet, dass sie nicht geben Sie es. Irgendetwas ging in diesem Fall falsch. 232 00:13:51,830 --> 00:13:56,080 Also das ist, was allgemein als Sentinel-Wert, der bedeutet nur spezielle bekannt. 233 00:13:56,080 --> 00:13:58,120 >> Lassen Sie uns nun in die. C-Datei. 234 00:13:58,120 --> 00:14:01,340 Die C-Datei in das Gerät für einige Zeit existierte. 235 00:14:01,340 --> 00:14:06,840 Und in der Tat hat das Gerät es vorkompilierte für Sie in dieser Sache, die wir als Objekt-Code, 236 00:14:06,840 --> 00:14:09,540 aber es ist einfach nicht zu Ihnen egal, wo es, weil das System kennt, ist 237 00:14:09,540 --> 00:14:11,730 In diesem Fall, wo sie: das Gerät. 238 00:14:11,730 --> 00:14:17,400 Lassen Sie nach unten scrollen nun GetInt und sehen, wie GetInt gearbeitet hat die ganze Zeit. 239 00:14:17,400 --> 00:14:19,460 Hier haben wir ähnliche Kommentare von früher. 240 00:14:19,460 --> 00:14:21,660 Lassen Sie mich vergrößern nur auf die Codeteil. 241 00:14:21,660 --> 00:14:23,900 Und was haben wir für GetInt ist die folgende. 242 00:14:23,900 --> 00:14:25,700 Es dauert keine Eingabe. 243 00:14:25,700 --> 00:14:29,510 Es gibt einen int, while (true), so haben wir eine bewusste Endlosschleife, 244 00:14:29,510 --> 00:14:33,180 aber vermutlich werden wir brechen aus dieser irgendwie wieder aus diesem. 245 00:14:33,180 --> 00:14:34,870 >> Mal sehen, wie das funktioniert. 246 00:14:34,870 --> 00:14:39,240 Wir scheinen mit GetString in dieser ersten Zeile innerhalb der Schleife, 166. 247 00:14:39,240 --> 00:14:43,780 Das ist jetzt eine gute Praxis, weil unter welchen Umständen GetString zurückkehren konnten 248 00:14:43,780 --> 00:14:47,660 dem Schlüsselwort NULL? >> [Schüler] Wenn etwas schief geht. 249 00:14:47,660 --> 00:14:51,630 Wenn etwas schief geht. Und was könnte schief gehen, wenn Sie so etwas wie GetString nennen? 250 00:14:54,960 --> 00:14:57,640 Yeah. >> [Schüler] Malloc nicht geben ihm die ints. 251 00:14:57,640 --> 00:14:59,150 Yeah. Vielleicht malloc fehlschlägt. 252 00:14:59,150 --> 00:15:03,190 Irgendwo unter der Haube wird GetString malloc, die Speicher zuweist, 253 00:15:03,190 --> 00:15:06,020 das lässt den Computer zu speichern alle Zeichen 254 00:15:06,020 --> 00:15:07,750 dass der Nutzer in der Tastatur. 255 00:15:07,750 --> 00:15:11,590 Und angenommen, der Benutzer hatte eine ganze Menge freie Zeit und mehr, zum Beispiel eingegeben, 256 00:15:11,590 --> 00:15:16,160 als 2 Milliarden Zeichen, mehr Zeichen als der Computer hat sogar RAM. 257 00:15:16,160 --> 00:15:19,250 GetString muss in der Lage sein, dass Sie bedeuten. 258 00:15:19,250 --> 00:15:22,560 Auch wenn dies ist ein super, super selten Ecke Fall, 259 00:15:22,560 --> 00:15:24,340 es hat irgendwie in der Lage sein, dies zu umgehen, 260 00:15:24,340 --> 00:15:28,750 und so GetString, wenn wir wieder und lesen Sie die Dokumentation, in der Tat Rückkehr NULL. 261 00:15:28,750 --> 00:15:34,460 So jetzt, wenn GetString durch Rücksendung NULL fehlschlägt, wird GetInt werde durch Rücksendung INT_MAX nicht 262 00:15:34,460 --> 00:15:37,690 ebenso wie ein Wächter. Dies sind nur menschliche Konventionen. 263 00:15:37,690 --> 00:15:41,450 Der einzige Weg, Sie wissen, ist dies der Fall wäre, ist durch das Lesen der Dokumentation. 264 00:15:41,450 --> 00:15:45,040 >> Lassen Sie nach unten scrollen, wo die int tatsächlich bekommen. 265 00:15:45,040 --> 00:15:51,160 Wenn ich mich ein bisschen weiter zu blättern, in Zeile 170 haben wir einen Kommentar über diesen Linien. 266 00:15:51,160 --> 00:15:55,100 Wir erklären in 172 ein int, n, und ein char, c, und dann diese neue Funktion, 267 00:15:55,100 --> 00:15:58,930 die einige von euch haben über vor, sscanf gestolpert. 268 00:15:58,930 --> 00:16:00,870 Dies steht für String scanf. 269 00:16:00,870 --> 00:16:05,700 In anderen Worten, gib mir einen String und ich werde es für Stücke von Informationen von Interesse zu scannen. 270 00:16:05,700 --> 00:16:07,360 Was bedeutet das? 271 00:16:07,360 --> 00:16:11,800 Angenommen, ich buchstäblich 123 geben über die Tastatur und drücken Sie dann die Eingabetaste. 272 00:16:11,800 --> 00:16:16,470 Was ist der Datentyp von 123, wenn sie von GetString zurückgekehrt? >> [Schüler] String. 273 00:16:16,470 --> 00:16:18,380 Es ist offensichtlich ein String, nicht wahr? Ich habe einen String. 274 00:16:18,380 --> 00:16:23,220 So 123 ist wirklich, quote-unquote, 123 mit dem \ 0 am Ende. 275 00:16:23,220 --> 00:16:27,110 Das ist nicht ein int. Das ist nicht eine Nummer. Es sieht aus wie eine Zahl, aber es ist nicht wirklich. 276 00:16:27,110 --> 00:16:29,080 Also, was bedeutet GetInt zu tun haben? 277 00:16:29,080 --> 00:16:35,750 Es muss die Zeichenfolge links nach rechts zu scannen - 123 \ 0 - und irgendwie zu einer tatsächlichen Ganzzahl umzuwandeln. 278 00:16:35,750 --> 00:16:37,850 Sie könnten herausfinden, wie dies zu tun. 279 00:16:37,850 --> 00:16:41,450 Wenn Sie zurück zu pset2 denken, Sie vermutlich habe ein wenig bequem mit Caesar 280 00:16:41,450 --> 00:16:44,820 oder Vigenere, so können Sie über einen String durchlaufen, können Sie Zeichen auf ints zu konvertieren. 281 00:16:44,820 --> 00:16:46,710 Aber was solls, es ist eine ganze Menge Arbeit. 282 00:16:46,710 --> 00:16:49,860 Warum nicht eine Funktion aufrufen, wie sscanf, die das tut für dich? 283 00:16:49,860 --> 00:16:54,230 So sscanf erwartet ein Argument - in diesem Fall als Linie, die ist ein String. 284 00:16:54,230 --> 00:17:01,840 Sie dann in Anführungszeichen angeben, sehr ähnlich printf, was Sie in dieser Zeichenfolge erwarten. 285 00:17:01,840 --> 00:17:09,000 Und was ich hier sage, ist erwarte ich eine Dezimalzahl und vielleicht ein Zeichen sehen. 286 00:17:09,000 --> 00:17:12,000 Und wir werden sehen, warum dies der Fall ist in nur einem Augenblick. 287 00:17:12,000 --> 00:17:15,869 Und es stellt sich heraus, dass diese Notation ist jetzt erinnert an Sachen, die wir kamen ins Gespräch über 288 00:17:15,869 --> 00:17:17,619 knapp über eine Woche her. 289 00:17:17,619 --> 00:17:21,740 Was ist & n und & c zu tun für uns hier? >> [Schüler] Adresse n und Anschrift des c. 290 00:17:21,740 --> 00:17:25,400 Yeah. Es gibt mir die Adresse n und Anschrift des c. Warum ist das so wichtig? 291 00:17:25,400 --> 00:17:30,220 Sie wissen, dass mit Funktionen in C, können Sie immer einen Wert zurückgeben oder überhaupt keinen Wert. 292 00:17:30,220 --> 00:17:34,530 Sie können zurückgeben int, einen String, einen Schwimmer, einen char, was auch immer, oder Sie können void zurückgeben, 293 00:17:34,530 --> 00:17:38,030 Sie können jedoch nur die Rückkehr eine Sache maximal. 294 00:17:38,030 --> 00:17:42,760 Aber hier wollen wir sscanf mir vielleicht wieder ein int, eine Dezimalzahl, 295 00:17:42,760 --> 00:17:46,220 und auch ein char, und ich werde, warum die Zeichen in einem Moment erklären. 296 00:17:46,220 --> 00:17:51,460 Sie effektiv möchten sscanf auf zwei Dinge zurück, aber das ist einfach nicht in C möglich 297 00:17:51,460 --> 00:17:55,200 Sie können rund um das funktionieren, indem in zwei Adressen 298 00:17:55,200 --> 00:17:57,370 denn sobald Sie eine Funktion übergeben zwei Adressen, 299 00:17:57,370 --> 00:18:00,470 was kann diese Funktion mit ihnen tun? >> [Schüler] Schreiben an diese Adressen. 300 00:18:00,470 --> 00:18:02,010 Es kann an diese Adressen schreiben. 301 00:18:02,010 --> 00:18:05,770 Sie können den Stern Betrieb und dorthin gehen, um jede dieser Adressen. 302 00:18:05,770 --> 00:18:11,260 Es ist eine Art des Back-Door-Mechanismus, sondern sehr häufig zum Ändern der Werte der Variablen 303 00:18:11,260 --> 00:18:14,870 mehr als nur einer Stelle - in diesem Fall, zwei. 304 00:18:14,870 --> 00:18:21,340 Jetzt merke ich bin für == 1 überprüfen und dann wieder n, wenn das bedeutet in der Tat, zu true ausgewertet. 305 00:18:21,340 --> 00:18:26,170 Also, was ist los? Technisch ist alles, was wir wirklich wollen, in GetInt passiert dies. 306 00:18:26,170 --> 00:18:30,740 Wir wollen analysieren, so zu sprechen, wollen wir den String lesen - quote-unquote 123 - 307 00:18:30,740 --> 00:18:34,560 und wenn es so aussieht, als gäbe es eine Reihe gibt, was wir sagen sscanf zu tun 308 00:18:34,560 --> 00:18:38,190 gelegt wird, diese Zahl - 123 - in dieser Variable n für mich. 309 00:18:38,190 --> 00:18:42,090 Also, warum dann habe ich tatsächlich diese als gut? 310 00:18:42,090 --> 00:18:48,220 Was ist die Rolle der sscanf sagen Sie vielleicht auch einen Charakter hier? 311 00:18:48,220 --> 00:18:53,470 [Unverständlich Student Response] >> Ein Dezimalpunkt tatsächlich funktionieren könnte. 312 00:18:53,470 --> 00:18:56,330 Halten wir, dass dachte einen Moment nach. Was sonst noch? 313 00:18:56,330 --> 00:18:59,270 [Schüler] Es könnte sein, NULL. >> Gute Gedanken. Es könnte die Null-Zeichen sein. 314 00:18:59,270 --> 00:19:01,660 Es ist eigentlich nicht in diesem Fall. Yeah. >> [Schüler] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Oder lassen Sie mich noch weiter zu verallgemeinern. 316 00:19:04,340 --> 00:19:06,640 Die% c gibt es nur für die Fehlerprüfung. 317 00:19:06,640 --> 00:19:09,300 Wir haben dort nicht wollen ein Zeichen sein, nach der Zahl, 318 00:19:09,300 --> 00:19:11,870 aber was dies ermöglicht mir zu tun ist die folgende. 319 00:19:11,870 --> 00:19:18,210 Es stellt sich heraus, dass sscanf neben Speichern von Werten in n und c in diesem Beispiel hier 320 00:19:18,210 --> 00:19:24,890 was es auch tut, ist es gibt die Anzahl der Variablen, die es genommen Werte in. 321 00:19:24,890 --> 00:19:30,260 Also, wenn Sie in 123 nur eingeben, dann wird nur die% d wird übereinstimmen, 322 00:19:30,260 --> 00:19:33,880 und nur n wird mit einem Wert wie 123 gespeichert, 323 00:19:33,880 --> 00:19:35,640 und nichts wird in c setzen. 324 00:19:35,640 --> 00:19:37,620 C bleibt ein Müll-Wert, so zu sprechen - 325 00:19:37,620 --> 00:19:40,730 Müll, weil es nie auf einen Wert initialisiert wurde. 326 00:19:40,730 --> 00:19:45,520 So dass in diesem Fall kehrt sscanf 1 I aufgefüllt, da ein solcher Zeiger, 327 00:19:45,520 --> 00:19:50,190 In diesem Fall toll, ich habe einen int, damit ich die Linie, um den Arbeitsspeicher freizugeben befreien 328 00:19:50,190 --> 00:19:54,000 dass GetString tatsächlich zugeteilt, und dann habe ich wieder n, 329 00:19:54,000 --> 00:19:58,500 else if Sie sich jemals gefragt, wo das Wiederholen Aussage kommt, es kommt von hier. 330 00:19:58,500 --> 00:20:04,390 Also, wenn dagegen vom Typ I in 123foo - nur einige zufällige Abfolge von Text - 331 00:20:04,390 --> 00:20:08,490 sscanf wird, Nummer, Zahl, f sehen, 332 00:20:08,490 --> 00:20:16,410 und es geht um die 123 in n setzen; es geht um die f in c setzen und dann wieder 2. 333 00:20:16,410 --> 00:20:20,640 So haben wir, nur mit der grundlegenden Definition des sscanf das Verhalten, eine sehr einfache Art und Weise - 334 00:20:20,640 --> 00:20:23,900 auch komplexe auf den ersten Blick, aber am Ende des Tages ziemlich einfachen Mechanismus - 335 00:20:23,900 --> 00:20:28,320 zu sagen, ist es ein int und wenn ja, ist, dass die einzige Sache, die ich gefunden habe? 336 00:20:28,320 --> 00:20:29,860 Und das Leerzeichen ist hier gewollt. 337 00:20:29,860 --> 00:20:34,000 Wenn Sie die Dokumentation für sscanf lesen, erzählt er, dass, wenn Sie ein Stück von Leerzeichen beinhalten 338 00:20:34,000 --> 00:20:38,810 am Anfang oder am Ende zu ermöglichen sscanf den Benutzer, aus irgendeinem Grund, 339 00:20:38,810 --> 00:20:41,860 um Platz bar 123 getroffen und das wird legitim. 340 00:20:41,860 --> 00:20:44,150 Sie werden nicht beim Anwender schreien, nur weil sie die Leertaste 341 00:20:44,150 --> 00:20:48,640 am Anfang oder am Ende ist das nur ein wenig mehr benutzerfreundlich. 342 00:20:48,640 --> 00:20:52,300 >> Fragen Sie dann auf GetInt? Yeah. >> [Schüler] Was ist, wenn Sie nur in einem char setzen? 343 00:20:52,300 --> 00:20:54,030 Gute Frage. 344 00:20:54,030 --> 00:20:59,890 Was ist, wenn Sie nur in einem char wie f eingegeben und drücken Sie Enter, ohne jemals die Eingabe 123? 345 00:20:59,890 --> 00:21:02,420 Was denken Sie, das Verhalten dieser Zeile Code wäre dann? 346 00:21:02,420 --> 00:21:04,730 [Unverständlich Studenten Antwort] 347 00:21:04,730 --> 00:21:08,790 Yeah, so sscanf können, dass zu decken, da in diesem Fall ist es nicht geht, um n oder c füllen. 348 00:21:08,790 --> 00:21:15,310 Es wird stattdessen 0 zurückgeben, in welchem ​​Fall ich auch fangen bin dieses Szenario 349 00:21:15,310 --> 00:21:18,750 , weil der erwartete Wert ich will, ist ein. 350 00:21:18,750 --> 00:21:22,000 Ich will nur eins und nur eins gefüllt werden. Gute Frage. 351 00:21:22,000 --> 00:21:24,290 >> Andere? Gut. 352 00:21:24,290 --> 00:21:26,250 >> Lassen Sie uns nicht gehen durch alle Funktionen hier, 353 00:21:26,250 --> 00:21:29,500 aber derjenige, der vielleicht der restlichen Anteile scheint, ist GetString 354 00:21:29,500 --> 00:21:32,790 weil es sich heraus, dass GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 Alle punt viele ihrer Funktionalität GetString. 356 00:21:36,260 --> 00:21:39,750 So lassen Sie uns einen Blick darauf, wie er hier umgesetzt. 357 00:21:39,750 --> 00:21:43,630 Dieser sieht ein wenig komplex, aber es verwendet die gleichen Grundlagen 358 00:21:43,630 --> 00:21:45,670 dass wir reden letzte Woche gestartet. 359 00:21:45,670 --> 00:21:49,490 In GetString, nimmt das kein Argument nach der Leere hier 360 00:21:49,490 --> 00:21:53,730 und es gibt einen String zurück, ich anscheinend bin Deklaration einer Zeichenkette als Puffer. 361 00:21:53,730 --> 00:21:56,270 Ich weiß nicht wirklich, was das los, um für noch verwendet werden, aber wir werden sehen. 362 00:21:56,270 --> 00:21:58,390 Es sieht aus wie Kapazität ist standardmäßig 0. 363 00:21:58,390 --> 00:22:01,350 Nicht ganz sicher, wohin dieses geht, nicht sicher, was n wird für die noch verwendet werden, 364 00:22:01,350 --> 00:22:03,590 aber jetzt ist es immer ein wenig interessanter. 365 00:22:03,590 --> 00:22:06,520 Im Einklang 243 erklären wir, einen int, c. 366 00:22:06,520 --> 00:22:08,800 Dies ist eine Art von dummen Details. 367 00:22:08,800 --> 00:22:15,820 Ein char ist 8 Bit und 8 Bit können, wie viele verschiedene Werte speichern? >> [Schüler] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Das Problem ist, wenn Sie 256 verschiedene ASCII-Zeichen, die dort sind, haben wollen 369 00:22:20,730 --> 00:22:23,340 Wenn Sie zurück denken - und das ist nicht etwas, das zu merken. 370 00:22:23,340 --> 00:22:25,710 Aber wenn Sie zurück zu diesem großen ASCII-Tabelle denke, wir hatten Wochen 371 00:22:25,710 --> 00:22:30,600 gab es in diesem Fall 128 oder 256 ASCII-Zeichen. 372 00:22:30,600 --> 00:22:32,940 Wir haben alle die Muster von 0 und 1 auf. 373 00:22:32,940 --> 00:22:36,210 Das ist ein Problem, wenn Sie in der Lage sein, um einen Fehler erkennen soll 374 00:22:36,210 --> 00:22:40,190 denn wenn Sie bereits mit 256 Werten für eure Charaktere, 375 00:22:40,190 --> 00:22:43,050 Sie nicht wirklich im Voraus zu planen, denn jetzt gibt es keine Möglichkeit zu sagen haben, 376 00:22:43,050 --> 00:22:46,270 dies ist keine legit Charakter, ist dies eine fehlerhafte Nachricht. 377 00:22:46,270 --> 00:22:50,270 Also, was die Welt tut, ist sie mit der nächst größeren Wert, so etwas wie ein int, 378 00:22:50,270 --> 00:22:54,720 so dass Sie eine verrückte Anzahl von Bits, 32, 4 Milliarden mögliche Werte 379 00:22:54,720 --> 00:22:58,860 so, dass man einfach am Ende mit im wesentlichen 257 von ihnen, 380 00:22:58,860 --> 00:23:01,720 1 davon hat einige besondere Bedeutung als Fehler. 381 00:23:01,720 --> 00:23:03,120 >> Also mal sehen, wie das funktioniert. 382 00:23:03,120 --> 00:23:07,760 In line 246 Ich habe diesen großen while-Schleife, die einen Aufruf fgetc wird, 383 00:23:07,760 --> 00:23:11,090 f Bedeutung Datei, so getc, und dann stdin. 384 00:23:11,090 --> 00:23:15,520 Es stellt sich heraus, das ist nur die genauere Art zu sagen, lesen Eingaben über die Tastatur. 385 00:23:15,520 --> 00:23:19,300 Standard-Eingabe mittels Tastatur, bedeutet Standard-Ausgabe-Bildschirm, 386 00:23:19,300 --> 00:23:23,310 und Standardfehler, die wir in pset4 sehen werden, bedeutet, den Bildschirm 387 00:23:23,310 --> 00:23:27,490 sondern eine besondere Teil des Bildschirms, so dass es nicht mit den tatsächlichen Ausgang verschmolzen 388 00:23:27,490 --> 00:23:30,750 Sie soll zu drucken. Aber mehr dazu in der Zukunft. 389 00:23:30,750 --> 00:23:34,440 So fgetc bedeutet nur lesen ein Zeichen von der Tastatur und speichern Sie es wo? 390 00:23:34,440 --> 00:23:37,350 Bewahren Sie es in c. 391 00:23:37,350 --> 00:23:41,360 Und überprüfen Sie dann - so bin ich nur mit ein paar Boolean Konjunktionen hier - 392 00:23:41,360 --> 00:23:46,000 prüfen, ob es nicht gleich - \ n, so hat der Benutzer die Eingabetaste drücken, wollen wir an dieser Stelle zu stoppen, 393 00:23:46,000 --> 00:23:49,850 Ende der Schleife - und wir wollen auch für die spezielle Konstante EOF prüfen, 394 00:23:49,850 --> 00:23:53,610 die, wenn Sie oder erraten wissen, was macht er? >> [Schüler] Ende der Datei. >> Ende der Datei. 395 00:23:53,610 --> 00:23:56,560 Dies ist eine Art unsinnig, weil wenn ich auf der Tastatur eingeben, 396 00:23:56,560 --> 00:23:58,870 gibt es wirklich keine Datei daran beteiligt, 397 00:23:58,870 --> 00:24:01,150 Doch dies ist nur der Oberbegriff für meine sortieren 398 00:24:01,150 --> 00:24:04,220 nichts anderes wird aus dem menschlichen Finger kommt. 399 00:24:04,220 --> 00:24:06,460 EOF - Ende der Datei. 400 00:24:06,460 --> 00:24:09,920 Nebenbei, wenn Sie jemals Control D auf Ihrer Tastatur getroffen haben, nicht, dass Sie noch - 401 00:24:09,920 --> 00:24:15,230 Sie haben Control C getroffen - Control D sendet diese spezielle Konstante genannt EOF. 402 00:24:15,230 --> 00:24:19,850 So, jetzt müssen wir nur noch einige dynamische Speicherzuweisung. 403 00:24:19,850 --> 00:24:23,440 >> So dass, wenn (n + 1> Kapazität). Jetzt werde ich erklären, n. 404 00:24:23,440 --> 00:24:26,100 N ist nur, wie viele Bytes sind derzeit im Puffer 405 00:24:26,100 --> 00:24:28,620 die Zeichenfolge, die Sie derzeit den Aufbau des Benutzers. 406 00:24:28,620 --> 00:24:33,450 Wenn Sie mehr Zeichen in Ihrem Puffer als Sie im Puffer haben, 407 00:24:33,450 --> 00:24:37,410 intuitiv, was wir dann tun müssen, ist dafür mehr Kapazität. 408 00:24:37,410 --> 00:24:43,330 So werde ich überfliegen einige der arithmetischen hier und konzentrieren uns nur auf diese Funktion hier. 409 00:24:43,330 --> 00:24:46,070 Sie wissen, was malloc ist oder zumindest allgemein bekannt. 410 00:24:46,070 --> 00:24:48,970 Take a guess, was realloc tut. >> [Student] Fügt Speicher. 411 00:24:48,970 --> 00:24:52,920 Es ist nicht ganz das Hinzufügen von Arbeitsspeicher. Verteilt Speicher wie folgt. 412 00:24:52,920 --> 00:24:57,220 Wenn es immer noch Raum am Ende des Strings, um Ihnen mehr von dieser Erinnerung 413 00:24:57,220 --> 00:25:00,000 als es gibt ursprünglich Sie, dann bekommen Sie diesen zusätzlichen Speicher. 414 00:25:00,000 --> 00:25:03,460 So können Sie einfach weiter setzen die Zeichenfolge Zeichen Rücken an Rücken an Rücken an Rücken. 415 00:25:03,460 --> 00:25:05,830 Aber wenn das nicht der Fall, weil Sie zu lange gewartet 416 00:25:05,830 --> 00:25:07,940 und etwas zufällig wurde im Speicher plumpste es 417 00:25:07,940 --> 00:25:10,290 aber es gibt zusätzlichen Speicher hier unten, das ist okay. 418 00:25:10,290 --> 00:25:13,100 Realloc wird alle die Schwerstarbeit für Sie tun, 419 00:25:13,100 --> 00:25:16,750 bewegen Sie die Zeichenfolge, die Sie in gelesen habe damit weit von hier, legte es dort unten, 420 00:25:16,750 --> 00:25:19,460 und dann geben Sie etwas mehr Start-und Landebahn an diesem Punkt. 421 00:25:19,460 --> 00:25:22,550 >> Also mit einer Handbewegung, lassen Sie mich sagen, dass das, was GetString tut 422 00:25:22,550 --> 00:25:26,330 wird es mit einem kleinen Puffer, vielleicht ein einzelnes Zeichen ab, 423 00:25:26,330 --> 00:25:30,820 und wenn der Benutzer in beiden Zeichen, endet GetString bis Aufruf realloc und sagt 424 00:25:30,820 --> 00:25:33,150 ein Charakter war nicht genug, gib mir zwei Zeichen. 425 00:25:33,150 --> 00:25:35,950 Dann, wenn Sie durch die Logik der Schleife zu lesen, es geht zu sagen, 426 00:25:35,950 --> 00:25:39,600 der Benutzer in 3 eingegebenen Zeichen, gib mir jetzt nicht 2, sondern 4 Zeichen, 427 00:25:39,600 --> 00:25:42,320 dann gib mir 8, dann geben Sie mir 16 und 32. 428 00:25:42,320 --> 00:25:45,000 Die Tatsache, dass ich eine Verdoppelung der Kapazität jedes Mal 429 00:25:45,000 --> 00:25:48,570 bedeutet, dass der Puffer ist nicht zu langsam wachsen, es geht um superschnell wachsen. 430 00:25:48,570 --> 00:25:51,380 Und was könnte der Vorteil das sein? 431 00:25:51,380 --> 00:25:54,600 Warum bin ich die Verdoppelung der Größe des Puffers 432 00:25:54,600 --> 00:25:58,020 obwohl der Benutzer kann nur noch ein zusätzliches Zeichen von der Tastatur? 433 00:25:58,020 --> 00:26:01,750 [Unverständlich Student Response] >> Was ist das? >> [Schüler] Sie müssen nicht so oft zu wachsen. 434 00:26:01,750 --> 00:26:03,300 Genau. Sie müssen nicht so oft zu wachsen. 435 00:26:03,300 --> 00:26:05,510 Und dies ist nur eine Art du Absicherung Ihrer Wetten hier, 436 00:26:05,510 --> 00:26:10,850 Die Idee ist, dass Sie nicht wollen, zu nennen realloc eine Menge, weil es zu langsam neigt. 437 00:26:10,850 --> 00:26:12,910 Jedes Mal, wenn Sie sich an das Betriebssystem für Speicher, 438 00:26:12,910 --> 00:26:16,990 wie Sie bald in einem zukünftigen Problem Satz sehen werden, neigt sie dazu, einige Zeit dauern. 439 00:26:16,990 --> 00:26:20,010 So minimiert so viel Zeit, auch wenn Sie verschwenden etwas Platz, 440 00:26:20,010 --> 00:26:21,900 neigt dazu, eine gute Sache sein. 441 00:26:21,900 --> 00:26:24,060 >> Aber wenn wir lesen, durch den letzten Teil der GetString hier - 442 00:26:24,060 --> 00:26:27,950 und wieder das Verständnis jede einzelne Zeile ist hier nicht so wichtig, heute - 443 00:26:27,950 --> 00:26:30,530 feststellen, dass es schließlich ruft malloc wieder 444 00:26:30,530 --> 00:26:33,880 und es weist genau so viele Bytes, wie es nach der Zeichenfolge muss 445 00:26:33,880 --> 00:26:38,060 und dann wegwirft, indem Sie befreit den übermäßig großen Puffer 446 00:26:38,060 --> 00:26:40,080 wenn es tatsächlich wurde zu oft verdoppelt. 447 00:26:40,080 --> 00:26:42,730 Also kurz gesagt, das ist, wie GetString gearbeitet hat die ganze Zeit. 448 00:26:42,730 --> 00:26:47,060 Alles, was sie tut, ist ein Zeichen in einer Zeit zu lesen wieder und wieder und wieder, 449 00:26:47,060 --> 00:26:50,750 und jedes Mal, es braucht einige zusätzliche Speicher, fragt er das Betriebssystem für sie 450 00:26:50,750 --> 00:26:53,670 indem realloc. 451 00:26:53,670 --> 00:26:57,890 >> Haben Sie Fragen? Gut. 452 00:26:57,890 --> 00:26:59,270 >> Ein Angriff. 453 00:26:59,270 --> 00:27:04,060 Jetzt, da wir verstehen, Zeigern oder zumindest immer vertrauter mit Zeigern 454 00:27:04,060 --> 00:27:06,700 Lassen Sie uns überlegen, wie die ganze Welt zum Einsturz beginnt 455 00:27:06,700 --> 00:27:10,030 wenn Sie nicht ganz gegen kontradiktorischen Nutzer zu verteidigen, 456 00:27:10,030 --> 00:27:11,850 Menschen, die versuchen, in Ihr System zu hacken sind, 457 00:27:11,850 --> 00:27:16,890 Menschen, die versuchen, Ihre Software unter Umgehung einige Registrierungscode stehlen 458 00:27:16,890 --> 00:27:19,090 dass sie vielleicht sonst zu tippen in. 459 00:27:19,090 --> 00:27:22,990 >> Werfen Sie einen Blick auf dieses Beispiel hier, das ist nur C-Code, der eine Funktion main am Boden hat 460 00:27:22,990 --> 00:27:26,380 das ruft eine Funktion foo. Und wie ist es vorbei, um foo? 461 00:27:26,380 --> 00:27:29,680 [Schüler] Ein einziges Argument. >> [Malan] Ein einziges Argument. 462 00:27:29,680 --> 00:27:33,450 So argv [1], was bedeutet, dass das erste Wort, dass der Benutzer in der Befehlszeile eingegeben 463 00:27:33,450 --> 00:27:36,360 Nach a.out oder was auch immer das Programm aufgerufen wird. 464 00:27:36,360 --> 00:27:41,680 So foo an der Spitze erfolgt in einem char *. Aber char * ist nur was? >> [Schüler] Eine Zeichenfolge. 465 00:27:41,680 --> 00:27:43,350 [Malan] Ein String, also gibt es hier nichts Neues. 466 00:27:43,350 --> 00:27:45,420 Diese Zeichenfolge beliebig aufgerufen bar. 467 00:27:45,420 --> 00:27:51,430 In dieser Linie hier, char c [12]; in einer Art semi-technisches Englisch, ist das, was diese Linie zu tun? 468 00:27:51,430 --> 00:27:55,220 [Student] Ein Array von - >> Array of? >> [Schüler] Charaktere. >> Characters. 469 00:27:55,220 --> 00:27:58,870 Gib mir eine Reihe von 12 Zeichen. So könnten wir nennen dies einen Puffer. 470 00:27:58,870 --> 00:28:02,920 Es ist technisch genannt c, aber ein Puffer in der Programmierung bedeutet nur einen Haufen von Raum 471 00:28:02,920 --> 00:28:04,800 dass Sie legte ein paar Sachen in. 472 00:28:04,800 --> 00:28:07,940 Dann schließlich memcpy haben wir nicht vor, aber Sie können sich wahrscheinlich vorstellen, was es tut. 473 00:28:07,940 --> 00:28:10,480 Er kopiert Speicher. Was bedeutet es? 474 00:28:10,480 --> 00:28:19,270 Offenbar kopiert bar, dessen Eingang in c, jedoch nur bis zur Länge der Stange. 475 00:28:19,270 --> 00:28:24,930 Aber da ist ein Fehler hier. >> [Schüler] benötigen Sie den sizeof Charakter. >> Okay. 476 00:28:24,930 --> 00:28:30,860 Technisch, sollten wir wirklich tun strlen (bar) * sizeof (char)). Das ist richtig. 477 00:28:30,860 --> 00:28:33,930 Aber im schlimmsten Fall hier, gehen wir davon aus, dass that's - 478 00:28:33,930 --> 00:28:35,950 Okay. Dann gibt es zwei Fehler. 479 00:28:35,950 --> 00:28:39,160 So sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Lassen Sie uns das ein wenig breiter. 481 00:28:41,290 --> 00:28:44,910 So, jetzt gibt es noch einen Bug, das, was ist? >> [Unverständlich Studenten Antwort] 482 00:28:44,910 --> 00:28:46,990 Überprüfen Sie, was? >> [Schüler] prüfen NULL. 483 00:28:46,990 --> 00:28:50,270 Wir sollten in der Regel für NULL werden überprüft, weil schlechte Dinge passieren 484 00:28:50,270 --> 00:28:53,200 Wenn Sie den Mauszeiger NULL ist, weil Sie am Ende vielleicht bis dorthin zu gehen, 485 00:28:53,200 --> 00:28:57,630 und Sie sollten nicht immer gehen, um durch Dereferenzierung es mit dem Stern-Operator NULL. 486 00:28:57,630 --> 00:29:01,050 So das ist gut. Und was tun wir? Logisch, da ist ein Fehler auch hier. 487 00:29:01,050 --> 00:29:04,450 [Schüler] Überprüfen Sie, ob argc ist> = 2 ist. 488 00:29:04,450 --> 00:29:10,550 So prüfen Sie, ob argc> = 2. Okay, so gibt es drei Fehler in diesem Programm hier. 489 00:29:10,550 --> 00:29:16,630 Wir prüfen nun, ob der Benutzer tatsächlich etwas in argv eingegeben [1]. Gut. 490 00:29:16,630 --> 00:29:20,950 Also, was ist der dritte bug? Yeah. >> [Schüler] C möglicherweise nicht groß genug sein. 491 00:29:20,950 --> 00:29:23,320 Gut. Wir checkten ein Szenario. 492 00:29:23,320 --> 00:29:29,520 Wir implizit überprüft nicht kopieren mehr Speicher als würde die Länge der bar nicht überschreiten. 493 00:29:29,520 --> 00:29:32,510 Also, wenn die Zeichenfolge der Benutzer eingetippt 10 Zeichen lang ist, 494 00:29:32,510 --> 00:29:36,020 dies sagte nur kopieren 10 Zeichen. Und das ist okay. 495 00:29:36,020 --> 00:29:39,940 Aber was, wenn der Benutzer in einem Wort an der Eingabeaufforderung wie ein 20-Zeichen-Wort getippt? 496 00:29:39,940 --> 00:29:44,900 Dieses sagt copy 20 Zeichen aus bar in was? 497 00:29:44,900 --> 00:29:49,750 C, sonst als unser Puffer bezeichnet, was bedeutet, Sie gerade geschrieben haben Daten 498 00:29:49,750 --> 00:29:52,540 zu 8 Byte Orte, die Sie nicht besitzen, 499 00:29:52,540 --> 00:29:54,870 und Sie nicht besitzen sie in dem Sinne, dass man nie vergeben sie. 500 00:29:54,870 --> 00:30:00,370 Also das ist, was allgemein als Pufferüberlauf Angriff oder Pufferüberlauf Angriff bekannt. 501 00:30:00,370 --> 00:30:05,580 Und es ist ein Angriff in dem Sinne, dass, wenn der Benutzer oder das Programm, die einen Aufruf Ihrer Funktion ist 502 00:30:05,580 --> 00:30:10,490 tut dies böswillig, was tatsächlich passiert als nächstes könnte tatsächlich ziemlich schlecht. 503 00:30:10,490 --> 00:30:12,450 >> Werfen wir also einen Blick auf dieses Bild hier. 504 00:30:12,450 --> 00:30:16,060 Dieses Bild stellt Ihr Stack Speicher. 505 00:30:16,060 --> 00:30:19,580 Daran erinnern, dass jedes Mal, wenn Sie eine Funktion aufrufen Sie diesen kleinen Rahmen auf dem Stack zu bekommen 506 00:30:19,580 --> 00:30:21,520 und dann noch eine und dann noch eine und noch eine. 507 00:30:21,520 --> 00:30:24,300 Und so weit, haben wir nur irgendwie abstrahiert diese als Rechtecke 508 00:30:24,300 --> 00:30:26,290 entweder auf dem Board oder auf dem Bildschirm hier. 509 00:30:26,290 --> 00:30:30,580 Aber wenn wir zu vergrößern auf einem dieser Rechtecke, wenn Sie eine Funktion foo nennen, 510 00:30:30,580 --> 00:30:35,880 es stellt sich heraus, dass es mehr auf den Stapel innerhalb dieses Rahmens in diesem Rechteck 511 00:30:35,880 --> 00:30:40,060 als nur x-und y-und a und b, wie wir haben über Swap reden. 512 00:30:40,060 --> 00:30:44,410 Es stellt sich heraus, dass es einige unteren Level-Details, darunter Adressaufkleber. 513 00:30:44,410 --> 00:30:49,550 So stellt sich heraus, wenn der Haupt ruft foo hat Wesentlichen auf foo informieren 514 00:30:49,550 --> 00:30:53,520 Welches Hauptziel ist die Adresse in den Speicher des Computers 515 00:30:53,520 --> 00:30:57,770 denn sonst wird sobald foo getan ausführt, wie im vorliegenden Fall ist, 516 00:30:57,770 --> 00:31:00,830 sobald Sie erreichen dieses geschlossene geschweifte Klammer am Ende des foo, 517 00:31:00,830 --> 00:31:05,310 Wie zum Teufel soll foo wissen, wo die Kontrolle des Programms soll gehen? 518 00:31:05,310 --> 00:31:08,970 Es stellt sich heraus, dass die Antwort auf diese Frage in diesem roten Rechteck ist hier. 519 00:31:08,970 --> 00:31:12,670 Dies repräsentiert einen Zeiger, und es ist bis auf den Computer vorübergehend zu speichern 520 00:31:12,670 --> 00:31:17,030 auf der so genannten Stapel die Adresse des Haupt so daß, sobald foo erfolgt ausführt, 521 00:31:17,030 --> 00:31:21,120 der Computer weiß, wo und in welcher Zeile im Hauptspeicher, um wieder auf. 522 00:31:21,120 --> 00:31:23,940 Gespeichert Rahmen Zeiger bezieht ebenfalls dazu bei. 523 00:31:23,940 --> 00:31:26,310 Char * bar stellt hier was? 524 00:31:26,310 --> 00:31:31,350 Nun ist diese blaue Segment ist hier foo-Rahmen. Was ist bar? 525 00:31:31,570 --> 00:31:35,010 Bar ist nur das Argument der foo-Funktion. 526 00:31:35,010 --> 00:31:37,500 So, jetzt sind wir wieder auf eine Art der gewohnte Bild. 527 00:31:37,500 --> 00:31:39,850 Es gibt mehr Sachen und mehr Ablenkungen auf dem Bildschirm, 528 00:31:39,850 --> 00:31:43,380 aber dieses Licht blaues Segment genau das, was wir an die Tafel gezeichnet 529 00:31:43,380 --> 00:31:45,790 für so etwas wie Swap. Das ist der Rahmen für foo. 530 00:31:45,790 --> 00:31:51,490 Und das einzige, was in ihm ist im Moment bar, was dieser Parameter. 531 00:31:51,490 --> 00:31:55,220 Aber was sollte in dem Stapel nach diesem Code hier sein? 532 00:31:55,220 --> 00:31:57,760 [Student] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Wir sollten auch sehen, 12 Quadrate zugewiesenen Speicher eine Variable namens c, 534 00:32:02,810 --> 00:32:04,970 und in der Tat haben wir nicht, dass auf dem Bildschirm haben. 535 00:32:04,970 --> 00:32:08,480 Ganz oben gibt es c [0], und dann der Autor dieses Diagramms 536 00:32:08,480 --> 00:32:11,850 störte Zeichnen aller der Quadrate, aber es sind in der Tat gibt 12 537 00:32:11,850 --> 00:32:16,590 denn wenn man in der unteren rechten schauen, c [11], wenn Sie von 0 zu zählen ist der 12. wie Byte. 538 00:32:16,590 --> 00:32:18,400 Aber hier ist das Problem. 539 00:32:18,400 --> 00:32:22,390 In welche Richtung wird c wächst? 540 00:32:22,390 --> 00:32:27,080 Sortieren von oben nach unten, wenn es an der Spitze beginnt und wächst nach unten. 541 00:32:27,080 --> 00:32:30,110 Es sieht nicht so, wie wir uns selbst überlassen viel Landebahn hier überhaupt. 542 00:32:30,110 --> 00:32:32,090 Wir haben Art von uns in eine Ecke manövriert, 543 00:32:32,090 --> 00:32:36,940 und daß c [11] ist direkt gegen Bar, die bis gegen gespeicherten Frame-Zeigers, 544 00:32:36,940 --> 00:32:39,960 das ist bis gegen Adressaufkleber. Es ist kein Platz mehr. 545 00:32:39,960 --> 00:32:42,810 Also, was ist die Implikation dann, wenn Sie es vermasseln 546 00:32:42,810 --> 00:32:46,500 und Sie versuchen, das Lesen 20 Bytes in eine 12-Byte-Puffer? 547 00:32:46,500 --> 00:32:50,060 Wo werden diese 8 zusätzliche Bytes gehen? >> [Schüler] Inside - 548 00:32:50,060 --> 00:32:53,200 Im Inneren alles andere, ist von denen einige super wichtig. 549 00:32:53,200 --> 00:32:57,260 Und das Wichtigste, möglicherweise ist die rote Box gibt, Return-Adresse, 550 00:32:57,260 --> 00:33:03,560 da annehmen, dass Sie versehentlich oder adversarially überschreiben diese 4 Bytes, 551 00:33:03,560 --> 00:33:07,260 dass Zeiger-Adresse, nicht nur mit Müll, sondern mit einer Reihe 552 00:33:07,260 --> 00:33:09,810 dies geschieht, um eine tatsächliche Adresse im Speicher darstellen. 553 00:33:09,810 --> 00:33:13,880 Was ist die Implikation, logisch? >> [Student] Funktion wird an einen anderen Ort zurückgeben. 554 00:33:13,880 --> 00:33:15,250 Genau. 555 00:33:15,250 --> 00:33:19,170 Wenn foo Renditen und Hits, die geschweiften Klammern, wird das Programm gehen, um fortzufahren 556 00:33:19,170 --> 00:33:25,060 nicht, um zum Hauptmenü zurückzukehren, es geht um alles, was Adresse ist in diesem roten Kasten zurückzukehren. 557 00:33:25,060 --> 00:33:28,600 >> Im Falle der Umgehung Software-Registrierung, 558 00:33:28,600 --> 00:33:32,260 was ist, wenn die Adresse, an ist zurückgegeben wird, ist die Funktion, die normalerweise aufgerufen wird 559 00:33:32,260 --> 00:33:35,690 nachdem Sie für die Software bezahlt und eingegeben Ihren Registrierungscode? 560 00:33:35,690 --> 00:33:39,870 Sie können von Trick der Computer in den nicht hier zu sortieren, sondern gehen hier oben. 561 00:33:39,870 --> 00:33:45,100 Oder wenn Sie wirklich clever sind, können ein Gegner tatsächlich geben in die Tastatur, zum Beispiel, 562 00:33:45,100 --> 00:33:50,690 nicht eine tatsächliche Wort, nicht 20 Zeichen, aber angenommen, er oder sie tatsächlich Typen 563 00:33:50,690 --> 00:33:52,770 einige Zeichen, Code darstellen. 564 00:33:52,770 --> 00:33:55,320 Und es ist nicht zu C-Code sein, es ist eigentlich los, um die Zeichen lang sein 565 00:33:55,320 --> 00:33:59,290 das stellen binäre Maschinensprache, 0s und 1s. 566 00:33:59,290 --> 00:34:01,290 Aber angenommen, sie sind klug genug, das zu tun, 567 00:34:01,290 --> 00:34:06,500 irgendwie in die GetString prompt etwas, das im wesentlichen kompilierten Code ist einzufügen, 568 00:34:06,500 --> 00:34:09,980 und die letzten 4 Bytes überschrieben, dass die Rückkehr-Adresse. 569 00:34:09,980 --> 00:34:13,360 Und welche Adresse soll das Eingangssignal zu tun? 570 00:34:13,360 --> 00:34:18,630 Es speichert tatsächlich in diesem roten Rechteck die Adresse des ersten Bytes des Puffers. 571 00:34:18,630 --> 00:34:23,070 So muss man sich wirklich clever, und das ist eine Menge von Versuch und Irrtum für schlechte Menschen da draußen, 572 00:34:23,070 --> 00:34:25,639 aber wenn Sie herausfinden können, wie groß dieser Puffer 573 00:34:25,639 --> 00:34:28,820 so dass die letzten Bytes im Eingang Sie für das Programm bereitstellen 574 00:34:28,820 --> 00:34:33,540 geschehen zu sein entspricht der Adresse des Beginns des Puffers, können Sie dies tun. 575 00:34:33,540 --> 00:34:39,320 Wenn wir normalerweise hallo und \ 0 sagen, ist das, was landet im Puffer. 576 00:34:39,320 --> 00:34:44,420 Aber wenn wir klüger und wir füllen diesen Puffer mit dem, was wir allgemein nennen Angriff Code - 577 00:34:44,420 --> 00:34:48,860 AAA, Angriff, Angriff, Angriff - wo das ist nur etwas, das etwas Schlimmes tut, 578 00:34:48,860 --> 00:34:51,820 was passiert, wenn Sie wirklich clever sind, können Sie dies tun. 579 00:34:51,820 --> 00:34:58,610 In der roten Box ist hier eine Folge von Zahlen - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Beachten Sie, dass die Zahl, die bis hier ist übereinstimmt. 581 00:35:01,610 --> 00:35:04,430 Es ist in umgekehrter Reihenfolge, aber dazu ein anderes Mal. 582 00:35:04,430 --> 00:35:08,140 Beachten Sie, dass diese Rückkehr-Adresse wurde absichtlich geändert 583 00:35:08,140 --> 00:35:12,020 um die Adresse gleich hier oben, nicht die Adresse der main. 584 00:35:12,020 --> 00:35:17,500 Also, wenn der Bösewicht super smart ist, wird er oder sie geht auf, in diesem Angriff Code 585 00:35:17,500 --> 00:35:20,930 so etwas wie löschen Sie alle Dateien des Benutzers oder kopieren Sie die Passwörter 586 00:35:20,930 --> 00:35:24,680 oder erstellen Sie ein Benutzerkonto, das kann ich dann einloggen - überhaupt nichts. 587 00:35:24,680 --> 00:35:26,950 >> Und dies ist sowohl die Gefahr und die Kraft C. 588 00:35:26,950 --> 00:35:29,840 Denn Sie haben Zugriff auf den Speicher über Zeiger 589 00:35:29,840 --> 00:35:32,520 und man kann daher alles schreiben, was Sie wollen in einem Computer-Speicher, 590 00:35:32,520 --> 00:35:35,080 Sie können einen Computer zu tun, was Sie wollen 591 00:35:35,080 --> 00:35:39,550 einfach, indem er sie hüpfen in einem eigenen Speicherbereich. 592 00:35:39,550 --> 00:35:44,650 Und so bis zum heutigen Tag so viele Programme und so viele Websites, die kompromittiert werden 593 00:35:44,650 --> 00:35:46,200 einkochen lassen, um Menschen nutzen diese. 594 00:35:46,200 --> 00:35:50,760 Und dies könnte wie ein super anspruchsvolle Angriff scheinen, aber es funktioniert nicht immer starten auf diese Weise. 595 00:35:50,760 --> 00:35:53,560 Die Realität ist, dass das, was böse Menschen werden in der Regel tun, ist, 596 00:35:53,560 --> 00:35:58,200 ob es sich um ein Programm in einer Befehlszeile oder ein GUI-Programm oder eine Website, 597 00:35:58,200 --> 00:35:59,940 starten Sie einfach die Bereitstellung Unsinn. 598 00:35:59,940 --> 00:36:03,980 Sie geben in einem wirklich großen Wort in das Suchfeld ein und drücken Sie die Eingabetaste, 599 00:36:03,980 --> 00:36:05,780 und Sie warten, um zu sehen, ob die Website stürzt 600 00:36:05,780 --> 00:36:09,990 oder Sie warten, um zu sehen, ob das Programm manifestiert einige Fehlermeldung 601 00:36:09,990 --> 00:36:14,330 denn wenn man Glück hat als Bösewicht und erhalten Sie einen gewissen verrückten Eingang 602 00:36:14,330 --> 00:36:18,980 das stürzt das Programm, das der Programmierer nicht vorhergesehen Dein schlechtes Benehmen bedeutet, 603 00:36:18,980 --> 00:36:23,630 was bedeutet, können Sie wahrscheinlich mit genug Mühe, genug Versuch und Irrtum, 604 00:36:23,630 --> 00:36:26,650 herausfinden, wie man eine genauere Angriff zu führen. 605 00:36:26,650 --> 00:36:31,410 So viel ein Teil der Sicherheit wird nicht nur die Vermeidung dieser Angriffe ganz 606 00:36:31,410 --> 00:36:34,100 aber nachgewiesen und sehen im Grunde logs 607 00:36:34,100 --> 00:36:36,780 und sehen, was verrückt Eingänge Menschen in Ihre Website eingegeben haben, 608 00:36:36,780 --> 00:36:38,960 Welche Suchbegriffe haben die Menschen ihn auf Ihrer Webseite eingegeben 609 00:36:38,960 --> 00:36:42,870 in der Hoffnung, überfüllt etwas Puffer. 610 00:36:42,870 --> 00:36:45,500 Und das läuft alles auf den einfachen Grundlagen dessen, was ist ein Array 611 00:36:45,500 --> 00:36:49,080 und was bedeutet es, zu vergeben und zu verwenden Speicher. 612 00:36:49,080 --> 00:36:51,710 >> Bezug zu, dass dann auch diese. 613 00:36:51,710 --> 00:36:54,280 Lassen Sie uns gerade innerhalb Blick einer Festplatte noch einmal. 614 00:36:54,280 --> 00:36:58,440 Sie erinnern sich aus einer oder zwei Wochen her, dass beim Ziehen Dateien auf Ihren Papierkorb oder Mülleimer, 615 00:36:58,440 --> 00:37:03,710 was passiert? >> [Schüler] Nichts. >> Absolut nichts, richtig? 616 00:37:03,710 --> 00:37:05,740 Schließlich, wenn Sie laufen auf Festplattenspeicher niedrig, 617 00:37:05,740 --> 00:37:08,190 Windows oder Mac OS starten Löschen von Dateien für Sie. 618 00:37:08,190 --> 00:37:10,390 Aber wenn Sie etwas ziehen dort, das ist überhaupt nicht sicher. 619 00:37:10,390 --> 00:37:13,800 Alle Ihre Mitbewohner oder ein Freund oder ein Familienmitglied zu tun hat, ist doppelt klicken und, voila, 620 00:37:13,800 --> 00:37:16,310 es gibt alle sketchy-Dateien, die Sie löschen versucht. 621 00:37:16,310 --> 00:37:19,590 Die meisten von uns zumindest wissen, dass Sie die rechte Maustaste oder Steuerelement klicken müssen 622 00:37:19,590 --> 00:37:22,310 und leeren Sie den Papierkorb oder so ähnlich. 623 00:37:22,310 --> 00:37:25,000 Aber selbst dann ist das nicht ganz den Trick tun 624 00:37:25,000 --> 00:37:28,010 weil das, was passiert, wenn Sie eine Datei auf Ihrer Festplatte haben 625 00:37:28,010 --> 00:37:32,770 Das stellt einige Word-Dokument oder eine JPEG, und dies stellt Ihre Festplatte, 626 00:37:32,770 --> 00:37:35,350 und lassen Sie uns sagen, dass dieses Bandes stellt hier die Datei, 627 00:37:35,350 --> 00:37:38,390 und es ist von einem ganzen Bündel von 0 und 1 zusammen. 628 00:37:38,390 --> 00:37:42,470 Was passiert, wenn Sie nicht nur ziehen Sie die Datei in den Papierkorb kann oder Papierkorb 629 00:37:42,470 --> 00:37:48,020 sondern auch entleeren? Sortieren von nichts. 630 00:37:48,020 --> 00:37:49,640 Es ist nicht unbedingt jetzt nichts. 631 00:37:49,640 --> 00:37:54,290 Jetzt ist es nur nichts, weil ein wenig etwas geschieht in Form dieser Tabelle. 632 00:37:54,290 --> 00:37:58,370 So gibt es eine Art von Datenbank oder Tabelle innerhalb der Speicher eines Computers 633 00:37:58,370 --> 00:38:03,850 dass im Wesentlichen eine Spalte für Dateien Namen und eine Spalte für Dateien "Lage, 634 00:38:03,850 --> 00:38:07,720 wo könnte dies Lage 123, nur eine zufällige Zahl sein. 635 00:38:07,720 --> 00:38:14,560 So haben wir vielleicht so etwas wie x.jpeg und Standort 123. 636 00:38:14,560 --> 00:38:18,800 Was passiert dann, wenn Sie tatsächlich leeren Sie Ihren Papierkorb? 637 00:38:18,800 --> 00:38:20,330 Das geht weg. 638 00:38:20,330 --> 00:38:23,610 Aber was geht nicht weg ist die 0s und 1s. 639 00:38:23,610 --> 00:38:26,270 >> Also, was ist dann die Verbindung zum pset4? 640 00:38:26,270 --> 00:38:31,240 Nun, mit pset4, nur weil wir versehentlich die Compact-Flash-Karte gelöscht 641 00:38:31,240 --> 00:38:35,750 das hatte alle diese Fotos oder einfach nur, weil sie vom Pech beschädigt wurde 642 00:38:35,750 --> 00:38:38,000 bedeutet nicht, dass die 0 und 1 nicht immer noch da. 643 00:38:38,000 --> 00:38:40,410 Vielleicht ein paar von ihnen sind verloren, weil etwas habe beschädigt 644 00:38:40,410 --> 00:38:43,320 in dem Sinne, dass einige 0s 1s wurde und 1s wurde 0s. 645 00:38:43,320 --> 00:38:47,240 Bad Dinge passieren können, weil fehlerhafte Software oder fehlerhafte Hardware. 646 00:38:47,240 --> 00:38:50,370 Aber viele dieser Bits, vielleicht sogar 100% von ihnen sind immer noch da. 647 00:38:50,370 --> 00:38:55,050 Es ist nur, dass der Computer oder die Kamera nicht weiß, wo JPEG1 begonnen 648 00:38:55,050 --> 00:38:56,910 und wo JPEG2 gestartet. 649 00:38:56,910 --> 00:39:01,070 Aber wenn Sie das Programmiergerät, mit ein wenig versierte wo diese JPEGs sind, wissen 650 00:39:01,070 --> 00:39:06,010 oder wie sie aussehen, so können Sie analysieren die 0 und 1 und sagen JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 können Sie ein Programm mit im wesentlichen nur eine zum Schreiben oder while-Schleife 652 00:39:09,440 --> 00:39:12,820 dass wieder jeder von diesen Dateien. 653 00:39:12,820 --> 00:39:16,030 So die Lehre dann zu starten sicheren Löschen von Dateien 654 00:39:16,030 --> 00:39:18,340 wenn Sie möchten, dies ganz zu vermeiden. Ja. 655 00:39:18,340 --> 00:39:21,010 >> [Schüler] Wie kommt es, heißt es auf Ihrem Computer 656 00:39:21,010 --> 00:39:23,550 dass Sie mehr Speicher als vorher? 657 00:39:23,550 --> 00:39:27,820 Mehr Speicher als vorher - >> [Schüler] Weitere verfügbaren Speicher. 658 00:39:27,820 --> 00:39:29,630 Oh. Gute Frage. 659 00:39:29,630 --> 00:39:32,360 Also, warum dann nach dem Leeren des Papierkorbs wird Ihr Computer Ihnen sagen, 660 00:39:32,360 --> 00:39:34,910 dass Sie mehr freien Speicherplatz als vorher? 661 00:39:34,910 --> 00:39:36,770 In einer Nussschale, weil sie lügt. 662 00:39:36,770 --> 00:39:40,740 Mehr technisch, haben Sie mehr Platz, weil Sie jetzt gesagt haben 663 00:39:40,740 --> 00:39:43,680 Sie setzen andere Sachen, wo die Datei einmal war. 664 00:39:43,680 --> 00:39:45,450 Aber das bedeutet nicht, dass die Bits weg, 665 00:39:45,450 --> 00:39:48,590 und das bedeutet nicht, dass die Bits werden auf alle 0s verändert, zum Beispiel, 666 00:39:48,590 --> 00:39:50,150 für Ihren Schutz. 667 00:39:50,150 --> 00:39:54,640 So dagegen, wenn Sie sicher löschen Dateien oder physisch zu zerstören das Gerät, 668 00:39:54,640 --> 00:39:57,300 das ist wirklich der einzige Weg, manchmal um, dass. 669 00:39:57,300 --> 00:40:02,020 >> Also, warum nicht wir auf diesem semi-beängstigend beachten verlassen, und wir werden Sie am Montag zu sehen. 670 00:40:02,020 --> 00:40:07,000 [Applaus] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]