[Musik zu spielen] David J. MALAN: In Ordnung. Dies ist CS50. Und dies ist der Beginn der Woche 5. Und wie Sie vielleicht bemerkt haben, ein Teil des Materials ist immer ein wenig mehr komplex, die etwas dichter. Und es ist sehr einfach, vor allem, wenn Sie haben die Angewohnheit seit einiger Zeit, zu versuchen, die meisten kritzeln alles, was wir tun, sind wir in der Klasse sagen. Aber erkennen, dass es vielleicht nicht die ideale pädagogischen Ansatz zu lernen, diese Art von Material, und Material im Allgemeinen. Und so freuen wir uns, verkünden, dass CS50 eigenen Gheng Gong begonnen hat, bereiten eine kanonische Satz von Notizen für den Kurs, die Hoffnung der Das ist das, ein, diese nicht nur als dienen Referenz und eine Ressource Material für die Überprüfung und Gehen zurück durch Material, das haben könnte Sie entkam beim ersten Mal, aber auch so, dass eure Köpfe können mehr up als unten, wenn es kommt Zeit, Vortrag, so dass Sie eingreifen könnten mehr nachdenklich, als mehr scribbly entgegen. Mit dieser sagte, was Sie finden auf die Website ist solche Dokumente wie dieses. Und beachtet, oben links, gibt es nicht nur ein Inhaltsverzeichnis, sondern auch Zeit-Codes, die Sie springt sofort an den entsprechenden Teil in dem Video online. Und was hier getan hat Chang ist im Wesentlichen dokumentiert was passiert ist in dieser insbesondere Vortrag. Und viele der Vorträge sind bereits jetzt online mit dieser URL. Und wir werden auch weiterhin den Rest veröffentlichen der von dem Ende der Woche, also nutzen Sie diese Ressource. So ohne weiteres, wir begonnen, wieder abziehen die Schicht, die gewesen ist String für einige Zeit. Und was haben wir sagen, eine Zeichenfolge tatsächlich ist in der vergangenen Woche? So char Stern. Char und Sterne, na ja, was hat das eigentlich? Nun, die ganze Zeit, ob wir wurde eine Funktion aufrufen, wie getString und Speichern die sogenannte Rück Wert getString in ein variable-- es heißt s Art string-- wir haben geschrieben die Codezeile dort oben. Und es ist nur, wenn ich meine Handschrift hier vergrößert muss ich erkennen, wie grauenhaft das ist. Aber lassen Sie uns davon ausgehen, dass, auf der rechten Seite ist dennoch eine sinnvolle Darstellung von dem, was wurde auf alles los Zeit mit getString. getString, natürlich, bekommt einen String. Aber was bedeutet das wirklich? Es bedeutet, dass es ein Stück bekommt Speicher vom Betriebssystem durch den Aufruf einer Funktion, genannt malloc. Aber dazu später mehr. Und dann füllt sie dass Teil des Speichers mit den Buchstaben der Benutzer eingegeben wird, gefolgt von der natürlich ein Null-Zeichen oder Backslash Null am Ende. Dessen auf der linken Seite dieser Geschichte, die ganze Zeit, wir haben eine Variable deklarieren, wie s. Und das ist das, was jetzt variable startet Aufruf einen Zeiger. Es ist nicht ein Feld, innerhalb dessen wir den String, Daven, per se, sondern in diesem Feld haben wir Box auf der linken Seite, was genau? Ja? ZIELGRUPPE: Die Adresse wo es im Speicher befindet. David J. MALAN: Genau. Die Adresse, wo Daven im Speicher abgelegt wird. Und nicht dort, wo alle Daven befindet, an sich, sondern insbesondere die Adresse von was? Ja? ZIELGRUPPE: Erstes Zeichen. David J. MALAN: Das erste Zeichen in Daven, die, in diesem Fall Ich schlug vor, willkürlich war und unrealistisch 1, Ox1, das bedeutet nur, die hexadezimale Zahl von 1. Aber es ist wahrscheinlich um eine viel größere Zahl sein dass wir vielleicht ziehen mit 0x als Präfix, die eine hexadezimale Zeichen. Und weil wir nicht brauchen, zu wissen, wo der Rest der Zeichen Daven sind, aufgrund dessen, was einfaches Design Entscheidung, die vor vielen Jahren gemacht wurde? Ja? ZIELGRUPPE: 0 Backslash. David J. MALAN: Ja, genau. Der Backslash 0 können Sie, wenn auch in lineare Zeit, um die Zeichenfolge zu durchqueren, zu Fuß von links nach rechts, mit einer for-Schleife oder eine Weile Schleife, oder so ähnlich das, und zu bestimmen, oh, hier ist das Ende dieses bestimmten String. Also nur mit der Adresse der Beginn einer Zeichenfolge, können wir die Gesamtheit der Zugang , weil all dies, während, ein String hat nur ein char Stern. So ist es sicherlich in Ordnung, weiterhin mit der CS50-Bibliothek und diese Abstraktion, so zu sprechen, aber wir werden beginnen, um genau zu sehen, was los war unter dieser ganzen Zeit. So können Sie dieses Beispiel erinnern, Auch vom letzten Mal, zu vergleichen, 0, was nicht wirklich zu vergleichen. Aber wir begannen, diese zu lösen. Aber wie vielleicht eine Auffrischung, könnte ich jemanden interessieren in einem rosa Elefanten heute auch von Chang gemacht? Wie über Sie vor? [Unverständlich]. Komm auf. Und in der Zwischenzeit, wie Sie kommen, lassen Sie uns Betrachten wir für einen Moment, was dieser Code tatsächlich tut. Es erklärt sich zwei Variablen Top, s und t, und mit der Aufforderung getString. Dies ist nicht ein sehr benutzerfreundliches Programm, weil sie nicht sagen, was zu tun ist. Aber lassen Sie uns einfach mal davon aus, wir sind die sich auf die saftigen Teil. Und dann tun wir, wenn s gleich t entspricht, sollte es printf sagen, Sie tippte die gleiche Sache. Hallo. Wie heißen Sie? JANELLE: Janelle. David J. MALAN: Janelle, Freut mich, dich kennenzulernen. So Ihre Herausforderung an Hand für diese Elefanten ist es, zuerst ziehen uns ein Bild von dem, was ist in den ersten beiden vertreten Linien. So s und t sein könnte vertreten, wie auf dem Bildschirm? Und Sie können einfach ziehen Sie es mit Ihren Finger auf dieser großen Leinwand. So gibt es zwei Hälften zu Jede Seite dieser Gleichung. So gibt es s auf der linken Seite, und dann getstring auf der rechten Seite. Und dann gibt es t auf der linken Seite, und dann getstring auf der rechten Seite. Also, wie könnten wir beginnen Zeichnen Sie ein Bild, stellt dar, was los ist hier in Erinnerung, würden Sie sagen? Und lassen Sie mich Ihnen erklären, was Sie tun, wie Sie gehen. JANELLE: OK. Nun, zunächst, es wäre zu fragen Sie die Eingabe-String zu bekommen. Und es wäre Speicher-- oh, sorry. David J. MALAN: OK. Gut. Und dies wird als was? Oh, OK. Weitermachen. Ich wollte nicht zu unterbrechen. JANELLE: Sorry. So würde es sie in Eingangs die Adresse von-- nicht sicher. Ich kann mich nicht genau erinnern, die Anzahl, aber ich glaube, es wurde mit 0 beginnend. David J. MALAN: Das ist alles richtig, weil ich die Zahlen auf, so gibt es keine richtige Antwort. JANELLE: Beginnend mit der 0 Lichtbogen. David J. MALAN: OK, also Element 0. Sicher. JANELLE: Und dann war, wenn nur wie ein zwei-letter-- David J. MALAN: OK, zurück zu Ihnen. JANELLE: Also Element 0, und dann Element 1 oder Element 2. David J. MALAN: Und welches Stück Bild Sie jetzt zeichnen? Der Aufruf von getString? Oder die Erklärung von s? JANELLE: Die Erklärung von s, glaube ich. Oh, die getString, denn es wäre in jedem [eingegeben werden? Bereich. ?] David J. MALAN: Gut. Genau. Obwohl dies effektiv Gibt ein Array, Rückruf, wenn wir zurück sind eine Zeichenfolge, können wir Index in diesem String mit 01 und 2. Technisch sind diese wahrscheinlich von einzelnen Adressen vertreten, aber das ist in Ordnung. Also nehme, wenn ich nur schnell uns auf, wo wir aufgehört haben letzten Mal, wenn eine der die Saiten war g a b e, Backslash 0, so repräsentiert Gabes Eingang, wie könnten wir jetzt stellen s? Wenn dies der Speicher, ist wurde durch getString zurückgegeben? JANELLE: Wäre es durch einen Bogen repräsentiert? David J. MALAN: Mit einem Bogen? Nun, nein. Sagen wir einfach, bildhaft, lassen Sie mich einfach weitermachen und schlagen vor, dass, wenn das S, diese ist der Rückgabewert der getString. Und Sie dies als 0, 1, 2, die gezeichnet haben ist durchaus sinnvoll, denn wir können Index in der Zeichenfolge, die als solche. Aber nur um im Einklang mit der letzten Mal, lassen Sie mich gehen Sie vor und willkürlich schlagen vor, diese ist die Adresse 1, das ist die Adresse 2, Dies ist die Adresse 3 und so weiter. Und so, nur um sein Super- klar, was los ist in s als Folge der, dass zu gehen erste Codezeile, würden Sie sagen? JANELLE: Adresse 1? David J. MALAN: Genau. So adressieren 0x1. Und in der Zwischenzeit, lassen Sie mich gehen Sie vor und duplizieren viel von dem, was Sie getan haben, und fügen Sie meine eigene t hier. Wenn ich zu geben gabe waren wieder ein zweites Mal, wenn sie mit getString aufgefordert werden, in denen, ist natürlich gabe hingehen? Nun, presumably-- JANELLE: Wie hier vor? David J. MALAN: Ja. JANELLE: Oder es ist auch in den gleichen Kisten? David J. MALAN: Lassen Sie mich schlagen, ja, genau, so dass in diesen zusätzlichen Boxen. Aber was ist jetzt Schlüssel ist, dass, auch obwohl ich diese ziemlich nahe gezogen together-- 0x1, diese ist in Wirklichkeit 0x2--, das jetzt vielleicht Adresse 0x10 sein, zum Beispiel, und 0x11 und 0x12, und so weiter. Und so, wenn das der Fall ist, was wird hier am Ende in t? JANELLE: 0x10? David J. MALAN: Genau. Also 0x10. Und jetzt, letzte Frage. Sie haben mit Abstand hatte, um die Arbeit härteste für einen Elefanten so weit. Von jetzt, wenn ich ziehen Sie den Code wieder, wenn ich in Zeile drei, wenn s gleich t gleich, was bin ich eigentlich Vergleichen, dass wir hier gezeichnet? JANELLE: Die beiden Adressen? David J. MALAN: Genau. Also ich sage, ist s gleich gleich t? In anderen Worten ist gleich 1 gleich 10? Und natürlich die offensichtliche Antwort ist jetzt, nein. Und so ist dieses Programm letztlich Drucklegung, was würden Sie sagen? JANELLE: Wäre es, Sie die gleiche Sache getippt? David J. MALAN: Also, wenn s 1 ist und t 10? JANELLE: Sie gaben verschiedene Dinge. David J. MALAN: Genau. Sie eingegeben haben verschiedene Dinge. In Ordnung. So eine Runde Applaus, Wenn wir könnten, hier. [Applaus] Das war schmerzhaft. Ich weiß. Schön gemacht. So, jetzt wollen wir mal sehen, ob wir es nicht können necken neben was das Update war. Und selbstverständlich, wenn man fest this-- Ich werde das jetzt in green-- darstellen wir haben ein paar Verbesserungen hier. Zunächst nur als Vernunft überprüfen, ich bin erste Überprüfung wenn s gleich null und t gleich null. Und nur klar zu sein, wenn vielleicht s oder t null sein in Code wie diesen? Wann könnte s oder t null sein. Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Genau. Wenn die Zeichenkette, die der Benutzer eingegeben ist viel zu lange um in den Speicher passen, oder einige seltsame Ecke Fall so, getstring, wie wir sehen werden, wörtlich heute, in der Dokumentation, sagt, es wird null zurück, wie eine spezielle Wächter-Wert, oder einfach irgendwie ein spezielles Symbol das bedeutet, dass etwas schief gelaufen ist. So überprüfen möchten wir dass, da es sich heraus dass null ist ein sehr gefährlicher Wert. Oft, wenn Sie versuchen, etwas zu tun mit null mit einer function-- Leiten als Eingabe für diese Funktion instance-- könnte sehr abstürzen und mit ihr, nehmen Sie Ihre ganze Programm. Also das dritte Linie ist jetzt nur eine Vernunft zu überprüfen, Fehlerprüfung, wenn man so will. Das ist eine gute Angewohnheit, sich jetzt für uns, in jeder Zeit erhalten wir versuchen, einen Wert zu verwenden, die könnte möglicherweise auch null sein. Jetzt, in der vierten Zeile hier, "Wenn strcmp (s, t):" Nun, was ist das bezieht? Nun haben wir gesagt, das war ein sehr prägnant benannte Funktion für String-Vergleich. Und seinen Zweck im Leben ist, zu vergleichen erstes Argument gegen sie zweite, aber nicht in Bezug auf ihre Adressen, wie wir unbeabsichtigt ein Moment vor mit dem roten Code, aber eher auf diese beiden vergleichen Zeichenfolgen in der menschlich intuitive Weise durch Vergleich dieser vor diesem, dagegen, gegen diese, und dann stoppen, ob und wann ein oder beide meine Finger trifft einen Backslash 0. So jemand vor Jahren umgesetzt strcmp für uns die Funktionalität implementieren dass wir hoffen, wir bekommen haben nur durch den Vergleich von zwei einfache Werte. Nun ehrlich gesagt, halte ich Zeichnung Alle diese verschiedenen Zahlen. Aber die Realität ist, ich habe machen diese die ganze Zeit. Und so lassen Sie mich einfach weitermachen und kritzeln diese aus um einen Punkt zu machen, dass am Ende des Tages und vorwärts, wir nicht wirklich zu interessieren welche Adressen sind die Dinge tatsächlich im Speicher. Also ich bin nicht dabei, diese zu zeichnen Arten von Zahlen so viel mehr, Ich bin nur ein abstrakter diese weg ein wenig freundlicher mit nur Pfeile. In anderen Worten, wenn s ist ein Zeiger, Nun, lassen Sie es gerade zu ziehen, buchstäblich, als ein Zeiger, ein Pfeil von sich selbst zu etwas anderem, und nicht zu viel Sorgen machen die Minutien dieser Adressen die wiederum habe ich sowieso. Aber wir werden diese Adressen sehen manchmal, wenn Debugging-Code. Jetzt inzwischen dieses Programm hier Korrekturen, natürlich, dieses Problem durch Vergleich diese beiden Saiten. Aber wir liefen in einem anderen Problem. Dies war von der Kopie programmieren letzten Mal, wobei, ich habe versucht zu kapitalisieren nur das erste Zeichen in einem String. Aber was war das Symptom wir letztes Mal sah, wenn ein Benutzer einen Wert eingegeben, wie gabe in Kleinbuchstaben, für s, dann haben wir zugewiesen s in t, wie in der dritten Zeile befinden, und dann habe ich versucht, Kapital t Halterung 0? Was war die Wirkung der Ändern t Halterung 0 hier? ZIELGRUPPE: Es änderte s. David J. MALAN: Ja, Ich änderte s, wie gut. Denn das, was wirklich los war? Nun, lassen Sie mich sehen, ob ich reinigen kann bis dieses Bild, wie folgt. Wenn s wieder das Wort g, a, b, e, Schrägstrich, 0 und S, wir Zeichnung als Feld weiter Hier, aber nicht mehr Adressen. Lassen Sie uns aufhören, Dinge. Lassen Sie uns einfach ein Bild zeichnen , um die Welt zu vereinfachen. Wenn ich erklären t mit String t, das schafft, dass Teil des Speichers. Platz passiert mit 32 sein Bits in den meisten Computern. In der Tat, wenn Sie jemals von einem gehört habe Computer mit einer 32-Bit-Architektur, wirklich Lust-sprechen, dass nur bedeutet dies, verwendet 32-Bit-Adressen. Und als technischer beiseite, Wenn Sie sich jemals gefragt haben warum ältere Computer, wenn Sie tatsächlich Suppe sie mit viel RAM versucht, konnte nur maximal haben vier Gigabyte RAM, auch das ist, weil buchstäblich nur Ihrem alten Computer konnte zählen so hoch wie 4 Milliarden, 4 Milliarden Bytes, denn es wurde unter Verwendung von 32-Bit- Zahlen für Adressen. Aber in jedem Fall in diesem Beispiel Geschichte ist viel einfacher. t ist nur ein weiterer Zeiger oder wirklich ein char Sterne, auch bekannt als String. Und wie will ich dieses Bild zu aktualisieren jetzt mit dieser zweite Codezeile, nach dem Punkt, Punkt, Punkt? Wenn ich String t gleich s Semikolon, wie funktioniert das Bild ändern? Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Ja. Genau. Ich habe nur einen Pfeil von der t-Box an die gleiche Adresse, die gleichen ersten Buchstaben gab. Oder technisch wenn diese Kerl noch auf 0x1, es ist, als hätte ich 0x1 hier und hier 0x1. Aber noch einmal, wer sich interessiert über die Adressen? Es ist nur die Idee, die jetzt zählt. Also das ist, was hier passiert. So natürlich, wenn Sie das tun t Halterung 0, der Array-Notation ist, von course-- und ehrlich gesagt, es sieht als gäbe es eine Reihe hier, aber jetzt gibt es diese seltsame Sache. Wissen, dass die Programmiersprache, C, bietet Ihnen diese Funktion, wobei, wenn t eine Zeiger oder S ist ein Zeiger, Sie können immer noch, dass die vertrauten, komfortable eckige Klammer Notation zu dem ersten Element zu gehen, oder das zweite Element oder ein Element dass dieser Zeiger zeigt auf, weil sie vermutlich ist, wie in diesem Fall, zeigt an einigen Array. So, wie wir dieses Problem beheben? Ehrlich gesagt, ist dies, wo es wurde ein wenig überwältigend auf den ersten Blick. Aber hier ist eine neue und verbesserte Version. Also zuerst, ich bin immer der CS50-Bibliothek zu befreien, nur um tatsächlich aussetzen, daß s ein char Sterne, nur ein Synonym. Und T ist auch ein Zeichen Stern. Aber, was los ist auf der rechten Seite dieser Linie wobei t ein Wert zugewiesen wird? Was ist malloc? Was es strlen? Was ist sizeof (char)? Warum zum Teufel tut dies Linie Blick so kompliziert? Wie ist es zu tun auf einem hohen Niveau? Wie ist es zu speichern in t? Ja? ZIELGRUPPE: Es ist eine Zuweisung bestimmte Menge an Speicherplatz. Es ist zu speichern, glaube ich, Briefe [unverständlich]. David J. MALAN: Perfect. Perfekt. Es Zuweisen eines bestimmten Menge an Speicherplatz zu speichern, vermutlich, Zukunft Buchstaben. Und insbesondere malloc wird daher der Rückkehr, was? ZIELGRUPPE: Rückkehr auf die [unverständlich]? David J. MALAN: Genau. Rücksendung der Adresse dieses Speicher, das ist eine andere Art zu sagen, liefert die Adresse, die ersten Bytes dieses Speichers. Die Last ist auf mich zu erinnern, wie viel Speicher ich eigentlich zugeteilt oder fragte malloc für. Nun, wie viel ist das? Nun, obwohl es viele Klammern hier, malloc dauert nur ein einziges Argument. Und ich bin Angabe strlen von s, so geben mir so viele Bytes, wie es in s, aber eins. Warum? Ja? ZIELGRUPPE: Der Backslash 0. David J. MALAN: Genau. Wir müssen ein wenig Hauswirtschaft zu tun. Also, da gibt es einen umgekehrten Schrägstrich 0, würden wir besser daran erinnern. Sonst werden wir um eine Zeichenfolge zu erstellen, die nicht über diese besonderen Terminator. Inzwischen, nur um sein Super- anal, ich habe sizeof (char), den Fall, jemand läuft mein Code nicht auf dem CS50-Appliance, aber vielleicht ein anderer Computer insgesamt, wo Zeichen sind ein Byte, durch Konvention, sondern zwei Byte, oder etwas größer als die. Es ist einfach super zu sein, Super abgeneigt Fehler. Obwohl in der Realität ist es wahrscheinlich werde eine 1. Nun, mittlerweile, ich voran gehen und kopieren Sie die String, t Bügel i gleich t s Halterung. Und ich werde zum letzten Woche verschieben Source-Code, um zu sehen, was los ist. Aber der Schlüssel zum Mitnehmen, und die Grund ich den Code jetzt in grün, Denn dieser letzten Zeile, t Klammer gleich 0 toupper, hat die Wirkung, Kapitalisierung, die Schnur? t und / oder s? Das letzte Codezeile. Nur T, weil das, was ist passiert dieses Mal, wenn ich diesen letzten Schritt leicht rückgängig zu machen, Was ist passiert, wenn ich rufe malloc, Ich bekomme im Wesentlichen ein Teil des Speichers Das ist dieselbe Größe wie das Original, denn das ist die Arithmetik habe ich getan. Ich Speicherung in t der Adresse dieser Teil des Speichers. Auch wenn dies sieht nett aus und hübsch, schön und leer, die Realität ist es, was wir halten Sie fordern, Müll Werte in hier. Das Stück Speicher kann sehr auch wurden bereits verwendet, ein paar Sekunden, vor ein paar Minuten. So könnte es durchaus sein, Zahlen oder Buchstaben da, nur durch Zufall. Aber sie sind nicht gültig, bis ich mich bevölkern diese Teil des Speichers mit den tatsächlichen Zeichen, wie ich zu tun, dass in for-Schleife gibt. In Ordnung? So, jetzt der Höhepunkt der Diese drei Beispiele , die scheinbar letzte Mal gebrochen wurden, Dieser Swap beispielsweise die Funktion im Sinne gearbeitet daß sie vertauscht und b. Aber es hat nicht in welche anderen Sinn zu arbeiten? Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Genau. Wenn ich diese Funktion aufrufen another-- von etwa von einer Funktion wie Main, wo Ich habe eine Variable, x und y, wie ich letzte Woche, gleiche Code, und ich pass in x und y zu tauschen, und rufen Sie dann diese Swap--, Natürlich ist die richtige Version ist das, was wir über den du see-- es hat nicht funktioniert. Was ist also die Lösung? Nun, so einfach zu sein klar, lass mich gehen Sie vor und-- geben mir 1 Sekunde hier und sehen wenn ich Ihnen die letzte, zu zeigen, welche werden sehen, ob ich finden kann in-- lassen diese reale fast-- OK, [unverständlich]. OK, da ist es. So ignorieren die Befehle, die ich bin nur die Eingabe. Ich will, dass es bei abrufen die letzte Minute ein Beispiel vom letzten Mal, die ist nun nicht Swap genannt. Also kein Swap ist, wo wir aufgehört haben beim letzten Mal, wobei initialisiert I x 1 und y 2. Ich habe dann Makeln, vorbei in 1 und 2. Und dann diese Funktion in gewisser Weise bearbeitet, aber es hatte keine bleib Wirkung auf x und y. So ist die Frage bei der Hand ist, wie jetzt wissen wir eigentlich dieses Problem zu beheben? Was ist die Lösung zur Hand? Nun, in swap.c, die heute neu ist, ist, feststellen, ein paar Unterschiede. x und y sind gleich. Aber was ist eindeutig anders an Linie 25? Was ist neu da, wenn Sie sich erinnern wie es aussah vor einer Sekunde? ZIELGRUPPE: [unverständlich]. David J. MALAN: Ja. Also die kaufmännische und-Zeichen sind ein neues Stück Syntax nicht nur in diesem Programm, sondern auch generell in CS50. Bis heute glaube ich nicht, wir haben keine Beispiele gesehen oder wirklich sprach über sie in jeder Detail, andere als, vielleicht, präventiv im Schnitt, ein kaufmännisches wie diese. Nun stellt sich heraus, Et-Zeichen ist eine der letzten Stücke der neuen Syntax wir gehen zu lernen. Alles, was es bedeutet, ist die Adresse einer Variablen. An welche Adresse muss x leben? Aber welche Adresse muss y leben? Weil, wenn der Grundproblem vor , dass x und y wurden bestanden Kopien, was wir wirklich tun wollen mit wie einen Schatz bieten Swap Karte, die in der x und y führt tatsächlich im RAM, so dass Swap kann diese Karte folgen und gehen dorthin, wo x oder y markiert die Stelle und ändern Sie die Ist-Werte 1 und 2 da. So tauschen muss auch etwas ändern. Auf den ersten Blick könnte dies scheinen ein wenig ähnlich char Stern. Und in der Tat ist es. So eine ist ein Zeiger auf welche Art von Daten, auf der Grundlage dieser markierten Teil? Es ist also ein int. So eine ist nicht mehr ein int, es ist die Adresse einer int. Und ähnlich, b jetzt gehen um die Adresse einer int sein. Also, wenn ich jetzt Makeln von Main, Ich werde nicht zu Swap 1 und 2 geben. Ich werde es wie geben Ochsen etwas und Ox-etwas, zwei Adressen, die führen wird Tauschen, um ihren tatsächlichen Standort im Speicher meines Computers. So, jetzt meine restlichen Umsetzung muss ein bisschen ändern. Was ist nun offensichtlich anders in diesen drei Zeilen Code? Es ist diese verdammte alle Sterne über dem Platz, alles in Ordnung? Also, was ist denn hier los? Ja? ZIELGRUPPE: Es ist offensichtlich [unverständlich]. David J. MALAN: Genau. Also in diesem context-- und das war nicht die beste Design-Entscheidung, zugegeben, vor Jahren. In diesem Zusammenhang, wo Sie müssen nur einen Stern, und Sie haben keinen Datentyp, wie int, sofort nach links, sondern Sie haben ein Gleichheitszeichen, klar, in diesem Zusammenhang, wenn Sie sagen, ein Stern, das bedeutet, lesen Sie den Adresse, die in einem ist. Folgen Sie der Schatzkarte, so zu sprechen. Und in der Zwischenzeit, in Zeile 37, es bedeutet, die gleiche Sache. Rufen Sie die Adresse ein, und setzen, was da? Was auch immer bei der ist Standort, b gibt. In anderen Worten, zu gehen b. Holen Sie sich diesen Wert. Gehen Sie zu einem, und je die Gleich unterzeichnen, der Zuweisungsoperator, setzen, dass es Wert. Ebenso ist int Temp nur ein int. Nichts muss über Temperatur ändern. Es ist nur ein Ersatzglas von Annenberg um etwas Milch oder Orangensaft. Aber ich muss sagen, gehen Sie zu b. Gehen Sie zu diesem Ziel und setzen Sie den Wert in Temp dort. Also, was ist dann passiert? Wenn ich tatsächlich Makeln dieser Zeit, wenn diese erste Fach hier stellt Main, Diese zweite Schale stellt Swap, wenn Ich gehe Et-Zeichen und das kaufmännische x y von Main zu tauschen, nur klar zu sein, was ist das Stapelrahmen Empfangs? Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Genau. Die Adresse x und die Adresse y. Und Sie von diesen denken kann wie Postanschriften. 33 Oxford Street und 35 Oxford Street, und Sie wollen die beiden Gebäude zu bewegen , die an diesen Stellen sind. Es ist eine Art lächerliche Idee, aber das ist alles, was wir damit meinen Adresse. Wo in der Welt kann man diese zwei ints finden? Wo in der Welt kann man finden die beiden Gebäude? Also, wenn endlich, nach all dieser Zeit habe ich gehen in der heutigen Quellcode und kompilieren Swap-und Lauf ./swap schließlich für die ersten Mal sehen wir eigentlich, dass meine Werte haben in der Tat erfolgreich getauscht. Und jetzt können wir sogar Kenntnis von diesem in, sagen wir, gdb. Lassen Sie mich also in die gleiche Datei zu gehen. Lassen Sie mich gehen Sie vor und führen Sie gdb von ./swap. Und jetzt, im Swap, ich werde gehen voraus und einen Haltepunkt setzen in Main. Und jetzt werde ich gehen vor, und führen Sie das Programm. Und jetzt sehen wir, mein Code blieb an dieser Linie. Wenn ich weiter und Druck gehen x, was soll ich hier sehen? Es ist eine Frage. Wieder sagen? ZIELGRUPPE: [unverständlich]. David J. MALAN: So Zufallszahlen, vielleicht. Vielleicht bekomme ich das Glück, und es ist schön und einfach, wie 0. Aber vielleicht ist es einige Zufallszahl. In diesem Fall hatte ich Glück. Es passiert einfach zu 0 sein. Aber es ist in der Tat Glück, denn nicht, bis ich Geben Sie auf Weiter und dann print x hat, dass Code-Zeile, Zeile 19, ausgeführt wurde. Inzwischen, wenn ich schreibe nächste wieder, und Drucken Sie nun y, werde ich sehen 2. Nun, wenn ich schreibe nächsten, es ist zu gehen ein wenig verwirrend, denn jetzt, printf wird am erscheinen der Bildschirm, wie es getan hat. x 1 ist. Das machen wir wieder. Und jetzt, hier, wo Dinge interessant. Bevor ich Makeln oder sogar Schritt hinein, lassen Sie uns einen kleinen Einblick. x ist wiederum 1. Y ist natürlich, schnell Vernunft überprüfen, 2, so gibt es nicht schwer. Aber was ist Kaufmanns-x? Antwort, es ist irgendwie funky suchen. Aber die int Sterne in Klammern ist nur BIP Art zu sagen, das ist eine Adresse. Es ist nicht ein int, es ist ein Zeiger auf eine int, oder anders als Adresse bekannt. Was ist das verrückte Sache? Wir haben noch nie etwas gesehen ganz so vor. Also das ist die Adresse in meinem Computer Speicher, wobei x passiert, zu leben. Es ist etwas, Ox-. Und das ist, ehrlich gesagt, warum Ich habe Pfeile zeichnen begann, anstelle von Zahlen, denn wer kümmert sich wirklich int, dass Ihr an einem bestimmten Adresse, die so groß ist. Aber bffff0c4 sind diese alle Tat hexadezimalen Ziffern, die durch f 0 sind. Also wir gehen nicht zu wohnen lange auf das, was diese Dinge sind. Aber wenn ich ausdrucken y, Natürlich sehe ich 2. Aber Kaufmanns-y, sehe ich diese Adresse. Und beachtet, für die Neugierigen, Wie ist der Abstand x und y? Sie können die meisten der Adresse ignoriert. Vier Bytes. Und das ist im Einklang mit unserer früher behaupten, dass, wie groß ist ein int? Vier Bytes. So wie es aussieht ist alles Futter bis Schön, wie Sie vielleicht hoffen, in Erinnerung. So, jetzt lassen Sie uns einfach schnell vorwärts an das Ende der Geschichte. Fahren wir fort und geben Schritt, in der Swap-Funktion zu tauchen. Jetzt bemerken, wenn ich ein Typ, es ist identisch mit der Adresse x. Wenn ich Typ B, es ist identisch die Adresse von y. Also, was soll ich sehen, ob ich sagen wir, an die Adresse einer gehen? So drucken Sie ein Star. Also Stern bedeutet, gehen dort in diesem Zusammenhang. Ampersand bedeutet, was ist die Adresse. So ein Mittel 1 Stern. Und Druck Sterne-B gibt mir 2. Und lassen Sie mich gehen davon aus, für den Augenblick, dass zumindest der Code, geht jetzt ausführen kann durch auf diese Weise begründet. Aber wir werden diese Idee schon bald wieder besuchen. Also diese Version von Swap ist jetzt richtig und ermöglicht uns, diese bestimmten Datentyp zu tauschen. Also Fragen dann tauschen? Auf Sterne? Am Adresse? Und Sie werden sehen, mit Problem-Set 4, Art, aber Problem Set 5, auf jeden Fall, wie diese Dinge sind nützlich und bekommen viel mehr wohl mit ihnen, als Ergebnis. Alles, was überhaupt? In Ordnung. Malloc so ist wiederum die Funktion dass nur reserviert Speicher, Speicher Allokation. Und warum ist das sinnvoll? Nun, die ganze Zeit, Sie habe mit malloc. Wenn Sie jetzt, wie betrachten getstring Werke, vermutlich ist es seit einem Stück jemanden fragen Speicher und jederzeit der Benutzer einen String in, weil wir sicher wusste nicht, wie CS50 Personal, wie groß diese Strings, die den Menschen gehen zu geben könnte. Lassen Sie uns also, zum ersten Mal starten, um abziehen, wie die CS50-Bibliothek Werke, durch eine Reihe von Beispielen das wird uns dorthin führen. Also, wenn ich öffnen gedit und eröffnen scanf 0, wir gehen, um den folgenden Code zu sehen. Scanf 0, auf der Website verfügbaren Heute hat relativ wenige Zeilen Code hier 14 bis 20. Und mal sehen, was es tut. Es erklärt einen int, genannt x. Es sagt so etwas wie, Zahl bitte. Und jetzt heißt es, scanf% i & x. So gibt es eine Reihe von neuen Sachen gibt. Aber scanf, Sie Art denken können der als das Gegenteil von printf. printf, natürlich, Drucke auf den Bildschirm. scanf Art von Scans aus dem Benutzer- Tastatur etwas, das er oder sie hat getippt. % I ist genau wie printf. Dies bedeutet, erwarten, dass die Benutzer, ein Typ int. Und jetzt, warum Sie denken, ich vielleicht vorbei scanf & x? Wenn der Zweck im Leben von scanf ist es, etwas von dem Benutzer zu bekommen, Was ist der Sinn des Weitergabe, & x, jetzt? Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Genau. Was auch immer ich, der Mensch, geben, meine Eingabe wird sich an dieser Stelle gespeichert werden. Es ist nicht ausreichend, daran erinnern, um nur Pass in x, weil wir bereits gesehen haben, immer wenn Sie nur eine rohe Variable übergeben, wie ein int, um eine andere Funktion, Sicher, es kann das ändern variabel, aber nicht dauerhaft. Es kann nicht eine Wirkung auf Main. Es kann nur eine lokale Kopie zu ändern. Aber wenn statt, brauchen Sie nicht gib mir die tatsächlichen int, aber du hast mich Richtungen zu geben int, dass ich jetzt, da scanf, sicher, ich kann das folgen Adresse und legte dort eine Nummer so dass Sie Zugriff darauf haben, wie gut. Also, wenn ich dieses Programm, mal sehen. Machen scanf 0 Punkt Schrägstrich, scanf 0. Und wenn ich jetzt eine Zahl wie 50, danke für den 50. Wenn ich jetzt eine Zahl wie Negativ 1, 1 für die negative. Ich jetzt eine Zahl eingeben, wie 1,5, hm. Warum hat mein Programm ignorieren mich? Nun, weil einfach, sagte ich es um einen int nur zu erwarten. In Ordnung. Also das ist eine Version davon. Lassen Sie uns die Dinge noch ein Stück und schlagen vor, das ist nicht gut. Und hierin liegt ein sehr einfaches Beispiel wie wir das Schreiben von Code beginnen dass andere Menschen ausnutzen können oder Kompromiss, Schlechtes zu tun. So Linie 16, so ähnlich im Geiste vor, aber ich bin nicht erklärt es dieses Mal Int. Ich erkläre es char Sterne, auch bekannt als String. Aber was bedeutet das wirklich? Also, wenn ich nicht eine address-- angeben und Ich bin es willkürlich aufrufen, Puffer, aber ich konnte es nennen S, simple-- zu sein und dann habe ich dies tun, erklären Sie mir, wenn du könntest, auf Basis des bisherigen Logik, was zu tun scanf in Zeile 18, wenn Pass% s und Puffer, dem eine Adresse? Was ist scanf, wenn Sie die Anwendung genau die gleiche Logik wie die Version 0, werde versuchen, hier zu tun, wenn der Benutzer etwas in? Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Genau. Scanf durch die Logik zuvor wird, um die Zeichenfolge zu nehmen dass der menschliche typisierte in-- jetzt ist es ein String ist, es ist nicht eine Zahl, vermutlich, wenn er oder sie cooperates-- und es wird versuchen, das zu setzen String im Speicher zu welcher Adresse Puffer angibt. Und das ist toll, weil Puffer tatsächlich soll eine Adresse sein. Aber ich behaupte, dieses Programm ist ein Buggy sehr ernste Weise, weil das, was Wert ist Puffer standardmäßig? Was habe ich in initialisiert? Was Teil des Speichers? Ich habe nicht, oder? Also auch wenn ich zuge ein char Stern, der nicht mehr aufgerufen S, es ist stattdessen genannt, so buffer-- Ziehen wir den Namen der Variablen jetzt als buffer--, wenn ich nicht genannt getString oder malloc hier, dass effektiv bedeutet, dass Puffer ist nur einige Müll Wert. Nun, was bedeutet das? Es bedeutet, dass ich gesagt scanf um einen String vom Benutzer erwartet. Und wissen Sie was? Was auch immer dieses Ding zeigen zu-- und ich ziehen Fragezeichen, aber in Wirklichkeit, es geht um sein so etwas wie Ox1, 2, 3, oder? Es ist eine falsche Wert, der nur geschieht es aus zuvor. Also mit anderen Worten, es ist als ob Puffer ist nur auf etwas in Erinnerung. Ich habe keine Ahnung, was. Also, wenn ich geben gabe jetzt, es geht zu versuchen, G-A-B-E / 0 Es stellen. Aber wer weiß, was das ist? Und in der Vergangenheit, einem Zeit, die wir versucht haben, berühren Speicher, der nicht gehört uns hat, was passiert ist? Oder fast jeder Zeit. Segmentation fault, oder? Dieser Pfeil, ich habe keine Ahnung, wo es ist Zeige. es ist nur einige Zufallswert. Und natürlich, wenn Sie interpretieren ein Zufallswert als Adresse, Sie gehen zu zu gehen einige zufällige Ziel. So könnte in der Tat gabe Crash mein Programm in diesem Fall hier. Also, was können wir tun, das ist fast so schlimm? Betrachten Sie dieses dritten und letztes Beispiel für scanf. Diese Version ist besser, in welchem ​​Sinne? Wenn Sie mit der ARE vorherige Problem, das ist besser. Warum? ZIELGRUPPE: [unverständlich]. David J. MALAN: Gut. So dass diese bei Zeile 16 besser ist, in dem Sinne, dass wir explizit Zuteilung etwas Speicher. Wir werden nicht mit malloc, wir sind mit der Woche 2 Ansatz von nur Deklaration eines Arrays. Und wir vor, dass ein String gesagt haben ist nur eine Reihe von Zeichen, so das ist völlig legitim. Aber es ist natürlich, wie Sie beachten, feste Größe, 16. So ist dieses Programm völlig sicher, wenn ich schreibe in einem Zeichenketten, zwei Zeichen Saiten, 15 Zeichenketten. Aber sobald ich mit der Eingabe beginnen 16, 17, 18, 1000 Zeichenketten, Wo ist das String am Ende sich? Es wird teilweise hier am Ende. Aber wer weiß was noch jenseits der Grenzen dieser besonderen Array? Es ist, als hätte ich erklärt 16 Boxen hier. Also anstatt ziehen alle 16, werden wir nur so tun, dass ich 16 gezogen. Aber wenn ich dann versuchen, einen String lesen Das ist viel mehr, wie 50 Zeichen, Ich werde damit beginnen, a, b, c, d, x, y, z. Und das ist vermutlich eine andere Speichersegment daß wiederum kann dazu führen, mein Programm zum Absturz zu bringen, denn ich habe nicht gefragt etwas mehr als nur 16 Byte. Also, wer sich interessiert? Nun, hier ist der CS50-Bibliothek. Und die meisten ist dies nur wie Anweisungen bis oben. Das CS50-Bibliothek, die ganze Zeit, hat diese Linie in der Linie 52 hatte. Wir haben gesehen typedef oder Sie werden sehen, typedef in pSoll 4, die gerade erstellt ein Synonym wobei char Stern kann mehr sein einfach als String bezeichnet. So ist dies eines der wenige Stützräder wir heimlich unter der Haube verwendet. Unterdessen, hier ist die Funktion, getchar. Nun offenbar, es gibt keinen Körper, um es. Und in der Tat, wenn ich halten Scrollen, ich nicht wirklich Sie sehen keine Implementierungen dieser Funktionen. Als Plausibilitätsprüfung, warum ist das so? ZIELGRUPPE: [unverständlich]. David J. MALAN: Ja. Also das ist der Header-Datei. Und Header-Dateien enthalten Prototypen, plus einige andere Sachen, so scheint es, wie Typdefinitionen. Aber in CS50.c, die wir haben Sie geradezu nie gegeben, hat aber in der CS50 Gerät war alles dieses Mal tief in die Ordner, feststellen, dass es eine ganze Reihe von Funktionen in hier. In der Tat, wir unten scrollen. Ignorieren wir die meisten von ihnen, für jetzt. Aber unten scrollen, um getInt und sehen, wie getInt funktioniert. So, hier ist getInt. Und wenn Sie jemals wirklich interessierte, wie bekommen int funktioniert, hier ist seine Dokumentation. Und unter den Dingen, es sagt, ist es Ihnen sagt, was die Wertebereiche kann es zurück. Es ist im Wesentlichen negativ 2 Milliarden positive 2 Milliarden, geben oder nehmen. Und es stellt sich heraus, das alles Zeit, auch wenn wir noch nie Sie hatte für ihn zu überprüfen, wenn etwas schief geht, es stellt sich heraus, dass alle Diesmal hat getInt wurde die Rückgabe eines speziellen konstant, nicht null ist, sondern INT_MAX, das ist Konvention nur einen Programmierer. Es bedeutet, hier ist ein spezieller Wert. Achten Sie darauf, dies zu überprüfen, nur falls etwas schief geht. Aber wir haben nie die Mühe gemacht mit, dass bis dato weil wieder, dieses soll vereinfacht werden. Aber wie funktioniert getInt bekommen umgesetzt? Nun, eines, dauert es keine Argumente. Das wissen wir. Es gibt ein int. Das wissen wir. Also wie kann es unter der Haube arbeiten? Es gibt also offenbar eine unendliche Schleife, mindestens das Auftreten eines. Beachten Sie, dass wir mit getString. Also das ist interessant. getInt ruft unsere eigene Funktion, getString. Und nun, was könnte dies der Fall sein? Warum bin ich defensiv hier in Zeile 165? Was könnte passieren, im Einklang 164, nur klar zu sein? Es ist die gleiche Antwort wie zuvor. Vielleicht nur aus der Erinnerung sein. Etwas schief geht mit getString, wir müssen in der Lage, damit umzugehen ist. Und der Grund, warum ich nicht zurückkehre null ist dass, technisch gesehen, ist ein Zeiger null. getInt muss einen int zurück. Also habe ich willkürlich beschlossen, im Wesentlichen, dass 2 Milliarden, geben oder nehmen, wird einen besonderen Wert sein, dass ich nie tatsächlich von dem Benutzer zu erhalten. Es ist nur der eine Wert werde ich zu verschwenden, um einen Fehlercode darstellen. So, jetzt werden die Dinge ein wenig Phantasie. Und es ist nicht ganz die gleiche Funktion wie vorher, aber es ist sehr ähnlich. So bemerken, erkläre ich hier, im Einklang 172, sowohl ein int n und eine char c. Und dann nutze ich diese flippige Linie, sscanf, die sich heraus scannt nicht einen String von der Tastatur. Es steht eine bestehende Zeichenfolge, die der Benutzer bereits eingegeben. Also habe ich bereits getString, genannt die bedeutet, dass ich einen String im Speicher. sscanf ist, was Sie möchten rufen Sie einen Parsing-Funktion. Es sieht an der Schnur habe ich eingegeben wird, Zeichen für Zeichen, und tut etwas Nützliches. Das String in Zeile gespeichert. Und ich weiß, dass nur, indem Sie Sichern Sie hier und sagen, oh, OK, Ich nannte es nicht s diesmal, aber Linie. Und jetzt ist dies ein wenig anders. Aber dies bedeutet effektiv, aus Gründen wir werden etwas winken uns die Hände auf der heutigen, dass wir überprüfen, ob der Benutzer eingetippt und int und vielleicht ein anderer Charakter. Wenn der Benutzer in einer int eingegeben haben, ist es werde in n gespeichert werden, denn ich bin Das Bestehen dieser nach Adresse, die neuen Trick, den wir heute gesehen haben. Wenn der Benutzer auch getippt in wie 123x, dass x wird, um am Ende ein Brief in Zeichen c. Jetzt stellt sich heraus, dass die sscanf wird mir sagen, intelligent, wie viele Variablen sscanf wurde erfolgreich in der Lage, zu füllen. Entsprechend dieser Logik, wenn die Funktion Ich bin der Umsetzung wird getInt, aber ich bin Prüfung, möglicherweise für den Benutzer in einem int eingegeben haben gefolgt von etwas anderem, was will ich sscanf die Rückgabewert wirklich sein? Wenn der Zweck ist, erhalten nur ein int vom Benutzer? Also, wenn sscanf Renditen 2, was bedeutet das? Der Benutzer eingegeben so etwas wie, buchstäblich, 123x, die nur Unsinn ist. Es ist ein Fehler, und Ich möchte, dass für zu überprüfen. Also, wenn der Benutzer tippt in diesem, von Diese Logik, was macht sscanf zurückkehren, würden Sie sagen? Also es geht um Rück 2, weil die 123 wird sich in hier zu gehen, und die x wird sich hier am Ende. Aber ich möchte nicht, dass das X, um gefüllt zu werden. Ich möchte sscanf nur gelingen, Füllen des ersten seiner Variablen. Und damit ist, warum ich wollen sscanf 1 zurückzukehren. Und wenn dies ein bisschen über den Kopf für den Moment, das ist völlig in Ordnung. Erkennen, obwohl, dass einer der Werte der getInt und getString ist, dass wir tun, eine verdammt Viele Fehlerprüfung wie dieser so , dass bis heute, können Sie ziemlich viel Geben Sie nichts auf Ihrer Tastatur, und wir werden es zu fangen. Und wir sicherlich die Personal, wird auf jeden Fall nicht sein die Quelle eines Fehlers in Ihrer Programm, weil wir defensiv Prüfung für alle dumm Dinge, die ein Benutzer tun, wie das Schreiben einer Zeichenfolge, wenn Sie wollte wirklich Int. Also für now-- wir kommen zurück, dies vor long-- aber die ganze Zeit, getString und getInt haben unter der Haube mit diesem gewesen Grundidee der Adressen des Speichers. So, jetzt machen wir die Dinge ein wenig benutzerfreundlich. Wie Sie sich vielleicht erinnern, von Binky letzten Zeit-- wenn meine Maus wird so cooperate-- wir diesen Code, hatte die ehrlich gesagt, ist ziemlich unsinnig. Dieser Code bringt gar nichts, nützlich, aber es war das Beispiel dass Professor Parlante um darzustellen verwendet was los war in ein Programm mit Speicher. Lassen Sie uns also erzählen diese Geschichte Super kurz. Diese ersten zwei Zeilen, in Englisch, nicht, was, würden Sie sagen? Nur in einigermaßen menschlich, aber Fachbegriffe leicht, einen Stich. ZIELGRUPPE: [unverständlich]. David J. MALAN: OK, du bist Gründung Adressen für Ihre Variablen x und y. Nicht ganz, denn x und y sind nicht Variablen im traditionellen Sinne. x und y-Adressen oder werden Adresse zu speichern. Also lassen Sie uns versuchen, diese noch einmal. Kein schlechter Start, wenn. Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Gut. Ich denke, das ist ein wenig sauberer. Deklarieren zwei Zeiger, zwei ganzen Zahlen. Und wir fordern sie x und y. Oder wenn wir ziehen dies als ein Bild, wieder, erinnern ganz einfach, dass alle wir mit dieser ersten Zeile tun zeichnet eine Box wie diese, mit einigen Müll Wert darin, und nannte es X, und dann ein anderes Feld wie dieses, mit einigen Müll Wert in ihm, nannte es y. Wir haben zwei deklariert Hinweise, die letztlich wird die Adresse einer int zu speichern. Also das ist alles da. Also, wenn Binky tat dies, die Ton sah nur so aus. Und Nick nur irgendwie bis die Pfeile eingewickelt, als ob sie nicht überall zeigen insbesondere, weil sie einfach sind Müll-Werte. Sie sind nicht explizit initialisiert überall im Besonderen. Nun ist die nächste Zeile Code, Rückruf, war diese. So in maßen benutzerfreundlich, aber etwas technisches Englisch, was ist das Codezeile zu tun? Ja? ZIELGRUPPE: [unverständlich]. David J. MALAN: Perfect. Es ist die Aufteilung der Brocken der Speicher, der die Größe eines int ist. Und das ist die Hälfte der Antwort. Sie beantwortet die richtige Hälfte des Ausdrucks. Was ist bei Eintritt linken Seite des Gleichheitszeichens? Ja? ZIELGRUPPE: und weist sie der Variablen x? David J. MALAN: und weist sie der Variablen x. So zu rekapitulieren, rechts ordnet genug Speicher, um einen int zu speichern. Aber speziell malloc gibt die Adresse dieser Teil des Speichers, die Sie haben, nur vorgeschlagen wird in x gespeichert. Also, was Nick beim letzten Mal mit Binky ist schleppte er den Zeiger aus, der Ton, jetzt auf ein weißes Stück Speicher zeigen , die gleich der Größe eines Int. Und in der Tat, das ist gemeint zu vier Bytes stellen. Nun, die nächste Codezeile dies tat, bekommt 42 x Sterne. Also 42 ist einfach auf die rechten Seite, Sinn des Lebens. Linke Seite bedeutet Sterne-x, was? Das könnte zu haben gone-- das ist OK. Ok. ZIELGRUPPE: Grundsätzlich gehen Sie auf die [unverständlich] David J. MALAN: Gut. ZIELGRUPPE: [unverständlich]. David J. MALAN: Genau. Linken Seite bedeutet, gehen Sie zu x. x ist die Adresse. Es ist wie 33 Oxford Street, oder Ox1. Und Stern x bedeutet, gehen Sie zu, dass anzugehen und umzusetzen, was da? 42. Also in der Tat, das ist genau das, was Nick tat. Er begann mit durch, Wesentlichen, mental mit dem Finger auf x, in Pfeil auf dem weißen Feld auf der rechten Seite Seite, und indem die Zahl 42 gibt. Aber dann wurde es ein wenig gefährlich, oder? Binky uns über den Kopf zu verlieren. Sterne y gleich 13, Pech, bedeutet was? Also Sterne y Mittel gehen an die Adresse in y. Aber was ist die Adresse in y? Alles in Ordnung, es ist Müll Wert, oder? Ich zog es als Fragezeichen. Nick zog es als eine zusammengerollt Pfeil. Und sobald Sie versuchen, Sterne tun y, sagen, es gehen, aber es ist nicht ein legitimes Adresse, ist es einige falsche Lage, Das Programm geht zum Absturz zu bringen. Binky und den Kopf geht hier fliegen, wie es getan hat. Also am Ende, dieses Programm war einfach nur Voll Fehler. Es war ein fehlerhaftes Programm. Und es benötigt wird, um festzusetzen. Und der einzige Weg, wirklich, um es zu beheben wäre, zum Beispiel, diese Linie, die wir noch nicht einmal, um zu bekommen, weil Das Programm stürzte zu früh. Aber wenn wir, dies zu beheben waren, was Einfluss hat dabei y gleich x haben? Nun, es ist im wesentlichen Punkte y auf beliebigen Wert x an zeigen wird. Also in Nicks Geschichte, oder Binky Geschichte, sowohl x und y wurden mit Zeige der weiße Teil des Speichers, so daß schließlich beim Sie Sterne y gleich 13 wieder, Sie am Ende setzen 13 in die entsprechende Stelle. Also alle diese Linien sind perfekt legitim, außer diesem einen, wenn es passiert, bevor Sie y tatsächlich einen Wert zugewiesen. Jetzt Gott sei Dank, du nicht haben, um durch alle Vernunft dieser Art von Fragen auf eigene Faust. Lassen Sie mich gehen Sie vor und öffnen bis einem Terminal-Fenster hier und eröffnen, nur für einen Augenblick, ein super kurzes Programm, das auch ist eine Art sinnlos. Es ist hässlich. Es ist nicht alles sinnvoll zu erreichen. Aber es hat Probleme zeigen Speicher, so lassen Sie uns einen Blick. Haupt, super einfach. Er fordert offenbar eine Funktion, f, und dann gibt 0. Es ist ziemlich schwer zu Chaos dieser auf. So Main ist ziemlich gut, so weit. F so problematisch ist. Und einfach nicht allzu viel Mühe in die Namensgebung hier, um den Fokus auf den Code halten. f hat zwei Linien. Und mal sehen, was jetzt los ist. So kann einerseits hier-- und lassen Sie mich dies im Einklang mit der bisherigen example-- auf der einen Seite, Die linke Seite ist zu tun, was, auf Englisch? Es ist-- ZIELGRUPPE: Erstellen eines Zeigers. David J. MALAN: Erstellen eines Zeigers in einen int und nannte es x. So ist es die Schaffung einer dieser Boxen Ich halte, Zeichnen auf dem Touchscreen. Und jetzt auf der rechten Seite des Seite malloc natürlich ist die Zuteilung der ein Stück Erinnerung. Und nur klar zu sein, wie viel Speicher ist es offenbar Zuteilung, wenn Sie nur Mathe Art von hier? So ist es 40 Byte. Und ich weiß, dass nur weil ich weiß, ein int am CS50 Gerät zumindest vier Bytes. Also 10 mal 4 ist 40. So ist dies Speichern einer x die Adresse der ersten von 40 ints, dass wurden Raum zugeordnet zurück, nach hinten, nach hinten, nach hinten. Und das ist, was ist Schlüssel zu malloc. Es ist nicht wenig Speicher nehmen hier, ein wenig hier, ein wenig hier. Es gibt Ihnen einen Teil des Speichers, hängend, vom Betriebs System. Nun, was über diese, x Halterung 10 gleich 0 ist? Beliebige Codezeile. Es ist nicht alles sinnvoll zu erreichen. Aber es ist interessant, weil x Halterung 10--? Ja? ZIELGRUPPE: [unverständlich]? David J. MALAN: x Halterung 10 nicht null ist. Die Null Detail nur ins Spiel kommt mit Streichern, am Ende eines Strings. Aber ein guter Gedanke. Wie groß ist dieses Array, auch obwohl ich 40 Byte zugewiesen? Es ist 0 bis neun, oder? Es ist 10 Ints, total. 40 Bytes, aber 10 Ints, bis 0 0 indiziert. Also, was ist, dass x Halterung 10? Es ist eigentlich ein unbekannt Müll Wert. Es ist Speicher, der nicht zu mir gehört. Ich sollte nicht berührt werden, dass Byte-Zahl 41, 42, 43, 44. Ich bin etwas zu weit zu gehen. Und in der Tat, wenn ich dieses Programm, könnte es sehr gut abstürzen. Aber manchmal werden wir Glück haben. Und so einfach zu zeigen, this-- und ehrlich gesagt, Sie wissen nie, bevor Sie Sie es-- wir laufen diese. Es hat nicht wirklich abstürzen. Aber wenn ich diese, für ändern So wie 1000 sein, Um dies wirklich zu machen bewusste, mal sehen, wenn wir es bekommen können, diese Zeit abstürzen. OK, es hat nicht abstürzen. Wie etwa 100.000? Lassen Sie uns ein Remake, und jetzt erneut ausführen. Ok. Puh. In Ordnung. Also anscheinend wieder, diese Speichersegmente, sozusagen sind recht groß, so können wir bekommen immer wieder Glück. Aber irgendwann, wenn man einmal lächerlich und wirklich gehen weit draußen auf dem Bildschirm, Sie Speicher berühren, die wirklich, wirklich nicht zu euch gehören. Aber ehrlich gesagt, diese Arten von Bugs gehen härter und härter zu sein auf eigene Faust herauszufinden. Aber Gott sei Dank, als Programmierer, haben wir Werkzeuge, die uns, dies für uns zu tun erlauben. Also das ist vielleicht einer der hässlichsten Programme, noch hässlicher als gdb Ausgang. Aber es hat immer eine Linie oder zwei, die super nützlich sind. Valgrind ist ein Programm, das hilft, Sie ein Programm debuggen nicht per se aber Sie finden hier speicherbezogene Probleme, speziell. Es wird automatisch der Code für RUN Sie und suchen Sie nach mindestens zwei Dinge. Eine, hast du etwas zu tun versehentliche wie Touch Memory das hat nicht Ihnen gehören? Es wird Ihnen helfen, die Fälle zu finden. Und zwei, wird es helfen Sie finden so genannte Speicherlecks, die wir haben völlig ignoriert, naiv, für einige Zeit und selig. Aber es stellt sich heraus, die alle Diesmal, wenn Sie getString gerufen haben so viele unserer Programme, Sie fragen das Betriebs sind System für Speicher, aber Sie haben keine Erinnerung der jemals die ihm zurück, tut UNALLOC oder frei, wie es heißt. Nein, denn wir haben noch nie Sie gebeten, dies zu tun. Aber die ganze Zeit, die Programme Sie habe in C geschrieben wurden undicht Speicher, fragt das Betriebs System für mehr Speicher für Streicher und so weiter, aber nie reichte es zurück. Und das ist jetzt ein bisschen einer Vereinfachung, aber wenn Sie jemals haben laufen Ihrem Mac oder Ihr PC für einige Zeit, die Öffnung viele Programme, vielleicht Programme schließen, und auch wenn Ihr Computer nicht abgestürzt ist, es ist immer so viel langsamer, als ob es wirklich mit viel Speicher oder Ressourcen, auch wenn, wenn Sie nicht selbst Berühren der Tastatur, dass aber BE-- konnte nicht always-- konnte sein, dass die Programme, die Sie laufen haben sich Speicherlecks. Und sie immer wieder die OS für mehr und mehr Speicher, sondern um es zu vergessen, nicht wirklich mit, aber daher unter Speicher entfernt aus anderen Programmen, die es möchten. Also das ist eine gemeinsame Erklärung. Jetzt ist hier, wo die Valgrind Ausgang vollständig grauenhaft, um die weniger und bequemer gleichermaßen. Aber die interessante Zeug ist bis hier. Es sagt mir, einen ungültigen Schreib von Größe vier geschieht in diesem Programm, insbesondere in Zeile 21 der memory.c. Wenn ich in die Linie 21, hm, gibt in der Tat ist ein ungültiger Schreib der Größe vier. Warum Size? Nun, dieses number-- und es könnte anything-- sein ist ein int. So ist es vier Byte. Also ich bin dass vier Bytes wo sie nicht hingehören. Das ist, was Valgrind ist mir eigentlich erzählen. Darüber hinaus wird es auch sagen Sie mir, wie wir sehen werden, wie Sie dies in einer zukünftigen pSoll laufen, wenn und wenn Sie die Speicher, die ja zugespielt haben Ich habe, weil ich genannt habe malloc, aber ich habe nicht wirklich genannt wird, in diesem Fall frei, was wir sehen, schließlich ist das Gegenteil von malloc. So, jetzt, glaube ich, ein letztes Beispiel. Also das hier ist ein wenig mehr geheimnisvoll, aber es ist vielleicht der wichtigste Grund, um Vorsicht mit Speicher, und der Grund dafür, daß viele Programme und / oder Web-Server, bis auf diesen Tag, werden von bösen Jungs irgendwo genommen im Internet, die irgendwie sind gefälschte Pakete senden Ihren Server versuchen, Ihre Konten gefährden, oder nehmen Ihre Daten, oder einfach nur in der Regel über eine Maschine zu nehmen. Pufferüberlauf, da die Name schon sagt, mittels Überlaufen nicht ein int, aber einen Puffer. Und einen Puffer ist nur eine andere Art zu sagen, es ist ein Haufen von Speicher. Und in der Tat, rief ich ein String vor Puffer anstelle von S. Denn wenn es einen Puffer, wie in der YouTube-Sinn, oder jede Zeit, die Sie gerade ein Video, Sie könnte das Wort Pufferung gesehen haben, Punkt, Punkt, Punkt. Es ist unglaublich ärgerlich. Und das bedeutet nur, dass Ihre Video-Player versucht, viele downloaden von Bytes, viele Bytes von einem Video aus dem Internet. Aber es ist langsam, so dass es versucht , eine Reihe von ihnen downloaden einen Puffer, einen Behälter zu füllen, so dass Sie genug Bytes haben, dass sie dann zeigen Sie das Video, ohne Pause ständig. Aber es stellt sich heraus, können Sie haben einen Puffer, um dieses groß. Aber versuchen Sie, so viel Daten in setzen , und sehr schlechte Dinge passieren können. So zum Beispiel, schauen wir uns an Dieser letzte Teaser Beispiel. Dies ist ein weiterer Programm dass auf den ersten Blick, nichts super nützlich machen. Es ist eine Hauptfunktion bekam dass nennt diese Funktion, f. Und diese Funktion, f, hier oben, hat ein char-Array, genannt c, der Größe 12. Und dann ist es mit diesem neue Funktion strncpy. Es stellt sich heraus, dass mit diesem einfachen, einfache Code-Zeile, nur zwei Linien, wir haben mein ganzes Programm gemacht, und deshalb meine gesamte Computer, und mein Benutzerkonto, und meine Fest fahren potentiell anfällig für jedermann wer weiß, und ist gut genug zu laufen dieses Programm mit einem bestimmten Befehlszeile Argument. In anderen Worten, wenn diese schlechte Kerl legt innerhalb von argvargv [1], indem Sie an der Tastatur einen sehr speziell gestaltete String, nicht abc, 123, aber im Wesentlichen, binären Symbolen, die ausführbare Datei darstellen Code, ein Programm, das er oder sie schrieb, mit diesem einfachen Programm, das ist Vertreter der Tausende von Programmen , die ähnlich gefährdet sind, wage zu behaupten, er oder sie kann letztlich alles löschen die Dateien auf meiner Festplatte, erhalten eine blinkende Eingabeaufforderung, so dass er oder sie Geben Sie Befehle auf ihre eigenen, per E-Mail alle Dateien für mich. Alles, was ich tun kann, er oder sie mit diesem Code zu tun. Wir werden nicht ganz lösen diese noch. Und in der Tat, es geht um beinhalten ein kleines Bild wie diese, die wir bald kommen zu verstehen, umso besser. Aber für heute, wir enden am was ist, hoffentlich, eine etwas verständlich XKCD Witz, bis wir wieder beim nächsten Mal. In Ordnung. Wir sehen uns am Mittwoch. [Musik zu spielen] SPRECHER: Und jetzt, tief Gedanken, von Daven Farnham. Das Gedächtnis ist wie ein Sprung in einen Haufen goldenen Blätter an einem Sonntag Nachmittag. Wind weht, werfen Sie Ihre hair-- oh, ich vermisse die Tage when-- [Gelächter]