[Παίζει μουσική] David J. MALAN: Εντάξει αυτό είναι CS50 και αυτή είναι η αρχή της εβδομάδας πέντε. Έτσι, σήμερα, κάτω από μαξιλάρια του καθίσματος σας, δεν θα βρείτε τίποτα. Αλλά πάνω, θα πρέπει να βρείτε αυτά, ένα μικρό δείγμα της εκτίμησής μας για όλη τη δουλειά που βάζετε στο παιχνίδι των Δεκαπέντε. Απλά αφαιρέστε το μικρό κύκλο στο κάτω μέρος για να ξεκινήσετε να παίζετε για την υπόλοιπο της κατηγορίας. Έτσι, υπενθυμίζουν ότι, ή να γνωρίζουν ότι το πρόβλημα που τέσσερις, που βγήκε αυτό το Σαββατοκύριακο, περιλαμβάνει γράψιμο ένα άλλο παιχνίδι. Αλλά αυτή τη φορά περιλαμβάνει τη χρήση ενός πραγματική γραφική διεπαφή χρήστη, δεν είναι κειμενικό περιβάλλον εργασίας, όπως Παιχνίδι των Δεκαπέντε ήταν. Και το παιχνίδι που βρίσκεται μπροστά σας, Εάν δεν έχετε δει ακόμα αυτό το επόμενο, μοιάζει λίγο κάτι σαν αυτό. Πάω να μπω σε τερματικό μου παράθυρο εδώ στην GDB. Και Πάω να πάει μπροστά και να τρέξει το λύση του προσωπικού, το οποίο μπορείτε να έχετε πρόσβαση μετά την εκτέλεση ενημέρωση 50 ως συνήθως. Αλλά Πάω να το βάλετε σε ένα μικρό μυστικό τρόπο, λίγο Πασχαλινό αυγό, λεγόμενη Θεός λειτουργία, με βάζοντας τον Θεό στην argv1. Και εγώ πρέπει να ακολουθήσει το δικό οδηγίες μου, τρέχει στη δική μου πρόβλημα που directory. Έτσι τώρα μπορείτε να δείτε μια πλήρη έκδοση το παιχνίδι του ξεμπλοκαρίσματος. Στην πραγματικότητα, αυτό δεν είναι-χέρια λειτουργία. Έτσι είναι στην πραγματικότητα - εντυπωσίασε αν και θα μπορούσε να είναι - πολύ ασήμαντο για να εφαρμόσουν τον Θεό σε λειτουργία Breakout, σε αντίθεση με το παιχνίδι των Δεκαπέντε, που κάποιοι από εσάς μπορεί να έχουν αντιμετωπιστεί για την έκδοση του χάκερ. Σε Breakout αρκεί στο Θεό τρόπος για να κάνει απλά αυτό, διαισθητικά με το κουπί; Απλά να είναι ίσο με το ό, τι η οριζόντια θέση είναι της μπάλας. Και εφ 'όσον μπορείτε να το κάνετε αυτό στο lockstep με την μπάλα να κινείται αυτό το παιχνίδι θα Ποτέ, ποτέ, ποτέ να χάσει την μπάλα και θα κερδίσετε κάθε φορά. Αλλά στην έκδοση του χάκερ αυτής της εβδομάδας Είναι κάτι περισσότερο από τρόπος του Θεού. Υπάρχει μια σειρά από άλλα χαρακτηριστικά. Μεταξύ αυτών, τα λέιζερ. Έτσι ώστε, αν είστε πραγματικά ανυπόμονοι σας μπορεί να ξεκινήσει κατάρριψη τα τούβλα και μερικοί άλλοι. Και για όσους από εσάς θα θέλατε να βαθμονόμηση πρότυπο έναντι χάκερ έκδοση, μπορώ να δω ότι αυτή η εβδομάδα έκδοση χάκερ είναι σκόπιμα μια λίγο πιο εφικτό, ας πούμε, από τον Θεό Λειτουργία ήταν με το παιχνίδι των Δεκαπέντε. Έτσι, αν ψάχνετε για ένα τέντωμα και ψάχνετε για κάποια επιπλέον διασκέδαση χαρακτηριστικά κάνουν βουτιά στο αν ενδιαφέροντος. Τώρα, περισσότερο πρακτικά, επιτρέψτε μου να επισημάνω από ένα πράγμα, καθώς και. GDB, που κάποιοι από εσάς μπορεί να μην έχουν ακόμη άγγιξε προσωπικά, η οποία είναι μια χαρά. Αλλά τώρα είναι πραγματικά το χρόνο για να συνηθίσουν σε αυτό και άνετα με αυτό το εργαλείο γιατί αυτό θα κάνει τη ζωή σας πολύ πιο εύκολο, πραγματικά. Ανά διάλεξη Rob για GDB ένα ζευγάρι εβδομάδες πριν, ανάκληση ότι η GDB είναι ένα πρόγραμμα εντοπισμού σφαλμάτων. Είναι ένα εργαλείο που σας επιτρέπει να εκτελέσετε σας πρόγραμμα, αλλά το εκτελέσετε βήμα προς βήμα, γραμμή από τη γραμμή, έτσι ώστε να μπορείτε να σακί γύρω, έτσι ώστε να δούμε τα πράγματα συμβαίνουν, οπότε που μπορείτε να εκτυπώσετε τιμές των μεταβλητών. Με λίγα λόγια, αυτό σας δίνει πολύ περισσότερα ενέργεια από printDef κάνει. Τώρα, κατά γενική ομολογία, η διεπαφή είναι αρκετά απόκρυφες. Μαύρο και άσπρο κειμένου interface για το μεγαλύτερο μέρος. Οι εντολές είναι κάπως δύσκολο να θυμάστε κατά την πρώτη. Αλλά ακόμα κι αν μπορεί να πάρει τα μισά μια ώρα, μια ώρα, να τεθεί η εκ των προτέρων επένδυση σε χρόνο σε αυτό, πιστέψτε με. Σίγουρα μέχρι το τέλος του εξαμήνου θα σώσει σας μια τάξη μεγέθους πιο χρόνο από αυτόν. Έτσι, στις αρχές της εβδομάδας έκανε βουτιά Και από την άποψη της Breakout, ξέρετε ότι να το κάνετε αυτό, εφόσον έχετε ο κωδικός διανομή ή τον δικό σας κώδικα σε εξέλιξη Pst4 σας κατάλογο. Να ξέρετε ότι μπορείτε να εκτελέσετε gdb. / Ξεμπλοκάρισμα. Αυτό πρόκειται να ανοίξει ένα παράθυρο σαν αυτό. Επιτρέψτε μου να δώσω στον εαυτό μου περισσότερο από ένα παράθυρο τερματικού. Και τότε τι Πάω να προχωρήσει και να το κάνουμε, δεν είναι να τρέξει μόνο. Πάω να πρώτα να ορίσετε ένα σημείο καμπής ανάκληση, η οποία σας επιτρέπει να διακόψετε εκτέλεση σε ένα συγκεκριμένο τόπο. Ακριβώς για να κρατήσει τα πράγματα απλά Πάω να σπάσει σε μία γραμμή απλά πληκτρολογώντας ο αριθμός ένα. Επιτρέψτε μου πραγματικότητα ξανανοίξει αυτό το παράθυρο επειδή είναι να πάρει ένα λίγο μικρό εκεί. Έτσι, αυτό που είμαι τώρα πρόκειται να κάνουμε εδώ είναι αν ανοίξει παράθυρο τερματικού μου. Έλα, εκεί πάμε. Έτσι τώρα, αν πάω πίσω στο dropbox, Pst4 και να τρέξει gdb. / ξεμπλοκάρισμα εισάγετε, παρατηρήστε Πάω να σπάσει ένα για να ορίσετε ένα σημείο καμπής σε μία γραμμή. Και τώρα είμαι πρόκειται να πάει μπροστά και το είδος τρέξει. Και όταν το κάνω, τίποτε δεν φαίνεται να συμβαίνει. Δεν υπάρχει μέχρι pop. Δεν υπάρχει καμία γραφική διεπαφή χρήστη ακόμα. Αλλά αυτό είναι κατανοητό γιατί είμαι κυριολεκτικά σε μία γραμμή στο πρόγραμμά μου. Και παρατηρήσετε ότι έχω γρήγορα προς τα εμπρός, ειδικά τώρα με 62, επειδή όλα τα πράγματα στην κορυφή αυτού του αρχείου είναι τα πράγματα όπως τα σχόλια και τις σταθερές και πληκτικός πράγματα για τώρα. Έτσι τώρα είμαι στο εσωτερικό της κύριας, φαίνεται, στη γραμμή 62. Και αυτό είναι μόνο η διανομή κώδικα, ανάκληση. Αν ανοίξω αυτό επάνω με τη μετάβαση, ομοίως, σε κατάλογο κουτί πτώση μου σε Pst4, σε breakout.c. Και αν μετακινηθείτε προς τα κάτω και προς τα κάτω και προς τα κάτω, και επιτρέψτε μου να πάει μπροστά και να ενεργοποιήσετε αριθμοί γραμμή μου. Αυτό που θα δείτε, αν μετακινηθείτε προς τα κάτω για να γραμμής 62, είναι ακριβώς η γραμμή που έχουμε παύση του. Έτσι, αυτή η γραμμή εδώ, 62, είναι όπου είμαστε έτοιμοι να είναι. Έτσι τώρα το GDB, αν πάω μπροστά και πληκτρολογήστε τώρα το επόμενο, εισάγετε πρόκειται να εκτελέσει αυτή τη γραμμή. Και voila, έχουμε την λεγόμενο παράθυρο γρ. Αν δεν είναι εξοικειωμένοι με αυτό που ένα GWindow είναι, για να μην ανησυχείτε. Το spec θα σας παρουσιάσουμε σε αυτό, όπως καθώς και μια σειρά από βίντεο περιδιάβαση ενσωματωμένο στο spec. Αλλά τώρα ας κάνουν αυτό ένα λίγο πιο ενδιαφέρουσα. Επιτρέψτε μου να περάσω αυτό το παράθυρο πάνω προς την πλευρά λίγο. Επιτρέψτε μου να κάνω το παράθυρο λίγο μεγαλύτερο έτσι μπορώ να δω περισσότερα. Και τώρα επιτρέψτε μου να πάμε μπροστά και να κάνετε στη συνέχεια και πάλι. Και υπάρχουν τούβλα μου. Αν μου πληκτρολογήσετε στη συνέχεια και πάλι τώρα βλέπω την μπάλα. Και αν πληκτρολογήσετε στη συνέχεια και πάλι τώρα βλέπω το κουπί. Και ευτυχώς αυτό gedit δεν είναι πραγματικά συνεργάζεται με την επίδειξη μου ό, τι θέλω. Αλλά τώρα αν κάνω το επόμενο και πάλι, επόμενη φορά, είμαι απλά με την οποία ορισμένες μεταβλητές. Και μπορώ να εκτυπώσετε οποιοδήποτε από αυτά τα παιδιά έξω. Τούβλα εκτύπωσης, εκτυπώσεις ζωές. Και τώρα αν συνεχίζω να κάνω Στη συνέχεια, παρατηρούμε ότι θα είμαι στο εσωτερικό του εν λόγω βρόχου. Αλλά ο κώδικας πρόκειται να εκτελέσει ακριβώς όπως περιμένω. Έτσι, όταν χτύπησα αυτή τη λειτουργία, περιμένετε Κάντε κλικ για, πρόκειται να κάνει κυριολεκτικά αυτό. Γι 'αυτό και φάνηκε να έχουν χάσει τον έλεγχο πάνω από το πρόγραμμα. GDB δεν μου δίνει μια άλλη ερώτηση. Αλλά μην ανησυχείτε. Πηγαίνετε στο παιχνίδι μου, κάντε κλικ κάπου. Και ιδού, τώρα προχωρά στη γραμμή 86. Έτσι και πάλι, είναι ανεκτίμητη, σε τελική ανάλυση, για τα προβλήματα debugging. Επειδή δεν μπορείτε κυριολεκτικά να βγείτε από κωδικό σας, τα πράγματα εκτύπωση και πολύ, πολύ, περισσότερο. Αλλά για τώρα, αυτά τα εργαλεία μόνο θα πρέπει να έχετε αρκετά μακριά. Έτσι είμαστε, φυσικά, ρίχνοντας μια ματιά στα γραφικά τώρα, ξαφνικά. Και τώρα ο κόσμος μας παίρνει λίγο πιο ενδιαφέρουσα. Και ξέρετε, ίσως, από κάποιες από τις βίντεο σε απευθείας σύνδεση που έχουμε αυτά τα σορτς που έχετε προσέξει ως μέρος των συνόλων προβλήματος. Και να έχουν πυροβοληθεί, σκόπιμα, σε λευκό φόντο. Και μερικοί από αυτούς έχουν τη διδασκαλία Fellows αντλώντας κάποιο κείμενο σχετικά με την οθόνη που είναι υπέρθεση από την πλευρά τους. Αλλά φυσικά, αυτό δεν είναι όλα αυτά ενδιαφέρον στον πραγματικό κόσμο. Αυτό είναι απλά μια αίθουσα διαλέξεων με μεγάλη λευκή οθόνη και ένα σκηνικό. Και την απίστευτη ομάδα μας παραγωγής της κάνει όλα να φαίνονται όμορφα μετά το γεγονός με περικοπή out επικάλυψη ή τίποτα κάνουμε ή δεν θέλουν. Τώρα απλά να παρακινήσει αυτή την εβδομάδα και Πραγματικά, όπου μπορείτε να πάτε, σε τελική ανάλυση, με την επιστήμη των υπολογιστών. Όχι μόνο μετά από το πρόβλημα που έχει τέσσερις. Αλλά μετά το άλλο μάθημα ή μια ολόκληρη πρόγραμμα σπουδών είναι καταπληκτικό το τι μπορείτε να κάνετε κάνει αυτές τις μέρες από την άποψη της γραφικών ειδικότερα. Κάποιοι από εσάς μπορεί να έχετε δει αυτό ρέει γύρω σε απευθείας σύνδεση. Αλλά σκέφτηκα να σας δείξω, μόνο για ένα λίγα λεπτά, μια γεύση από το τι τεχνολογία των υπολογιστών και τι CGI, γραφικά υπολογιστών μπορεί να κάνει αυτές τις μέρες με ένα γνωστό τραγούδι και ίσως ταινία. [MUSIC - LANA DEL RAY, "Η νεαρή και όμορφη] ΟΜΙΛΗΤΗΣ 1: Είναι λίγο εκπληκτικό, ίσως, πόσο πανταχού παρούσα - [Χειροκρότημα] ΟΜΙΛΗΤΗΣ 1: Έχω κατεβάσει απλά. Αλλά είναι πραγματικά εκπληκτικό, νομίζω, απλά Πώς πανταχού παρών λογισμικού και κώδικα και εργαλεία όπως αυτό πραγματικά είναι. Έτσι, αυτό είναι μια γεύση από την κατεύθυνση στο οποίο μπορείτε να πάτε. Ω, όχι περισσότερο Appliance σήμερα. Λοιπόν, αυτό είναι πραγματικά τραγικό το χρονοδιάγραμμα δίνεται το σημείο εγώ απλά προσπάθησα να κάνω. Εντάξει, ας ξεκινήσει Fusion και πάλι. Υπενθύμιση αργότερα. Εντάξει, και θα πρέπει να έχεις ένα e-mail ως ένα μέρος, αν είχε πάρει ένα παρατηρήσετε έτσι. Εντάξει, έτσι Υπενθυμίζεται ότι την περασμένη εβδομάδα αρχίσαμε να φλούδα πίσω αυτό αργότερα γνωστό ως string. εγχόρδων υπενθυμίζει έναν τύπο δεδομένων που είναι δηλωθεί στη βιβλιοθήκη CS50. Και αυτό είναι μέρος των ρόδες που θα αρχίσει τώρα να απογειωθεί. Ήταν μια χρήσιμη έννοια νωρίς. Αλλά τώρα πρόκειται να πάρει περισσότερο ενδιαφέρουσα και πιο ισχυρή για να πραγματικά να δείτε ότι κάτω από το καπό, ένα string είναι ακριβώς αυτό, δεν είπαμε; Ναι, έτσι είναι το λεγόμενο char *. Και η * εκεί σημαίνει ότι υπάρχει κάποια διεύθυνση που εμπλέκονται. Και έτσι όταν λέτε char * απλά σημαίνει μια μεταβλητή του οποίου ο τύπος δεδομένων είναι ένα pointer τώρα. Το γεγονός ότι υπάρχει το αστέρι εκεί απλά σημαίνει ότι είστε με την οποία μια λεγόμενη δείκτη. Και αυτό δείκτη πρόκειται να φαινομενικά αποθηκεύσετε τη διεύθυνση, του Φυσικά, μια χαρα. Τώρα γιατί αυτό το νόημα; Λοιπόν, αυτό είναι ένα string κάτω από την κουκούλα; Λοιπόν, εδώ και αρκετό καιρό έχουμε πει ότι μια σειρά κάτω από το καπό είναι μόλις h-E-L-L-O, για παράδειγμα. Αλλά έχουμε μιλήσει για αυτό, όπως είναι, ουσιαστικά, μια σειρά. Και μια σειρά θα δούμε στη συνέχεια, λίγο περισσότερο όπως αυτό, με κάθε μία από αυτές ανάληψη μια μπουκιά. Και τότε έχουμε πει ότι υπάρχει κάτι το ιδιαίτερο πίσω εδώ, η backslash 0 ή null τερματισμού. Έτσι, όλο αυτό το διάστημα, αυτό εδώ υπήρξε ένα string. Αλλά πραγματικά, ένα string είναι στην πραγματικότητα μια διεύθυνση. Και διευθύνσεις, όπως θα δούμε, είναι συχνά πρόθεμα 0x κατά συνθήκη. Τι σημαίνει 0x δηλώνουν; Ξέρει κανείς; Έτσι, αυτό σημαίνει απλώς δεκαεξαδικό. Έτσι, μπορείτε να θυμάστε, στην πραγματικότητα, από PST 1, πιστεύω, ένας από τους προθέρμανσης ερωτήσεις στην πραγματικότητα ρώτησε για δεκαεξαδικό συμβολισμό πέραν δυαδικό και δεκαδικό. Και το κίνητρο εδώ είναι ότι με δεκαεξαδικό έχετε 16 ψηφία στη διάθεσή σας. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ακολουθούμενη από α, β, c, d, e, f. Και αν υπολογίσουμε όλα αυτά επάνω, μπορείτε να πάρετε ένα σύνολο 16. Έτσι, αυτό είναι σε αντίθεση με τις δεκαδικό, όπου έχουμε 10 ψηφία 0 έως εννέα. Είναι σε αντίθεση με το δυαδικό όπου έχουμε μόνο 0 και 1. Αλλά στο τέλος της ημέρας μπορείτε απλά αντιπροσωπεύουν τους ίδιους αριθμούς, αλλά κάπως διαφορετικά. Και δεκαεξαδικό είναι κοινή, επειδή, όπως αποδεικνύεται - και θα δούμε αυτό αργότερα κατά την πορεία - ακόμα και όταν παίρνουμε για web προγραμματισμό στο πλαίσιο της HTML και τους χρωματικούς κώδικες, δεκαεξαδικό είναι ωραίο. Επειδή κάθε ψηφίο, αποδεικνύεται ότι, αντιπροσωπεύει τέσσερα κομμάτια τέλεια. Γι 'αυτό ακριβώς το είδος των γραμμών επάνω ωραία όπως θα δούμε τελικά. Έτσι, αυτό θα μπορούσε να είναι Ox123 ή κάτι όπως αυτό, που δηλώνει 123 διεύθυνση κάπου μέσα μου μνήμη του υπολογιστή. Αλλά φυσικά, προκύπτουν ορισμένα προβλήματα εξαιτίας αυτού του υποκείμενου εφαρμογή. Και υπενθυμίζουν ότι πήρα μια μαχαιριά στο εφαρμογή μια λειτουργία όπως αυτό - συγκρίνουν παύλα 0 dot γ περασμένη εβδομάδα, ότι ακόμα κι αν φαινόταν σαν να ήταν Εντάξει, απλά δεν συγκρίνετε δύο χορδές σωστά. Έχω πετάξει κύρια, και έχω ρίξει μακριά τα σχόλια μόνο για να επικεντρωθεί η προσοχή στα ο κώδικας που μας ενδιαφέρουν εδώ. Και είναι στο κόκκινο, γιατί είναι λάθη. Για ποιο λόγο; Λοιπόν, στην κορυφή εκεί όταν δήλωσα ένα string, τι πραγματικά συμβαίνει κάτω από την κουκούλα; Λοιπόν, επιτρέψτε μου να πάω στο οθόνη εδώ και σχεδιάστε αυτό. Γι 'αυτό και δήλωσε, και πάλι, GetString συμβολοσειράς s. Έτσι, Πάω να προχωρήσει τώρα και επιστήσει s για το τι είναι πραγματικά. Είναι πρόκειται να είναι ένα τετράγωνο εδώ. Και Πάω να διεκδικήσει ότι είναι 32 bits. Τουλάχιστον είναι συνήθως, τουλάχιστον για το CS50 συσκευή σε πολλούς υπολογιστές. Πάω να το ονομάσουμε s. Τώρα, όμως, υπενθυμίζουν ότι ονομάζεται GetString. Έτσι GetString αποδόσεις, φυσικά, μια συμβολοσειρά. Εάν ο χρήστης πληκτρολογήσει στο h-e-l-l-o εισάγετε η σειρά Hello παίρνει επέστρεψε. Και αυτή η σειρά, όπως μόλις είπε, τελειώνει κάπου στη μνήμη του υπολογιστή σας με 0 κάθετος στο τέλος. Θα τραβήξω αυτό, όπως του πίνακα - ή συνεχόμενο μπλοκ των χαρακτήρων - ότι είναι στην πραγματικότητα. Και τώρα, τι GetString η ίδια η επιστροφή; Τι έχει GetString έχει επιστροφή όλο αυτό το διάστημα; Λοιπόν, ας πούμε, σε εβδομάδες πριν, επιστρέφει ένα string. Αλλά πιο τεχνικά, τι κάνει GetString επιστροφή προφανώς; ΚΟΙΝΟ: Μία διεύθυνση. ΟΜΙΛΗΤΗΣ 1: Μία διεύθυνση. Συγκεκριμένα επιστρέφει τη διεύθυνση της την πρώτη κιόλας μπουκιά, όποια και αν είναι. Απλά συνεχίζω να χρησιμοποιείτε ένα, δύο, τρία επειδή είναι βολικό. Επιστρέφει τη διεύθυνση του πρώτου χαρακτήρα της συμβολοσειράς. Και είπαμε την περασμένη εβδομάδα ότι ότι είναι επαρκής. Επειδή δεν μπορούμε πάντα να καταλάβω πού το τέλος του string μόνο από επανάληψη πάνω από αυτό, ίσως, με ένα για loop ή βρόχος while ή κάτι τέτοιο ότι, απλά ψάχνουν για "backslash 0", ο ειδικός χαρακτήρας δεικτών. Και τότε γνωρίζουμε ότι η σειρά συμβαίνει να είναι μήκους - σε αυτή την περίπτωση - πέντε. Έτσι, από τεχνική GetString τι κάνει είναι ότι επιστρέφει Ox123 σε αυτή την περίπτωση. Και τεχνικά τότε τι συμβαίνει είναι που αποθηκεύουμε, στο εσωτερικό του s, Ox123. Στο τέλος της ημέρας, έστω και αν αυτό είναι νέα έννοια, δείκτες, είναι μόνο μεταβλητές. Αλλά τυχαίνει να αποθηκεύουν bits που συλλογικά αντιπροσωπεύουν μια διεύθυνση. Έτσι, τεχνικά όλα αυτά παίρνει αποθηκεύονται σε s είναι Ox123. Αλλά εμείς ως άνθρωποι - συμπεριλαμβανομένης της περαιτέρω σήμερα - δεν είναι πραγματικά πρόκειται για τη φροντίδα, συνήθως, ποια είναι η πραγματική διεύθυνση είναι από κάποιο κομμάτι της μνήμης. Είναι απλά σε χαμηλό επίπεδο λεπτομέρειας που να είναι διανοητικά ενδιαφέρον. Έτσι, Πάω να αναιρέσετε αυτό. Και αντ 'αυτού, πιο υψηλό επίπεδο, απλά να πω ότι όταν μιλάμε για δείκτες Πάω να επιστήσω λίγο περισσότερο φιλικό προς το χρήστη βέλος που μεταφέρει το ίδια ιδέα και αποσπάσματα μακριά τα στοιχεία ποια είναι η πραγματική υποκείμενη διεύθυνση είναι. Τώρα αν πάμε πίσω στον κώδικα, ό, τι συνέβη την περασμένη εβδομάδα, αν έχουμε σειρά t ισούται με GetString; Λοιπόν, αν και πάλι, πληκτρολογήστε γεια αυτή τη φορά είμαι πρόκειται να πάρει ένα άλλο κομμάτι της μνήμης. h-e-l-l-o backslash 0. Αλλά επειδή κάλεσα GetString μια δεύτερη φορά - και το ξέρω από την εξέταση των πηγαίο κώδικα για GetString - ακόμη αν είναι τυχαίο ότι ήταν γεια πληκτρολογήσετε δύο φορές, GetString δεν είναι πρόκειται να προσπαθήσει να βελτιστοποιήσει και να είσαι έξυπνος. Είναι ακριβώς πρόκειται να πάρει ένα άλλο κομμάτι της μνήμης από τον υπολογιστή, το οποίο είναι πρόκειται να είναι σε άλλη διεύθυνση. Ας πούμε αυθαίρετα μόνο 456. Και τότε τι είναι αυτό πρόκειται να επιστρέψει; Είναι πρόκειται να επιστρέψει 456 και αποθηκεύστε το σε t. Έτσι, αυτό που πραγματικά συμβαίνει, σχετικά με την αριστερή πλευρά είναι ότι έχω ένα άλλο κομμάτι της μνήμης, τυπικά 32 bits. Και εκεί πρόκειται να πάει Ox456. Αλλά και πάλι, δεν είμαι ενδιαφέρονται για αυτά συγκεκριμένα νούμερα πια. Είμαι ακριβώς πρόκειται να αφηρημένα συντάξει ως ένα βέλος. Έτσι, αυτό είναι τώρα μια νέα εξήγηση. Αλλά είναι η ίδια ακριβώς ιδέα που είναι συμβαίνει όλο αυτό το διάστημα. Και έτσι το λόγο λοιπόν, ότι αυτή η πρώτη έκδοση της σύγκρισης ήταν buggy την περασμένη εβδομάδα είναι ο λόγος; Όταν το κάνετε, αν s ισούται ισούται t τι είσαι πραγματικά κάτω από την κουκούλα σύγκριση; Είσαι συγκρίνοντας τις διευθύνσεις. Και μόνο διαισθητικά, με σαφήνεια, Ox123 δεν πρόκειται να ισούται Ox456. Αυτοί οι αριθμοί, αυτά τα δυαδικά ψηφία είναι απλώς διαφορετικά. Και έτσι με συνέπεια, την περασμένη εβδομάδα, δήλωσε πληκτρολογήσετε διαφορετικά πράγματα, ακόμη και αν η λόγια ήταν αυτολεξεί η ίδια. Γι 'αυτό το διορθώσω αυτό. Με άλλα λόγια, ποια ήταν η λύση; ΚΟΙΝΟ: Χρησιμοποιήστε μια λειτουργία. ΟΜΙΛΗΤΗΣ 1: Χρησιμοποιήστε μια λειτουργία. Ή αστέρων είναι σίγουρα εμπλέκονται, αλλά χρησιμοποιούν μια λειτουργία για να κάνει τι; ΚΟΙΝΟ: Για να συγκρίνετε τις χορδές. ΟΜΙΛΗΤΗΣ 1: Για να συγκρίνετε τις χορδές. Έτσι, το βασικό πρόβλημα εδώ ήταν ότι θα εξέταζε μόνο το ποιότητα των strings που ορίζονται από σύγκριση διευθύνσεις τους. Και προφανώς αυτό είναι απλά ηλίθιος τώρα για άλλη μια μπορείτε να καταλάβετε τι συμβαίνει κάτω από το καπό. Για να συγκρίνετε πραγματικά χορδές για να δείτε αν ότι είναι ίση με τον τρόπο που ένας άνθρωπος θα εξετάσει δύο χορδές να είναι ίση θα πρέπει να συγκρίνουμε τους χαρακτήρα χαρακτήρα για τον χαρακτήρα. Τώρα θα μπορούσα να έχω κάνει αυτό το πολύ κουραστικά. Αλλά οικεία, είμαστε χρησιμοποιώντας ένα for loop. Και συγκρίνει μόνο s βραχίονα i εναντίον t βραχίονα i. s βραχίονα i συν 1 κατά τ βραχίονα Ι συν 1, και ούτω καθεξής, στο εσωτερικό κάποιο είδος βρόχου. Και αν εντοπίσετε οποιαδήποτε δύο χαρακτήρες που διαφέρουν, ή αν αντιλαμβάνομαι ότι ooh, s είναι μικρότερη από t ή περισσότερο από ό, τι t Μπορώ να πω αμέσως ψευδή, δεν είναι το ίδιο. Αλλά αν πάρω μέσω s και t και να πω ίδιο, το ίδιο, το ίδιο, το ίδιο, το ίδιο, τέλος δύο χορδές, μπορώ να πω αλήθεια, είναι ίσες. Λοιπόν, ευτυχώς, πριν από χρόνια κάποιος έγραψε τον κώδικα για εμάς. Και ονόμασαν StrComp για σύγκρισης συμβολοσειράς. Και ακόμα κι αν είναι ένα μικρό μετρητή διαισθητική, StrComp επιστρέφει 0 αν αυτά δύο χορδές, s και t είναι τα ίδια. Αλλά επιστρέφει αρνητική αξία, αν s θα πρέπει να έρθει πριν από t αλφαβητικά ή θετική τιμή, εάν θα πρέπει να έρχονται μετά από t αλφαβητικά. Έτσι, αν ποτέ θέλετε να ταξινομήσετε κάτι, αποδεικνύεται ότι StrComp είναι χρήσιμη. Επειδή δεν έχει μόνο να πω ναι ή όχι, ίσα ή όχι. Σας δίνει την αίσθηση της παραγγελίας σαν μια δύναμη λεξικό. Έτσι StrComp, s κόμμα t ισούται είναι ίσο με 0 σημαίνει ότι η χορδές είναι πραγματικά ίσες. Διότι όποιος έγραψε αυτή τη λειτουργία χρόνια χρησιμοποιούνται πιθανώς ένα for loop ή ένα βρόχο, ενώ ή κάτι τέτοιο να ενσωματώσει πάνω από τους χαρακτήρες και πάλι και ξανά και ξανά. Αλλά δύο πρόβλημα προέκυψε εδώ. Αυτό ήταν copy0.c. Και οι δύο είναι στο κόκκινο γιατί είναι εσφαλμένη. Και τι κάνουμε εδώ; Λοιπόν, πρώτα κάλεσα GetString. Και εγώ αποθηκευμένη την τιμή επιστροφής s. Έτσι, αυτό είναι λίγο πολύ η ίδια με Αυτό το άνω μέρος της εικόνας. Αλλά αυτό που έρχεται μετά από αυτό; Λοιπόν, επιτρέψτε μου να πάει μπροστά και να απαλλαγούμε σε ένα σωρό από αυτό. Θα τα πίσω στο χρόνο για να όπου απλά έχουν s, η οποία είναι συνεπής με τώρα μία γραμμή εκεί. Μπορώ να ελέγξω. Αν S είναι ίση με 0. Τώρα, μια γρήγορη σημείωση, όταν μπορεί να GetString επιστροφή 0? Δεν υπάρχει αρκετή μνήμη. Σωστά; Είναι σπάνιο ότι αυτή η μετάβαση είναι να συμβεί, σίγουρα σε έναν υπολογιστή που είναι πήρε εκατοντάδες megs ή ακόμα συναυλίες της μνήμης RAM. Αλλά θα μπορούσε, θεωρητικά, να επιστρέψει 0, ειδικά αν η χρήστης δεν συνεργάζεται. Υπάρχουν τρόποι για να προσποιούνται σαν να μην έχουν εισηγμένο τίποτα και τέχνασμα GetString στην επιστροφή 0 αποτελεσματικά. Έτσι, πρόκειται να ελέγξει για αυτό. Διότι, αν κάποιος από εσάς έχουν αρχίσει να πάρει, ήδη, σφάλματα κατάτμησης - το οποίο είναι πιθανώς μια πηγή από κάποια απογοήτευση - αυτά είναι σχεδόν πάντα το αποτέλεσμα της μνήμης σχετίζονται με το σφάλμα. Κάπως μπέρδεμα πάνω σε σχέση με ένα pointer, ακόμα κι αν δεν έχετε συνειδητοποιήσει υπήρχε ένα δείκτη. Έτσι, μπορεί να έχετε προκαλείται κατάτμηση βλάβες το ταχύτερο μία εβδομάδα χρησιμοποιώντας κάτι σαν ένα για βρόχο ή λίγο βρόχο και μια σειρά από υπερβολικό παρελθόν από τα όρια της συστοιχίας ότι κάποια δηλώσατε, την εβδομάδα σε δύο ειδικότερα. Μπορεί να έχετε κάνει ακόμα το πρόβλημα έθεσε τέσσερις με Breakout. Ακόμα κι αν ίσως δεν έχουν δει τυχόν αστέρια στον κώδικα διανομής για Breakout, αποδεικνύεται ότι οι GRect και Goval και άλλα τέτοια πράγματα, αυτά είναι στην πραγματικότητα δείκτες κάτω από το καπό. Αλλά Stanford, όπως και εμείς, το είδος των δερμάτων που λεπτομέρεια, τουλάχιστον για τις βιβλιοθήκες σκοπούς, όπως και εμείς για έγχορδα και char *. Αλλά GRect και Goval και όλους εκείνους τα πράγματα εσείς είναι ή θα πρέπει να χρησιμοποιούν αυτή την εβδομάδα είναι τελικά διευθύνσεις μνήμης. Απλά δεν το γνωρίζουν. Έτσι δεν είναι περίεργο λοιπόν, ίσως, που μπορεί να σκοντάψει κάποια σφάλματα κατάτμησης. Αλλά αυτό που είναι ενδιαφέρον εδώ και τώρα, Εάν μετά τον έλεγχο για 0 ​​κάνουμε εγχόρδων t παίρνει s. Λοιπόν, επιτρέψτε μου να δηλώσω t. Πάω να το συντάξει ως ένα τετράγωνο, 32 bits, αποκαλούν t. Και τότε Πάω να κάνω παίρνει s. Λοιπόν, τι σημαίνει αυτό; Λοιπόν, είναι λίγο δύσκολο να σκεφτεί γι 'αυτό εικόνα σοφός. Αλλά ας σκεφτούμε τι υπάρχει μέσα του x; Τι είναι κυριολεκτικά μέσα σε αυτή τη μεταβλητή; Η Ox123 αξία. Έτσι, όταν λέω σειρά t παίρνει s, που απλά κυριολεκτικά σημαίνει πάρε τον αριθμό το s, η οποία είναι Ox123 και το βάζουμε Ox123. Ή εικονογραφικά, αν το είδος της αφηρημένης μακριά από εκείνη την λεπτομέρεια που έχει η αποτέλεσμα κυριολεκτικά να κάνει Αυτό, καθώς και. Έτσι τώρα, σκεφτείτε την περασμένη εβδομάδα, όταν προχωρήσαμε στην καπιταλιστική T. I έκανε T βραχίονα 0. Λοιπόν, T βραχίονα 0, ακόμα κι αν είναι ένα δείκτη, μπορείτε να το αντιμετωπίσουμε σαν Είναι μια σειρά, με ένα τετράγωνο σημειογραφία βραχίονα. Λοιπόν, πού είναι T βραχίονα 0; Λοιπόν, είναι η ώρα. Και έτσι, όταν χρησιμοποιείτε τη γραμμή του κώδικα, δύο άνω, η οποία είναι σε αυτό το γ type.h αρχείο κεφαλίδας, αυτό είναι όπου που έχει δηλωθεί. Είσαι κεφαλαιοποίηση αυτή H. Αλλά Φυσικά, αυτό είναι η ίδια ακριβώς ώρα που είναι εσωτερικό του s, να το πω έτσι. Και έτσι τώρα έχετε αλλάξει ή κεφαλαιοποιούνται τόσο το πρωτότυπο και το λεγόμενη αντιγραφής. Επειδή δεν έχετε κάνει ένα αντίγραφο στην τρόπο που ένας άνθρωπος θα ήθελε να είναι. Λοιπόν, τι ήταν η αποτύπωση εδώ, σε copy1.c την περασμένη εβδομάδα; Λειτουργίες, γι 'αυτό θα μπορούσε πραγματικά να αντιγράψτε το string. Και, ουσιαστικά ό, τι χρειαζόμαστε για να κάνει για να αντιγράψετε το string; Λοιπόν, σε αυτό το πράσινο έκδοση εδώ είμαι πρόκειται να κάνουμε αρκετά χαμηλό επίπεδο. Υπάρχουν πραγματικά λειτουργίες θα μπορούσε να βοηθήσει με αυτό. Αλλά το πιο βασικό ένα, και η πιο εξοικειωμένος είναι κάποιος, τουλάχιστον, θα είναι σύντομα οικεία σε μας, είναι τα ακόλουθα: - Έτσι, ένα στην πρώτη γραμμή του κώδικα σε πράσινο χρώμα. Ξαναέγραψα ακριβώς s ως char *. Δεν υπάρχει καμία λειτουργική Υπάρχει διαφορά. Απλά πέταξε μακριά το CS50 βιβλιοθήκης και Είμαι αυτό που ζητά αυτό που είναι, μια χαρα *. Τώρα, τελεία, τελεία, τελεία, γιατί υπήρχαν κάποια έλεγχος σφαλμάτων που δεν είναι ενδιαφέρον να μιλήσουμε για και πάλι. Έτσι τώρα t δηλώνεται. Είναι πάρα πολύ ένα char *. Γι 'αυτό και έκανε μια μικρή πλατεία για η οθόνη όπως πριν. Αλλά από την δεξιά πλευρά, malloc, είπαμε είναι η μνήμη διαθέσει. Έτσι διαθέσει κάποιο κομμάτι της μνήμης. Και πόσα bytes κάνουμε πραγματικά θέλουν να διαθέσουν, δεν φαίνεται; Λοιπόν, το μήκος της συμβολοσειράς s. Έτσι, αν είναι γειά σου ότι είναι πρόκειται να είναι πέντε. Θα πούμε h-e-l-l-o. Έτσι, πέντε bytes. Στη συνέχεια, όμως συν 1, γιατί 1; Το 0 χαρακτήρα. Αν δεν αφήνουν περιθώρια για αυτόν τον τύπο που μπορεί να δημιουργήσει κατά λάθος μια κατάσταση όπου η χορδή είναι Η-Ε-Ε-Ε-Ο. Και τότε το επόμενο GetString ώρα είναι ονομάζονται και τύπου Ι, για παράδειγμα, David, ϋ-α-ν-Ι-ά, ο υπολογιστής πρόκειται να πιστεύουν ότι s είναι στην πραγματικότητα h-E-L-L-O-α-D-ν-Ι-ά επειδή υπάρχει Δεν διάλειμμα μεταξύ αυτών των λέξεων. Έτσι, χρειαζόμαστε αυτή τη διακοπή. Έτσι, δεν θέλουμε πέντε. Θέλουμε έξι bytes. Και bytes λέω. Αλλά είναι πραγματικά το χρόνο μέγεθος της Χαρ. Τεχνικά char είναι σχεδόν πάντα ένα μόνο byte. Αλλά ακριβώς για να μας κώδικα φορητό, να το πω έτσι, ώστε να λειτουργεί σε διαφορετικούς υπολογιστές, ακόμη και αν θα μπορούσαν να είναι κάπως διαφορετική κάτω από την κουκούλα, Πάω να γενικά πω το μέγεθος του char, έτσι ώστε κωδικό μου λειτουργεί πάντα. Και δεν πρέπει να το μεταγλωττίσετε μόνο γιατί αναβάθμιση του υπολογιστή μου ή να χρησιμοποιήσετε κάποια διαφορετική πλατφόρμα. Έτσι έχω 6 φορές το μέγεθος της μια χαρα, η οποία συμβαίνει να είναι 1. Έτσι ώστε malloc μέσα θα μπορούσαν να μου δώσει έξι bytes. Τι είναι αυτό πραγματικά κάνει; Λοιπόν, επιτρέψτε μου να κυλήσει πίσω στο χρόνο εδώ στο σημείο που βρισκόμαστε σε αυτή την ιστορία. Έτσι, αν πάω πάλι εδώ, έχω δηλώσει μια χαρα * ονομάζεται t. Έχω τώρα ονομάζεται malloc για έξι bytes. Και τώρα είμαι πρόκειται να καταλήξουμε σε αυτά τα έξι bytes ακριβώς όπως η σειρά νωρίτερα. Αλλά εγώ πραγματικά δεν ξέρω τι είναι μέσα σε αυτό το φάσμα. Αν διαθέτετε μνήμη αποδεικνύεται ότι δεν μπορείτε να εμπιστευθείτε ότι υπάρχει κάποια γνωστή τιμή εκεί. Θα μπορούσαν να έχουν χρησιμοποιηθεί από κάτι άλλο, κάποια άλλη λειτουργία, κάποια άλλη γραμμή του κώδικα που έγραψες. Έτσι, θα καλέσουμε γενικά αυτά τα σκουπίδια αξίες και να τους, ίσως, όπως ερωτηματικά, απλά δείχνει ότι έχουμε Δεν ξέρω τι είναι πραγματικά εκεί. Και αυτό δεν είναι μεγάλη υπόθεση, εφ 'όσον εμείς είναι αρκετά έξυπνος για να αντικαταστήσετε τα τιμές σκουπίδια με αριθμούς ή χαρακτήρες που νοιαζόμαστε για. Έτσι, σε αυτή την περίπτωση, τι θα πάω να κάνω; Λοιπόν, μου γραμμή κώδικα Στη συνέχεια, έχω τέσσερα. int παίρνω 0, n παίρνει το μήκος του νήματος του s. Έτσι, μια γνώριμη για το βρόχο. Ι είναι μικρότερο ή ίσο με η, η οποία είναι συνήθως παραπάνω. Αλλά αυτή τη φορά είναι σκόπιμη. I + +, και στη συνέχεια απλά να κάνουμε t βραχίονα i παίρνει s. Επειδή η εικόνα μου μοιάζει με αυτό στο Αυτή τη στιγμή, αποθηκεύονται στο t είναι η διεύθυνση του εν λόγω τυχαίας κομμάτι της μνήμης οι τιμές των οποίων είναι άγνωστα. Αλλά μόλις κάνω t βραχίονα 0 που με βάζει εδώ. Και τι καταλήγει να συρθούν εκεί; Έχουμε καταλήξει βάζοντας h. Διότι αυτό είναι ό, τι είναι στο s βραχίονα 0. Και στη συνέχεια το ίδιο πράγμα για e, και το L και το L, και o. n, γιατί πάω μέσα από ίση με n; Λόγω του χαρακτήρα 0. Έτσι, ακριβώς για να είναι σαφές, λοιπόν, αν πραγματικά διαγράψει όποια και αν είναι αυτά τα σκουπίδια οι τιμές είναι στην πραγματικότητα και στη συνέχεια κλήρωση αυτό που περιμένω, αυτό είναι s βραχίονα 1, 2, 3, 4, καθώς και ότι είναι πίσω νέο χαρακτήρα. Και έτσι τώρα αν συνεχίζαμε παρελθόν την τελεία, τελεία, τελεία σε αυτή την σωστή έκδοση και περιελήφθησαν στο ενεργητικό βραχίονα t 0 Θα ήθελα, Φυσικά, πρέπει να κεφαλαιοποίηση μόνο αυτό τύπος εδώ, η οποία εννοιολογικά, ήταν τελικά ο στόχος. Έτσι, αυτό είναι όλο το δείκτη. Και έχετε τη χρήση τους για εβδομάδες τώρα στο πλαίσιο των χορδών. Αλλά κάτω από το καπό που είναι λίγο πιο περίπλοκη. Αλλά αν νομίζετε ότι γι 'αυτούς στην παρούσα εικονογραφική μορφή προτείνω ότι είναι πιθανόν να μην είναι όλα αυτά τρομακτικό, δεδομένου ότι μπορεί αρχικά να φαίνεται με την πρώτη ματιά, ιδιαίτερα με τέτοια νέα σύνταξη. Οποιεσδήποτε ερωτήσεις σχετικά με δείκτες, χορδές, ή χαρακτήρες; Ναι; ΚΟΙΝΟ: Μπορείτε να πάτε πίσω στο [δεν ακούγεται]; ΟΜΙΛΗΤΗΣ 1: Σίγουρα. ΚΟΙΝΟ: Λοιπόν, πώς έρχονται σε πολύ τελευταία σας γραμμή, δεν έχετε ένα t * line και A * S στη γραμμή; Δεν έχετε την αναφορά στο - ΟΜΙΛΗΤΗΣ 1: Αχ, μια πραγματικά καλή ερώτηση. Γιατί δεν έχω ένα t * και * s; Επειδή εν συντομία, την περασμένη εβδομάδα, όπως και σε μας ανταλλάξουν λειτουργία, είχα πει ότι όταν έχετε ένα δείκτη ο τρόπος με τον που θα πάτε εκεί, όπως κάναμε σωματικά στη σκηνή, ήταν πραγματικά χρησιμοποιήσετε τον τελεστή αστέρων. Αποδεικνύεται ότι αυτό το τετράγωνο-βραχίονα συμβολισμός είναι αυτό που θα καλέσουμε συντακτική ζάχαρη, η οποία είναι απλά μια σέξι τρόπο της λέγοντας στενογραφημένη είναι για ακριβώς αυτό που περιγράφετε. Αλλά είναι λίγο πιο διαισθητικό. Και με κίνδυνο να καταστεί αυτό φαίνεται περισσότερο περίπλοκη από ό, τι πρέπει να είναι, τι πραγματικά συμβαίνει εδώ είναι τα ακόλουθα: - Αν πω t * αυτό σημαίνει ότι πηγαίνετε στο η διεύθυνση αποθηκεύεται σε t. Έτσι, στην κυριολεξία, αν t αποθηκεύει η διεύθυνση του εν λόγω h Αρχικά, μέσα * t πηγαίνετε εδώ. Τώρα, τι t βραχίονα 0 σημαίνει; Το ίδιο ακριβώς πράγμα. Είναι λίγο πιο χρήστη να γράφει. Είμαι, όμως, δεν έχει γίνει ακόμα. Δεν μπορώ να πω * t παίρνει * s. Γιατί αυτό που θα έκανα τότε; Θα πρέπει να θέτει h, h, h, h, h σε όλο το όλο θέμα. Σωστά; Επειδή * t είναι να πάει στη διεύθυνση του t. Αλλά είμαστε στο εσωτερικό του βρόχου. Και τι αξία είμαι προσαύξηση, Φυσικά, σε κάθε επανάληψη; i. Αλλά υπάρχει μια ευκαιρία εδώ, έτσι δεν είναι; Ακόμα κι αν αυτό μοιάζει να παίρνει λίγο πιο εξελιγμένα από την πλατεία-βραχίονα σημειογραφία έχουμε χρησιμοποιήσει για κάποιο χρονικό διάστημα - επιτρέψτε μου να αναιρέσετε την αλλαγή ώρα μου εκεί - Ακόμα κι αν αυτό είναι να πάρει τώρα μια μικρή φανταχτερό, η βασική ιδέα, αν * t σημαίνει εδώ και t * είναι μόνο μεταβείτε στη διεύθυνση της t. Αλλά ποια ήταν η διεύθυνση t; Ο αριθμός που συνεχίζουν να χρησιμοποιούν; Όπως Ox456, ας φέρει ότι πίσω μόνο για χάρη της συζήτησης. Λοιπόν, αν θέλετε να πάρετε στο e στο t string, θέλω απλώς να πάει, κατ 'ουσίαν, 456. Ή μάλλον, 457. Απλά πρέπει να προσθέσετε μία. Αλλά μπορώ να το κάνουμε αυτό, έτσι δεν είναι; Επειδή t, ακόμα κι αν έχω κρατήσει σχέδιο τώρα ως ένα βέλος, είναι απλά μια αριθμό, Ox456. Και αν μπορώ να προσθέσω ένα με αυτό, ή περισσότερα Γενικότερα, αν μπορώ να προσθέσω σε ότι μπορώ να πραγματικά να πάρει ακριβώς εκεί που θέλω. Έτσι, αν το κάνω πραγματικά αυτό - και αυτό είναι ό, τι είναι σήμερα ονομάζεται αριθμητικής δεικτών - Μπορώ να αφαιρέσετε αυτή τη γραμμή. Ποια είναι, ειλικρινά, πιστεύω σαφέστερη και λίγο πιο φιλικό προς το χρήστη να διαβάσει. Αλλά αυτό δεν είναι λιγότερο σωστή. Αυτή η γραμμή κώδικα χρησιμοποιεί τώρα αριθμητικής δεικτών. Είναι λέει να πάει στο ακόλουθη διεύθυνση - ό, τι η έναρξη του t είναι, το οποίο είναι τ συν Ι, το οποίο αρχικά είναι 0, η οποία είναι μεγάλη. Διότι αυτό σημαίνει την αρχή του t συν 1, συν 2, συν 3, και ούτω καθεξής. Και η ίδια συμφωνία με την s. Έτσι συντακτική ζάχαρη γι 'αυτό. Ωστόσο, η κατανόηση τι πραγματικά συμβαίνει κάτω από την κουκούλα, θα έλεγα, είναι πραγματικά χρήσιμη και αυτή η ίδια. Διότι αυτό σημαίνει ότι πλέον δεν υπάρχει πολύ περισσότερη μαγεία συνεχίζεται κάτω από το καπό. Δεν πρόκειται να είναι πολλά περισσότερα στρώματα που μπορούμε να φλούδα πίσω για σας. Αυτό είναι c. Και αυτό είναι προγραμματισμός. Πολύ καλή ερώτηση. Εντάξει, έτσι αυτό ήταν ότι buggy πρόγραμμα που αναφερόταν στην προηγούμενη. swap ήταν εσφαλμένη. Εάν δεν φαίνεται να λειτουργεί. Υπενθυμίζεται ότι ακριβώς όπως με το γάλα και ο χυμός πορτοκαλιού - που άρχισα πόσιμο σημερινή διαδήλωση. Έτσι ακριβώς όπως και με το χυμό πορτοκαλιού και το γάλα, εμείς πρέπει να χρησιμοποιήσετε ένα προσωρινή μεταβλητή, TMP, να κατέχει ένα προσωρινά, έτσι ώστε να μπορεί στη συνέχεια αλλάξτε την τιμή του και στη συνέχεια να ενημερώσετε b. Αλλά αυτή η λειτουργία, είπαμε, ή αυτό το πρόγραμμα στο οποίο αυτή η λειτουργία ήταν γραμμένο ήταν λάθος και λανθασμένη, γιατί; Ναι; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Ακριβώς, όταν σας καλούν ανταλλαγής - ή, γενικότερα, όταν αποκαλούν οι περισσότεροι οποιαδήποτε λειτουργία - αν είναι τα επιχειρήματα σε αυτή τη λειτουργία πρωτόγονη, να το πω έτσι, ints και χαρακτήρες και δίκλινα και πλωτήρες, τα πράγματα χωρίς αστέρια, περνάτε σε ένα αντίγραφο της το επιχείρημα. Έτσι, αν ήταν 1 χ και y ήταν 2, ένα πρόκειται να είναι 1 και Β πρόκειται να είναι 2. Αλλά πρόκειται να είναι διαφορετικά κομμάτια της, διαφορετικά κομμάτια κομμάτια της μνήμη που τυχαίνει να αποθηκεύει ίδιες τιμές. Έτσι, ο κωδικός αυτός είναι σούπερ τέλεια σε εναλλαγή a και b. Δεν είναι καλή στο swapping - στο παράδειγμα της προηγούμενης εβδομάδας - x και y. Επειδή και πάλι, είναι σε λάθος πεδίο. Τώρα, πώς θα πάει για τον καθορισμό αυτό; Έπρεπε να καταστήσουν τη λειτουργία του κοιτάξουμε λίγο πιο άσχημο. Αλλά και πάλι, σκεφτείτε τι αυτό σημαίνει απλά. Και στην πραγματικότητα, επιτρέψτε μου, για λόγους συνέπειας, αλλάξετε ένα πράγμα γι 'αυτό είναι πανομοιότυπο με τι ακριβώς έκανε. Όπως ανέφερα και την προηγούμενη εβδομάδα, δεν ανεξάρτητα από το πού πηγαίνει. Στην πραγματικότητα, συνήθως θα βάλει το αστέρι δίπλα από το όνομα της μεταβλητής. Αλλά νομίζω ότι θα είναι λίγο πιο εύκολο να εξετάσει το * δίπλα στο τύπο δεδομένων υπό την έννοια ότι είναι ένας δείκτης σε int σε αυτή την περίπτωση. Λοιπόν, τι κάνω εδώ; Λέω να μην μου δώσει μια int ακολουθούμενο από ένα άλλο int, καλώντας τους a και b. Δώσε μου τη διεύθυνση ενός int. Δώσε μου τη διεύθυνση του άλλου int. Καλέστε αυτές τις διευθύνσεις a και b. Και στη συνέχεια, χρησιμοποιώντας το συμβολισμό * κάτω στη συνέχεια, πηγαίνετε στο καθένα από αυτά διευθύνσεων όπως απαιτείται για να πάρει είτε ή να ορίσετε την αξία του. Αλλά υπάρχει μια εξαίρεση εδώ. Γιατί δεν έχω μια * δίπλα στο tmp; Γιατί δεν το κάνετε αυτό, για παράδειγμα; Νιώθω σαν να πρέπει να πάει ακριβώς όλα έξω και να διορθώσει το όλο θέμα. Ναι; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Δεν έχω δηλώσει tmp ως string. Έτσι, αυτό θα δηλώσει, στην περίπτωση αυτή, ένα tmp να είναι η διεύθυνση ενός int. Αλλά αυτό δεν είναι αρκετά αυτό που θέλω, για δυο λόγους. ΚΟΙΝΟ: Δεν θέλετε να τα ανταλλάξουν. ΟΜΙΛΗΤΗΣ 1: Ακριβώς, δεν θέλω να ανταλλάξουν τίποτα με tmp. tmp είναι απλά εβδομάδα-ένα τα πράγματα. Το μόνο που θέλω είναι μια μεταβλητή να αποθηκεύσετε κάποιον αριθμό. Δεν νοιάζονται καν για τις διευθύνσεις αυτή τη στιγμή. Χρειάζομαι μόνο 32 bits ή έτσι ώστε να αποθηκεύσει έναν int. Και θέλω να βάλω σε αυτά τα 32 bits Ό, τι δεν είναι ένα, να το πω έτσι, αλλά Τι είναι σε ένα, μόνο και μόνο για να είμαι πιο ακριβής. Διότι εάν το α είναι μια διεύθυνση, * ένα μέσο πάμε εκεί και να πάρει την τιμή 1. Για παράδειγμα, στο παράδειγμα της προηγούμενης εβδομάδας ή στην περίπτωση β της, να πάρει την τιμή 2. Έτσι, αυτό που πραγματικά συμβαίνει; Επιτρέψτε μου να επιστήσω την εικόνα εδώ που θα μόνο πειράζω χώρια μέρος του σήμερα. Αλλά αυτό θα συνεχίσουν να εμφανίζονται για αρκετό καιρό. Αυτό, ισχυρίζονται, είναι αυτό του υπολογιστή σας μνήμη μοιάζει όταν εκτελείτε μια εφαρμογή προγράμματος, κάθε πρόγραμμα. Όταν εκτελείτε ένα πρόγραμμα στην κορυφή της μνήμης RAM του υπολογιστή σας - οπότε σκεφτείτε Αυτό το ορθογώνιο, πραγματικά, όπως σας RAM ή μνήμη του υπολογιστή, όλα 101 δισεκατομμύριο bytes του, όλα τα δύο δισεκατομμύρια bytes, όλα τα δύο gigabytes του, ανεξάρτητα από την ποσότητα που έχετε είναι, ας τραβήξουμε ως ένα ορθογώνιο. Και εγώ ισχυρίζομαι ότι όταν εκτελείτε ένα πρόγραμμα όπως το Microsoft Word ή Chrome ή κάτι τέτοιο, τα bits που Microsoft ή η Google έγραψε - στις περιπτώσεις των προγραμμάτων αυτών - φορτώνονται στη μνήμη του υπολογιστή σας όπου μπορούν να εκτελεστούν περισσότερες γρήγορα και τροφοδοτείται στο CPU, η οποία είναι οι εγκέφαλοι του υπολογιστή. Και σε TAM είναι αποθηκευμένα στην ίδια κορυφή του προγράμματός σας, να το πω έτσι. Με άλλα λόγια, αν αυτό είναι ένα μεγάλο κομμάτι του μνήμη, όταν κάνετε διπλό κλικ στο Microsoft Word, έρχονται τα bits από το σκληρό δίσκο. Παίρνουν φορτωμένο στη μνήμη RAM. Και εμείς θα τους χώσουν επάνω στην κορυφή αυτού του ορθογωνίου εννοιολογικά. Λοιπόν, το υπόλοιπο της μνήμης σας είναι χρησιμοποιούνται για διαφορετικά πράγματα. Στην κορυφή θα δείτε προετοιμαστεί δεδομένα και κατάργηση της προετοιμασίας των δεδομένων. Αυτό έχει να κάνει, κατά το μεγαλύτερο μέρος, με σταθερές ή καθολικές μεταβλητές που έχουν τιμές. Αλλά περισσότερα για αυτά άλλη φορά. Στη συνέχεια, έχετε το σωρό, το οποίο θα επανέλθω. Αλλά στο κάτω μέρος είναι το μέρος που είναι ιδιαίτερα συναφές τώρα. Είναι η λεγόμενη στοίβα. Έτσι ακριβώς όπως και στα περισσότερα οποιοδήποτε D αίθουσα εδώ πανεπιστημιούπολη, έχετε αυτές δίσκους που απλά στοιβάζονται το ένα πάνω από το άλλο επί του οποίου μπορείτε να βάλετε τα τρόφιμα και εταζέρα. Η στοίβα σε ένα σύστημα υπολογιστή είναι πολύ παρόμοια. Εκτός ενώ στο δίσκο, όπως χρησιμοποιούμε στην η τραπεζαρία, φυσικά, εννοείται να φέρει τα πράγματα τους δίσκους ή τα πλαίσια - όπως θα τους αποκαλούν - σε έναν υπολογιστή μνήμη χρησιμοποιείται για να κρατήσει μεταβλητές και τις τιμές. Έτσι, αυτό που πραγματικά πηγαίνει για κάτω από την κουκούλα; Λοιπόν, επιτρέψτε μου να βλέπω τον στην οθόνη εδώ. Και ας επικεντρωθεί μόνο για τις κάτω μέρος για μια στιγμή. Αν αυτό είναι το κάτω τμήμα του μου μνήμη του υπολογιστή αποδεικνύεται όταν καλέστε την κύρια λειτουργία - η οποία συμβαίνει, ειλικρινά, αυτόματα για μένα - Παίρνω ένα κομμάτι της μνήμης με την κάτω μέρος της RAM μου να το πω έτσι. Και αυτό είναι όπου το κύριο είναι τοπικές μεταβλητές πάει. Είναι το μέρος όπου argc και argv ίσως πάει, και τυχόν μεταβλητές I δηλώνουν στο εσωτερικό της κύριας. Καταλήγουν στο κάτω μέρος της μνήμης RAM του υπολογιστή μου. Τώρα, ας υποθέσουμε ότι οι κύριες κλήσεις μια λειτουργία όπως swap, όπως έκανε την περασμένη εβδομάδα; Λοιπόν, έχουμε θέσει ουσιαστικά ένα νέο δίσκο, ένα νέο πλαίσιο, πάνω στο κομμάτι της μνήμης μου. Και Πάω να περιγράψει αυτό ως που ανήκουν στη συνάρτηση swap. Τώρα αυτό που είναι μέσα της ανταλλαγής; Λοιπόν, με βάση το πρόγραμμα της περασμένης εβδομάδας και που είδαμε μόλις ένα απόσπασμα από, εντός του πλαισίου ανταλλαγής του, ή της ανταλλαγής δίσκο, είναι ό, τι οι μεταβλητές; Λοιπόν, a και b. Επειδή αυτές ήταν τοπικές επιχειρήματά της, συν ένα τρίτο, tmp. Έτσι, πραγματικά, θα μπορούσα να επιστήσει λίγο πιο καθαρά. Επιτρέψτε μου να πάω μπροστά και να αναιρέσετε την ετικέτα. Και επιτρέψτε μου να ισχυρίζονται ότι ξέρετε τι; ένα είναι κατά πάσα πιθανότητα πρόκειται να καταλήγουν εδώ. B πρόκειται να τελειώσει εδώ. Και tmp πρόκειται να τελειώσει εδώ. Τώρα, η παραγγελία θα μπορούσε είναι λίγο διαφορετική. Αλλά εννοιολογικά αυτή είναι η ιδέα. Και μόνο συλλογικά, αυτό είναι ό, τι θα καλέσουμε το πλαίσιο ανταλλαγής, ή να τραπεζαρία-αίθουσα δίσκο. Και η ίδια συμφωνία με το κύριο. Αλλά εγώ δεν θα αναδιατυπώσει αυτό. Αλλά αυτό είναι όπου argc και argv και κάθε τις τοπικές μεταβλητές, όπως x και y θα μπορούσε να είναι επίσης. Έτσι τώρα σκεφτείτε τι πραγματικά συμβαίνει όταν καλείτε swap. Όταν καλείτε το swap, την εκτέλεση κώδικα, όπως αυτό, είστε περνώντας, στην έκδοση λάθη, α και β και αντίγραφα των x και y. Έτσι, αν κάνω επιστήσω τώρα αυτό στην οθόνη - πήρε για να πάρει καλύτερα σε αυτό - έτσι η ιστορία έλεγα στον εαυτό μου Ήταν σε αυτό το buggy έκδοση, όταν Εναλλαγή ανάμεσα σε κυριολεκτικά α και β όπως ακέραιοι, τι πραγματικά συμβαίνει; Λοιπόν, αυτό που πραγματικά συμβαίνει είναι το εξής. Επιτρέψτε μου να πάω μπροστά και να αναιρέσετε μόνο να ξεκαθαρίσω λίγο χώρο εδώ. Έτσι, αυτό είναι η μνήμη του υπολογιστή μου. Έτσι, αν έχω, για παράδειγμα - πραγματικά ας το κάνουμε με αυτόν τον τρόπο - αν ισχυρίζονται ότι αυτό είναι x, την αποθήκευση η τιμή 1 όπως ακριβώς και την προηγούμενη εβδομάδα. Και αυτό είναι y, αποθήκευση της τιμής 2 ακριβώς όπως την περασμένη εβδομάδα. Και αυτό είναι το κύριο, όταν καλώ swap, δίνοντας έτσι τον εαυτό μου πρόσβαση σε ένα και β και TMP, Πάω να ισχυρίζονται ότι αυτό είναι ένα και αυτό είναι 1. Αυτό είναι β. Αυτό είναι 2. Αυτό ονομάζεται tmp. Και αρχικά, έχει κάποια αξία σκουπίδια μέχρι που πραγματικά να αποθηκεύουν σε ένα, η οποία είναι 1. Στη συνέχεια, να προχωρήσει και να αλλάξει ένας να είναι αυτό; Αξία Β. Και έτσι τώρα έχω δύο εδώ. Και τότε είπαμε b παίρνει tmp. Και πάλι, ακριβώς όπως μια λογική έλεγχο, η τρίτη γραμμή κώδικα εδώ είναι απλά αυτό ένα, b παίρνει tmp. Και έτσι, τέλος, τι να κάνω; Θα προχωρήσει και να αλλάξει το b να είναι ανεξάρτητα η αξία των ΠΔΤ, η οποία είναι 1. Δεν αγγίζω tmp και πάλι. Αλλά τώρα, το πρόβλημα είναι το συντομότερο ανταλλαγής επιστρέφει, επειδή δεν είναι παράδοση πίσω κάποια αξία, δεν υπάρχει επιστροφή Δήλωση ρητά σε αυτό. Τι πραγματικά συμβαίνει; Λοιπόν, κατ 'ουσίαν, όλη αυτή η μνήμη - Εντάξει, προφανώς η γόμα αρέσει μόνο ένα δάχτυλο τη φορά - απλά εξαφανίζεται. Τώρα, στην πραγματικότητα δεν είναι πάει πουθενά. Αλλά μπορείτε να σκεφτείτε από το τώρα ως ερωτηματικά. Επειδή δεν είναι πλέον στην πραγματικότητα σε χρήση. Και τίποτα δεν γίνεται με αυτές τις αξίες. Έτσι, στην περίπτωση του πράσινου εκδοχή Αυτός ο κωδικός, τι αντ 'αυτού να πέρασε στην ανταλλαγή; Έτσι αντιμετωπίζει. Έτσι, η διεύθυνση των χ και η διεύθυνση του y. Έτσι, αν έχουμε ξανά πει αυτή την ιστορία μια τελευταία χρόνο, και εφιστώ την πραγματικότητα ανταλλαγής και πάλι, αλλά με δείκτες, η οποία αποτελεί, αυτό είναι b, και αυτό είναι tmp, τι είναι στην πραγματικότητα είναι αποθηκευμένα σε ένα σε αυτό το πράσινο έκδοση του κώδικα μου, όπου είμαι διέρχεται στις διευθύνσεις; Είναι πρόκειται να είναι ένας δείκτης για x. Γι 'αυτό και θα μπορούσε να αντλήσει ένα βέλος. Αλλά ας χρησιμοποιήσουμε την ίδια αυθαίρετη παράδειγμα όπως πριν. Ας πούμε ότι αυτό είναι κάτι σαν Ox123. Και αυτό πρόκειται να είναι Ox127 γιατί Είναι τέσσερις bytes μακριά γιατί είναι ένα int, έτσι Ox127. Και πάλι, παίρνω κάποιες ελευθερίες με τους αριθμούς. Είναι πολύ μικρότερο από ό, τι θα στην πραγματικότητα να είναι και με διαφορετική σειρά. Αλλά αυτό είναι το πώς η εικόνα τώρα είναι διαφορετική. Αλλά όταν μπορώ να χρησιμοποιήσω αυτό το πράσινο κώδικα και δεν έχω πάρει int tmp * a. * Ένα μέσο για να κάνετε τα εξής, να λάβει τα αντιμετώπιση που είναι σε μια και να πάει σε αυτό, η οποία είναι 1. Και αυτό είναι που στη συνέχεια θα τοποθετούνται στο tmp. Εν τω μεταξύ, στην επόμενη γραμμή κώδικα εδώ, * a παίρνει b, τι σημαίνει αυτό; Λοιπόν, * a, οπότε πάμε εδώ παίρνει * b, το οποίο σημαίνει ότι πάμε εκεί. Και αυτό σημαίνει να θέσει την τιμή εκεί. Τέλος, η τελευταία γραμμή του κώδικα απλά είπε * b παίρνει tmp. Έτσι, β λέει να πάει εκεί και να το αντικαταστήσετε με tmp το οποίο, στην περίπτωση αυτή, πρόκειται να είναι, και πάλι, 1. Και γι 'αυτό η πράσινη εκδοχή του έργα μας κώδικα, ενώ το κόκκινο έκδοση ποτέ δεν το έκανε. Είναι όλα απλά βράζει κάτω στο πώς το μνήμη, η διοίκηση και, όπου αυτό είναι που πράγματι τίθεται σε σας RAM του υπολογιστή. Και για τώρα, αυτό είναι ένα από τα πράγματα ότι η στοίβα χρησιμοποιείται για. Ερωτήματα σχετικά με την διάταξη; Στις δείκτες; Ή με swap; Εντάξει, έτσι malloc, ανάκληση, έκανε κάτι τέτοιο. Αυτό ήταν ένα σούπερ απλό παράδειγμα. Και αυτός ήταν ο μοναδικός που Binky μας σύστησε, αν και αρκετά γρήγορα, κατά το τέλος της κατηγορίας. Γαμώτο, εκεί πάμε πάλι. Έτσι, υπενθυμίζουν ότι αυτό ήταν το παράδειγμα που Binky μας εισήγαγε, αν και κάπως γρήγορα στο τέλος της κατηγορίας. Και εδώ χρησιμοποιούνται malloc πραγματικά για δεύτερη φορά. Επειδή την πρώτη φορά που θα χρησιμοποιηθεί για να δημιουργήσει αρκετή μνήμη RAM, διαθέτουν αρκετή μνήμη RAM να αποθηκεύσει ένα string. Αυτή τη φορά Binky κράτησε απλά. Έτσι είναι για να αποθηκεύσετε μόνο ένα int, προφανώς. Και αυτό είναι εντελώς καλά. Είναι λίγο περίεργο, ειλικρινά, να χρησιμοποιείτε malloc να διαθέσει ένα int. Αλλά το θέμα της πλαστελίνης Nick ήταν πραγματικά να πει μόνο την ιστορία του τι θα συμβεί ή δεν συμβεί όταν σας κακομεταχειρίζονται τη μνήμη. Έτσι, στην περίπτωση αυτή, το εν λόγω πρόγραμμα έκανε μερικά πράγματα. Στην πρώτη περίπτωση εδώ, δηλώνει ένα δείκτη που ονομάζεται x σε int. Δηλώνει τότε ένα δείκτη ονομάζεται y σε int. Αποθηκεύει στη συνέχεια, x, τι; Κάποιος άλλος τώρα. Τι παίρνει αποθηκεύονται στο x σύμφωνα με το Η τρίτη γραμμή αυτού του προγράμματος; ΚΟΙΝΟ: [δεν ακούγεται]. ΟΜΙΛΗΤΗΣ 1: Λοιπόν, δεν είναι αρκετά bytes, ανά πω. Να είστε πιο ακριβείς τώρα. Τι παίρνει αποθηκεύονται στο x; Μια διεύθυνση, νομίζω ότι το άκουσα. Έτσι τι malloc επιστρέφει; malloc συμπεριφορικά διαθέτει ένα μεγάλο κομμάτι της μνήμης. Αλλά πώς να σας δώσει πρόσβαση σε αυτό; Επιστρέφει τι; Η διεύθυνση του πρώτου byte στο κομμάτι της μνήμης. Τώρα, αυτό είναι εξαιρετικά απλή. Είναι απλά ένα byte, που σημαίνει ότι το αντιμετώπιση είμαστε πάρει πίσω είναι η Διεύθυνση του όλου πράγματος. Έτσι αποθηκεύονται σε x, στη συνέχεια, είναι η διεύθυνση του εν λόγω κομμάτι της μνήμης. Εν τω μεταξύ, τι θα συμβεί στη συνέχεια; Έτσι, στην πραγματικότητα, ας πάμε μπροστά και συντάξει αυτό το πραγματικά γρήγορα. Έτσι, αν πάμε πάνω στην οθόνη εδώ και παίζουμε αυτό έξω int * x και int * y πρόκειται να κάνει ό, τι για μένα; Ισχυρίζομαι ότι είναι ακριβώς πρόκειται να κάνουν κάτι σαν αυτό και να το ονομάσουμε x, και αυτό και να το ονομάσουμε y. Εν τω μεταξύ, η τρίτη γραμμή του κώδικα είναι πρόκειται να διαθέσει το μέγεθος ενός int, η οποία συμβαίνει να είναι - συγνώμη αν είπα μία πριν εννοούσα ένα int - τέσσερα bytes σε ένα τυπικό υπολογιστή. Τουλάχιστον με τη συσκευή CS50. Έτσι, αυτό πρόκειται να διαθέσει αυτό, ποιος ξέρει; Κάπου εδώ. Και αυτό είναι αποθηκευμένο σε μερικά Ox διεύθυνση, ποιος ξέρει; Αλλά τι πρόκειται να πάρει επιστροφή είναι η διεύθυνση. Αλλά θα επιστήσει εικονογραφικά όπως ακριβώς ένα βέλος όπως αυτό. Τώρα στην επόμενη γραμμή * x παίρνει 42. Τι σημαίνει * x σημαίνει σε απλή γλώσσα; Απλά πηγαίνετε εκεί. Πηγαίνετε σε αυτή τη διεύθυνση. Ή με άλλα λόγια, ακολουθήστε τις βέλους και βάλτε 42 εκεί. Στη συνέχεια, όμως κάτι κακό συνέβη να Binky, έτσι δεν είναι; Υπενθυμίζουμε ότι η γραμμή πέντε εδώ, * y παίρνει 13, πράγματι, ένας άτυχος αριθμός, έκανε ό, τι για μας; Λοιπόν, * μέσα και πάνε εκεί. Λοιπόν, αυτό δεν έχει δοθεί μια τιμή ακόμα, έτσι δεν είναι; Ο κώδικας δεν έχει y είναι αρχικοποιείται σε τίποτα. Είχαμε x αρχικοποιείται σε μια διεύθυνση. Αλλά y κηρύχθηκε επάνω στην κορυφή. Στη συνέχεια, όμως ένα ερωτηματικό, δεν έχει αξία τέθηκε όντως σε αυτό. Έτσι είναι δίκαιο να καλέσετε αυτό μια τιμή σκουπιδιών. Ποιος ξέρει τι υπάρχει εκεί; Είναι τα απομεινάρια των bits που χρησιμοποιήθηκαν από κάποια προηγούμενη γραμμή κώδικα στο το πρόγραμμά μου. Έτσι, αν λέω πάμε εκεί, αυτό είναι σαν, Δεν έχω καμία ιδέα για το πού αυτό το βέλος πρόκειται να καταλήξουν. Και τότε είναι που συνήθως να πάρει ένα σφάλμα κατάτμησης. Εάν κατά λάθος dereference, έτσι ώστε να να μιλήσει, ή να πάτε σε μια διεύθυνση που δεν είναι πραγματικά μια νόμιμη διεύθυνση, κακά πράγματα να συμβούν. Και αυτό είναι ακριβώς αυτό που συνέβη να σκέφτονται Binky. Έτσι, υπενθυμίζουν ότι η ιστορία ότι ο Νικ ήταν λέει εδώ ήταν η ίδια ιδέα με το τι Έχω συντάσσεται με την ψευδαίσθηση της κιμωλία στον πίνακα εκεί. Χ και Υ έχουν δηλωθεί. Τότε θα διατεθεί το μέγεθος της μια int και τα αποθήκευε στο x. Στη συνέχεια, η επόμενη γραμμή που κάναμε * x. Αυτό ήταν το μαγικό ραβδί του Νικ της dereferencing. Αυτό κάνει 42 στη μνήμη επισημάνθηκε από x. Αλλά αυτό είναι όπου τα πράγματα εξελίχθηκαν φριχτά. Σωστά; Προσπαθήσαμε να y dereference. Αλλά y είχε κάποια ψευδή αξία, έτσι δεν είναι; Αυτό βέλος στην κάτω αριστερή γωνία, δεν είναι πραγματικότητα δείχνει σε τίποτα. Είναι το είδος του κάνει ό, τι έκανε εδώ στο διοικητικό συμβούλιο. Έτσι, συμβαίνουν άσχημα πράγματα, ο κατακερματισμός βλάβης, ή Binky βλάβης, σε αυτή την περίπτωση. Αλλά αν στη συνέχεια να καθορίσει ότι με αυτόν x παίρνει y πώς αλλάζει η ιστορία; Λοιπόν, αν το κάνω x παίρνει y, που είναι ουσιαστικά το ίδιο με το να λέμε ό, τι είναι αυτό, Ox-κάτι πρόκειται να είναι το ίδιο εδώ, Ox-κάτι. Ή εικονογραφικά θα συντάξει ένα βέλος. Έτσι, εδώ στο διοικητικό συμβούλιο με Binky, με την επόμενη γραμμή κώδικα, * y σημαίνει να πάει εκεί. Πού υπάρχει; Αυτό σημαίνει ότι πάνω από εδώ. Και όταν ενημερώσουμε ότι για να είναι 13 περιλαμβάνει ακριβώς πρόκειται και γραφής 13 εδώ τώρα. Έτσι, ίσως δεν είναι απόλυτα απλή με την πρώτη ματιά. Αλλά για να ανακεφαλαιώσουμε και να χρησιμοποιούν την ίδια ορολογία ότι Binky χρησιμοποιούσε εδώ, έτσι τα δύο πρώτα διαθέσει τους δείκτες, Χ και Υ, αλλά όχι τα pointees. Και pointees δεν αποτελεί γενικά χρησιμοποιείται ο όρος. Αλλά δείκτη είναι απολύτως. Αλλά τι να επισημανθεί σε στην ονοματολογία Binky του. Αυτή η επόμενη γραμμή, φυσικά, διαθέτει ένα int pointee. Έτσι, ένα μεγάλο κομμάτι της μνήμης - όπως μου επέστησε πάνω σε η δεξιά πλευρά εκεί - και σετ x ισούται με το σημείο σε αυτό. Αυτή x dereferences για την αποθήκευση 42 στην η μνήμη που να υποδεικνύουν. Και τότε αυτό, φυσικά, ήταν ένα κακό πράγμα. Επειδή η y δεν δείχνει σε τίποτα ακόμα. Αυτό που καθορίζει. Έτσι, αυτό εξακολουθεί να είναι προβληματικό πρόγραμμα. Ακριβώς επειδή είμαστε φυσάει μέσα από το γραμμή κώδικα από τη γραμμή και να λένε, OH καλά, ας συντριβή εκεί. Αυτό είναι ένα κακό πράγμα. Οι πιθανότητες είναι το πρόγραμμα είναι ακριβώς πρόκειται να ματαίωση συνολικά σε αυτή τη γραμμή. Αλλά αν ήταν να αφαιρέσετε την τράκαρε γραμμή και να την αντικαταστήσει με τα δύο τελευταία γραμμές εκεί εκχωρήσετε - με ανάθεση δείκτη - y να επισημάνει x ως t το σημείο. Και τότε θα dereference y σε ένα πολύ ασφαλή τρόπο. Έτσι, όταν το κάνει αυτό μας αφήνει; Λοιπόν, αποδεικνύεται ότι κάτω από το καπό στη βιβλιοθήκη CS50, δείκτες είναι χρησιμοποιούνται σε όλη. Και θα αρχίσει πραγματικά να φλοιό πίσω αυτό το στρώμα πριν από καιρό. Αλλά αποδεικνύεται, επίσης, μια έκφραση που κάποιοι από εσάς μπορεί να είναι εξοικειωμένοι με, ιδίως εκείνων πιο άνετη, είναι στην πραγματικότητα εκείνη ενός πολύ δημοφιλής ιστοσελίδα, ή από την υπερχείλιση στοίβας, αυτές τις μέρες. Αλλά αυτό έχει πραγματικά πολύ τεχνική έννοια. Γνωρίζουμε πλέον τι μια στοίβα είναι. Είναι σαν μια στοίβα των δίσκων μέσα σε μια τραπεζαρία. Ή στο εσωτερικό του υπολογιστή σας μνήμη του εκείνα τα πλαίσια που χρησιμοποιούνται από τις λειτουργίες. Λοιπόν, αποδεικνύεται ότι λόγω του ότι πολύ απλή εφαρμογή των μνήμη και τα πλαίσια για τη λεγόμενη στοίβα, μπορείτε να πάρετε πραγματικά τον έλεγχο ενός συστήματος ηλεκτρονικού υπολογιστή αρκετά εύκολα. Μπορείτε να χαράξει σε ένα σύστημα αν οι άνθρωποι σαν εμάς δεν έχουν γραπτό κώδικα μας ιδιαίτερα καλά. Αν άνθρωποι σαν εμάς χρησιμοποιούν κομμάτια της μνήμης ή τη χρήση συστοιχίες - ακόμη πιο συχνά - αλλά μερικές φορές ξεχνάτε να ελέγχετε το τα όρια του πίνακα μας όπως μπορείτε να έχετε τον εαυτό σας μερικές φορές, και επαναλαμβάνεται πάρα πολύ μακριά πέρα ​​από το τέλος μια σειρά. Στην καλύτερη περίπτωση, το πρόγραμμα σας θα μπορούσε απλώς συντριβή. Σφάλμα κατάτμησης, το είδος της ενοχλητικό. Δεν είναι μεγάλη, αλλά δεν είναι κατ 'ανάγκην ένα εξαιρετικά κακό πράγμα. Αλλά αν το πρόγραμμά σας είναι πραγματικά σε πραγματικές υπολογιστές των χρηστών, αν εκτελείται σε ένα δικτυακό τόπο που πραγματικά τυχαία άτομα στο διαδίκτυο είναι το χτύπημα, αφήνοντας οι άνθρωποι προκαλούν άσχημα πράγματα για τον κωδικό σας γενικά δεν είναι καλό πράγμα, επειδή αυτό σημαίνει ότι η δυνατότητα να λάβει τον έλεγχο του υπολογιστή. Και αυτό πρόκειται να δούμε λίγο αινιγματικό. Αλλά σκέφτηκα να σας τρομάξει με την Αυτό το τελευταίο παράδειγμα εδώ. Εδώ είναι ένα παράδειγμα του κώδικα. Και υπάρχει μια καλή Wikipedia άρθρο που καθοδηγεί αυτό με περισσότερες λεπτομέρειες. Έχω κυρίως στο κάλεσμα κάτω foo, περνώντας argv 1. Και αυτό είναι ακριβώς έτσι ώστε να μπορείτε να τρέξει το πρόγραμμα και να περάσει αυθαίρετη είσοδο. Και τότε foo δηλώνεται επάνω στην κορυφή ως αποδοχή μιας συμβολοσειράς, ή περισσότερα Συγκεκριμένα, μια χαρα *. Δηλώνει στη συνέχεια μια σειρά από χαρακτήρες. Καλέστε ένα buffer, γενικότερα, μεγέθους 12. Μέχρι 12 χαρακτήρες μπορούν να χωρέσουν μέσα του εν λόγω πίνακα που ονομάζεται c. Και τότε χρησιμοποιεί αυτή τη νέα λειτουργία, η οποία είναι νέα, αλλά δεν είναι δύσκολο να καταλαβαίνουν, αντίγραφο μνήμης. Αυτό αντιγράφει τη μνήμη από το μπαρ, το οποίο ήταν η μεταβλητή n παρελθόν, ανεξάρτητα από το χρήστης πληκτρολογήσει στο argv 1 σε c. Πόσα bytes; Το μήκος του νήματος του μπαρ. Έτσι, με άλλα λόγια, αν ο χρήστης πληκτρολογεί σε h-e-l-l-o Enter, το μήκος της συμβολοσειράς του Hello είναι πέντε. Έτσι, πέντε από αυτά τα bytes πρόκειται να πάρει αντιγράφονται στο πίνακα που ονομάζεται C, η οποία έχει μέγεθος 12. Αλλά αυτό που ο χρήστης πληκτρολογεί σε ένα πολύ μεγαλύτερο λέξη που είναι 13 χαρακτήρες ή 14 χαρακτήρες ή 100 χαρακτήρες ή περισσότερο; Πού θα πάμε; Λοιπόν, αυτό το πλαίσιο, ο δίσκος αυτός στην αίθουσα φαγητού στοίβα, θα πάμε για να πάει εκεί. Και είναι ακριβώς πρόκειται να ξεκινήσει την αντικατάσταση άλλα πράγματα που είναι ήδη στην εν λόγω στοίβα, ξεχειλίζει η στοίβα, να το πω έτσι. Έτσι, εικαστικά, σκεφτείτε το αυτό τον τρόπο. Αυτό είναι μόνο ένα πολύχρωμο έκδοση η εικόνα που έχουμε σχέδιο. Στο κάτω μέρος, ας πούμε, είναι το κύριο. Και στην κορυφή, αυτό που βλέπουμε τώρα είναι το πλαίσιο, χρώμα που κωδικοποιείται τώρα, για ένα λειτουργία που ονομάζεται foo. Αλλά αυτό που είναι ενδιαφέρον εδώ για foo είναι ότι εδώ είναι το πλαίσιό του. Έτσι είναι που ακριβώς όπως εγώ έκανε, αλλά το γαλάζιο. Και τώρα αυτό είναι όπου γ βραχίονα 0 πηγαίνει. Και αυτό είναι όπου c βραχίονα 11 πρόκειται να καταλήξει. Με άλλα λόγια, αυτό συμβαίνει σε να εκπροσωπούνται ως ένα τετράγωνο. Αλλά αν απλά κρατήσει plopping bytes κάτω - ή χαρακτήρες - από όπου και αν πρόκειται να τελειώσει up στη θέση 0 σε όλη τη διαδρομή μέχρι σε 11 επειδή είναι 0 ευρετήριο. Αλλά πού είναι ο 13ος χαρακτήρας πρόκειται να καταλήξει; Πού είναι η 14η; Πού είναι η 50η χαρακτήρα πρόκειται να καταλήξει; Δεν πρόκειται να συνεχίσω κάτω. Διότι ακόμα κι αν έχουμε κληρωθεί εικόνα με τη στοίβα μεγαλώνει, η διευθύνσεις, αποδεικνύεται, πάει από μικρές διευθύνσεις, μικρές δείκτες, σε μεγάλες διευθύνσεις. Γι 'αυτό συνεχίζει να ανεβαίνει και πάνω. Έτσι, αν ο χρήστης πληκτρολογεί σε Γεια σας, αυτό είναι υπέροχο. Δεν bug, δεν υπάρχει πρόβλημα, ασφαλή καθενός. Αλλά αν ο χρήστης πληκτρολογεί σε τι θα καλέστε εκατέρωθεν κώδικα, εκπροσωπούμενη γενικά ως, επίθεση, επίθεση, επίθεση, επίθεση, τι μπορεί να συμβεί; Λοιπόν, αν το σύνολο των εισροών που ο χρήστης πληκτρολογήσει δεν είναι μόνο μερικά φιλικά ή προσβλητικό σειρά χαρακτήρων. Είναι πραγματικά μια ακολουθία χαρακτήρων ότι αν το συνέταξε, στην πραγματικότητα είναι κώδικα. Ίσως πρόκειται για κώδικα που διαγράφει όλα τα αρχεία στο σκληρό σας δίσκο ή να στέλνει το spam ή κάτι τέτοιο. Σημειώστε ότι αυτό είναι το κλειδί εδώ είναι ότι αν ο κακός έχεις την τύχη να αντικαταστήσετε το κόκκινο κομμάτι της μνήμης - το οποίο δεν είχα επιστήσει στην εικόνα μου, αλλά αυτή η εικόνα Wikipedia έχει εδώ - λεγόμενη διεύθυνση της επιστροφής. Όταν οι αποδόσεις των τροφίμων, όταν επιστρέφει swap, πώς ο υπολογιστής ξέρει να πάει από εδώ πάνω προς τα κάτω εδώ; Ή στην τεχνολογία τμήμα από πάνω, πώς το ξέρει να πάει από τη συμφωνία ανταλλαγής - Ο κωδικός 0 και του 1 που συνθέτουν ανταλλαγής - επιστροφή στην κεντρική σελίδα; Υπάρχει η λεγόμενη διεύθυνση επιστροφής αποθηκεύονται στην ίδια στοίβα πλαίσιο, για το ίδιο δίσκο καφετέρια. Έτσι, αν ο κακός είναι αρκετά έξυπνος για να θέσει τον κωδικό επίθεση, κωδικό επίθεση, επίθεση κώδικα, και να πάρει την τύχη - συχνά μέσω της δοκιμής και του λάθους - για να αντικαταστήσετε το κόκκινο διεύθυνση επιστροφής, με τη διεύθυνση και ανακοίνωση την κορυφή. Ανακοίνωση 0835C080. Είναι γραμμένο πίσω επάνω στην κορυφή για λόγους θα ίσως να επανεξετάσουμε. Αυτός είναι ο αριθμός. Έτσι, αν ο κακός τύπος παίρνει την τύχη ή Είναι αρκετά έξυπνος για να αντικαταστήσετε το κόκκινο λωρίδα της μνήμης με τη διεύθυνση του κώδικα που αυτός ή αυτή έχει κατά κάποιο τρόπο εγχέεται στον υπολογιστή σας, υποθέτω οποίων κώδικας πρόκειται να επιστραφεί συντομότερο foo γίνεται εκτέλεσης; Ο κώδικας του κακός. Έτσι, αυτού του κώδικα επίθεσης, AAA, και πάλι, θα μπορούσε στέλνουν spam, να διαγράψετε όλα τα αρχεία στο σκληρό σας δίσκο. Αλλά αυτό είναι πραγματικά μια υπερχείλιση στοίβας είναι, ή υπέρβαση του buffer, ή buffer επίθεση υπερχείλισης. Και είναι απίστευτα, απίστευτα κοινό σε αυτήν την ημέρα με τα προγράμματα που είναι γραμμένα σε C, C + +, και ακόμη και μερικές άλλες γλώσσες. Σε αυτό το τρομακτικό σημείωμα, θα τελειώνει με ένα αστείο. [Γέλια] Τα λέμε την Τετάρτη. Στο επόμενο CS50 - Έτσι, είμαι όλοι έξω από λαμπτήρες δίσκο σήμερα, αλλά περιμένετε, χωρίς λιπαρά γάλα, μισό το τηλέφωνο βιβλίο, ο χυμός πορτοκαλιού ότι έπινα σήμερα. Καλώδιο USB, ένα γαλλικό κλειδί. [Παίζει μουσική]