[Powered by Google Translate] [ΕΒΔΟΜΑΔΑ 5]
[David J. Malan, Πανεπιστήμιο Χάρβαρντ]
[Αυτό είναι CS50.] [CS50.TV]
[Γυναίκα] Λέει ψέματα? Για το τι, δεν ξέρω.
[Άνθρωπος] Λοιπόν, τι ξέρουμε;
[Γυναίκα] Αυτό στις 9:15, Ray Santoya ήταν στο ΑΤΜ.
[Άνθρωπος] Έτσι, το ερώτημα είναι, τι κάνει αυτός στις 9:16;
[Γυναίκα] Σκοποβολή το 9 mm σε κάτι.
Ίσως είδε τον ελεύθερο σκοπευτή.
[Άνθρωπος] Ή δούλευε μαζί του.
[Γυναίκα] Περιμένετε. Επιστροφή στο προηγούμενο.
[Άνθρωπος] Τι βλέπεις;
[♫ ♫ suspenseful μουσική]
[Γυναίκα] Φέρτε το πρόσωπό του επάνω. Πλήρης οθόνη.
[Άνθρωπος] γυαλιά του. >> Υπάρχει μια αντανάκλαση.
[♫ ♫ suspenseful μουσική]
[Άνθρωπος] Αυτό είναι ομάδα μπέιζμπολ του Nuevita του. Αυτό είναι το λογότυπο τους.
[Γυναίκα] Και μιλάει σε όποιον φοράει μπουφάν αυτό.
>> [David Malan] Έτσι, αυτό είναι CS50 εβδομάδα 5, και σήμερα έχουμε καταστρέψει ένα κομμάτι της τηλεόρασης και του κινηματογράφου για σας.
Έτσι, κάθε φορά που βλέπετε μια εκπομπή όπως αυτή εδώ,
και οι μπάτσοι λένε "Μπορείς να καθαρίσει ότι μέχρι;" ή "Ενίσχυση"
δεν υπάρχει ενίσχυση στον πραγματικό κόσμο.
Στην πραγματικότητα, αυτό που πραγματικά να είναι λίγο κάτι σαν αυτό.
Έχω τράβηξε μία από τις φωτογραφίες από το προσωπικό της σελίδας.
Πρόκειται για ένα πρόγραμμα που ονομάζεται Photoshop. Αυτό είναι 1 από 2 Bowdens,
1 από 3 Bowdens πραγματικότητα, σήμερα, επειδή έχουμε κα Bowden εδώ, καθώς, με τον Rob και Παύλου.
Αλλά εδώ είναι Rob στην οθόνη, και αν κάνετε ζουμ σε αυτή λάμψη που πάντα είχε στο μάτι του,
αυτό που πραγματικά βλέπουμε είναι ότι αυτό που βλέπετε είναι αυτό που παίρνετε.
Αυτή είναι η "βελτιωμένη", ώστε "CSI" έχετε λίγο λάθος.
Υπάρχει ένα άλλο clip, αν μπορούμε να τα βάζουμε με "CSI" και λίγο περισσότερο.
Αυτό είναι ένα ωραίο φράση πλέον να λέμε, αν θέλετε να
καλή τεχνική με τους φίλους σας όταν, πραγματικά, λέτε απολύτως τίποτα.
>> [Άνθρωπος] Για τις εβδομάδες έχω τη διερεύνηση των δολοφονιών Cabby Killer
με μια ορισμένη γοητεία νοσηρή.
[Γυναίκα # 1] Αυτό είναι σε πραγματικό χρόνο.
[Γυναίκα # 2] Θα δημιουργήσει μια διεπαφή GUI χρήση της Visual Basic, να δω αν μπορώ να παρακολουθείτε μια διεύθυνση IP.
>> [Malan] Έτσι ήχου εκτός συγχρονισμού μέρος, δημιουργώντας ένα γραφικό περιβάλλον διεπαφής με τη χρήση της Visual Basic
για να παρακολουθείτε μια διεύθυνση IP είναι πλήρης ανοησία.
Αυτές τις μέρες δεν θα χρησιμοποιήσετε το Visual Basic,
δεν υπάρχει καμία ανάγκη για ένα GUI, και τη διεύθυνση IP ήταν τεχνικά ακριβής όρος.
Έτσι, κρατήστε ένα μάτι έξω για αυτά, και ένα από τα αγαπημένα μου:
Αυτό και μόνο είναι λίγο πιο απόκρυφες, γιατί θα πρέπει να γνωρίζουν μια άλλη γλώσσα.
Υπάρχει μια γλώσσα που ονομάζεται Objective-C, το οποίο είναι ένα υπερσύνολο της C.
Πράγμα που σημαίνει ότι το C συν κάποια επιπλέον χαρακτηριστικά, μεταξύ των οποίων και αντικειμενοστραφή προγραμματισμό.
Και αυτή είναι η γλώσσα που η Apple έχει διαδοθεί για τον προγραμματισμό iOS.
Και έτσι εδώ είναι ένα απόσπασμα από ένα διαφορετικό show συνολικά, από το "Numbers"
ότι αν πραγματικά εξετάσουμε προσεκτικά την παύση TiVo και σας την κατάλληλη στιγμή,
θα δείτε ότι αυτό που κοιτάτε δεν είναι αρκετά αυτό που περιγράφεται.
Και επιτρέψτε μου να δοκιμάσετε μια διαφορετική υποδοχή ήχου εδώ και να δούμε αν δεν μπορούμε να
κρατήσει τον ήχο σε συγχρονισμό αυτή τη φορά.
Σας δίνω "Αριθμοί".
>> [Man # 1] Είναι ένα 32-bit διεύθυνση IPv4.
[Man # 2] IP, αυτό είναι το Διαδίκτυο. >> Ιδιωτικό δίκτυο. Είναι το ιδιόκτητο δίκτυο της Ανίτας.
[Malan] Εντάξει. Αυτό είναι Objective-C, και είναι για το πρόγραμμα χρωματισμό κάποιου παιδιού,
όπως ίσως μπορείτε να συναγάγει από το όνομα της μεταβλητής εκεί.
Έτσι ώστε, στη συνέχεια, ήταν «Αριθμοί». Έτσι, σήμερα και αυτή την εβδομάδα έχουμε εισαγάγει
ένα μικρό κομμάτι του κόσμου της εγκληματολογίας και το πλαίσιο των προβλημάτων αυτών.
Σήμερα θα είναι μια συνοπτική διάλεξη, επειδή υπάρχει μια ειδική εκδήλωση εδώ
αργότερα, οπότε θα ρίξουμε μια ματιά, και να δώσουμε έμφαση τόσο οι μαθητές όσο και οι γονείς σήμερα
με μερικά από τα πράγματα που είναι στον ορίζοντα.
Ανάμεσά τους, από τη Δευτέρα, θα έχετε μερικές ακόμα συμμαθητές.
EDX, του Χάρβαρντ και MITs νέα σύνδεση πρωτοβουλία για ανοικτές εκπαιδευτικού
και περισσότερο, ξεκινά στην πανεπιστημιούπολη του Χάρβαρντ τη Δευτέρα.
Που σημαίνει ότι έρχονται Δευτέρα θα έχετε - από την τελευταία καταμέτρηση,
86.000 επιπλέον συμμαθητές θα ακολουθεί μαζί με διαλέξεις του CS50
και τμήματα και walkthroughs και σύνολα πρόβλημα.
Και στο πλαίσιο αυτό, θα γίνουν μέλη της εναρκτήριας κατηγορίας
CS50 και τώρα CS50x.
>> Στο πλαίσιο αυτό, τώρα, να συνειδητοποιήσουν ότι θα υπάρξουν κάποιες upsides, καθώς και.
Για να ετοιμαστείτε για αυτό, για τον τεράστιο αριθμό των φοιτητών,
αρκεί να πούμε ότι ακόμα κι αν έχουμε 108 TFs και ΑΠ,
δεν είναι αρκετά η καλύτερη αναλογία φοιτητών / καθηγητών τη στιγμή που θα χτυπήσει 80.000 άλλους μαθητές.
Γι 'αυτό και δεν πρόκειται να ταξινόμησης τόσα πολλά θέτει πρόβλημα χειροκίνητα.
Έτσι εισήγαγε αυτή την εβδομάδα στο σύνολο πρόβλημα θα είναι CS50 Έλεγχος,
η οποία πρόκειται να είναι ένα βοηθητικό πρόγραμμα γραμμής εντολών εντός της συσκευής
ότι θα πάρετε τη στιγμή που θα ενημερώσετε αργότερα αυτό το Σαββατοκύριακο,
και θα είστε σε θέση να εκτελέσετε μια εντολή, ελέγξτε 50,
με δική PSET σας, και θα πάρετε κάποιες πληροφορίες για το αν το πρόγραμμά σας είναι
σωστό ή λάθος, σύμφωνα με διάφορες προδιαγραφές σχεδιασμού που έχουμε παράσχει.
Έτσι, περισσότερα για αυτό και οι προδιαγραφές σετ πρόβλημα και
CS50x οι συμμαθητές θα πρέπει να χρησιμοποιούν αυτό ως καλά.
>> Έτσι, το πρόβλημα σύνολο 4 είναι όλα σχετικά με εγκληματολογίας.
Και αυτό το κομμάτι εμπνεύστηκε από κάποια πραγματική ζωή τα πράγματα,
σύμφωνα με την οποία όταν ήμουν μεταπτυχιακή φοιτήτρια, εγώ εγκλεισθούν για λίγο με
Επαρχιακό Γραφείο του Middlesex County του πληρεξούσιου κάνει εγκληματολογικής εργασίας
με επικεφαλής ερευνητής ιατροδικαστική τους, και ό, τι αυτό ανήλθε σε
είναι, νομίζω ότι ανέφερα το παρελθόν ολίγων εβδομάδων, είναι η μάζα της αστυνομίας κράτος ή άλλοι
θα έρθει, θα πέσει από τα πράγματα όπως σκληρούς δίσκους και CD και δισκέτες
και τα παρόμοια, και στη συνέχεια, ο στόχος του γραφείου εγκληματολογίας ήταν να εξακριβωθεί αν
υπήρχε ή δεν ήταν απόδειξη κάποιου είδους.
Αυτή ήταν η Μονάδα Ειδικών Ερευνών, γι 'αυτό ήταν υπαλληλικό έγκλημα,
ήταν πιο ανησυχητικό είδος των εγκλημάτων,
κάτι που περιλαμβάνει κάποιο είδος των ψηφιακών μέσων? αποδεικνύεται ότι δεν είναι ότι πολλοί άνθρωποι
γράψετε ένα e-mail λέγοντας ότι "το έκανα."
Έτσι, αρκετά συχνά αυτές οι αναζητήσεις εγκληματολογίας δεν εμφανίζονται και τόσο πολύ τα φρούτα,
αλλά μερικές φορές οι άνθρωποι θα έγραφε τέτοια emails.
Έτσι, μερικές φορές οι προσπάθειες ανταμείβονται.
>> Αλλά για να οδηγήσει μέχρι αυτό το ιατροδικαστική PSET, εμείς θα πρέπει να εισάγει στην PSET 4 α κομμάτι των γραφικών.
Έτσι, θα είναι κατά πάσα πιθανότητα αυτά τα πράγματα για χορηγημένος, JPEG, GIF και όπως αυτές τις μέρες,
αλλά αν πραγματικά το σκέφτομαι, μια εικόνα, μοιάζει πολύ με το πρόσωπο του Rob,
θα μπορούσε να απεικονιστεί ως μια ακολουθία των κουκκίδων ή εικονοστοιχεία.
Τώρα, στην περίπτωση του προσώπου του Rob, υπάρχει κάθε λογής χρώματα,
και αρχίσαμε να βλέπουμε τις μεμονωμένες κουκίδες, otherwide γνωστό ως pixel,
τη στιγμή που θα αρχίσει να μεγεθύνετε
Αλλά αν έχουμε απλοποιήσει τον κόσμο λίγο, και να πω ότι αυτό εδώ είναι Rob
σε μαύρο και άσπρο, και, για να αντιπροσωπεύουν μαύρο και άσπρο μπορούμε να χρησιμοποιήσουμε μόνο δυαδικό.
Και αν θα πάμε να χρησιμοποιούν δυαδικό, 1 ή 0, μπορούμε να εκφράσουμε την ίδια εικόνα
χαμογελαστό πρόσωπο του Rob με αυτό το μοτίβο των bits: 11000011 αντιπροσωπεύει
άσπρο, λευκό, μαύρο, μαύρο, μαύρο, μαύρο, λευκό λευκό.
Και γι 'αυτό δεν είναι ένα τεράστιο άλμα, στη συνέχεια, να αρχίσουμε να μιλάμε για πολύχρωμες φωτογραφίες.
Τα πράγματα που θα δείτε στο Facebook ή να με μια ψηφιακή φωτογραφική μηχανή,
αλλά, σίγουρα, όταν πρόκειται για τα χρώματα, θα πρέπει να έχετε περισσότερα bits.
Και αρκετά κοινό στον κόσμο των φωτογραφιών είναι να χρησιμοποιήσετε δεν 1-bit χρώματος,
όπως αυτό προτείνει, αλλά 24-bit χρώμα, όπου μπορείτε να πάρετε πραγματικά εκατομμύρια χρώματα.
Έτσι, όπως στην περίπτωση όταν μεγεθύνεται στο μάτι του Rob,
που ήταν οποιοσδήποτε αριθμός εκατομμυρίων διαφορετικών δυνατοτήτων πολύχρωμα.
>> Γι 'αυτό και θα εισαγάγει αυτό το σύνολο το πρόβλημα 4, καθώς και στην περιδιάβαση,
η οποία θα είναι σήμερα στις 3:30 αντί της συνήθους 2:30 λόγω διάλεξη της Παρασκευής εδώ.
Αλλά το βίντεο θα είναι σε απευθείας σύνδεση, ως συνήθως, αύριο.
Θα σας παρουσιάσουμε επίσης σε άλλη μορφή αρχείου.
Έτσι, αυτό σήμαινε σκόπιμα να δούμε τον εκφοβισμό κατά την πρώτη,
αλλά αυτό είναι μόνο μερικά έγγραφα για struct C.
Φαίνεται ότι η Microsoft, πριν από χρόνια, βοήθησε να διαδώσει αυτή τη μορφή,
ονομάζεται η μορφή αρχείου bitmap, BMP, και αυτό ήταν ένα σούπερ-απλή,
πολύχρωμα γραφικά μορφή αρχείου που χρησιμοποιείται εδώ και αρκετό καιρό
και μερικές φορές ακόμα για ταπετσαρίες για επιτραπέζιους υπολογιστές.
Αν νομίζετε ότι πίσω στα Windows XP και τους λόφους και τον μπλε ουρανό,
που ήταν συνήθως μια BMP, ή bitmap εικόνα, και bitmaps
είναι διασκέδαση για μας, επειδή έχουν λίγο περισσότερο την πολυπλοκότητα.
Δεν είναι τόσο απλό όσο αυτό το πλέγμα των 0 και 1 του?
Αντ 'αυτού, έχετε τα πράγματα όπως μια κεφαλίδα στην αρχή ενός αρχείου.
Έτσι με άλλα λόγια, μέσα σε ένα αρχείο. Bmp είναι ένα σωρό του 0 και 1,
αλλά υπάρχει κάποια επιπλέον 0 και 1 στην εκεί.
Και αποδεικνύεται ότι αυτό που έχουμε κατά πάσα πιθανότητα θεωρείται δεδομένη για τα επόμενα χρόνια,
μορφές αρχείων όπως. doc ή. xls ή. mp3 ή. mp4,
ανεξάρτητα από τις μορφές αρχείων που είστε εξοικειωμένοι με.
Λοιπόν, τι σημαίνει αυτό ακόμα να είναι μια μορφή αρχείου;
Διότι στο τέλος της ημέρας, όλα αυτά τα αρχεία που χρησιμοποιούμε έχουν μόνο 0 και του 1
και ίσως εκείνους 0 και το 1 αντιπροσωπεύουν α, β, γ, μέσω ASCII ή τα παρόμοια,
αλλά μέχρι το τέλος της ημέρας, είναι ακριβώς το 0 και 1.
>> Έτσι, οι άνθρωποι απλώς περιστασιακά αποφασίσει να εφεύρει μια νέα μορφή αρχείου
όπου τυποποίηση τι σχέδια των bits θα σημαίνει πραγματικά.
Και σε αυτή την περίπτωση εδώ, οι λαοί που σχεδίασε το bitmap μορφή αρχείου
είπε ότι στο πρώτο byte σε ένα αρχείο bitmap, όπως υποδηλώνεται από offset 0, εκεί,
υπάρχει μετάβαση να είναι κάποια μυστική ονομασία μεταβλητή που ονομάζεται bfType,
η οποία στέκεται μόνο για τον τύπο αρχείου bitmap? τι είδους αρχείο bitmap αυτό είναι.
Μπορείτε να συμπεράνουμε, ίσως, από τη δεύτερη γραμμή που αντισταθμίζεται 2, αριθμός byte 2,
έχει ένα σχέδιο του 0 και του 1 που αντιπροσωπεύει ό, τι;
Το μέγεθος του κάτι, και συνεχίζει από εκεί.
Έτσι, στο σύνολο πρόβλημα 4, θα πρέπει να περάσει μέσα από κάποια από αυτά τα πράγματα.
>> Εμείς δεν θα καταλήξουν να νοιάζονται για όλα αυτά, αλλά παρατηρήσετε ότι αρχίζει να παίρνει ενδιαφέρον
γύρω από τη γραμμή ή byte 54, rgbtBlue, πράσινο και κόκκινο.
Εάν έχετε ακούσει ποτέ το ακρωνύμιο RGB, κόκκινο πράσινο μπλε, αυτό είναι μια αναφορά σε αυτό.
Επειδή αποδεικνύεται μπορείτε να ζωγραφίσει όλα τα χρώματα του ουράνιου τόξου
με κάποιο συνδυασμό του κόκκινου και του μπλε και του πράσινου.
Και, στην πραγματικότητα, οι γονείς στο δωμάτιο θα μπορούσε να υπενθυμίσουμε μερικά από τα πρώτα προβολείς.
Αυτές τις μέρες, μπορείτε απλά να βλέπετε 1 λαμπερό φως που βγαίνει από ένα φακό.
Αλλά πίσω στην ημέρα, θα έπρεπε το κόκκινο φακό, το μπλε φακό, και το πράσινο φακό
και μαζί με στόχο την οθόνη και σχηματίζεται μια πολύχρωμη εικόνα.
Και αρκετά συχνά γυμνάσια και λύκεια θα έχουν αυτές οι φακοί
πάντα-έτσι-ελαφρώς στραβό, έτσι ώστε να ήταν το είδος του βλέποντας διπλά ή τριπλά εικόνες,
αλλά αυτή ήταν η ιδέα. Είχες κόκκινο και πράσινο και μπλε φως ζωγραφική μια εικόνα.
Και ότι η ίδια αρχή χρησιμοποιείται σε υπολογιστές.
>> Έτσι, μεταξύ των προκλήσεων, τότε, για το πρόβλημα σας σετ 4
πρόκειται να είναι μερικά πράγματα? το ένα είναι στην πραγματικότητα να αλλάξετε το μέγεθος μιας εικόνας.
Για να ληφθεί σε ένα μοτίβο των 0 και 1, η
καταλάβω ποια κομμάτια του 0 και του 1 αντιπροσωπεύουν ό, τι σε μια δομή όπως αυτή,
και στη συνέχεια να καταλάβω πώς να αναπαράγουν τα pixels: τα κόκκινα, τα μπλε, τα πράσινα
μέσα, έτσι ώστε, όταν μια εικόνα μοιάζει με αυτό αρχικά, θα μπορούσε να μοιάζει με αυτό αντί μετά από αυτό.
Μεταξύ των άλλων προκλήσεων, επίσης, πρόκειται να είναι ότι θα πρέπει να παραδοθεί
η ιατροδικαστική εικόνα ενός πραγματικού αρχείου από μια ψηφιακή φωτογραφική μηχανή
και για την κάμερα, μια φορά κι έναν καιρό, ήταν ένα σωρό φωτογραφίες.
Το πρόβλημα είναι, θα διαγραφούν κατά λάθος ή η εικόνα είχε καταστραφεί κατά κάποιο τρόπο.
Κακά πράγματα συμβαίνουν με τις ψηφιακές φωτογραφικές μηχανές, και γι 'αυτό αντιγράφονται γρήγορα όλα του 0 και του 1
μακριά από αυτή την κάρτα για σας, τους έσωσε όλα σε 1 μεγάλο αρχείο, και στη συνέχεια θα τα παραδώσουμε σε σας
στο πρόβλημα που 4 έτσι ώστε να μπορείτε να γράψετε ένα πρόγραμμα σε C με την οποία να ανακτήσει
όλα αυτά τα αρχεία JPEG, ιδανικά.
Και αποδεικνύεται ότι τα αρχεία JPEG, ακόμα κι αν είναι κάπως από μια σύνθετη μορφή αρχείου,
ότι είναι πολύ πιο περίπλοκη από ό, τι αυτό το χαμογελαστό πρόσωπο εδώ.
Αποδεικνύεται ότι κάθε JPEG ξεκινά με τα ίδια πρότυπα του 0 και 1.
Έτσι, χρησιμοποιώντας ένα βρόχο while ή ένα βρόχο for ή παρόμοια,
μπορείτε να επαναλάβει πάνω από όλα το 0 και 1 σε αυτό το ιατροδικαστική εικόνα
και κάθε φορά που θα δείτε το ειδικό σχέδιο που έχει προσδιοριστεί στο σύνολο προδιαγραφές του προβλήματος,
μπορείτε να υποθέσετε, «Ω, εδώ είναι, με πολύ μεγάλη πιθανότητα,
η αρχή μιας JPEG, και το συντομότερο θα βρείτε το ίδιο μοτίβο,
κάποια αριθμός των bytes ή kilobytes ή megabytes αργότερα,
μπορείτε να υποθέσετε, "Ooh! Εδώ είναι ένα δεύτερο JPEG, η φωτογραφία πήρα μετά την πρώτη.
Επιτρέψτε μου να σταματήσετε να διαβάζετε αυτό το πρώτο αρχείο, αρχίστε να γράφετε το νέο. "
Και η έξοδος του προγράμματος σας για PSET 4 πρόκειται να είναι όσο το 50 αρχεία JPEG.
Και αν δεν είναι 50 αρχεία JPEG, έχετε ένα κομμάτι ενός βρόχου.
Εάν έχετε έναν άπειρο αριθμό των αρχεία JPEG, έχετε ένα άπειρο βρόχο.
Έτσι ώστε, επίσης, θα είναι μια αρκετά συνηθισμένη περίπτωση.
Αυτό είναι ό, τι είναι στον ορίζοντα.
>> Quiz 0, πίσω μας. Συνειδητοποιήστε, ανά e-mail μου, που πάντα υπάρχει λαοί
που είναι τόσο ευτυχισμένος, είδος ουδέτερο, και λυπημένος κουίζ γύρω από το χρόνο 0.
Και παρακαλώ να φτάσει σε μένα, οι TFs κεφάλι, Zamyla, τη δική σας TF
ή μία από τις αρμόδιες αρχές ότι ξέρετε αν θα θέλατε να συζητήσουμε για το πώς πήγαν τα πράγματα.
>> Έτσι για να εντυπωσιάσουν τους γονείς εδώ στην αίθουσα,
ποια είναι η CS50 βιβλιοθήκη; Καλή δουλειά.
Ποια είναι η CS50 βιβλιοθήκη; Ναι; [Απαντήσεις σπουδαστών, ακατάληπτο]
>> Εντάξει, καλά. Έτσι είναι ένας έτοιμος σύνολο του κώδικα που εμείς, το προσωπικό, έγραψε,
σας παρέχουμε, να παρέχουν ορισμένες κοινές λειτουργίες.
Γεμίζουμε ήθελα να μου βρεις ένα string? Πάρτε μια int, όλες οι λειτουργίες που αναφέρονται εδώ.
Ξεκινώντας τώρα, αρχίζουμε να πάρει πραγματικά αυτές τις ρόδες μακριά.
Έτσι θα πάμε για να ξεκινήσει να πάρει μια «σειρά» από εσάς,
η οποία, ανάκληση, ήταν απλά ένα συνώνυμο για το τι πραγματικά τύπο δεδομένων; char *.
Έτσι, για τους γονείς, που ήταν κατά πάσα πιθανότητα - αυτό είναι καλό, έτσι char * θα αρχίσουμε να βλέπουμε
στην οθόνη όλες οι περισσότερο ως αφαιρούμε "string" από το λεξιλόγιό μας,
τουλάχιστον όταν πρόκειται για την πραγματικότητα γράφοντας κώδικα.
Ομοίως, θα σταματήσει να χρησιμοποιεί κάποια από αυτές τις λειτουργίες, όπως πολύ,
επειδή τα προγράμματά μας πρόκειται να πάρει πιο εξελιγμένα
αντί να γράφουν απλά προγράμματα που κάθονται εκεί με μια προτροπή να αναβοσβήνει,
περιμένει το χρήστη να τυπώσει κάτι in
Θα πάρετε τις εισροές σας από κάπου αλλού.
Για παράδειγμα, θα τα πάρετε από μια σειρά από bits στον τοπικό σκληρό δίσκο.
Θα τους πάρει αντ 'αυτού στο μέλλον από μια σύνδεση δικτύου, κάποια ιστοσελίδα κάπου.
Ας φλούδα πίσω αυτό το στρώμα για πρώτη φορά, και τραβήξτε τη συσκευή CS50
και αυτό το αρχείο ονομάζεται CS50.h, που ήσουν απότομη ακόμη και για εβδομάδες.
>> Αλλά ας δούμε τι πραγματικά είναι μέσα από αυτό.
Έτσι, η κορυφή του αρχείου στο μπλε είναι απλώς ένα σωρό σχόλια,
πληροφορίες εγγύησης και τη χορήγηση αδειών. Αυτό είναι ένα είδος κοινό παράδειγμα
το λογισμικό, επειδή πολλά από λογισμικό αυτές τις μέρες είναι αυτό που λέμε "open source"
πράγμα που σημαίνει ότι κάποιος έχει γράψει τον κώδικα
και έκανε ελεύθερα διαθέσιμα, όχι μόνο για να τρέξει και να χρησιμοποιήσει,
αλλά στην πραγματικότητα διαβάζουν και να αλλάξει και να ενσωματώσει στο δικό σας έργο.
Έτσι, αυτό είναι ό, τι έχετε χρησιμοποιήσει, το λογισμικό ανοιχτού κώδικα,
αν και σε πολύ μικρή μορφή.
Αν μετακινηθείτε προς τα κάτω μετά από τα σχόλια, όμως, θα αρχίσουμε να βλέπουμε κάποια πράγματα πιο οικεία.
Έτσι παρατηρούμε στην κορυφή εδώ, ότι το αρχείο CS50.h περιλαμβάνει ένα σωρό αρχεία κεφαλίδας.
Τώρα, τα περισσότερα από αυτά δεν έχουμε δει πριν, αλλά ένα είναι
εξοικειωμένοι? ποια από αυτά τα έχουμε δει, έστω και για λίγο, μέχρι στιγμής;
Ναι, τυποποιημένες βιβλιοθήκες. Stdlib.h έχει malloc,
έτσι όταν αρχίσαμε να μιλάμε για δυναμική κατανομή μνήμης,
το οποίο θα επανέλθουμε την επόμενη εβδομάδα, καθώς, όπως αρχίσαμε αυτό το αρχείο.
Αποδεικνύεται ότι bool και αληθινό και το ψεύτικο, δεν υπάρχει στην πραγματικότητα σε C, per se,
εκτός και αν έχετε συμπεριλάβει αυτό το αρχείο εδώ.
Έτσι έχουμε, για εβδομάδες, συμπεριλαμβανομένων και των τυποποιημένων έχουν bool.h
έτσι ώστε να μπορείτε να χρησιμοποιήσετε την έννοια του ένα bool, αληθής ή ψευδής.
Χωρίς αυτό, θα πρέπει να ταξινομήσετε από το ψεύτικο και να χρησιμοποιήσετε ένα int
και μόλις αυθαίρετα υποθέσουμε ότι 0 είναι ψευδής και 1 είναι αλήθεια.
>> Τώρα, αν έχουμε περαιτέρω κύλιση προς τα κάτω, εδώ είναι ο ορισμός μας από μια σειρά.
Αποδεικνύεται, όπως έχουμε ξαναπεί, ότι όταν αυτό * δεν πειράζει πραγματικά.
Μπορείτε να έχετε ακόμη χώρο γύρω.
Εμείς, αυτό το εξάμηνο, έχουν την προώθηση και αυτό να καταστεί σαφές ότι η * έχει να κάνει με το είδος.
Αλλά συνειδητοποιούν, όπως ακριβώς κοινή, αν όχι λίγο πιο κοινό, είναι να το βάλετε εκεί
αλλά λειτουργικά είναι το ίδιο πράγμα.
Αλλά τώρα, αν διαβάσουμε μειωθεί περαιτέρω, ας ρίξουμε μια ματιά στο λόγο, GetInt,
επειδή χρησιμοποιήσαμε ότι, ίσως, πριν από οτιδήποτε άλλο αυτό το εξάμηνο.
Και εδώ είναι GetInt. Αυτό είναι ό, τι;
Αυτό είναι το πρωτότυπο. Έτσι, συχνά, έχουμε θέσει πρωτότυπα στις κορυφές των μας. Γ αρχεία,
αλλά μπορείτε να βάλετε επίσης σε πρωτότυπα αρχεία κεφαλίδας, αρχεία. h,
όπως αυτή εδώ, έτσι ώστε όταν γράφετε ορισμένες λειτουργίες
που θέλετε άλλους ανθρώπους για να είναι σε θέση να χρησιμοποιήσει, το οποίο είναι ακριβώς η περίπτωση με τη βιβλιοθήκη CS50,
μπορείτε όχι μόνο να εφαρμόσουν τις λειτουργίες σας σε κάτι σαν CS50.c,
βάζετε επίσης τα πρωτότυπα όχι στην κορυφή του εν λόγω αρχείου, αλλά στην κορυφή ενός αρχείου κεφαλίδας,
τότε αυτό το αρχείο κεφαλίδας είναι αυτό που περιλαμβάνει τους φίλους και τους συναδέλφους,
με αιχμηρά περιλαμβάνουν τον δικό τους κώδικα.
Έτσι, όλο αυτό το διάστημα που έχετε συμπεριλαμβανομένων όλων αυτών των πρωτοτύπων
αποτελεσματικά στην κορυφή του αρχείου σας, αλλά με τον τρόπο του αυτό το αιχμηρό περιλαμβάνουν μηχανισμό
ότι ουσιαστικά αντίγραφα και πάστες αυτό το αρχείο στο δικό σας.
Τώρα, εδώ είναι μερικές αρκετά λεπτομερή τεκμηρίωση.
>> Έχουμε λίγο πολύ δεδομένο ότι GetInt παίρνει μια int,
αλλά αποδεικνύεται ότι υπάρχει σε ορισμένες περιπτώσεις γωνία, έτσι δεν είναι;
Τι θα συμβεί αν ο χρήστης πληκτρολογεί σε έναν αριθμό που είναι πάρα πολύ μεγάλο;
Μια τετράκις εκατομμύρια, που απλά δεν μπορεί να χωρέσει μέσα από έναν int;
Ποια είναι η αναμενόμενη συμπεριφορά; Λοιπόν, στην ιδανική περίπτωση, είναι προβλέψιμη.
Έτσι, σε αυτή την περίπτωση, αν διαβάσει πραγματικά τα ψιλά γράμματα,
θα δείτε ότι αν η γραμμή δεν μπορεί να διαβάσει, αυτό το INT_MAX επιστρέφει.
Εμείς ποτέ δεν έχω μιλήσει για αυτό, αλλά με βάση την κεφαλαιοποίησή της,
Τι είναι αυτό, ίσως;
Είναι μια σταθερή, έτσι είναι κάποια ειδική σταθερά που είναι πιθανόν να κηρυχθεί
σε ένα από αυτά τα αρχεία κεφαλίδας που είναι ψηλότερα στο αρχείο,
και INT_MAX είναι πιθανώς κάτι σαν, περίπου, 2 δισ. ευρώ.
Η ιδέα είναι ότι επειδή πρέπει να δηλώσουν κατά κάποιο τρόπο ότι κάτι πήγε στραβά,
εμείς, ναι, έχουν 4 δισεκατομμύρια αριθμούς στη διάθεσή μας,
αρνητικό 2 δισεκατομμύρια έως 2 δισ. ευρώ, ή να δώσει.
Λοιπόν, αυτό που είναι κοινό στον προγραμματισμό είναι να κλέψει ένα μόνο από αυτούς τους αριθμούς.
Ίσως 0, ίσως 2 δισ. ευρώ, ίσως αρνητικό 2 δισ. ευρώ.
Έτσι ξοδεύετε μία από τις πιθανές τιμές σας, έτσι ώστε να μπορείτε να δεσμευτούν για τον κόσμο
ότι αν κάτι πάει στραβά, θα επιστρέψει αυτό το σούπερ-μεγάλη αξία.
Αλλά δεν θέλετε ο χρήστης πληκτρολογώντας κάτι αινιγματικά σαν "2, 3, 4 ..."
πραγματικά μεγάλο αριθμό, όπου θα γενικεύσει αντί ως σταθερή.
Έτσι, πραγματικά, αν ήταν να πρωκτικό τις τελευταίες εβδομάδες,
ανά πάσα στιγμή να καλέσετε GetInt, θα πρέπει να έχουν τον έλεγχο με αν κατάσταση.
Μήπως ο τύπος χρήστη σε INT_MAX, ή πιο συγκεκριμένα,
έκανε GetInt INT_MAX επιστροφή; Διότι αν το έκανε,
αυτό σημαίνει ότι στην πραγματικότητα δεν το πληκτρολογήστε? κάτι πήγε στραβά σε αυτή την περίπτωση.
Έτσι, αυτό είναι ό, τι είναι γενικά γνωστό ως «φρουρός» αξία, που σημαίνει ακριβώς το ιδιαίτερο.
>> Λοιπόν, ας στραφούμε τώρα για να τα αρχεία. C.
Το αρχείο C υπήρχε στη συσκευή για κάποιο χρονικό διάστημα,
και, στην πραγματικότητα, η συσκευή αυτή έχει μεταγλωττισμένα για σας
σε αυτό το πράγμα που ονομάζεται "αντικειμενικό κώδικα"
αλλά αυτό ακριβώς δεν έχει σημασία για εσάς, όπου είναι γιατί το σύστημα ξέρει,
στην περίπτωση αυτή, όπου είναι, η συσκευή.
Αλλά ας μετακινηθείτε προς τα κάτω για να GetInt τώρα, και να δούμε πώς GetInt έχει εργαστεί όλο αυτό το διάστημα.
Έτσι, εδώ έχουμε παρόμοια σχόλια από πριν.
Επιτρέψτε μου να μεγεθύνετε μόνο το τμήμα κώδικα,
και ό, τι έχουμε για GetInt είναι η ακόλουθη.
Δεν λαμβάνει εισόδου και επιστρέφει ένα int, ενώ η (πραγματική), έτσι έχουμε μια εσκεμμένη άπειρο βρόχο
αλλά, κατά πάσα πιθανότητα, θα ξεφύγει από αυτό με κάποιο τρόπο, ή να επιστρέψουν μέσα από αυτό.
Ας δούμε λοιπόν πώς αυτό λειτουργεί. Λοιπόν, φαίνεται να χρησιμοποιούν GetString
σε αυτή την πρώτη γραμμή στο εσωτερικό του βρόγχου, 166.
Αυτό τώρα είναι καλή πρακτική, διότι κάτω από ποιες συνθήκες
θα μπορούσε να επιστρέψει GetString αυτό το ειδικό κλειδί, NULL;
Αν κάτι πάει στραβά. Τι θα μπορούσε να πάει στραβά, όταν σας καλούν κάτι σαν GetString;
Ναι; [Απάντηση Φοιτητής, ακατάληπτο] >> Ναι. Έτσι ίσως malloc αποτύχει.
Κάπου κάτω από την κουκούλα GetString καλεί malloc,
η οποία διαθέτει μνήμη, η οποία επιτρέπει το κατάστημα ηλεκτρονικών υπολογιστών
το σύνολο των χαρακτήρων που ο χρήστης πληκτρολογεί στο πληκτρολόγιο.
Και ας υποθέσουμε ότι ο χρήστης είχε ένα πάρα πολύ ελεύθερο χρόνο
και πληκτρολογείται περισσότερο, για παράδειγμα, από 2 δισεκατομμύρια χαρακτήρες.
Περισσότεροι χαρακτήρες από τον υπολογιστή έχει ακόμη RAM.
Λοιπόν, GetString πρέπει να είναι σε θέση να σημαίνει ότι σε εσάς,
ακόμη και αν αυτό είναι ένα σούπερ, σούπερ ασυνήθιστο περίπτωση γωνία.
Πρέπει με κάποιο τρόπο να είναι σε θέση να χειριστεί το θέμα, και έτσι GetString,
αν πάμε πίσω και να διαβάσετε τα έγγραφα του, έχει, στην πραγματικότητα, επιστρέφει NULL.
Τώρα, αν αποτύχει GetString με την επιστροφή NULL, GetInt πρόκειται να αποτύχει
επιστρέφοντας INT_MAX, ακριβώς ως φρουρός.
Αυτά είναι μόνο τα ανθρώπινα. Ο μόνος τρόπος θα ξέρετε αυτή είναι η περίπτωση
είναι με την ανάγνωση των εγγράφων.
Ας μετακινηθείτε προς τα κάτω για να όπου η int είναι πραγματικά GotInt.
>> Έτσι, αν μετακινηθείτε προς τα κάτω λίγο περισσότερο, σε γραμμή 170 έχουμε ένα σχόλιο πάνω από αυτές τις γραμμές.
Έτσι δηλώνουμε, σε 172, μια int n και ένα char c, και στη συνέχεια, αυτή η νέα λειτουργία
που ορισμένοι από εσάς έχετε σκόνταψε σε πριν, αλλά sscanf.
Αυτό σημαίνει στ σειρά σάρωσης.
Με άλλα λόγια, να μου δώσει μια σειρά και θα το σαρώσει για κομμάτια των πληροφοριών που παρουσιάζουν ενδιαφέρον.
Λοιπόν, τι σημαίνει αυτό; Λοιπόν, ας υποθέσουμε ότι θα πληκτρολογήσετε, κυριολεκτικά, 1 2 3 στο πληκτρολόγιο,
και στη συνέχεια χτύπησε αρχίζει. Ποιος είναι ο τύπος δεδομένων του 1 2 3 όταν επέστρεψε από GetString;
Είναι προφανώς μια σειρά, έτσι δεν είναι; Πήρα μια σειρά, έτσι ώστε 1 2 3 είναι πραγματικά «1 2 3»
με το \ 0 στο τέλος της. Αυτό δεν είναι ένα int.
Αυτό δεν είναι ένας αριθμός. Μοιάζει με έναν αριθμό αλλά δεν είναι πραγματικά.
Έτσι, αυτό που κάνει GetInt πρέπει να κάνω; Πρέπει να σαρώσει ότι η σειρά αριστερά προς τα δεξιά,
1 2 3 \ 0, και με κάποιο τρόπο να το μετατρέψει σε μια πραγματική ακέραιο.
Τώρα, μπορείτε να καταλάβω πώς να το κάνουμε αυτό.
Αν νομίζετε ότι πίσω PSET 2, που προφανώς πήρε λίγο άνετα
με Καίσαρα ή Vigenere ώστε να μπορείτε να επαναλάβει πάνω από ένα string,
μπορείτε να μετατρέψετε σε χαρακτήρες ints με επιλογή. Αυτό είναι ένα πάρα πολύ δουλειά.
Γιατί να μην καλέσετε μια συνάρτηση όπως sscanf που το κάνει αυτό για σας;
Έτσι sscanf αναμένει ένα επιχείρημα, στην περίπτωση αυτή ονομάζεται γραμμή, η οποία είναι μια συμβολοσειρά.
Μπορείτε στη συνέχεια, καθορίστε, σε εισαγωγικά, είναι πολύ παρόμοια με printf,
τι περιμένετε να δείτε σε αυτή τη σειρά;
Αυτό που λέω εδώ είναι, περιμένω να δω ένα δεκαδικό αριθμό και ίσως ένα χαρακτήρα.
Και θα δούμε γιατί συμβαίνει αυτό σε μια στιγμή.
Αποδεικνύεται ότι αυτή η σημείωση είναι πλέον θυμίζει πράγματα
αρχίσαμε να μιλάμε για μόλις πάνω από μία εβδομάδα πριν.
>> Τι είναι & n & c και κάνει για μας εδώ; [Απαντήσεις σπουδαστών, ακατάληπτο]
Ναι >>. Είναι που μου δίνετε τη διεύθυνση του n και τη διεύθυνση του c.
Τώρα, γιατί είναι τόσο σημαντικό; Λοιπόν, ξέρετε ότι με τις λειτουργίες σε C
μπορείτε να επιστρέψετε πάντα μια τιμή ή καμία αξία σε όλα.
Μπορείτε να επιστρέψετε ένα int, μια σειρά, μια float, ένα char, οτιδήποτε.
Ή μπορείτε να επιστρέψετε κενό, αλλά μπορείτε να επιστρέψετε μόνο 1 πράγμα μέγιστο βαθμό.
Αλλά εδώ θέλουμε sscanf να μου επιστρέψει ίσως ένα int, ένας δεκαδικός αριθμός,
και επίσης μια χαρα, και θα εξηγήσω γιατί το char σε μια στιγμή.
Έτσι, μπορείτε πραγματικά θέλουν να επιστρέψουν στ 2 πράγματα? Αυτό είναι όχι μόνο δυνατή σε C.
Έτσι, μπορείτε να εργαστείτε γύρω από αυτό με το πέρασμα σε 2 διευθύνσεις,
επειδή μόλις ένα χέρι τη λειτουργία 2 διευθύνσεις, τι μπορεί να κάνει με τη λειτουργία τους;
Δεν μπορεί να γράψει σε αυτές τις διευθύνσεις. Μπορείτε να χρησιμοποιήσετε τη λειτουργία * και "go there" σε κάθε μία από αυτές τις διευθύνσεις.
Είναι αυτό το είδος του μηχανισμού κερκόπορτα, αλλά πολύ κοινό για αλλαγή των τιμών των μεταβλητών
σε περισσότερες από μόλις 1 θέση, σε αυτή την περίπτωση 2.
Τώρα, παρατηρούμε Φεύγω για == μέχρι1, και στη συνέχεια επιστρέφουν n αν αυτό σημαίνει, στην πραγματικότητα, να αξιολογήσει αλήθεια.
Λοιπόν, τι συμβαίνει; Καλά, τεχνικά, όλοι θέλουμε πραγματικά να συμβεί σε GetInt είναι αυτό.
Θέλουμε να αναλύσει, να το πω έτσι? Θέλουμε να διαβάσετε το string
«1 2 3» και αν φαίνεται σαν να υπάρχει ένας αριθμός εκεί,
τι λέμε sscanf να κάνουμε είναι να βάλετε τον αριθμό, 1 2 3, σε αυτή τη μεταβλητή n για μένα.
Γιατί, λοιπόν, δεν είχα αυτό, καθώς;
Ποιος είναι ο ρόλος της και λέγοντας, sscanf, μπορείτε να πάρετε επίσης ένα χαρακτήρα εδώ.
[Μιλώντας Φοιτητών, ακατάληπτο] >> Δεν είναι - ένα δεκαδικό σημείο θα μπορούσε να λειτουργήσει.
Ας κρατήσει ότι σκέφτηκε για μια στιγμή. Τι άλλο;
[Φοιτητών, ακατάληπτο] >> Έτσι, καλή σκέψη, θα μπορούσε να είναι ο χαρακτήρας NULL.
Είναι πραγματικά δεν είναι, σε αυτή την περίπτωση. Ναι; [Φοιτητών, ακατάληπτο]
>> >> ASCII. Ή, επιτρέψτε μου να γενικεύσει ακόμη περισσότερο.
Το γ% δεν είναι μόνο για έλεγχο σφαλμάτων.
Δεν θέλουμε να υπάρξει χαρακτήρα μετά από τον αριθμό,
αλλά αυτό που μου επιτρέπει να κάνω είναι η εξής:
Αποδεικνύεται ότι sscanf, εκτός από την αποθήκευση των τιμών σε n και c, σε αυτό το παράδειγμα εδώ,
ό, τι δεν είναι, επίσης, να επιστρέφει τον αριθμό των μεταβλητών έθεσε αξίες μέσα
Έτσι, αν πληκτρολογήσετε μόνο το 1 2 3, τότε το μόνο% d πρόκειται να ταιριάζει με
και μόνο n παίρνει αποθηκεύονται με μια τιμή, όπως 1 2 3 και τίποτα δεν παίρνει θέσει σε γ?
γ παραμένει μια αξία σκουπίδια, να το πω έτσι.
Σκουπίδια, διότι ποτέ δεν έχει αρχικοποιηθεί ως κάποια αξία.
Έτσι, στην περίπτωση αυτή, sscanf επιστρέφει 1, γιατί κατοικείται μία από αυτές τις υποδείξεις,
στην οποία περίπτωση, μεγάλη. Έχω ένα int, γι 'αυτό ελευθερώσει τη γραμμή για να ελευθερώσετε τη μνήμη
GetString που πραγματικά διατεθεί, και στη συνέχεια θα επιστρέψει n.
Αλλιώς, αν ποτέ αναρωτηθεί όπου η επανάληψη δήλωση προέρχεται από, έρχεται από τα δεξιά εδώ.
Εάν, αντίθετα, θα πληκτρολογήσετε 1 2 3 foo,
μερικά μόνο τυχαία ακολουθία του κειμένου, sscanf πρόκειται να δει,
ooh, αριθμός, ooh, αριθμός, ooh, αριθμός, ooh - f.
Και πρόκειται να θέσει το 1 2 3 σε n.
Είναι πρόκειται να θέσει το f στο c, και στη συνέχεια επιστρέφουν 2.
Έτσι έχουμε, απλά χρησιμοποιώντας το βασικό ορισμό της συμπεριφοράς της scanf,
ένας πολύ απλός τρόπος - καλά, σύμπλοκο με την πρώτη ματιά, αλλά στο τέλος της ημέρας,
αρκετά απλό μηχανισμό του λέγοντας, υπάρχει ένα int, και αν ναι, είναι ότι το μόνο πράγμα που βρήκα;
Και ο λευκός χώρος εδώ είναι σκόπιμη. Αν διαβάσετε την τεκμηρίωση για sscanf,
σας λέει ότι αν έχετε συμπεριλάβει ένα κομμάτι από λευκό κενό διάστημα στην αρχή ή το τέλος,
sscanf επίσης θα επιτρέψει στο χρήστη, για οποιονδήποτε λόγο, να χτυπήσει το spacebar 1 2 3, και αυτό θα είναι νόμιμο.
Δεν θα φωνάζω στο χρήστη μόνο και μόνο επειδή χτύπησε το spacebar στην αρχή ή το τέλος,
το οποίο είναι λίγο πιο φιλική προς το χρήστη.
>> Όλες οι ερωτήσεις, τότε, για GetInts; Ναι;
[Ερώτηση Φοιτητών, ακατάληπτο]
Καλή ερώτηση >>. Τι γίνεται αν έχετε μόλις πληκτρολογήσατε σε ένα char, όπως και στ, και πατήστε enter
χωρίς ποτέ να πληκτρολογήσετε 1 2 3? τι νομίζετε ότι η συμπεριφορά της αυτή τη γραμμή του κώδικα θα είναι τότε;
Έτσι sscanf μπορεί να καλύψει ότι πάρα πολύ, γιατί σε αυτή την περίπτωση,
δεν πρόκειται να γεμίσει ή ν γ? πρόκειται να επιστρέψει αντί 0.
Σε αυτή την περίπτωση, είμαι αλίευση, επίσης, ότι το σενάριο, επειδή η αναμενόμενη αξία που θέλω είναι 1.
Θέλω μόνο 1, και μόνο 1 πράγμα που πρέπει να πληρωθεί. Καλή ερώτηση. Άλλοι;
>> Εντάξει, έτσι ας μην περάσει από όλες τις λειτουργίες εδώ,
αλλά αυτό που φαίνεται να είναι, ίσως, το ενδιαφέρον των υπόλοιπων
GetString είναι επειδή αποδεικνύεται ότι GetFloat, GetInt,
GetDouble, GetLongLong όλων punt πολλές λειτουργίες τους σε GetString.
Έτσι, ας ρίξουμε μια ματιά στο πώς εφαρμόζεται εδώ.
Αυτός φαίνεται λίγο περίπλοκη αλλά χρησιμοποιεί τα ίδια βασικά
ότι αρχίσαμε να μιλάμε για την τελευταία εβδομάδα. Έτσι, σε GetString,
η οποία λαμβάνει κανένα επιχείρημα σύμφωνα με το κενό μέχρι εδώ,
και επιστρέφει ένα string? έτσι δηλώνω μια σειρά που ονομάζεται buffer.
Πραγματικά, δεν ξέρω τι πρόκειται να χρησιμοποιηθεί για ακόμα, αλλά θα δούμε.
Μοιάζει με ικανότητα είναι, εξ ορισμού, 0? Δεν είναι αρκετά βέβαιοι πού αυτό θα είναι.
Δεν είστε σίγουροι για το τι πρόκειται ν να χρησιμοποιηθεί για ακόμα.
Αλλά τώρα είναι να πάρει λίγο πιο ενδιαφέρουσα, ώστε σε γραμμή 243,
δηλώνουμε μια int c, αυτό είναι το είδος της μια ηλίθια λεπτομέρεια.
Μια χαρα είναι 8 bit, 8 bits και μπορεί να αποθηκεύσει πόσες διαφορετικές τιμές;
256. Το πρόβλημα είναι, αν θέλετε να έχετε 256 διαφορετικά χαρακτήρες ASCII,
που υπάρχουν, αν νομίζετε ότι πίσω, και αυτό δεν είναι κάτι για να απομνημονεύσουν.
Αλλά αν νομίζετε ότι πίσω σε εκείνη την μεγάλη ASCII διάγραμμα είχαμε εβδομάδες πριν,
υπήρξαν, στην περίπτωση αυτή, 128 ή 256 χαρακτήρες ASCII.
Χρησιμοποιήσαμε όλα τα πρότυπα του 0 και 1 στο χέρι.
Αυτό είναι ένα πρόβλημα, αν θέλετε να είναι σε θέση να ανιχνεύσει ένα σφάλμα.
Διότι αν χρησιμοποιείτε ήδη 256 τιμές για τους χαρακτήρες σας,
δεν έχετε πραγματικά προγραμματίσουν το μέλλον, διότι τώρα δεν έχετε κανέναν τρόπο να πούμε,
"Αυτό δεν είναι μια legit χαρακτήρας? Αυτό είναι κάποια λανθασμένη μήνυμα."
Έτσι, αυτό που κάνει ο κόσμος είναι να χρησιμοποιήσετε την επόμενη μεγαλύτερη αξία,
κάτι σαν int, έτσι ώστε να έχουν μια τρελή αριθμός των bits,
32 για 4 δισεκατομμύρια δυνατές τιμές, έτσι ώστε να μπορείτε απλά να καταλήξετε με τη χρήση,
κατ 'ουσίαν, 257 από αυτούς, 1 εκ των οποίων έχει κάποια ιδιαίτερη σημασία ως σφάλμα.
>> Ας δούμε λοιπόν πώς αυτό λειτουργεί. Στη γραμμή 246, έχω αυτό το μεγάλο βρόχο, ενώ
που ζητά fgetc? στ αρχείο έννοια, getc, και στη συνέχεια stdin.
Βγάζει αυτό είναι μόνο η πιο ακριβής τρόπος για να πούμε "διαβάσουμε είσοδο από το πληκτρολόγιο."
Πρότυπο πληκτρολόγιο μέσο εισόδου, εξόδου σημαίνει πρότυπο οθόνη,
και τυπικό σφάλμα, το οποίο θα δούμε σε PSET 4, σημαίνει την οθόνη,
αλλά ένα ειδικό μέρος της οθόνης έτσι ώστε να είναι δεν συγχέονται
με πραγματική παραγωγή που προορίζεται για την εκτύπωση? αλλά περισσότερο για αυτό στο μέλλον.
Έτσι fgetc σημαίνει απλώς διαβάσει ένα χαρακτήρα από το πληκτρολόγιο, και το κατάστημα όπου;
Αποθηκεύστε το στο γ, και στη συνέχεια ελέγξτε, έτσι είμαι χρησιμοποιώντας μόνο μερικές boolean σύνδεσμοι εδώ,
βεβαιωθείτε ότι δεν ίσες \ n, έτσι ώστε ο χρήστης έχει πατήστε enter.
Θέλουμε να σταματήσει σε εκείνο το σημείο, τέλος του βρόχου, και θέλουμε επίσης να ελέγξετε
για το ειδικό σταθερά, ΕΟΦ, η οποία, αν γνωρίζετε ή να μαντέψει - τι ηρεμήσει;
Τέλος του αρχείου. Έτσι, αυτό είναι το είδος της νόημα, γιατί αν είμαι πληκτρολογώντας στο πληκτρολόγιο,
πραγματικά δεν υπάρχει αρχείο που συμμετέχουν σε αυτό,
αλλά αυτό είναι ακριβώς το είδος της γενικός όρος που χρησιμοποιείται για να σημάνει
ότι τίποτα άλλο δεν έρχεται από τα δάχτυλα του ανθρώπου. ΕΟΦ. Τέλος του αρχείου.
Ως μέρος, αν έχετε χτυπήσει ποτέ τον έλεγχο d στο πληκτρολόγιό σας,
όχι ότι θα έχετε ακόμα? έχετε χτυπήσει τον έλεγχο c.
Αλλά ελέγχου δ στέλνει αυτή την ειδική σταθερά που ονομάζεται ΕΟΦ.
>> Μέχρι τώρα έχουμε μόνο κάποια δυναμική κατανομή μνήμης.
Έτσι, αν n + 1> ικανότητα, τώρα θα εξηγήσω n.
n είναι ακριβώς πόσα bytes είναι επί του παρόντος στο ρυθμιστικό,
η σειρά που είστε σήμερα δημιουργία από το χρήστη.
Εάν έχετε περισσότερους χαρακτήρες στο ρυθμιστικό σας από ό, τι έχετε την ικανότητα στο ρυθμιστικό,
διαισθητικά, τι πρέπει να κάνουμε στη συνέχεια διαθέτουν μεγαλύτερη χωρητικότητα.
Πάω να προσπεράσει μερικές από τις αριθμητικές εδώ
και να επικεντρωθεί μόνο σε αυτήν την λειτουργία εδώ.
Ξέρεις τι είναι malloc, ή τουλάχιστον γενικά εξοικειωμένοι.
Πάρτε μια εικασία τι κάνει realloc. [Απάντηση Φοιτητής, ακατάληπτο]
Ναι >>. Και αυτό δεν είναι αρκετά προσθέτοντας μνήμη? Να αναδιανέμει μνήμη ως εξής:
Αν υπάρχει ακόμα περιθώριο στο τέλος του string για να σας δώσουμε περισσότερες της μνήμης
από ό, τι σας δίνει αρχικά, τότε θα πάρετε αυτό το επιπλέον μνήμη.
Έτσι, μπορείτε να θέτει απλώς τους χαρακτήρες χορδές πλάτη με πλάτη με πλάτη με πλάτη.
Αλλά αν αυτό δεν είναι η περίπτωση, επειδή περίμενα πολύ καιρό
και κάτι τυχαία πήρε plopped στη μνήμη εκεί, αλλά υπάρχει επιπλέον
μνήμη εδώ κάτω, αυτό είναι εντάξει. Realloc πρόκειται να κάνει όλη τη δύσκολη δουλειά για εσάς,
μετακινήσετε τη σειρά που έχετε διαβάσει στο έτσι μακριά από εδώ,
έβαλε εκεί κάτω, και στη συνέχεια να σας δώσει κάποιες περισσότερες διάδρομο σε εκείνο το σημείο.
Έτσι, με μια κίνηση του χεριού, επιτρέψτε μου να πω ότι αυτό που κάνει GetString
είναι αυτό που αρχίζει με ένα μικρό ρυθμιστικό, ίσως 1 μονό χαρακτήρα,
και εάν ο χρήστης τύποι στο 2 χαρακτήρες, GetString καταλήγει
καλώντας realloc και λέει, «Ω, 1 χαρακτήρας δεν ήταν αρκετό.
Δώσε μου 2 χαρακτήρες. Στη συνέχεια, αν μπορείτε να διαβάσετε μέσα από τη λογική του βρόχου,
πρόκειται να πει, «Ω, ο χρήστης πληκτρολογήσει 3 χαρακτήρες.
Δώσε μου τώρα όχι 2, αλλά 4 χαρακτήρες, τότε να μου δώσει 8, τότε δώσε μου 16 και 32. "
Το γεγονός ότι είμαι ο διπλασιασμός της χωρητικότητας κάθε φορά
σημαίνει ότι το ρυθμιστικό δεν πρόκειται να αυξηθεί σιγά-σιγά.
Είναι πρόκειται να αυξηθεί σούπερ γρήγορα, και τι θα μπορούσε να είναι το πλεονέκτημα του ότι;
Γιατί είμαι διπλασιάζοντας το μέγεθος της ενδιάμεσης μνήμης, παρόλο που ο χρήστης
θα μπορούσε απλώς να χρειαστεί 1 επιπλέον χαρακτήρα από το πληκτρολόγιο;
[Απάντηση Φοιτητής, ακατάληπτο]. >> Τι είναι αυτό;
Ακριβώς. Δεν χρειάζεται να αναπτυχθεί τόσο συχνά.
Και αυτό είναι ακριβώς το είδος του ένα - Μπορείτε πλέον αντιστάθμισης στοιχήματά σας εδώ.
Η ιδέα είναι ότι δεν θέλετε να καλέσετε realloc πολύ, επειδή τείνει να είναι αργή.
Κάθε φορά που θα ζητήσει από το λειτουργικό σύστημα για τη μνήμη, όπως θα δείτε σύντομα
σε ένα μελλοντικό πρόβλημα σύνολο, τείνει να πάρει κάποιο χρόνο.
Έτσι, ελαχιστοποιώντας το ποσό του χρόνου, ακόμα και αν σπαταλάτε κάποιο διάστημα, τείνει να είναι ένα καλό πράγμα.
>> Αλλά αν διαβάσετε το τελευταίο μέρος της GetString εδώ,
και πάλι, την κατανόηση κάθε γραμμή εδώ δεν είναι τόσο σημαντικό σήμερα.
Να σημειωθεί όμως ότι τελικά malloc καλεί και πάλι, και διαθέτει
ακριβώς όπως ο αριθμός των bytes που χρειάζεται για το string
και στη συνέχεια ρίχνει μακριά καλώντας δωρεάν, το υπερβολικά μεγάλο buffer,
αν πράγματι πήρε διπλασίασε πάρα πολλές φορές.
Με λίγα λόγια, αυτό είναι το πώς GetString έχει εργαστεί όλο αυτό το διάστημα.
Το μόνο που κάνει είναι να διαβάσει ένα χαρακτήρα σε μια στιγμή ξανά και ξανά και ξανά
και κάθε φορά που χρειάζεται κάποια επιπλέον μνήμη, ζητεί από το λειτουργικό σύστημα για να καλώντας realloc.
Οποιεσδήποτε ερωτήσεις; Εντάξει.
>> Μια επίθεση. Τώρα που καταλαβαίνουμε δείκτες, ή τουλάχιστον
είναι όλο και πιο εξοικειωμένοι με δείκτες,
ας αναλογιστούμε πως όλος ο κόσμος αρχίζει να καταρρέει
αν δεν είναι αρκετά υπερασπιστεί κατά αντιμωλία των χρηστών,
οι άνθρωποι που προσπαθούν να χαράξει στο σύστημά σας.
Οι άνθρωποι που προσπαθούν να κλέψουν το λογισμικό σας με παράκαμψη κάποιο κωδικό εγγραφής
ότι θα μπορούσαν διαφορετικά να πληκτρολογήσετε μέσα
Ρίξτε μια ματιά σε αυτό το παράδειγμα εδώ, το οποίο είναι απλά κώδικας C
που έχει μια κύρια λειτουργία στο κάτω μέρος, που καλεί μια συνάρτηση foo,
και τι είναι αυτό που περνά για foo; [Φοιτητικό] Ένα μοναδικό επιχείρημα.
Ενιαία >> επιχείρημα. Έτσι, argv [1], το οποίο σημαίνει ότι η πρώτη λέξη ο χρήστης πληκτρολογήσει
στη γραμμή εντολών μετά το a.out ή οτιδήποτε άλλο, το πρόγραμμα ονομάζεται.
Έτσι foo, στην κορυφή, παίρνει σε ένα char *, char * αλλά είναι ακριβώς αυτό;
String. Δεν υπάρχει τίποτα νέο εδώ, και ότι η σειρά είναι αυθαίρετα που ονομάζεται μπαρ.
Σε αυτή τη γραμμή εδώ, char c [12], το είδος των ημι-τεχνικά Αγγλικά, τι είναι αυτή η γραμμή να κάνει;
Array της -; Χαρακτήρες. Δώσε μου μια σειρά από 12 χαρακτήρες.
Έτσι, θα μπορούσαμε να ονομάσουμε αυτό ένα ρυθμιστικό. Είναι τεχνικά ονομάζεται c, αλλά ένα ρυθμιστικό στον προγραμματισμό
ακριβώς σημαίνει ένα σωρό χώρο που μπορείτε να βάλετε κάποια πράγματα μέσα
>> Στη συνέχεια, τέλος, memcpy, δεν έχουμε χρησιμοποιήσει στο παρελθόν.
Αλλά μπορείτε να μαντέψετε τι κάνει. Αυτό αντιγράφει τη μνήμη.
Τι κάνει; Λοιπόν, προφανώς αντιγράφει μπαρ, εισαγωγή του, στο γ,
αλλά μόνο μέχρι το μήκος της ράβδου.
Αλλά υπάρχει ένα bug εδώ.
Εντάξει, έτσι τεχνικά θα πρέπει να κάνουμε πραγματικά strlen (bar) x sizeof (char), το οποίο είναι σωστό.
Όμως, στη χειρότερη περίπτωση εδώ, ας υποθέσουμε ότι that's - έτσι, εντάξει.
Στη συνέχεια υπάρχουν 2 σφάλματα. Έτσι, sizeof (char), εντάξει, ας κάνουμε αυτό το λίγο μεγαλύτερο.
Έτσι τώρα υπάρχει ακόμα ένα bug, το οποίο είναι αυτό;
[Απάντηση Φοιτητής, ακατάληπτο] >> Έλεγχος για τι; Εντάξει, γι 'αυτό πρέπει να τον έλεγχο
για NULL, επειδή κακά πράγματα συμβαίνουν όταν ο δείκτης σας είναι NULL,
Επειδή μπορεί να καταλήξουν εκεί, και δεν θα πρέπει ποτέ να πρόκειται να NULL
με την εύρεση τιμών με το χειριστή *.
Έτσι, αυτό είναι καλό, και ό, τι άλλο κάνουμε; Λογικά υπάρχει ένα ελάττωμα εδώ.
[Απάντηση Φοιτητής, ακατάληπτο]
>> Ελέγξετε Έτσι, αν argc ≥ 2;
Εντάξει, έτσι είναι υπάρχουν 3 σφάλματα σε αυτό το πρόγραμμα εδώ.
Δεν είμαστε έλεγχο αν ο χρήστης πληκτρολογήσει πραγματικά σε οτιδήποτε σε argv [1], καλό.
Έτσι, αυτό που είναι το τρίτο σφάλμα; Ναι;
[Απάντηση Φοιτητής, ακατάληπτο] >> Καλή.
Γι 'αυτό και ελέγχεται ένα σενάριο. Θα ελέγχεται εμμέσως μην αντιγράψετε περισσότερη μνήμη
από ό, τι θα μπορούσε να υπερβαίνει το μήκος της ράβδου.
Έτσι, αν το string ο χρήστης πληκτρολογήσει είναι 10 χαρακτήρες,
αυτό που λέει, «μόνο αντιγράψετε 10 χαρακτήρες.
Και αυτό είναι εντάξει, αλλά τι γίνεται αν ο χρήστης πληκτρολογήσει σε μια λέξη στη γραμμή εντολών
σαν μια λέξη 20 χαρακτήρων? αυτό, λέγοντας αντίγραφο 20 χαρακτήρες από τη γραμμή σε ό, τι;
γ, αλλιώς γνωστή ως ρυθμιστικό μας, το οποίο σημαίνει ότι έγραψε μόνο τα δεδομένα
έως 8 θέσεις byte που δεν έχουν στην ιδιοκτησία τους,
και δεν τα κατέχουν, με την έννοια ότι ποτέ δεν τους διατίθενται.
Έτσι, αυτό είναι ό, τι είναι γενικά γνωστή ως η επίθεση υπερχείλισης buffer,
ή ρυθμιστικό υπέρβασης επίθεση, και αυτό είναι επίθεση με την έννοια ότι αν ο χρήστης
ή το πρόγραμμα που σας καλεί η λειτουργία σας κάνει αυτό κακόβουλα,
τι συμβαίνει στην πραγματικότητα επόμενο μπορούσε να είναι αρκετά κακό.
>> Ας ρίξουμε μια ματιά σε αυτή την εικόνα εδώ.
Αυτή η εικόνα αντιπροσωπεύει το stack σας μνήμη.
Και θυμάμαι ότι κάθε φορά που θα καλέσετε μια συνάρτηση,
μπορείτε να πάρετε αυτό το μικρό πλαίσιο στη στοίβα και στη συνέχεια ένα άλλο και στη συνέχεια ένα άλλο και στη συνέχεια ένα άλλο.
Και μέχρι τώρα έχουμε ακριβώς το είδος του αντλούμενου αυτά μακριά ως ορθογώνια
είτε υπάρχουν στο ταμπλό ή στην οθόνη εδώ.
Αλλά αν κάνετε ζουμ σε ένα από αυτά τα ορθογώνια,
όταν καλείτε μια συνάρτηση foo, αποδεικνύεται ότι υπάρχει κάτι περισσότερο στη στοίβα
εσωτερικό του εν λόγω πλαισίου και ορθογωνίου
από ό, τι ακριβώς x και y και α και β, όπως κάναμε μιλάμε για swap.
Αποδεικνύεται ότι υπάρχουν χαμηλότερου επιπέδου λεπτομέρειες,
μεταξύ των οποίων και η διεύθυνση επιστροφής.
Έτσι αποδεικνύεται όταν η κύρια καλεί foo, κυρίως έχει να ενημερώσει foo
ποια διεύθυνση είναι κύριος στη μνήμη του υπολογιστή.
Διότι αλλιώς, το συντομότερο foo γίνεται εκτέλεση, όπως στην προκειμένη περίπτωση εδώ,
μόλις φτάσετε σε αυτό το στενό άγκιστρο στο τέλος του foo,
πώς στο καλό δεν ξέρει πού foo ελέγχου του προγράμματος υποτίθεται ότι θα πάει;
Αποδεικνύεται ότι η απάντηση στο ερώτημα αυτό είναι σε αυτό το κόκκινο ορθογώνιο εδώ.
Αυτό αντιπροσωπεύει ένα δείκτη, και είναι στο χέρι του υπολογιστή για την αποθήκευση, προσωρινά,
για το λεγόμενο στοίβα τη διεύθυνση της κύριας έτσι ώστε το συντομότερο foo γίνεται εκτέλεση,
ο υπολογιστής ξέρει πού και τι γραμμή στην κύρια να πάει πίσω.
Αποθηκευμένες δείκτης πλαίσιο σχετίζεται παρόμοια με αυτό.
Char μπαρ * εδώ τι αντιπροσωπεύει;
Λοιπόν, τώρα αυτό το μπλε τμήμα είναι εδώ foo πλαίσιο, τι είναι το μπαρ;
Εντάξει, έτσι μπαρ είναι ακριβώς το επιχείρημα για τη λειτουργία foo.
>> Έτσι τώρα είμαστε πίσω στο οικείο εικόνα.
Υπάρχουν κι άλλα πράγματα και περισσότερο περισπασμούς στην οθόνη
αλλά αυτό το γαλάζιο τμήμα είναι αυτό που έχουμε με βάση την μαυροπίνακα για κάτι σαν swap.
Αυτό είναι το πλαίσιο για foo και το μόνο πράγμα που αυτή τη στιγμή είναι το μπαρ,
η οποία είναι αυτή η παράμετρος.
Αλλά τι άλλο θα πρέπει να είναι στη στοίβα, σύμφωνα με αυτόν τον κώδικα εδώ;
Char c [12]. Έτσι, θα πρέπει να δούμε επίσης 12 πλατείες της μνήμης,
κατανέμεται σε μια μεταβλητή που ονομάζεται c.
Και πράγματι έχουμε ότι στην οθόνη.
Η κορυφή δεν υπάρχει c [0], και στη συνέχεια, ο συγγραφέας αυτού του διαγράμματος
δεν ενοχλεί την κατάρτιση όλων των τετραγώνων, αλλά υπάρχουν πράγματι υπάρχουν 12
γιατί αν κοιτάξετε στο κάτω δεξιό μέρος, γ [11], αν συμπεριλάβουμε και από το 0, είναι οι 12 αυτές bytes.
Αλλά εδώ είναι το πρόβλημα: Σε ποια κατεύθυνση γ αυξάνεται;
Ταξινόμηση των άνω προς τα κάτω, έτσι δεν είναι; Εάν ξεκινά από την κορυφή και μεγαλώνει προς τα κάτω,
δεν μοιάζει με αφήσαμε τους εαυτούς μας πολύ διάδρομο εδώ καθόλου.
Έχουμε το είδος του εαυτού μας ζωγράφισε σε μια γωνιά,
και ότι c [11] είναι σωστό επάνω ενάντια μπαρ, το οποίο βρίσκεται ακριβώς πάνω από το πλαίσιο δείκτη στοίβας,
το οποίο είναι ακριβώς επάνω ενάντια διεύθυνση επιστροφή? δεν υπάρχει μεγαλύτερο περιθώριο.
Έτσι ποια είναι η επίπτωση, τότε, αν τα κάνεις θάλασσα,
και θα προσπαθήσουμε να διαβάσουμε 20 bytes σε ένα 12-byte buffer;
Σε περίπτωση που αυτές οι 8 επιπλέον bytes πρόκειται να πάει;
Μέσα από οτιδήποτε άλλο, μερικές από τις οποίες είναι εξαιρετικά σημαντικό.
Και το πιο σημαντικό πράγμα, ενδεχομένως, είναι το κόκκινο κουτί εκεί, η διεύθυνση επιστροφής.
Διότι ας υποθέσουμε ότι είστε είτε τυχαία είτε adversarially
αντικαταστήσετε τα 4 bytes, ότι ο δείκτης διεύθυνση,
όχι μόνο με τα κοινά, αλλά με έναν αριθμό που συμβαίνει να αντιπροσωπεύουν μια πραγματική διεύθυνση στη μνήμη;
Ποια είναι η implicaiton, λογικά;
[Απαντήσεις σπουδαστών, ακατάληπτο] >> Ακριβώς. Όταν επιστρέφει foo
και χτυπήματα που στήριγμα σγουρά, το πρόγραμμα πρόκειται να προχωρήσει όχι για να επιστρέψετε στην κύρια,
πρόκειται να επιστρέψει στην διεύθυνση ό, τι είναι σε αυτό το κόκκινο κουτί.
>> Τώρα, σε περίπτωση καταστρατήγησης εγγραφής λογισμικού,
ποια είναι η διεύθυνση που είναι επιστρέφονται στο είναι η συνάρτηση
που συνήθως παίρνει ονομάζεται μετά έχετε καταβάλει για το λογισμικό και εισάγεται κωδικό εγγραφής σας;
Μπορείτε να ταξινομήσετε του τέχνασμα ο υπολογιστής δεν πρόκειται σε εδώ, αλλά αντ 'αυτού, θα αυξηθεί μέχρι εδώ.
Ή, αν είστε πραγματικά έξυπνος, ένας αντίπαλος μπορεί πραγματικά να πληκτρολογήσετε στο πληκτρολόγιο,
Για παράδειγμα, δεν είναι μια πραγματική λέξη, δεν 20 χαρακτήρες, αλλά ας υποθέσουμε ότι αυτός ή αυτή
τύποι σε ορισμένες χαρακτήρες που αντιπροσωπεύουν τον κωδικό;
Και αυτό δεν πρόκειται να είναι C κώδικα, πρόκειται να είναι οι χαρακτήρες
που αποτελούν τους κωδικούς μηχανή δυαδικό, το 0 και 1.
Αλλά ας υποθέσουμε ότι είσαι αρκετά έξυπνος για να το κάνουμε αυτό, με κάποιο τρόπο να επικολλήσετε την άμεση GetString
κάτι που καταρτίζονται κατ 'ουσίαν κώδικα,
και τα τελευταία 4 bytes αντικαταστήσετε αυτή τη διεύθυνση επιστροφής, και ποια διεύθυνση κάνει ότι κάνει εισόδου;
Αποθηκεύει σε αυτό το κόκκινο ορθογώνιο η διεύθυνση του πρώτου byte του ρυθμιστικού.
Έτσι, θα πρέπει να είναι πραγματικά έξυπνος, και αυτό είναι ένα πολύ δοκιμής και λάθους
για τους κακούς ανθρώπους εκεί έξω, αλλά αν μπορείτε να υπολογίσετε πόσο μεγάλο είναι αυτό το ρυθμιστικό,
έτσι ώστε τα τελευταία λίγα bytes στην είσοδο που παρέχει στο πρόγραμμα
τυχαίνει να είναι ισοδύναμη με τη διεύθυνση από την έναρξη της buffer σας,
μπορείτε να το κάνετε αυτό. Αν λέμε, συνήθως, γειά σου, και \ 0, αυτό είναι ό, τι καταλήγει στο ρυθμιστικό.
Αλλά αν είμαστε πιο έξυπνοι και έχουμε γεμίσει το buffer με το τι θα καλέσουμε γενικά κώδικα επίθεσης,
Α, Α, Α, Α: Επίθεση, επίθεση, επίθεση, επίθεση, όπου αυτό είναι κάτι που κάνει κάτι κακό.
Λοιπόν, τι θα συμβεί αν είστε πραγματικά έξυπνο, μπορείτε να το κάνετε αυτό:
Στο κόκκινο κουτί εδώ είναι μια ακολουθία αριθμών: 80, CO, 35, 08.
Παρατηρήστε ότι ταιριάζει με τον αριθμό που είναι εδώ.
Είναι σε αντίστροφη σειρά, αλλά περισσότερο για αυτό κάποια άλλη στιγμή.
Σημειώστε ότι αυτή η διεύθυνση επιστροφής έχει σκόπιμα μεταβληθεί
να ισούται με τη διεύθυνση εδώ, δεν είναι η διεύθυνση της κύριας.
Έτσι, αν ο κακός είναι εξαιρετικά έξυπνος, αυτός ή αυτή πρόκειται να περιληφθούν στο εν λόγω κώδικα επίθεσης
κάτι σαν, "Διαγραφή όλων των αρχείων του χρήστη."
Ή «Αντιγράψτε τους κωδικούς πρόσβασης,» ή «Δημιουργήστε ένα λογαριασμό χρήστη που μπορώ να συνδεθείτε σε.
Οτιδήποτε σε όλα? Και αυτό είναι τόσο ο κίνδυνος και η δύναμη του C.
Επειδή έχετε πρόσβαση στη μνήμη μέσω των δεικτών
και μπορείτε να γράψετε ως εκ τούτου ό, τι θέλετε στη μνήμη ενός υπολογιστή.
Μπορείτε να κάνετε έναν υπολογιστή κάνει ό, τι θέλετε απλά
αφού το άλμα γύρω στο δικό του χώρο μνήμης του.
Και έτσι, μέχρι σήμερα, τόσα πολλά προγράμματα και τόσες πολλές ιστοσελίδες που είναι σε κίνδυνο
συνοψίζεται στους ανθρώπους να επωφεληθούν από αυτό.
Και αυτό μπορεί να φαίνεται σαν ένα υπερ-εξελιγμένο επίθεση,
αλλά δεν ξεκινά πάντα με αυτόν τον τρόπο.
>> Η πραγματικότητα είναι ότι ό, τι κακοί άνθρωποι θα κάνουν συνήθως είναι,
είτε πρόκειται για ένα πρόγραμμα σε μια γραμμή εντολών ή ένα πρόγραμμα GUI ή μια ιστοσελίδα,
είναι απλά να αρχίσει να προσφέρει ανοησίες.
Πληκτρολογείτε σε μια πραγματικά μεγάλη λέξη στο πεδίο αναζήτησης και πατήστε enter,
και σας περιμένουμε για να δούμε αν οι συντριβές ιστοσελίδα.
Εναλλακτικά, μπορείτε να περιμένετε να δείτε αν το πρόγραμμα εκδηλώνεται κάποιο μήνυμα λάθους.
Διότι, αν μπορείτε να πάρετε τυχεροί, καθώς ο κακός,
και θα παρέχουν κάποια τρελή εισόδου που κολλάει το πρόγραμμα,
αυτό σημαίνει ότι ο προγραμματιστής δεν πρόλαβε την κακή συμπεριφορά σας
το οποίο σημαίνει ότι μπορείτε να πιθανώς, με αρκετή προσπάθεια,
αρκετά δοκιμής και του λάθους, να καταλάβω πώς να ξεκινήσουν έναν πιο ακριβή επίθεση.
Έτσι, τόσο ένα μέρος της ασφάλειας δεν είναι απλώς αποφεύγοντας εντελώς αυτές τις επιθέσεις, αλλά και τον εντοπισμό τους
και στην πραγματικότητα κοιτάζοντας τα αρχεία καταγραφής και να δει τι τρελό είσοδοι έχουν πληκτρολογήσει τους ανθρώπους στην ιστοσελίδα σας.
Ποια όροι αναζήτησης έχουν οι άνθρωποι πληκτρολογήσει στην ιστοσελίδα σας με τις ελπίδες της υπερχείλισης κάποιου buffer;
Και αυτό όλα βράζει κάτω στην απλή βασικά του τι είναι ένας πίνακας,
και τι σημαίνει αυτό για την κατανομή και τη χρήση της μνήμης;
Και σχετικά με αυτό, επίσης, είναι αυτό.
>> Έτσι, ας ρίξουμε μια ματιά στο εσωτερικό του σκληρού δίσκου και πάλι.
Έτσι, θα θυμάστε από μια εβδομάδα ή δύο πριν ότι όταν μεταφέρετε αρχεία
σε κάδο ανακύκλωσης ή σκουπίδια σας μπορεί, τι συμβαίνει;
[Φοιτητικό] Τίποτα. >> Ναι, απολύτως τίποτα. Τελικά αν τρέχετε χαμηλά
ελεύθερος χώρος στο δίσκο, Windows ή Mac OS θα ξεκινήσει τη διαγραφή των αρχείων για εσάς.
Αλλά αν σύρετε κάτι εκεί, τότε δεν είναι καθόλου ασφαλή.
Όλα συγκάτοικο, φίλο ή μέλος της οικογένειας σας θα πρέπει να κάνετε είναι να κάνετε διπλό κλικ, και voila.
Υπάρχει όλοι οι πρόχειρες αρχεία που προσπαθήσατε να διαγράψετε.
Έτσι, οι περισσότεροι από εμάς γνωρίζουν τουλάχιστον ότι θα πρέπει να κάνετε δεξί κλικ ή τον έλεγχο κλικ
και αδειάστε το κάδο απορριμμάτων, ή κάτι τέτοιο.
Αλλά ακόμα και τότε, αυτό δεν κάνει αρκετά το κόλπο.
Γιατί αυτό που συμβαίνει όταν έχετε ένα αρχείο στο σκληρό σας δίσκο
που αντιπροσωπεύει κάποιο έγγραφο ή κάποια λέξη JPEG;
Και αυτό αντιπροσωπεύει το σκληρό δίσκο σας, και ας πούμε ότι αυτή η σχίζα εδώ αντιπροσωπεύει αυτό το αρχείο,
και αυτό είναι που αποτελείται από ένα σωρό από το 0 και 1.
Τι συμβαίνει όταν δεν είστε μόνο σύρετε το αρχείο στο κάδο ανακύκλωσης ή κάδο ανακύκλωσης,
αλλά επίσης αδειάσει;
Ταξινόμηση του τίποτα. Δεν είναι απολύτως τίποτα τώρα.
Τώρα είναι ακριβώς τίποτα, γιατί λίγο κάτι συμβαίνει με τη μορφή του πίνακα αυτού.
Έτσι, υπάρχει κάποιο είδος της βάσης δεδομένων ή πίνακα στο εσωτερικό της μνήμης ενός υπολογιστή
που έχει ουσιαστικά 1 στήλη για τα ονόματα αρχείων,
και 1 στήλη για την θέση του αρχείου, όπου αυτό μπορεί να είναι θέση 123, μόνο ένας τυχαίος αριθμός.
Έτσι, θα μπορούσαμε να έχουμε κάτι σαν X.jpg, και τη θέση 123.
Και τι θα συμβεί στη συνέχεια, όταν έχετε αδειάσει τα σκουπίδια σας;
Αυτό πηγαίνει μακριά. Αλλά ό, τι δεν πάει μακριά είναι το 0 και 1 του.
>> Έτσι τι, λοιπόν, η σύνδεση με PSET 4;
Λοιπόν, με PSET 4, μόνο και μόνο επειδή έχουμε διαγραφούν κατά λάθος
η συμπαγής κάρτα flash που είχαν όλες από αυτές τις φωτογραφίες,
ή απλά επειδή είναι από κακή τύχη έγινε κατεστραμμένο,
δεν σημαίνει ότι το 0 και το 1 δεν είναι ακόμα εκεί.
Ίσως μερικά από αυτά χάνονται επειδή κάτι έχει καταστραφεί
με την έννοια ότι ορισμένα μηδέν έγιναν 1 και 1 έγιναν 0 του.
Κακά πράγματα μπορούν να συμβούν λόγω της προβληματικό λογισμικό ή ελαττωματικό υλικό.
Αλλά πολλά από αυτά τα κομμάτια, ίσως ακόμη και 100% από αυτούς είναι ακόμα εκεί,
είναι ακριβώς ότι ο υπολογιστής ή η φωτογραφική μηχανή δεν ξέρει πού JPEG 1 άρχισε
και όπου JPEG 2 ξεκίνησε, αλλά αν, ο προγραμματιστής,
γνωρίζουν, με ένα κομμάτι του μυαλό, όταν τα αρχεία JPEG είναι ή τι μοιάζουν,
μπορείτε να αναλύσετε το 0 και το 1 και να πει, «Ooh. JPEG. Ooh, JPEG.
Μπορείτε να γράψετε ένα πρόγραμμα με ουσιαστικά μόνο ένα βρόχο for ή while
που ανακτά κάθε ένα από αυτά τα αρχεία.
Έτσι, το μάθημα λοιπόν, είναι να ξεκινήσει "ασφάλεια" διαγραφή αρχείων σας
αν θέλετε να το αποφύγετε αυτό εντελώς. Ναι;
[Ερώτηση Φοιτητών, ακατάληπτο]
>> Έχουν περισσότερη μνήμη από ό, τι κάνατε πριν -
Oh! Καλή ερώτηση. Γιατί, τότε, μετά το άδειασμα του κάδου απορριμμάτων,
ο υπολογιστής σας να σας πω ότι έχετε περισσότερο ελεύθερο χώρο από ό, τι κάνατε πριν;
Με λίγα λόγια, επειδή είναι ψέματα. Περισσότερα τεχνικά, έχετε περισσότερο χώρο.
Επειδή τώρα είπατε, μπορείτε να βάλετε άλλα πράγματα, όπου αυτό το αρχείο ήταν κάποτε,
αλλά αυτό δεν σημαίνει ότι τα bits πρόκειται μακριά,
και αυτό δεν σημαίνει ότι τα bits που άλλαξε Όλα τα 0, για παράδειγμα, για την προστασία σας.
Αντίθετα, αν «με ασφάλεια» τα αρχεία διαγράψει, ή φυσικά καταστρέψει τη συσκευή,
αυτό είναι πραγματικά ο μόνος τρόπος, μερικές φορές, γύρω από αυτό.
Γιατί λοιπόν να μην αφήσουμε σε αυτό το ημι-τρομακτικό σημείωμα, και εμείς θα σας δούμε τη Δευτέρα.
CS50.TV