>> [Musik spielt]
>> DAVID J. MALAN: All right dies CS50 und das ist der Beginn der fünften Woche.
Also heute, unter Ihrem Sitzkissen, Sie werden nichts finden.
Aber oben, sollten Sie diese ein kleines Zeichen unserer Wertschätzung für
all der Arbeit, die Sie setzen in das Spiel der Fünfzehn.
Entfernen Sie einfach den kleinen Kreis auf die Boden und spielen für die
Rest der Klasse.
>> So erinnern, dass dieses Problem oder weiß eingestellt vier, die ging an diesem Wochenende,
beinhaltet das Schreiben ein anderes Spiel.
Aber diesmal ist es beinhaltet die Verwendung einer tatsächliche grafische Benutzeroberfläche, nicht ein
textuelle Schnittstelle wie Game of Fifteen war.
Und das Spiel, das vor Ihnen liegt, wenn du noch nicht diese nächste gesehen,
sieht ein wenig so etwas wie dieses.
Ich werde in meinem Terminal gehen Fenster hier in GDB.
Und ich werde weitermachen und führen Sie das Personal-Lösung, die Sie zugreifen können
nach dem Ausführen Update 50 wie gewohnt.
>> Aber ich werde es in ein wenig setzen Geheim-Modus, ein wenig Osterei,
sogenannte Gott-Modus, durch Putting Gott in argv1.
Und ich habe meinen eigenen Anweisungen zu folgen, läuft es in meinem eigenen
Problem eingestellt Verzeichnis.
So, jetzt sehen Sie eine vollständige Version des Spiels von Breakout.
In der Tat ist dies keine-hands-Modus.
So ist es tatsächlich -
begeisterte obwohl Sie vielleicht -
ziemlich trivial zu Gott-Modus in Umsetzung Breakout, im Gegensatz zu Game of Fifteen,
die einige von euch vielleicht angegangen haben für die Hacker-Ausgabe.
>> In Breakout genügt es in Gott Modus, einfach tun, was,
intuitiv mit dem Paddel?
Machen Sie es gleich unabhängig von der horizontale Position des Balles.
Und so lange, wie Sie dies tun im Gleichschritt mit dem Ball bewegt dieses Spiel
nie, nie, nie verpassen den Ball und du wirst jedes Mal gewinnen.
>> Aber in dieser Woche die Ausgabe Hacker es gibt mehr als nur Gott-Modus.
Es gibt eine Reihe von anderen Funktionen.
Unter ihnen, Lasern.
So dass, wenn Sie wirklich ungeduldig Sie beginnen können Abschuss die Steine
und ein paar andere.
Und für diejenigen unter euch, die gerne würde Standard kalibrieren gegen Hacker
Auflage, kann ich sehen, dass diese Woche Hacker Ausgabe bewusst ist
wenig mehr machbar, sagen wir, als Gott Modus war mit Game of Fifteen.
>> Also, wenn Sie für eine Strecke suchen und Sie für einige zusätzliche Spaß suchen
Features tun tauchen, wenn von Interesse.
Jetzt mehr praktisch, möchte ich darauf out eine Sache als gut.
GDB, die einige von euch vielleicht noch nicht berührt persönlich, was in Ordnung ist.
Aber jetzt ist wirklich die Zeit zu gewöhnen dies und komfortabel mit diesem Tool
denn es wird Ihr Leben viel einfacher, wirklich.
>> Per Rob Vortrag über GDB ein paar von Wochen, erinnern
dass GDB ist ein Debugger.
Es ist ein Werkzeug, das Sie laufen lässt Ihre Programm, sondern führen Sie es für Schritt, Zeile Schritt
durch die Linie, so dass Sie rund stecken, so dass Sie die Dinge geschehen seht, so
dass Sie ausdrucken können Werte der Variablen.
Kurz gesagt, es gibt Ihnen so viel mehr Macht als printDef tut.
>> Jetzt freilich, die Schnittstelle ist ziemlich obskure.
Black and white Textschnittstelle in den meisten Fällen.
Die Befehle sind etwas hart auf den ersten erinnern.
Aber auch wenn es vielleicht nehmen Sie die Hälfte eine Stunde, eine Stunde, zu setzen, dass im Voraus
Investition von Zeit hinein, vertraue mir.
Sicher durch Semester Ende wird es retten Ihnen eine Größenordnung mehr
Zeit als die.
>> So früh in der Woche tauchen in.
Und in Bezug auf Breakout, wissen, dass Sie kann dies so lange tun, wie Sie
die Verteilung Code oder Ihren eigenen Code in Fortschritte in Ihrem Pst4 Verzeichnis.
Wissen, dass man gdb laufen. / Ausbruch.
>> Das wird zu öffnen ein Fenster wie dieses.
Lassen Sie mich mich mehr von einem Terminal-Fenster.
Und dann, was ich werde weitermachen und zu tun, ist es nicht nur ausführen.
Ich werde zunächst einen Haltepunkt Rückruf, die Sie pausieren erlaubt
Ausführung an einem bestimmten Ort.
>> Nur um die Dinge einfach halten, ich werde auf Leitung eins nur brechen, indem Sie
die Nummer eins.
Lassen Sie mich tatsächlich wieder öffnen dieses Fenster weil es immer ein
etwas klein da.
Also, was ich nun zu tun ist wenn ich öffne meine Terminal-Fenster.
Komm, es geht los.
>> So jetzt, wenn ich gehe zurück zu Dropbox, Pst4 und führen Sie gdb. / Breakout geben, bemerken
Ich werde zu brechen, um eine ein Haltepunkt in Zeile eins.
Und jetzt werde ich gehen voraus und Art laufen.
Und wenn ich es tue, merke nichts scheint zu passieren.
>> Es gibt keine Pop-up.
Es gibt keine grafische Benutzeroberfläche noch.
Aber das ist verständlich, denn ich bin buchstäblich in Zeile in meinem Programm.
Und feststellen, dass ich schnell weitergeleitet, speziell jetzt auf 62, weil alle
das Zeug an der Spitze dieser Datei ist Dinge wie Kommentare und Konstanten und
uninteressante Sachen für jetzt.
>> So jetzt bin ich in der Hauptsache wie es scheint, in Zeile 62.
Und das ist nur die Verteilung Code Rückruf.
Wenn ich diese öffnen sich, indem Sie, ähnlich, in meine Dropbox-Verzeichnis in Pst4,
in breakout.c.
Und wenn ich nach unten scrollen und runter und runter, und lassen Sie mich gehen, und schalten Sie
meine Zeilennummern.
>> Was werde ich sehen, wenn ich nach unten scrollen, um Leitung 62 ist genau die Linie,
wir haben auf Pause.
Also diese Linie hier, 62, ist wo wir zu sein sind.
So, jetzt in GDB, wenn ich gehen Sie vor und geben nun neben, geben Sie es zu gehen
führen diese Zeile.
Und voila, wir haben die sogenannte g-Fenster.
Falls Sie nicht wissen, was ein GWindow ist, sich nicht zu sorgen.
Die Spezifikation wird Ihnen, es einzuführen, wie sowie eine Reihe von exemplarischen Videos
eingebettet in die spec.
>> Aber jetzt lasst uns diese eine wenig interessanter.
Lassen Sie mich dieses Fenster verschieben über an der Seite ein wenig.
Lassen Sie mich das Fenster ein wenig größer, so kann ich mehr sehen.
>> Und jetzt lassen Sie mich gehen und im nächsten wieder tun.
Und es sind meine Steine.
Wenn ich als nächstes schreiben wieder jetzt sehe ich den Ball.
Und wenn ich als nächstes schreiben wieder jetzt sehe ich das Paddel.
>> Und zum Glück ist nicht gedit wirklich kooperierenden indem sie mir
alles was ich will.
Aber jetzt, wenn ich als nächstes tun wieder, nächste wieder, ich bin nur
erklärt einige Variablen.
Und ich kann eine beliebige ausdrucken dieser Jungs.
Print Ziegel, Drucke Leben.
>> Und nun, wenn ich weiterhin tun nächsten, bemerken, dass ich bald
innerhalb dieser Schleife.
Aber der Code wird ausgeführt genau so, wie ich erwartet.
Also, wenn ich diese Funktion getroffen, Warten für Click, es zu tun
es wörtlich, dass.
So schien ich die Kontrolle verloren haben über das Programm.
>> GDB ist nicht so dass mir noch prompt.
Aber keine Sorge.
Gehen Sie zu meinem Spiel, irgendwo auf.
>> Und voila, jetzt geht sie in die Linie 86.
Also noch einmal, dann ist es von unschätzbarem Wert, schließlich zum Debuggen Probleme.
Da kann man buchstäblich durch Schritt Ihr Code, Print Dinge und noch viel,
viel, mehr.
Aber jetzt, diese Werkzeuge allein sollten Sie ziemlich weit kommen.
>> So sind wir natürlich einen Blick bei Graphics jetzt, ganz plötzlich.
Und jetzt unsere Welt wird ein wenig mehr interessant.
Und weißt du, vielleicht von einigen der Videos online, dass wir diese haben
Shorts, die Sie beobachtet haben als Teil Problemstellungen.
>> Und sie haben geschossen worden, bewusst, vor einem weißen Hintergrund.
Und einige von ihnen haben die Lehre Fellows zeichnen etwas Text auf der
Bildschirm, ist überlagert auf der Seite des ihnen.
Aber natürlich ist das nicht alles, was interessant in der realen Welt.
Dies ist nur ein Hörsaal mit einem großen weißen Bildschirm und eine Kulisse.
Und unsere erstaunliche Produktionsteam Art der macht alles schön aussehen
nach der Tat durch Zuschneiden aus oder überlagert alles
wir tun oder nicht wollen.
>> Jetzt brauchen Sie nur zu motivieren, in dieser Woche und wirklich, wo Sie gehen können, letztlich
mit Informatik.
Nicht nur nach dem Problem stellen vier.
Aber nach einem anderen Kurs oder einer ganzen Lehrplan, es ist erstaunlich, was man
zu tun in diesen Tagen in Bezug auf Grafiken im Besonderen.
>> Einige von euch haben vielleicht gesehen haben umströmt online.
Aber ich dachte, ich würde Ihnen zu zeigen, für die nur ein paar Minuten, einen Einblick in das, was
Computer-Technologie und was CGI, Computergrafik tun können, in diesen Tagen
mit einer vertrauten Song und vielleicht Film.
>> [MUSIC - LANA DEL RAY, "Jung und schön]
>> Sprecher 1: Es ist nur ein bisschen erstaunlich, vielleicht, wie
allgegenwärtig -
>> [Applaus]
>> Sprecher 1: Ich habe es heruntergeladen.
Aber es ist wirklich erstaunlich, wie ich glaube, nur wie allgegenwärtig und Software-Code und
Tools wie diese wirklich sind.
Also das ist ein Vorgeschmack auf die Richtung in denen man gehen kann.
Oh, nicht mehr Appliance heute.
Nun, das ist eigentlich tragisch Timing angesichts der Punkt, den ich gerade versucht zu machen.
>> Alles klar, also lasst uns starten Fusion wieder.
Später erinnern.
Alles klar, und Sie sollten haben ein E-Mail als beiseite, wenn Sie eine haben
bemerken so.
Alles klar, so erinnern, dass letzte Woche haben wir begonnen, diese abziehen
später als String bekannt.
>> String erinnert einen Datentyp, ist erklärte in der CS50-Bibliothek.
Und es ist Teil der Stützräder das wird jetzt damit beginnen, sich zu entfernen.
Es war ein nützliches Konzept früh.
Aber jetzt wird es mehr zu bekommen interessanter und stärker zu
tatsächlich sehen, daß unterhalb der Haube, ein String ist genau das, was haben wir gesagt?
>> Ja, so ist es eine sogenannte char *.
Und das bedeutet, dass es * gibt es eine Art Adresse beteiligt.
Und so, wenn Sie sagen, Sie char * nur bedeuten, eine Variable, deren Datentyp ist eine
Zeiger jetzt.
Die Tatsache, dass es der Stern dort bedeutet nur, dass Sie sich über die Vereinbarkeit eines
sogenannte Zeiger.
Und dass Zeiger auf scheinbar gehen speichern Sie die Adresse, von
natürlich ein char.
>> Nun, warum ist das sinnvoll?
Nun, was ist ein String unter der Haube?
Nun, seit einiger Zeit haben wir gesagt dass eine Zeichenfolge unter der Haube ist
nur h-e-l-l-o, zum Beispiel.
>> Aber wir haben darüber gesprochen, wie wobei im Wesentlichen ein Array.
Und ein Array würde dann schauen ein wenig mehr davon, wobei jeder von diesen
Aufnahme einen Bissen.
Und dann haben wir gesagt, dass es etwas Besonderes hierher zurück, die
Backslash 0 oder null Terminator.
>> Also all dieser Zeit, das hier ist ein String.
Aber wirklich, ist ein String tatsächlich eine Adresse.
Und Adressen, wie wir sehen werden, sind oft mit dem Präfix 0x durch Konvention.
Was macht 0x bezeichnen?
Kennt jemand?
>> Also es bedeutet nur hexadezimal.
So erinnern sich vielleicht, eigentlich von Pst 1. Ich glaube, einer der Warm-up
Fragen tatsächlich gefragt Hexadezimalnotation zusätzlich zu
binäre und decimal.
Und die Motivation ist hier, dass mit hexadezimalen Sie haben 16
Ziffern zur Verfügung.
0, gefolgt 1, 2, 3, 4, 5, 6, 7, 8, 9, von a, b, c, d, e, f.
>> Und wenn Sie zählen all jene auf, Sie erhalten insgesamt 16.
Dies ist also im Gegensatz Nachkommastelle, wo wir 10
Ziffern 0 bis neun.
Es ist im Gegensatz zu binären wo wir nur noch 0 und 1.
>> Aber am Ende des Tages können Sie einfach die gleichen Zahlen, aber
etwas anders.
Und hexadezimal ist üblich, weil, wie es stellt sich heraus - und wir werden das sehen
später im Verlauf - auch wenn wir auf dem Web-Programmierung im Zusammenhang mit
HTML und Farbcodes, Hexadezimal ist schön.
Weil jeder Ziffer, entpuppt, stellt vier Bits perfekt.
So ist es nur eine Art von Linien auf den Punkt Als wir schließlich sehen.
So könnte dies sein oder etwas Ox123 so, bezeichnen Adresse 123
irgendwo in meiner Arbeitsspeicher des Computers.
>> Aber natürlich ergeben sich einige Probleme wegen dieser zugrunde liegenden
Umsetzung.
Und daran erinnern, dass ich einen Stich an nahm Implementierung einer Funktion wie diese -
Vergleichen 0 dash dot c letzte Woche, dass obwohl es sah aus wie es war
richtig, es ist einfach nicht zu vergleichen zwei Strings richtig.
>> Ich habe entfernt main, geworfen und ich habe geworfen entfernt die Kommentare nur in sich konzentrieren
der Code, der von Interesse ist hier.
Und es ist in rot, weil es buggy ist.
Aus welchem ​​Grund?
>> Nun, an der Spitze gibt, als ich erklärte, ein String ist, war das, was wirklich vor sich geht
unter der Haube?
Nun, lassen Sie mich gehen über die screenen und hier ziehen, dass.
So erklärte ich, wieder, string s GetString.
>> Also werde ich weitermachen und jetzt s ziehen für das, was es wirklich ist.
Es wird ein Quadrat hier zu sein.
Und ich werde Anspruch , dass ist 32 Bit.
Zumindest ist es in der Regel, zumindest auf der CS50
Gerät in einer Menge von Computern.
Ich werde es nennen s.
>> Aber jetzt daran erinnern, dass wir genannt GetString.
So GetString Renditen natürlich eine Zeichenfolge.
Wenn der Benutzer in h-e-l-l-o geben die Zeichenkette hallo wird zurückgegeben.
Und das String, wie wir gerade gesagt, endet irgendwo in den Arbeitsspeicher Ihres Computers
mit einem Backslash 0 am Ende.
Ich werde dies wie die Array ziehen - oder zusammenhängenden Block von Zeichen -
dass es tatsächlich ist.
>> Und jetzt, was ist GetString eigentlich wieder?
Was hat GetString worden Rückkehr all dieser Zeit?
Nun, sagen wir, in den Wochen vor, es gibt einen String zurück.
Aber technisch, was tut GetString Rückkehr offenbar?
>> ZUSCHAUER: Eine Adresse.
>> Sprecher 1: Eine Adresse.
Konkret gibt die Adresse das erste Biss, was immer es ist.
Ich einfach weiter mit einer, zwei, drei denn es ist bequem.
>> Es gibt die Adresse des ersten Zeichen in der Zeichenfolge.
Und wir letzte Woche gesagt, dass das ist ausreichend.
Denn wir können immer herausfinden, wo das Ende der Schnur nur durch
Iteration über sie, vielleicht, mit einem für Schleife oder eine while-Schleife oder so ähnlich
dass gerade auf der Suche für "Backslash 0" die spezielle Wächter Charakter.
>> Und dann wissen wir, dass die Zeichenfolge passiert mit der Länge sein -
in diesem Fall -
fünf.
So technisch was tut GetString es gibt Ox123 in diesem Fall.
Und was dann passiert, technisch ist dass wir speichern, innerhalb von s, Ox123.
Am Ende des Tages, obwohl dies wird neues Konzept, Zeiger, sind sie
nur Variablen.
Aber sie passieren, um Bits zu speichern, dass kollektiv eine Adresse.
So technisch alles, was sie bekommt gespeichert in s ist Ox123.
>> Aber wir als Menschen -
einschließlich heute an -
sind wirklich nicht zu kümmern, in der Regel, was die eigentliche Adresse
einiger Teil des Speichers.
Es ist nur zu niedrigen Detail intellektuell interessant.
Also werde ich dies rückgängig zu machen.
Und anstatt, mehr High-Level, nur sagen, dass, wenn wir über Hinweise sprechen
Ich werde einfach ziehen mehr benutzerfreundliche Pfeil, der vermittelt
gleiche Idee und Abstracts entfernt die Einzelheiten, was die eigentliche
zugrunde liegenden Adresse ist.
>> Nun, wenn wir wieder nach dem Code, was letzte Woche passiert, wenn wir String t haben
gleich GetString?
Nun, wenn ich wieder in Typ hallo Dieses Mal werde ich bekommen habe
ein weiterer Teil des Speichers.
h-e-l-l-o Backslash 0.
>> Aber weil ich genannt GetString ein zweites Mal -
und ich weiß, dass dies aus der Betrachtung der Quellcode für GetString - auch
obwohl es Zufall, dass hallo war tippte zweimal ist nicht GetString
werde versuchen, zu optimieren und klug sein.
Es ist gerade dabei, ein anderes Stück zu bekommen Speicher vom Computer, das ist
gehen, um an einer anderen Adresse.
Lasst uns einfach sagen, 456 willkürlich.
>> Und dann, was es wird, zurückzukehren?
Es geht um 456 zurück und speichern Sie es in t.
Also, was wirklich vor sich geht, auf die linken Seite ist, ich habe ein anderes Stück
Speicher, 32 Bit typisch.
Und es geht um Ox456 gehen.
Aber noch einmal, ich bin nicht an diesen interessiert Insbesondere Zahlen mehr.
Ich werde einfach zu abstrakt ziehen Sie es wie ein Pfeil.
>> Also das ist jetzt eine neue Erklärung.
Aber es ist genau die gleiche Idee, die ist geschehen die ganze Zeit.
Und so der Grund dann, dass diese erste Version des Vergleichs war buggy
letzte Woche ist, warum?
Wenn Sie das tun, wenn s gleich gleich t, was sind Sie wirklich
unter die Haube Vergleich?
>> Sie vergleichen die Adressen.
Und gerade intuitiv klar, Ox123 wird nicht gleich Ox456.
Diese Zahlen, diese Bits sind einfach anders.
>> Und so konsequent, letzte Woche gesagt Sie geben verschiedene Dinge, auch wenn die
Worte waren wortwörtlich das gleiche.
Also haben wir dieses Problem beheben.
In juristischer Hinsicht, was war die Lösung?
>> ZUSCHAUER: Verwenden Sie eine Funktion.
>> Sprecher 1: Verwenden Sie eine Funktion.
Oder Sterne sind auf jeden Fall beteiligt, aber eine Funktion verwenden, um was zu tun?
>> ZUSCHAUER: Um die Zeichenfolgen zu vergleichen.
>> Sprecher 1: Um die Zeichenfolgen zu vergleichen.
Also das grundlegende Problem war hier dass ich nur in Anbetracht der
Qualität der Saiten durch definiert werden Vergleich der Adressen.
Und natürlich ist das nur dumm jetzt einmal Sie verstehen, was los ist
unter der Haube.
Um wirklich vergleichen Strings zu sehen, ob sie sind gleich in der Weise, dass ein Mensch
hielte zwei Strings gleich sein müssen wir vergleichen sie Zeichen für
Zeichen für Zeichen.
>> Jetzt könnte ich getan haben dies sehr mühsam.
Aber vertraut, wir sind mit einer for-Schleife.
Und genau vergleichen s Halterung i gegen t i Halterung.
s Halterung i plus 1 gegen t Halterung i + 1, und so weiter, in
eine Art Schleife.
Und wenn ich vor Ort keine zwei Zeichen, die unterscheiden, oder ob ich das ooh realisieren, ist s
kürzer ist als t oder länger als t Ich kann sofort sagen, falsch,
sie sind nicht das gleiche.
>> Aber wenn ich durch s und t und sagen same, same, same, same, gleichen, Ende
beide Zeichenfolgen, kann ich sagen, wahr, sind sie gleich.
Nun, zum Glück, vor Jahren jemand schrieb, dass Code für uns.
>> Und sie nannten es StrComp for string vergleichen.
Und obwohl es ein wenig Zähler intuitive, kehrt StrComp 0, wenn die
zwei Saiten, sind s und t gleich.
Aber es gibt negativen Wert, wenn s sollte vor t alphabetisch oder kommen
positiven Wert, wenn sie kommen sollte, nach t alphabetisch.
>> Also, wenn Sie schon immer einmal etwas zu sortieren, es stellt sich heraus, dass StrComp nützlich ist.
Weil es nicht nur sagen, ja oder nein, gleich oder nicht.
Es gibt Ihnen ein Gefühl der Bestellung wie ein Wörterbuch Macht.
So StrComp entspricht s Komma t gleich 0 bedeutet, dass die
Strings sind wirklich gleich sind.
Denn wer schrieb diese Funktion Jahren vermutlich eine for-Schleife verwendet
oder eine while-Schleife oder so ähnlich über die Charaktere wieder integrieren
und immer wieder.
>> Aber zwei Problem entstand hier.
Dies war copy0.c.
Und die zwei in rot denn es ist fehlerhaft.
Und was haben wir hier?
Nun, zunächst einmal rief ich GetString.
Und ich den Rückgabewert in s gespeichert.
Also das ist so ziemlich das gleiche wie diese oberen Teil des Bildes.
>> Aber was kommt danach?
Nun, lassen Sie mich gehen und loszuwerden von einem ganzen Bündel von dieser.
Wir werden in der Zeit, wo wir einfach zurückspulen s haben, die nun im Einklang mit
Zeile eins dort oben.
>> Ich überprüfe.
Wenn s gleich gleich 0 ist.
Nun, eine kurze Randnotiz, wenn vielleicht GetString 0 zurückgeben?
Es ist nicht genügend Speicher vorhanden.
Right?
>> Es ist selten, dass dies passieren wird, sicherlich auf einem Computer, ist
ich Hunderte megs oder sogar GB RAM.
Aber es könnte in der Theorie zurück 0, insbesondere wenn die
Benutzer nicht kooperieren.
Es gibt Möglichkeiten, so zu tun, wie Sie nicht haben eingegebenen alles und Trick
GetString zur Rückkehr 0 wirksam.
>> Also es geht um, dass der Check.
Denn wenn einer von euch haben damit begonnen, bekommen schon, Segmentation Faults -
das war wohl eine Quelle einiger Frustration -
das sind fast immer das Ergebnis der Fehlermeldung bezüglich des Speichers.
Irgendwie durcheinander im Hinblick auf eine Zeiger, auch wenn Sie nicht erkennen,
Es war ein Zeiger.
Sie könnten also Segmentierung induziert haben Fehler so früh wie eine Woche mit
so etwas wie eine for-Schleife oder eine Weile Schleife und eine Reihe von zu weit gehen
über die Begrenzungen von einigen Array, Sie erklärten, in der zweiten Woche in
Besonderen.
>> Man könnte es auch in Problem getan haben Set mit vier Breakout.
Auch wenn Sie wahrscheinlich noch nicht gesehen haben Alle Sterne in der Distribution-Code für
Breakout, stellt sich heraus, dass diejenigen, GRect und Goval und andere solche Dinge,
das sind eigentlich Zeiger unter der Haube.
>> Aber Stanford, wie wir, eine Art von Häuten dass mindestens Angaben für die Bibliotheken
Zwecke, ähnlich wie wir tun für String und char *.
Aber GRect und Goval und all jene, Dinge, die Sie Jungs sind oder werden mit
diese Woche sind letztlich Speicheradressen.
Sie wissen einfach nicht, es.
>> So ist es nicht verwunderlich, vielleicht, Sie könnten stolpern einige
Segmentierung Fehler.
Aber was ist interessant, hier, jetzt, wenn, nachdem wir für 0 wir überprüfen
String t s bekommt.
Nun, lassen Sie mich erklären, t.
Ich werde es wie ein Quadrat zu zeichnen, 32 Bit, nennen Sie es t.
Und dann werde ich zu tun bekommt s.
>> Nun, was bedeutet das?
Nun, es ist ein wenig schwer zu glauben, darüber vorstellen klug.
Aber lassen Sie uns darüber nachdenken, was drin ist von x?
Was ist buchstäblich innerhalb dieser Variablen?
Der Wert Ox123.
>> Wenn ich also sage String t s bekommt, dass nur bedeutet wörtlich nehmen Sie die Anzahl
in s, ist die Ox123 und steckte es Ox123.
Oder bildhaft, wenn ich irgendwie abstrakt weg von diesem Detail hat die
Wirkung buchstäblich tun diese als gut.
>> So, jetzt denke zurück an letzte Woche, als begaben wir uns zur kapitalistischen T. I
tat T Klammer 0.
Nun, T 0 Halterung, auch wenn es ein Zeiger, können Sie es behandeln, als ob
es ist ein Array mit einem quadratischen Klammer-Notation.
>> Also, wo ist T Klammer 0?
Nun, es ist die h.
Und so, wenn wir diese Codezeile verwenden, zwei obere, die in diesem c type.h ist
Header-Datei, das ist, wo es erklärt.
Du Kapitalisierung dieses H. Aber Natürlich, das ist exakt das gleiche, das ist h
innerhalb von s, so zu sprechen.
Und so jetzt haben Sie oder geändert aktiviert sowohl das Original und die
sogenannte Kopie.
Weil du nicht eine Kopie in die Weise, dass ein Mensch würde es haben wollen.
>> Also, was war das Update hier, copy1.c in der vergangenen Woche?
Funktionen, und so konnten wir tatsächlich kopieren Sie die Zeichenfolge.
Und grundsätzlich, was wir brauchen, um tun, um die Zeichenfolge zu kopieren?
>> Nun, in dieser grünen Version hier bin ich werde es recht niedrigen Niveau zu tun.
Es gibt tatsächlich Funktionen sie könnte dabei helfen.
Aber die grundlegendste und die meisten vertraut man, zumindest, bald
uns vertraut, ist die folgende -
so dass man in der ersten Zeile Code in grün jetzt.
>> Ich schrieb s als char *.
Es gibt keine funktionalen Unterschied gibt.
Ich warf den CS50-Bibliothek und Ich rufe es, was es ist ein char *.
>> Jetzt Punkt, Punkt, Punkt, denn es gab einige Fehler geprüft, das ist nicht
interessant, darüber zu sprechen wieder.
So, jetzt t deklariert ist.
Es ist auch ein char *.
Also zog ich einen kleinen Platz auf der Bildschirm wie vorher.
>> Aber auf der rechten Seite, malloc, wir sagen, ist Speicher zuzuweisen.
So etwas zuteilen Teil des Speichers.
Und wie viele Bytes brauchen wir eigentlich zuweisen möchten, es scheint?
>> Nun, die String-Länge von s.
Also, wenn es das ist, hallo gehen bis fünf sein.
Wir sagen, h-e-l-l-o.
Also fünf Bytes.
>> Aber dann plus 1, 1, warum?
Das 0-Zeichen.
Wenn wir keinen Raum für diesen Kerl, den wir möglicherweise versehentlich eine Situation schaffen,
wobei die Zeichenfolge h-e-l-l-o.
Und dann das nächste Mal ist GetString genannt und Typ I in, zum Beispiel,
David, D-a-v-i-d, der Computer wird zu denken, dass s tatsächlich ist
h-e-l-l-o-d-a-v-i-d, weil es nicht zwischen diesen Worten brechen.
>> Also müssen wir diese Pause.
So wollen wir nicht fünf.
Wir wollen sechs Bytes.
>> Und bytes, sage ich.
Aber es ist wirklich an der Zeit eine Größe von char.
Technisch char ist fast immer ein einziges Byte.
>> Aber nur, um unseren Code tragbar, so zu sprechen, so dass es auf funktioniert
verschiedenen Computern, auch wenn sie vielleicht etwas anders unterhalb der
Haube, ich bin zu generisch gehen sagen Größe char so dass
mein Code immer funktioniert.
Und ich weiß nicht, es zu kompilieren nur weil ich mein Computer oder verwenden
einige andere Plattform.
>> Also habe ich 6 mal die Größe des ein char, die auf 1 werden passiert.
Damit konnte mittels malloc Gib mir sechs Bytes.
Was ist das eigentlich?
Nun, lassen Sie mich ein Rollback in der Zeit hier wo wir sind in der Geschichte.
>> Also, wenn ich wieder hier, habe ich erklärt ein char * t genannt.
Ich habe jetzt genannt malloc für sechs Bytes.
Und jetzt werde ich zu denen sechs Remis Byte wie das Array zuvor.
Aber ich weiß wirklich nicht, was in diesem Array.
>> Wenn Sie Speicher zuzuweisen es stellt sich heraus, dass Sie können nicht darauf vertrauen, dass es einige
bekannte Wert gibt.
Es könnte durch etwas verwendet wurden anderes, eine andere Funktion, eine andere
Codezeile, die Sie geschrieben haben.
Also werden wir in der Regel rufen diese Müll Werte und ziehen sie, vielleicht, wie
Fragezeichen, nur darauf hinweist, dass wir weiß nicht, was ist eigentlich da.
Und das ist keine große Sache, so lange wir sind intelligent genug, um diejenigen zu überschreiben
Müll Werte mit Zahlen oder Zeichen, dass wir zu kümmern.
>> Also in diesem Fall, was soll ich tun?
Nun, mein Code Zeile Als nächstes habe ich vier.
int i erhalten 0, n erhält die String-Länge von s.
So eine vertraute for-Schleife.
I weniger als oder gleich n ist, die in der Regel höher.
>> Aber dieses Mal ist es gewollt.
I + +, und dann habe ich einfach tun t Halterung i s bekommt.
Weil mein Bild aussieht wie dieses an Dieses Moment, in t gespeichert ist
Adresse dieser zufälligen Teil des Speichers deren Werte unbekannt sind.
Aber sobald ich t Halter tun 0 bringt mich hier.
>> Und was endet immer dort gezogen?
Wir Ende setzen h.
Denn das ist, was auf dem Bügel s 0.
Und dann das Gleiche für e und l und l und o.
>> n, warum ich gehen durch ein gleich n?
Aufgrund der 0-Zeichen.
Also nur klar zu sein, dann, wenn ich eigentlich löschen diese unabhängig Müll
Werte sind und dann tatsächlich in zeichnen was ich erwarte, ist diese Halterung s 1, 2,
3, 4, zuzüglich das ist Hinterkante neuen Charakter.
>> Und nun, wenn wir weiter vorbei an der dot, Punkt, Punkt in diesem richtige Version
und aktivierte t Klammer 0 Ich würde von Natürlich werden gerade diese Kapitalisierung
Kerl hier, die konzeptionell, war schließlich das Ziel.
Also das ist alles, der Zeiger.
>> Und Sie haben mit ihnen seit Wochen jetzt im Rahmen der Saiten.
Aber unter der Haube sind sie ein wenig komplizierter.
Aber wenn Sie denken über sie in diese Bildform Ich schlage vor, sie sind
wahrscheinlich gar nicht so gefährlich, wie sie vielleicht zuerst auf den ersten Blick scheinen mag,
insbesondere mit solchen neuen Syntax.
Irgendwelche Fragen zu Zeigern Strings oder Zeichen?
Ja?
>> ZUSCHAUER: Können Sie gehen zurück der [unverständlich]?
>> Sprecher 1: Sicher.
>> ZUSCHAUER: So wie in Ihrem letzten kommen Linie, die Sie nicht haben einen * t Linie
und a * s in der Leitung?
Haben Sie nicht den Verweis auf die -
>> Sprecher 1: Ah, eine wirklich gute Frage.
Warum kann ich nicht haben * t und * s?
Weil kurz, letzte Woche, wie in unserem Swap-Funktion, habe ich gesagt, dass, wenn
du hast einen Zeiger das Mittel, durch die Sie dorthin gehen wie wir
physisch auf der Bühne, war es tatsächlich Mit der Stern-Operator.
>> Es stellt sich heraus, dass diese eckigen Klammer Notation ist das, was wir nennen syntaktischen
Zucker, die nur ein sexy Weg ist sagen, es ist für Kurzschrift
genau das, was Sie beschreiben.
Aber es ist ein wenig mehr intuitiv.
Und auf die Gefahr hin dass diese scheinen mehr komplizierter als es sein muss,
was wirklich los ist hier ist die folgende -
Wenn ich sage, das heißt * t gehen die Adresse in t gespeichert.
>> So wörtlich, wenn t speichert die Adresse dieser h
zunächst, * t bedeutet hier.
Nun, was t Klammer 0 bedeuten?
Genau dasselbe.
Es ist nur ein wenig mehr Benutzer freundlich zu schreiben.
>> Aber ich bin noch nicht fertig.
Ich kann nicht einfach sagen: * t * s bekommt.
Denn was würde ich dann tun?
Ich würde Putting h, h, h, h, h während der ganzen Sache.
Right?
>> Weil * t ist an die Adresse in t gehen.
Aber wir sind in einer Schleife.
Und welchen Wert ich Inkrementieren natürlich bei jeder Iteration?
i.
>> Aber es gibt eine Chance hier, nicht wahr?
Auch wenn sich das anfühlt, wie es immer ist ein wenig anspruchsvoller
als der eckigen Klammer-Notation wir haben für längere Zeit nicht benutzt -
lassen Sie mich meine rückgängig h Veränderung gibt -
obwohl dies ist jetzt immer ein wenig Züchter, die Grundidee, wenn * t
bedeutet hier, und * t ist nur rufen Sie die Adresse in t.
>> Aber was war die Adresse in t?
Die Zahl halten wir mit?
Wie Ox456, lasst uns zurück zu bringen, dass nur wegen der Diskussion.
Nun, wenn ich an der e in zu bekommen t Zeichenfolge, ich möchte nur zu gehen,
Wesentlichen, 456.
>> Oder besser gesagt, 457.
Ich brauche nur einen hinzufügen.
Aber ich kann das tun, nicht wahr?
Da t, obwohl ich halten Zeichnung es jetzt wie ein Pfeil, ist es nur eine
Anzahl, Ox456.
Und wenn ich hinzufügen, dass man, oder mehr Im Allgemeinen, wenn ich hinzufügen, ich, dass ich
tatsächlich genau dort, wo ich will.
Also, wenn ich tatsächlich tun dies -
und dies ist, was jetzt genannt Pointer-Arithmetik -
Ich kann entfernen Sie diese Zeile.
Welches ist, ehrlich gesagt, ich glaube, klarer und ein wenig benutzerfreundlicher zu lesen.
Aber dies ist nicht weniger richtig.
>> Diese Codezeile wird nun mit Pointer-Arithmetik.
Es ist selbstverständlich, um die folgender Adresse -
was auch immer der Beginn von t, die ist t plus i, die zunächst
0 ist, was toll ist.
Denn das bedeutet den Beginn der t plus 1, plus 2, plus 3, und so weiter.
Und das gleiche Angebot mit s.
>> So syntaktischen Zucker für diese.
Aber zu verstehen, was wirklich vor sich geht unter der Haube, würde ich behaupten,
tatsächlich an sich nützlich.
Weil es bedeutet, jetzt gibt es nicht viel mehr Magie los
unter der Haube.
Es sind nicht zu viele sein Schichten, die wir Peeling für Sie eine Sicherungskopie.
Dies ist c.
Und dies ist die Programmierung.
Wirklich gute Frage.
>> Alles klar, so war dies, dass Buggy Programm, das ich früher bezog.
Swap war fehlerhaft.
Wenn schien zu funktionieren.
Daran erinnern, dass nur mit der Milch mögen und der Orangensaft - die ich begonnen
trinken heutigen Demonstration.
So wie mit dem Orangensaft und die Milch, wir haben eine Verwendung
temporäre Variable, tmp, zu halten, ein vorübergehend, so dass wir dann
ändern Sie seinen Wert und aktualisieren Sie dann b.
>> Aber diese Funktion, sagten wir, oder diese Programm, in dem diese Funktion war
geschrieben war falsch und fehlerhaft, warum?
Ja?
>> ZUSCHAUER: [unverständlich].
>> Sprecher 1: Genau, wenn Sie Makeln -
oder allgemeiner, wenn man nennen die meisten keine Funktion -
wenn die Argumente dieser Funktion sind primitiv, so zu sprechen, ints und chars
und Doppelzimmer und Schwimmern, die Dinge ohne Sterne, sind Sie in einer Kopie der Weitergabe
das Argument.
Also, wenn x und y 1 war war 2 ist ein gehen 1 sein und b wird 2 sein.
Aber sie gehen, um verschiedene Stücke sein von Bits verschiedenen Stücke
Speicher, die geschehen, um die Speicherung identische Werte.
>> Also dieser Code ist super perfekt bei Austausch a und b.
Es ist nicht gut bei Swapping -
in der vergangenen Woche beispielsweise -
x und y.
Denn wieder sind sie, in den falschen Bereich.
>> Nun, wie wir über die Festsetzung dies gehen?
Wir hatten, um die Funktion zu schauen ein wenig hässlicher.
Aber noch einmal überlegen, was bedeutet dies einfach.
>> Und tatsächlich, lass mich, für Konsistenz, ändern eine Sache so ist es identisch ist
was wir gerade getan.
Wie ich letzte Woche erwähnt, ist es nicht egal, wohin es geht.
In der Tat, in der Regel würden Sie setzen die Sterne neben dem variablen Namen.
Aber ich denke, es wäre ein wenig leichter die * neben dem betrachten
Datentyp dahin ist es ein Zeiger in einen int in diesem Fall.
>> Also, was mache ich hier?
Ich sage nicht, mir einen int gefolgt von einem weiteren int,
ruft sie a und b.
Gib mir die Adresse einer int.
Gib mir die Adresse eines anderen int.
Rufen Sie die Adressen a und b.
>> Und dann mit der *-Notation unten nachfolgend auf jede dieser Adressen gehen
nach Bedarf, um entweder oder setzen Sie seinen Wert.
Aber es gibt eine Ausnahme.
Warum habe ich nicht ein * neben tmp?
Warum muss ich das nicht tun, zum Beispiel?
Es fühlt sich an, wie ich gerade gehen sollte alle aus und korrigieren Sie die ganze Sache.
Ja?
>> ZUSCHAUER: [unverständlich].
>> Sprecher 1: Ich habe nicht erklärt tmp als String zurück.
So würde erklären, in diesem Fall a tmp die Adresse einer int sein.
Aber das ist nicht ganz das, was ich will, für eine Reihe von Gründen.
>> ZUSCHAUER: Sie wollen nicht, um sie auszutauschen.
>> Sprecher 1: Genau, ich will nicht zu tauschen nichts mit tmp. tmp ist nur
Woche-ein Zeug.
Alles was ich will ist eine Variable um etwas zu speichern.
Ich weiß nicht einmal über Adressen kümmern in diesem Moment.
>> Ich brauche nur 32 Bit oder so zu lagern einen int.
Und ich möchte in diesen 32 Bit setzen Was nicht in eine, so zu sprechen, aber
was auf eine, nur um genauer zu sein.
Denn wenn eine ist eine Adresse, * a bedeutet dorthin gehen und erhalten den Wert 1.
Zum Beispiel in der vergangenen Woche beispielsweise oder b der Fall, erhalten Sie den Wert von 2.
>> Also, was ist wirklich los?
Lassen Sie mich ein Bild zeichnen, das hier wird nur necken neben Teil von heute.
Aber dies wird weiterhin angezeigt seit geraumer Zeit.
>> Dies, behaupte ich, ist das, was Ihres Computers Speicher aussieht, wenn Sie eine
Programm, ein Programm.
Wenn Sie ein Programm ausführen, an der Spitze der Arbeitsspeicher Ihres Computers - so denken
dieses Rechteck, wahrlich, wie Ihre Arbeitsspeicher des Computers oder Speicher, die alle 101
Milliarde Byte davon, alle zwei Milliarden bytes, alle zwei Gigabyte es,
unabhängig von der Menge, die Sie haben, ist, wir ziehen es als Rechteck.
Und ich behaupte, dass, wenn Sie ein Programm ausführen wie Microsoft Word oder Chrome
oder so etwas, dass die Bits Microsoft oder Google, dass schrieb -
in den Fällen von diesen Programmen -
werden in den Arbeitsspeicher Ihres Computers geladen wo sie mehr ausgeführt werden
schnell und in die CPU, die ist das Gehirn des Computers.
>> Und in TAM sie ganz am gespeichert Anfang des Programms, so zu sprechen.
Mit anderen Worten, wenn dies ein Stück Speicher, wenn Sie einen Doppelklick auf klicken
Microsoft Word, kommen die Bits von der Festplatte.
Sie bekommen in den Arbeitsspeicher geladen.
Und wir schieben sie bis an die Spitze dieses Rechtecks ​​konzeptionell.
>> Nun, das ist der Rest von Ihrem Gedächtnis verwendet für verschiedene Dinge.
Ganz oben sehen Sie initialisieren Daten und deinitialisieren Daten.
Dies zu tun hat, zum größten Teil mit Konstanten oder globale Variablen
das haben Werte.
Aber mehr auf die andere Zeit.
>> Dann haben Sie die Haufen, welche wir kommen zurück auf.
Aber im Grunde ist das Teil, das ist gerade jetzt Germane.
Es ist die so genannte Stapel.
Also einfach in fast jeder Halle D hier gefallen Campus, müssen Sie diese Tabletts, dass
nur auf der jeweils anderen, auf dem Stapel Sie können die Lebensmittel und so weiter.
Der Stapel in einem Computersystem, sehr ähnlich ist.
Außer während der Schale, wie wir in der Speisesaal, natürlich, soll
zu tragen Dinge die Fächer oder die Rahmen -
wie wir sie nennen - in einem Computer Speicher verwendet zu halten,
Variablen und Werte.
>> Also, was wirklich geht unter der Haube?
Nun, lassen Sie mich umdrehen auf den Bildschirm hier.
Und lasst uns nur auf die konzentrieren Unterteil für einen Moment.
Ist dies der Bodenabschnitt meiner Arbeitsspeicher des Computers stellt sich heraus, wenn ich
Aufruf der Funktion main - was passiert, ehrlich gesagt,
automatisch für mich -
Ich bekomme einen Teil des Speichers bei der Unterseite meines RAM sozusagen.
Und das ist, wo wichtigsten ist lokalen Variablen gehen.
Es ist, wo argc und argv vielleicht gehen, und alle Variablen, die ich
erklären innerhalb von main.
Sie enden am unteren Rand meines Computers RAM.
>> Nehmen wir nun an, dass die wichtigsten Anrufe eine Funktion wie swap, wie es letzte Woche tat?
Nun, wir setzen im Wesentlichen ein neues Fach, ein neuen Rahmen, auf meinem Teil des Speichers.
Und ich werde dies so beschreiben aus der Swap-Funktion.
>> Nun, was drin ist der Swap?
Nun, letzte Woche auf dem Programm basiert und das, was wir gerade gesehen, einen Auszug aus,
innerhalb von Swap-Rahmen oder auf Swaps Fach sind, was Variablen?
Well, a und b.
Denn das waren seine lokale Argumente, plus eine dritte tmp.
Also wirklich, ich könnte zeichnen diese ein wenig mehr sauber.
Lassen Sie mich gehen und rückgängig das Etikett.
Und lassen Sie mich behaupten, dass Sie wissen, was?
>> a ist wahrscheinlich zu Ende hier.
B wird hier enden.
Und tmp wird hier enden.
Nun könnte die Reihenfolge ein wenig unterschiedlich sein.
Aber konzeptionell das ist die Idee.
>> Und nur gemeinsam, das ist, was wir nennen Swap-Rahmen, oder
Speisesaal Fach.
Und das gleiche Angebot mit main.
Aber ich werde nicht neu zu zeichnen, dass.
Aber das ist, wo argc und argv und jede der lokalen Variablen wie x und y
könnte genauso gut sein.
>> So, jetzt überlegen, was wirklich passiert Wenn Sie Swap nennen.
Wenn Sie Swap nennen, wie die Ausführung von Code Damit sind Sie im Vorbeigehen, in der
Buggy-Version, a und b als Kopien von x und y.
Also, wenn ich jetzt zeichnen diese auf dem Bildschirm -
habe, um besser auf diese -
so dass die Geschichte, die ich zu mir selbst sagen, war in dieser buggy Version, wenn wir
Makeln vorbei in buchstäblich a und b als ganze Zahlen, was ist wirklich passiert?
>> Nun, was wirklich passiert ist.
Lassen Sie mich gehen und nur rückgängig zu klären, etwas Platz hier.
Also das ist meine Arbeitsspeicher des Computers.
>> Also, wenn ich zum Beispiel -
eigentlich machen wir es auf diese Weise -
wenn ich behaupten, dass dies x ist, Speicherung der Wert 1 genau wie letzte Woche.
Und dies ist y, Speichern des Wertes 2 genau wie letzte Woche.
Und dies ist hauptsächlich, wenn ich Swap nennen, wodurch selbst Zugriff auf ein und
b und tmp, werde ich behaupten, dass Dies ist ein, und das ist 1.
>> Dies ist b.
Dies ist 2.
Dies nennt man tmp.
>> Und anfangs hat es einige Müll Wert bis ich tatsächlich in es ein Geschäft,
Das ist 1.
Dann habe ich voran gehen und ändern ein, was sein?
B den Wert.
>> Und so habe ich jetzt zwei hier.
Und dann haben wir gesagt bekommt b tmp.
Wiederum nur als Plausibilitätsprüfung, die dritte Codezeile hier ist einfach dies
ein, bekommt b tmp.
>> Und so schließlich, was soll ich tun?
Ich voran gehen und ändern b zu sein, was der Wert von tmp ist, die 1 ist.
Ich weiß nicht berühren tmp wieder.
>> Aber jetzt ist das Problem so schnell wie Swap kehrt, weil es nicht die Übergabe
Sichern gewissen Wert, es gibt keine Rückkehr Aussage explizit in sie.
Was ist eigentlich passiert?
Nun, im Wesentlichen alle diese Erinnerung -
OK, scheinbar der Radiergummi mag nur einen Finger zu einer Zeit -
gerade verschwindet.
>> Jetzt in Wirklichkeit ist es nicht überall.
Aber man kann davon halten Jetzt als Fragezeichen.
Weil es nicht mehr tatsächlich in Gebrauch ist.
Und nichts wird mit diesen Werten durchgeführt.
>> So wurden bei der grüne Version dieser Code ist das, was ist stattdessen
übergeben Swap?
So befasst.
Also die Adresse von x und die Adresse von y.
Also, wenn wir diese Geschichte ein letztes neu erzählen Zeit, und ich eigentlich ziehen Swap wieder
aber mit Zeigern, wobei diese a, diese wobei b, und dies ist tmp, was ist
tatsächlich in eine in dieser grünen gespeichert Version von meinem Code, wo ich vorbei
in Adressen?
>> Es wird ein Zeiger auf x.
So konnte ich einen Pfeil zeichnen.
Aber lassen Sie uns den gleichen willkürlichen Beispiel wie zuvor.
Lassen Sie uns sagen, dass dies etwas wie Ox123.
Und das wird Ox127 sein, weil es ist vier Bytes weg, weil es ist ein
int, so Ox127.
>> Und wieder nehme ich einige Freiheiten mit den Zahlen.
Sie sind viel kleiner, als sie es tatsächlich werden und in einer anderen Reihenfolge.
Aber das ist, wie das Bild ist nun anders.
>> Aber wenn ich dieses grünen Code und ich weiß int tmp bekommen * a.
* Ein Mittel, um die folgenden tun, nehmen Sie die anzugehen, das ist in ein und gehen Sie zu ihm,
Das ist 1.
Und das ist, was ich dann legte in tmp.
In der Zwischenzeit in der nächsten Zeile der Code hier * a b bekommt, was bedeutet das?
>> Nun, * a, so hier gehen wird * b, was bedeutet, dorthin zu gehen.
Und das bedeutet, setzen Sie den Wert auf es.
Schließlich ist die letzte Codezeile einfach gesagt * b bekommt tmp.
>> So sagt es b gehen und überschreiben ihn mit tmp die, in diesem Fall wird
um wiederum 1.
Und das ist, warum die grüne Version unser Code funktioniert, während die rote
Version nie getan.
Es ist alles nur darauf an, wie der Speicher verwaltet wird und wo es
tatsächlich in Ihrer platziert Arbeitsspeicher des Computers.
Und jetzt, das ist eines der Dinge, daß der Stapel wird verwendet.
>> Fragen zu dem Layout?
Am Zeiger?
Oder auf Swap?
>> Alles klar, so malloc, Rückruf, habe so etwas wie dies.
Dies war ein super einfaches Beispiel.
Und das war die eine, die Binky stellte uns, wenn auch recht
schnell, am Ende der Klasse.
Verdammt, es geht wieder los.
>> So erinnern, dass dies das Beispiel war, dass Binky stellte uns, wenn auch
etwas schnell am Ende der Klasse.
Und hier haben wir wirklich verwendet malloc für die zweite Zeit.
Da wir zum ersten Mal benutzte es, um schaffen genug RAM, RAM zuweisen genug
zum Speichern einer Zeichenfolge.
>> Diesmal Binky hielt es einfach.
So ist es nur speichern ein int, anscheinend.
Und das ist völlig in Ordnung.
Es ist ein bisschen komisch, ehrlich gesagt, zu verwenden malloc einem int zuzuweisen.
Aber der Punkt von Nicks claymation war wirklich nur die Geschichte erzählen von dem, was
geschieht oder geschieht nicht, wenn Sie misshandeln Speicher.
>> So dass in diesem Fall das Programm habe ein paar Dinge.
Im ersten Fall wird hier erklärt, es ein Zeiger namens x in einen int.
Dann deklariert einen Zeiger genannt y auf int.
Es speichert dann in x, was?
Jemand anders jetzt.
Was wird in x nach gespeicherten die dritte Zeile von diesem Programm?
>> ZUSCHAUER: [unverständlich].
>> Sprecher 1: Nun, nicht ganz Bytes pro sagen.
Seien Sie genauere jetzt.
Was wird in x gespeichert?
Eine Adresse, ich glaube, ich hörte es.
>> Also, was bedeutet malloc zurückkehren?
malloc behaviorally ordnet ein Teil des Speichers.
Aber wie kommt es Ihnen darauf zugreifen?
Es gibt was?
Die Adresse des ersten Bytes in dem Teil des Speichers.
>> Nun, dies ist super einfach.
Es ist nur ein Byte, was bedeutet, das adressieren wir immer wieder die
Adresse der ganzen Sache.
So in x dann gespeichert, ist die Adresse dieser Teil des Speichers.
Unterdessen was passiert als nächstes?
Also eigentlich, lasst uns gehen Sie vor und zeichnen dieses heraus wirklich schnell.
>> Also, wenn wir gehen über den Bildschirm hier und Wir spielen dieses out int * x und int * y
wird, was für mich tun?
Ich behaupte, dass es nur geht zu tun so etwas wie dieses und nennen es x und
dies und nennen es y.
Inzwischen ist in der dritten Zeile der Code gehen, um die Größe eines int zuweisen,
was passiert zu sein - sorry, wenn ich sagte ein, bevor ich bedeutete eine int -
vier Bytes auf einem typischen Computersystem.
Zumindest mit dem CS50 Gerät.
>> Also das wird vergeben es, wer weiß?
Irgendwo hier draußen.
Und dies ist bei einigen gespeichert Adresse Ox, wer weiß?
Aber was wird zurückgegeben bekommen ist, dass Adresse.
Aber wir werden diese bildhaft zeichnen als nur ein Pfeil so.
>> Jetzt in der nächsten Zeile * x 42 bekommt.
Was bedeutet * x bedeuten, in juristischer Hinsicht?
Gehen Sie dort hin.
Gehe zu dieser Adresse.
Oder in anderen Worten, folgen Sie den Pfeil und legte 42 gibt.
Doch dann geschah etwas Schlimmes passiert zu Binky, nicht wahr?
>> Daran erinnern, dass Linie fünf hier bekommt * y 13, in der Tat eine Unglückszahl,
tat, was für uns?
Nun, gehen * y Mittel gibt.
Nun, dieses nicht gegeben ein Wert vorhanden, richtig?
Der Code muss nicht y initialisiert zu nichts.
Wir hatten x initialisiert eine Adresse.
Aber y wurde oben erklärt.
Aber dann ein Semikolon, kein Wert wurde tatsächlich in sie setzen.
Also, es ist fair zu dieser Aufforderung a garbage Wert.
Wer weiß, was ist da?
Es sind die Reste von Bits, die verwendet wurden von einigen vorherigen Codezeile in
mein Programm.
>> Also, wenn ich sage, es gehen, das ist wie, Ich habe keine Ahnung, wo dieser Pfeil ist
gehen, um am Ende.
Und das ist, wenn Sie in der Regel bekommen einen Segmentation Fault.
Wenn Sie versehentlich dereference, so zu sprechen, oder gehen Sie zu einer Adresse, die nicht ist
tatsächlich eine legitime Adresse, schlimme Dinge passieren.
>> Und das ist genau das, was passiert zu Binky denken.
So erinnern daran, dass die Geschichte, die Nick war erzählt hier war die gleiche Idee wie das, was
Ich habe mit der Illusion gezogen Kreide auf dem Brett gibt.
X und Y erklärt.
>> Dann haben wir die Größe der zugeteilten ein int und lagerte sie in x.
Dann wird die nächste Linie haben wir x *.
Dies war Nicks Zauberstab von Dereferenzierung.
Das setzte 42 in dem Speicher von x hingewiesen.
>> Aber das ist, wo die Dinge ging schief.
Right?
Wir haben versucht, dereference y.
Aber y hatte einige falsche Wert, nicht wahr?
>> Dass Pfeil in der linken unteren Ecke, ist nicht
tatsächlich zeigt auf nichts.
Es ist eine Art zu tun, was ich habe hier im Board.
So schlimme Dinge passieren, Segmentierung Fehler oder Binky Fehler in diesem Fall.
>> Aber wenn wir dann fix, dass dadurch x bekommt y wie funktioniert die Geschichte ändern?
Nun, wenn ich x y bekommt, das ist effektiv das gleiche wie zu sagen
was auch immer das ist, Ox-etwas wird gleich hier sein,
Ox-etwas.
Oder bildhaft zeichnen wir einen Pfeil.
>> Also hier auf dem Brett mit Binky, mit der nächsten Zeile des
Code bedeutet * y dorthin gehen.
Wo gibt es denn?
Es bedeutet hier.
>> Und wenn wir aktualisieren, die 13 sein es nur geht und gehen
Schreiben 13 jetzt hier.
Also vielleicht nicht ganz einfach auf den ersten Blick.
Aber zur Erinnerung und um den gleichen Jargon das Binky wurde hier mit, so
die ersten beiden verteilen die Zeiger, x und y, aber nicht die pointees.
Und pointees ist kein allgemein verwendeter Begriff.
Aber Zeiger ist absolut.
Aber es ist, was gerade darauf bei in Binkys Nomenklatur.
>> Die nächste Linie natürlich ordnet eine int pointee.
So ein Teil des Speichers - wie ich über zog auf der rechten Seite gibt es - und Satz
x gleich auf ihn verweisen.
Diese dereferenziert x bis 42 in speichern die Erinnerung, dass es an zeigt.
Und dann natürlich war eine schlechte Sache.
Da y nicht zeigen bei noch nichts.
Dies behebt es.
Also das ist immer noch buggy Programm.
Nur weil wir durch das Einblasen Code Zeile für Zeile und sagen, na ja,
lassen Sie es dort abstürzen.
Das ist eine schlechte Sache.
Quoten sind das Programm ist nur los, um abbrechen insgesamt bei dieser Linie.
Aber wenn Sie zu entfernen waren abgestürzt Zeile und ersetzen Sie es mit den letzten beiden
Linien dort zuweisen -
mit Zeiger Zuordnung - y um x als Punkt t zeigen.
Und dann dereference y in einer sehr sicheren Weise.
>> Also, wo führt uns das?
Nun, stellt sich heraus, dass unter der Haube in der CS50-Bibliothek, sind Zeiger
durchgehend verwendet.
Und wir werden tatsächlich zu schälen beginnen zurück, dass lange Schicht vor.
Aber es stellt sich auch, einen Ausdruck, einige von euch vielleicht bekannt sein,
insbesondere diejenigen, komfortabler, ist eigentlich, dass von einer sehr beliebten
Website oder Stack-Überlauf, in diesen Tagen.
>> Aber das hat eigentlich sehr technische Bedeutung.
Wir wissen jetzt, was ein Stack ist.
Es ist wie ein Stapel von Ablagen innerhalb eines Speisesaal.
>> Oder im Inneren Ihres Computers Speicher its diese Frames
, die durch Funktionen verwendet.
Nun stellt sich heraus, dass aus diesem Grund sehr einfache Implementierung
Speicher und die Rahmen auf der sogenannten stapeln, können Sie tatsächlich die Kontrolle
eines Computersystems ziemlich leicht.
Sie können in ein System zu hacken, wenn die Menschen wie wir haben nicht unser Code geschrieben
besonders gut.
>> Wenn Leute wie uns nutzen Brocken von Speicher-Arrays oder Verwendung -
sogar häufiger -
aber manchmal vergessen, die überprüfen Grenzen unserer Reihe, wie Sie vielleicht
haben Sie sich manchmal, und wiederholt viel zu weit über das Ende ein Array.
Im besten Fall, das Programm vielleicht einfach abstürzen.
Segmentation fault, Art peinlich.
Nicht so toll, aber es ist nicht unbedingt eine äusserst schlechte Sache.
>> Aber wenn Ihr Programm ist eigentlich auf realen Computern der Benutzer, wenn es läuft
auf einer Website, dass die tatsächlichen random people im Internet sind Schlagen, ließ
Menschen induzieren schlechte Dinge über Ihr Code in der Regel nicht eine gute Sache, weil
es bedeutet, eine Gelegenheit zu ergreifen, Steuerung des Computers.
Und das wird aussehen ein wenig kryptisch.
Aber ich dachte, ich würde dich erschrecken mit Dieses letzte Beispiel hier.
>> Hier ist ein Beispiel des Codes.
Und es gibt eine gute Wikipedia Artikel, die durch Spaziergänge
dies näher.
Ich habe wichtigsten auf der Unterseite Berufung foo, vorbei in argv von 1.
Und das ist nur so, dass man starten Sie das Programm und geben
eine beliebige Eingabe.
>> Und dann foo wird oben erklärt wie die Annahme eines String oder mehr
genau, ein char *.
Dann deklariert ein Array von Zeichen.
Nennen Sie es einen Puffer, ganz allgemein, von Größe 12.
So können 12 Zeichen hineinpassen dieses Array namens c.
>> Und dann wird diese neue Funktion, was ist neu, aber nicht schwer zu
verstehen, Speicher zu kopieren.
Er kopiert den Speicher von Bar, das war die Variable letzten n, unabhängig von der
Benutzer in argv 1 in c getippt.
Wie viele Bytes?
Die String-Länge des Stabes.
>> Mit anderen Worten, wenn der Benutzer in h-e-l-l-o eingeben, wird der String-Länge
von hello ist fünf.
Also fünf dieser Bytes wird erhalten kopiert in das Array mit Namen C, das
ist von Größe 12.
Aber was die Benutzer in eine viel längere Wort, das 13 Zeichen oder 14 ist
Zeichen oder 100 Zeichen oder mehr?
>> Wo sind sie hin?
Nun, dass der Rahmen, das Fach in den Speisesaal Stapel,
sie gehen, um dorthin zu gehen.
Und es ist einfach anfangen zu überschreiben andere Sachen, die sich bereits
auf diesem Stapel, Überlaufen der Stapel, so zu sprechen.
>> So bildhaft, es auf diese Weise zu denken.
Dies ist nur eine bunte Version das Bild, das wir schon seit Zeichnung.
Am unteren Ende, sagen wir, ist main.
Und auf der Spitze, was Sie jetzt sehen ist der Rahmen, Farbe jetzt für ein codiert
Funktion namens foo.
Aber was ist interessant, hier zu foo ist, dass hier dem Rahmen.
So ist es, so wie ich gezeichnet tat, aber in hellblau.
Und das ist jetzt, wo c Halterung 0 geht.
Und das ist, wo c Halterung 11 wird am Ende.
>> Mit anderen Worten, es geschieht als Quadrat dargestellt werden.
Aber wenn Sie nur halten Plopp bytes down - oder Zeichen - sie gehen zu Ende
bis an der Stelle 0 den ganzen Weg bis bis 11, weil es null indexiert.
>> Aber wo ist das 13. Zeichen gehen, um am Ende?
Wo ist der 14.?
Wo ist der 50. Charakter gehen, um am Ende?
>> Es wird immer nach unten.
Denn obwohl wir die gezogene Bild mit dem Stapel aufwachsen, die
Adressen, es stellt sich heraus, aus gehen kleiner Adressen, kleine
Zeiger, große Adressen.
So ist es einfach immer weiter steigt und steigt.
>> Also, wenn der Benutzer in hallo, das ist großartig.
Kein Fehler, kein Problem, jeder ist sicher.
Aber wenn der Benutzer in was wir rufen kontradiktorischen Code, vertreten
allgemein als ein, Angriff, Angriff, Angriff, Angriff, was kann passieren?
>> Nun, wenn alle Eingaben, die der Benutzer eingetippt ist nicht nur eine freundliche
oder offensive Zeichenfolge.
Es ist eigentlich eine Folge von Zeichen dass, wenn Sie es zusammengestellt,
es ist eigentlich Code.
Vielleicht ist es, dass Code löscht alle Dateien auf Ihrer Festplatte oder versendet Spam
oder so ähnlich.
Beachten Sie, dass das, was ist der Schlüssel hier ist, dass wenn der Bösewicht hatte Glück genug, um
überschreiben Sie den roten Teil des Speichers -
was ich nicht auf mein Bild aber zeichnen Dieses Bild hier hat Wikipedia -
seine sogenannte Absenderadresse.
>> Wenn die Nahrung Renditen, wenn Swap-Renditen wie funktioniert der Computer wissen aus gehen
bis hier, um hier unten?
Oder in der Tech-Segment oben, wie weiß er aus dem Swap gehen
Code - die 0 und 1 ist das komponieren Swap -
zurück zur Hauptansicht?
Es gibt eine sogenannte Rücksprungadresse gespeichert in demselben Stapelrahmen auf
das gleiche Cafeteria-Tablett.
>> Also, wenn der Bösewicht ist klug genug, um legte Angriff Code, Code Angriff, Angriff
Code, und mit etwas Glück genug -
oft durch Versuch und Irrtum - zu überschreiben, dass rot Rücksprungadresse,
mit der Adresse und Bekanntmachung ganz oben.
Unsere 0835C080.
Es steht geschrieben rückwärts bis oben für Gründen wir vielleicht überdenken.
Dies ist die Nummer.
>> Also, wenn der Bösewicht bekommt das Glück oder ist intelligent genug, um den roten überschreiben
Streifen der Speicher mit der Adresse Code, dass er oder sie muss irgendwie
eingespritzt in Ihren Computer, schätze deren Code wird zurückgegeben werden
sobald foo erfolgt die Ausführung?
>> Der Bösewicht den Code.
Also dieses Angriffs-Code, AAA, wieder Macht Spam, vielleicht löschen Sie alle Dateien
auf Ihrer Festplatte.
Aber das ist, was wirklich ein Stack-Überlauf ist, oder ein Pufferüberlauf oder eine
Pufferüberlauf Angriff.
>> Und es ist unglaublich, unglaublich weit verbreitet bis zum heutigen Tag mit Programmen geschrieben in
C, C + +, und auch einige andere Sprachen.
Auf dieser beängstigend beachten, werden wir Ende mit einem Witz.
>> [Gelächter]
>> Wir sehen uns am Mittwoch.
An der nächsten CS50 -
Also ich bin ganz aus Festplattenspeicher Lampen heute aber warten, fettfreie Milch, die Hälfte der Telefon
Buch, das Orangensaft dass ich trank heute.
USB-Kabel, ein Schraubenschlüssel.
>> [Musik spielt]