1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Εβδομάδα 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Πανεπιστήμιο του Χάρβαρντ] 3 00:00:04,860 --> 00:00:07,260 [Αυτό είναι CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Αυτό είναι CS50, Εβδομάδα 5. 5 00:00:09,740 --> 00:00:12,900 Σήμερα και αυτή την εβδομάδα, έχουμε εισαγάγει ένα μικρό κομμάτι του κόσμου της εγκληματολογίας 6 00:00:12,900 --> 00:00:14,850 στο πλαίσιο του προβλήματος Σετ 4. 7 00:00:14,850 --> 00:00:18,480 Σήμερα θα είναι μια συνοπτική διάλεξη, επειδή υπάρχει μια ειδική εκδήλωση εδώ στη συνέχεια. 8 00:00:18,480 --> 00:00:21,940 Έτσι, θα ρίξουμε μια ματιά και να δώσουμε έμφαση τόσο οι μαθητές όσο και οι γονείς σήμερα 9 00:00:21,940 --> 00:00:24,600 με μερικά από τα πράγματα που είναι στον ορίζοντα. 10 00:00:24,600 --> 00:00:29,050 >> Ανάμεσά τους, από τη Δευτέρα, θα έχετε μερικές ακόμα συμμαθητές. 11 00:00:29,050 --> 00:00:32,980 EDX, του Χάρβαρντ και των νέων επιγραμμικών πρωτοβουλία του MIT για OpenCourseWare και περισσότερο, 12 00:00:32,980 --> 00:00:36,730 ξεκινά στην πανεπιστημιούπολη του Χάρβαρντ, τη Δευτέρα, γεγονός που σημαίνει ότι έρχονται Δευτέρα 13 00:00:36,730 --> 00:00:40,930 θα έχετε, ήδη από την προηγούμενη μέτρηση, 86.000 επιπλέον συμμαθητές 14 00:00:40,930 --> 00:00:43,680 ο οποίος θα παρακολουθεί μαζί με διαλέξεις και τμήματα του CS50 15 00:00:43,680 --> 00:00:45,890 και walkthroughs και σύνολα πρόβλημα. 16 00:00:45,890 --> 00:00:51,870 Και στο πλαίσιο αυτό, θα γίνουν μέλη της εναρκτήριας κατηγορίας του CS50 και τώρα CS50x. 17 00:00:51,870 --> 00:00:56,150 Στο πλαίσιο αυτό τώρα, να συνειδητοποιήσουν ότι θα υπάρξουν κάποιες upsides, καθώς και. 18 00:00:56,150 --> 00:01:00,620 Για να ετοιμαστείτε για αυτό, για τον τεράστιο αριθμό των φοιτητών, 19 00:01:00,620 --> 00:01:03,820 αρκεί να πούμε ότι ακόμα κι αν έχουμε 108 TFs και ΑΠ, 20 00:01:03,820 --> 00:01:07,560 δεν είναι αρκετά η καλύτερη αναλογία μαθητή-δασκάλου τη στιγμή που θα χτυπήσει 80.000 από τους μαθητές. 21 00:01:07,560 --> 00:01:09,830 Εμείς δεν πρόκειται να ταξινόμησης τόσα πολλά θέτει πρόβλημα χειροκίνητα, 22 00:01:09,830 --> 00:01:13,050 έτσι εισήγαγε αυτή την εβδομάδα στο σύνολο πρόβλημα θα είναι CS50 Έλεγχος, 23 00:01:13,050 --> 00:01:15,410 η οποία πρόκειται να είναι ένα βοηθητικό πρόγραμμα γραμμής εντολών εντός της συσκευής 24 00:01:15,410 --> 00:01:17,880 ότι θα πάρετε τη στιγμή που θα ενημερώσετε αργότερα αυτό το Σαββατοκύριακο. 25 00:01:17,880 --> 00:01:21,030 Θα είστε σε θέση να εκτελέσετε μια εντολή, check50, με δική σας PSET, 26 00:01:21,030 --> 00:01:24,770 και θα έχετε άμεση ανατροφοδότηση ως προς το αν το πρόγραμμά σας είναι σωστή ή λανθασμένη 27 00:01:24,770 --> 00:01:27,980 σύμφωνα με διάφορες προδιαγραφές σχεδιασμού που έχουμε παράσχει. 28 00:01:27,980 --> 00:01:30,310 Περισσότερα επ 'αυτού στο σύνολο προδιαγραφών πρόβλημα. 29 00:01:30,310 --> 00:01:34,220 Οι συμμαθητές CS50x θα πρέπει να χρησιμοποιούν αυτό ως καλά. 30 00:01:34,220 --> 00:01:36,170 >> Σετ Πρόβλημα 4 είναι όλα σχετικά με εγκληματολογίας, 31 00:01:36,170 --> 00:01:38,630 και αυτό PSET ήταν πραγματικά εμπνευσμένη από κάποια πραγματική ζωή τα πράγματα 32 00:01:38,630 --> 00:01:41,210 σύμφωνα με την οποία όταν ήμουν μεταπτυχιακή φοιτήτρια I εγκλεισθούν για λίγο 33 00:01:41,210 --> 00:01:45,270 με το γραφείο του εισαγγελέα του Middlesex County της εγκληματολογικής κάνει την εργασία 34 00:01:45,270 --> 00:01:47,660 με επικεφαλής ερευνητής ιατροδικαστική τους. 35 00:01:47,660 --> 00:01:50,280 Αυτό ανήλθαν σε, όπως ανέφερα νομίζω λίγες εβδομάδες το παρελθόν, 36 00:01:50,280 --> 00:01:52,720 είναι η κρατική αστυνομία ή άλλοι Μαζικής θα έρθει, 37 00:01:52,720 --> 00:01:56,150 θα πέσει από τα πράγματα όπως σκληρούς δίσκους και CD και δισκέτες και παρόμοια, 38 00:01:56,150 --> 00:01:58,770 και στη συνέχεια ο στόχος του γραφείου εγκληματολογίας ήταν να εξακριβωθεί 39 00:01:58,770 --> 00:02:01,470 αν υπήρχε ή δεν ήταν απόδειξη κάποιου είδους. 40 00:02:01,470 --> 00:02:04,730 Αυτή ήταν η Μονάδα Ειδικών Ερευνών, γι 'αυτό ήταν υπαλληλικό έγκλημα. 41 00:02:04,730 --> 00:02:10,949 Ήταν πιο ανησυχητικό είδος των εγκλημάτων, κάτι που περιλαμβάνει κάποιο είδος των ψηφιακών μέσων. 42 00:02:10,949 --> 00:02:16,450 Αποδεικνύεται ότι δεν είναι ότι πολλοί άνθρωποι γράφουν ένα e-mail λέγοντας, "το έκανα." 43 00:02:16,450 --> 00:02:20,490 Έτσι, πολύ συχνά, αυτές οι ιατροδικαστικές έρευνες δεν εμφανίζονται και τόσο πολύ τα φρούτα, 44 00:02:20,490 --> 00:02:22,820 αλλά μερικές φορές οι άνθρωποι θα έγραφε τέτοια emails. 45 00:02:22,820 --> 00:02:25,240 Έτσι, μερικές φορές, οι προσπάθειες ανταμείβονται. 46 00:02:25,240 --> 00:02:31,210 >> Αλλά για να οδηγήσει μέχρι αυτό το ιατροδικαστική PSET, εμείς θα πρέπει να εισάγει στην pset4 ένα κομμάτι των γραφικών. 47 00:02:31,210 --> 00:02:35,410 Μπορείτε να πάρετε αυτά τα πράγματα μάλλον δεδομένο - JPEG, GIF, και τα παρόμοια - αυτές τις μέρες. 48 00:02:35,410 --> 00:02:38,320 Αλλά αν πραγματικά το σκέφτομαι, μια εικόνα, μοιάζει πολύ με το πρόσωπο του Rob, 49 00:02:38,320 --> 00:02:41,270 θα μπορούσε να απεικονιστεί ως μια ακολουθία των κουκκίδων ή των εικονοστοιχείων. 50 00:02:41,270 --> 00:02:43,380 Στην περίπτωση του προσώπου του Rob, υπάρχει κάθε λογής χρώματα, 51 00:02:43,380 --> 00:02:46,760 και αρχίσαμε να βλέπουμε τις μεμονωμένες κουκίδες, αλλιώς γνωστή ως pixel, 52 00:02:46,760 --> 00:02:48,610 τη στιγμή που θα αρχίσει να μεγεθύνετε 53 00:02:48,610 --> 00:02:54,660 Αλλά αν έχουμε απλοποιήσει τον κόσμο λίγο και να πω ότι αυτό είναι εδώ Rob σε μαύρο και άσπρο, 54 00:02:54,660 --> 00:02:57,490 να εκπροσωπεί μαύρο και άσπρο, μπορούμε να χρησιμοποιήσουμε μόνο δυαδικό. 55 00:02:57,490 --> 00:03:01,660 Και αν θα πάμε να χρησιμοποιούν δυαδικό, 1 ή 0, μπορούμε να εκφράσουμε την ίδια εικόνα 56 00:03:01,660 --> 00:03:06,140 χαμογελαστό πρόσωπο του Rob με αυτό το μοτίβο των bits. 57 00:03:06,140 --> 00:03:12,100 11000011 αντιπροσωπεύει το λευκό, λευκό, μαύρο, μαύρο, μαύρο, μαύρο, λευκό, λευκό. 58 00:03:12,100 --> 00:03:16,150 Και γι 'αυτό δεν είναι ένα τεράστιο άλμα στη συνέχεια να αρχίσουμε να μιλάμε για έγχρωμες φωτογραφίες, 59 00:03:16,150 --> 00:03:18,600 πράγματα που θα βλέπατε στο Facebook ή να με μια ψηφιακή φωτογραφική μηχανή. 60 00:03:18,600 --> 00:03:21,410 Αλλά βεβαίως, όταν πρόκειται για τα χρώματα, θα πρέπει να έχετε περισσότερα bits. 61 00:03:21,410 --> 00:03:25,690 Και αρκετά κοινό στον κόσμο των φωτογραφιών είναι να χρησιμοποιήσετε δεν 1-bit χρώματος, 62 00:03:25,690 --> 00:03:29,560 όπως αυτό προτείνει, αλλά 24-bit χρώμα, όπου μπορείτε να πάρετε πραγματικά εκατομμύρια χρώματα. 63 00:03:29,560 --> 00:03:32,250 Έτσι, όπως στην περίπτωση όταν μεγεθύνεται στο μάτι του Rob, 64 00:03:32,250 --> 00:03:36,370 που ήταν οποιοσδήποτε αριθμός εκατομμυρίων διαφορετικών δυνατοτήτων πολύχρωμα. 65 00:03:36,370 --> 00:03:39,040 Γι 'αυτό και θα εισαγάγει αυτό το πρόβλημα Σετ 4, καθώς και στην περιδιάβαση, 66 00:03:39,040 --> 00:03:43,370 η οποία θα είναι σήμερα στις 3:30 αντί της συνήθους 2:30 λόγω διάλεξη της Παρασκευής εδώ. 67 00:03:43,370 --> 00:03:46,620 Όμως, το βίντεο θα είναι σε απευθείας σύνδεση, ως συνήθως, αύριο. 68 00:03:46,620 --> 00:03:48,820 >> Θα σας παρουσιάσουμε επίσης σε άλλη μορφή αρχείου. 69 00:03:48,820 --> 00:03:51,270 Αυτό σήμαινε σκόπιμα να δούμε τον εκφοβισμό κατά την πρώτη, 70 00:03:51,270 --> 00:03:55,670 αλλά αυτό είναι μόνο μερικά έγγραφα για struct C. 71 00:03:55,670 --> 00:03:58,940 Αποδεικνύεται ότι η Microsoft χρόνια βοήθησε να διαδώσει αυτή τη μορφή 72 00:03:58,940 --> 00:04:05,150 ονομάζεται η μορφή αρχείου bitmap, bmp, και αυτό ήταν μια εξαιρετικά απλή, πολύχρωμα γραφικά μορφή αρχείου 73 00:04:05,150 --> 00:04:10,150 που χρησιμοποιήθηκε για αρκετό καιρό και μερικές φορές ακόμα για ταπετσαρίες για επιτραπέζιους υπολογιστές. 74 00:04:10,150 --> 00:04:14,760 Αν νομίζετε ότι πίσω στα Windows XP και τους λόφους και το γαλάζιο του ουρανού, 75 00:04:14,760 --> 00:04:17,170 που ήταν συνήθως μια εικόνα bitmap ή bmp. 76 00:04:17,170 --> 00:04:19,959 Bitmaps είναι διασκέδαση για μας, επειδή έχουν ένα λίγο πιο περίπλοκο. 77 00:04:19,959 --> 00:04:22,610 Δεν είναι αρκετά τόσο απλό όσο αυτό το πλέγμα των 0s και 1s. 78 00:04:22,610 --> 00:04:27,510 Αντ 'αυτού, έχετε τα πράγματα όπως μια κεφαλίδα στην αρχή ενός αρχείου. 79 00:04:27,510 --> 00:04:31,990 Έτσι με άλλα λόγια, μέσα από ένα αρχείο. Bmp είναι ένα σωρό 0s και 1s, 80 00:04:31,990 --> 00:04:34,910 αλλά υπάρχει κάποια επιπλέον 0s και 1s εκεί. 81 00:04:34,910 --> 00:04:38,220 Και αποδεικνύεται ότι αυτό που έχουμε κατά πάσα πιθανότητα θεωρείται δεδομένη για τα επόμενα χρόνια - 82 00:04:38,220 --> 00:04:45,170 μορφές αρχείων όπως. doc ή. xls ή. mp3,. mp4, όποια και αν είναι οι μορφές αρχείων 83 00:04:45,170 --> 00:04:48,480 ότι είστε εξοικειωμένοι με - τι σημαίνει αυτό ακόμα να είναι μια μορφή αρχείου, 84 00:04:48,480 --> 00:04:52,480 διότι στο τέλος της ημέρας, όλα αυτά τα αρχεία που χρησιμοποιούμε έχουν μόνο 0s και 1s. 85 00:04:52,480 --> 00:04:56,810 Και ίσως αυτά 0s και 1s αντιπροσωπεύουν ABC μέσω ASCII ή τα παρόμοια, 86 00:04:56,810 --> 00:04:58,820 αλλά στο τέλος της ημέρας, είναι ακόμα μόνο 0s και 1s. 87 00:04:58,820 --> 00:05:02,100 Έτσι, οι άνθρωποι απλώς περιστασιακά αποφασίσει να εφεύρει μια νέα μορφή αρχείου 88 00:05:02,100 --> 00:05:06,420 όπου τυποποίηση τι σχέδια των bits θα σημαίνει πραγματικά. 89 00:05:06,420 --> 00:05:09,220 Και σε αυτή την περίπτωση εδώ, οι λαοί που σχεδίασε το bitmap μορφή αρχείου 90 00:05:09,220 --> 00:05:15,620 είπε ότι στο πρώτο byte σε ένα αρχείο bitmap, όπως υποδηλώνεται από αντιστάθμιση 0 εκεί, 91 00:05:15,620 --> 00:05:18,940 υπάρχει μετάβαση να είναι κάποια μυστική ονομασία μεταβλητή που ονομάζεται bfType, 92 00:05:18,940 --> 00:05:23,080 το οποίο σημαίνει απλά bitmap τύπο αρχείου, τον τύπο του αρχείου bitmap είναι αυτό. 93 00:05:23,080 --> 00:05:27,700 Μπορείτε να συμπεράνουμε ίσως από τη δεύτερη γραμμή που αντισταθμίζεται 2, αριθμός byte 2, 94 00:05:27,700 --> 00:05:33,740 έχει ένα σχέδιο 0s και 1s που αντιπροσωπεύει ό, τι; Το μέγεθος του κάτι. 95 00:05:33,740 --> 00:05:35,310 Και συνεχίζει από εκεί. 96 00:05:35,310 --> 00:05:37,410 Έτσι, στο σύνολο Πρόβλημα 4, θα πρέπει να περάσει μέσα από κάποια από αυτά τα πράγματα. 97 00:05:37,410 --> 00:05:39,520 Εμείς δεν θα καταλήξουν να νοιάζονται για όλα αυτά. 98 00:05:39,520 --> 00:05:47,510 Αλλά παρατηρήσετε ότι αρχίζει να παίρνει ενδιαφέρον γύρω από byte 54: rgbtBlue, πράσινο και κόκκινο. 99 00:05:47,510 --> 00:05:52,110 Αν έχετε ποτέ ακούσει το ακρωνύμιο RGB - κόκκινο, πράσινο, μπλε - αυτή είναι μια αναφορά στο ότι 100 00:05:52,110 --> 00:05:54,610 γιατί βγάζει μπορείτε να ζωγραφίσει όλα τα χρώματα του ουράνιου τόξου 101 00:05:54,610 --> 00:05:58,180 με κάποιο συνδυασμό του κόκκινου και του μπλε και του πράσινου. 102 00:05:58,180 --> 00:06:03,320 Και στην πραγματικότητα, οι γονείς στο δωμάτιο θα μπορούσε να υπενθυμίσουμε μερικά από τα πρώτα προβολείς. 103 00:06:03,320 --> 00:06:05,890 Αυτές τις μέρες, μπορείτε απλά να δείτε ένα λαμπρό φως που βγαίνει από ένα φακό, 104 00:06:05,890 --> 00:06:09,800 αλλά πίσω στην ημέρα που είχε το κόκκινο φακό, το μπλε φακό, και το πράσινο φακό, 105 00:06:09,800 --> 00:06:13,380 και μαζί με στόχο την οθόνη και σχηματίζεται μια πολύχρωμη εικόνα. 106 00:06:13,380 --> 00:06:16,270 Και αρκετά συχνά, γυμνάσια και λύκεια θα έχουν αυτές οι φακοί 107 00:06:16,270 --> 00:06:19,720 πάντα τόσο ελαφρώς στραβό, έτσι ώστε να ήταν το είδος του βλέποντας δίκλινα ή τρίκλινα εικόνες. 108 00:06:19,720 --> 00:06:24,100 Αλλά αυτό ήταν η ιδέα. Είχες κόκκινο και πράσινο και μπλε φως ζωγραφική μια εικόνα. 109 00:06:24,100 --> 00:06:26,590 Και ότι η ίδια αρχή χρησιμοποιείται σε υπολογιστές. 110 00:06:26,590 --> 00:06:30,230 >> Έτσι, μεταξύ των προκλήσεων τότε για εσάς σε πρόβλημα Σύνολο 4 πρόκειται να είναι μερικά πράγματα. 111 00:06:30,230 --> 00:06:34,800 Η μία είναι να αλλάξετε το μέγεθος μιας εικόνας στην πραγματικότητα, να λάβει σε ένα μοτίβο των 0 και 1, 112 00:06:34,800 --> 00:06:40,200 καταλάβω ποια κομμάτια του 0s και 1s αντιπροσωπεύουν ό, τι σε μια δομή όπως αυτή, 113 00:06:40,200 --> 00:06:43,630 και στη συνέχεια να καταλάβω πώς να αναπαράγουν τα pixels - τα κόκκινα, τα μπλε, τα πράσινα - 114 00:06:43,630 --> 00:06:46,660 εσωτερικό έτσι ώστε όταν μια εικόνα μοιάζει με αυτό αρχικά, 115 00:06:46,660 --> 00:06:49,210 θα μπορούσε να μοιάζει με αυτό αντί μετά από αυτό. 116 00:06:49,210 --> 00:06:53,640 Μεταξύ των άλλων προκλήσεων που πολύ θα είναι ότι θα πρέπει να δοθεί μια εικόνα ιατροδικαστική 117 00:06:53,640 --> 00:06:56,030 από ένα πραγματικό αρχείο από μια ψηφιακή φωτογραφική μηχανή. 118 00:06:56,030 --> 00:06:58,960 Και σε αυτή φωτογραφική μηχανή, μια φορά κι έναν καιρό, ήταν ένα σωρό φωτογραφίες. 119 00:06:58,960 --> 00:07:03,760 Το πρόβλημα είναι ότι διαγραφούν κατά λάθος ή η εικόνα είχε καταστραφεί κατά κάποιο τρόπο. 120 00:07:03,760 --> 00:07:05,750 Κακά πράγματα συμβαίνουν με τις ψηφιακές φωτογραφικές μηχανές. 121 00:07:05,750 --> 00:07:09,150 Και γι 'αυτό αντιγράφονται γρήγορα όλα τα 0s και 1s μακριά από αυτή την κάρτα για σας, 122 00:07:09,150 --> 00:07:13,610 αποθηκεύσει όλα αυτά σε ένα μεγάλο αρχείο, και στη συνέχεια θα τα παραδώσουμε σε σας πρόβλημα Σετ 4 123 00:07:13,610 --> 00:07:19,320 έτσι ώστε να μπορείτε να γράψετε ένα πρόγραμμα σε C με την οποία να ανακτήσει όλα αυτά τα αρχεία JPEG, ιδανικά. 124 00:07:19,320 --> 00:07:23,330 Και αποδεικνύεται ότι τα αρχεία JPEG, ακόμα κι αν είστε κάπως μιας σύνθετης μορφής αρχείου - 125 00:07:23,330 --> 00:07:26,360 ότι είναι πολύ πιο περίπλοκη από ό, τι αυτό το χαμογελαστό πρόσωπο εδώ - 126 00:07:26,360 --> 00:07:31,160 αποδεικνύεται ότι κάθε JPEG ξεκινά με τα ίδια πρότυπα της 0s και 1s. 127 00:07:31,160 --> 00:07:35,630 Έτσι, χρησιμοποιώντας, εν τέλει, ένα βρόχο while ή ένα βρόχο for ή παρόμοια, 128 00:07:35,630 --> 00:07:38,880 μπορείτε να επαναλάβει πάνω από όλα την 0s και 1s σε αυτή την ιατροδικαστική εικόνα, 129 00:07:38,880 --> 00:07:43,150 και κάθε φορά που θα δείτε το ειδικό σχέδιο που έχει προσδιοριστεί στο σύνολο προδιαγραφές πρόβλημα, 130 00:07:43,150 --> 00:07:47,880 μπορείτε να υποθέσετε είναι εδώ, με πολύ μεγάλη πιθανότητα, η έναρξη μιας JPEG. 131 00:07:47,880 --> 00:07:51,230 Και το συντομότερο μπορείτε να βρείτε το ίδιο μοτίβο κάποια αριθμός των bytes 132 00:07:51,230 --> 00:07:55,430 ή kilobytes ή megabytes αργότερα, μπορείτε να υποθέσετε εδώ είναι ένα δεύτερο JPEG, 133 00:07:55,430 --> 00:07:57,380 η φωτογραφία πήρα μετά την πρώτη. 134 00:07:57,380 --> 00:08:01,370 Επιτρέψτε μου να σταματήσετε να διαβάζετε αυτό το πρώτο αρχείο, αρχίσει να γράψω αυτό το νέο, 135 00:08:01,370 --> 00:08:06,310 και η έξοδος του προγράμματος σας για pset4 πρόκειται να είναι όσο το 50 αρχεία JPEG. 136 00:08:06,310 --> 00:08:09,270 Και αν δεν είναι 50 αρχεία JPEG, έχετε ένα κομμάτι ενός βρόχου. 137 00:08:09,270 --> 00:08:12,490 Εάν έχετε έναν άπειρο αριθμό των αρχεία JPEG, έχετε ένα άπειρο βρόχο. 138 00:08:12,490 --> 00:08:14,910 Έτσι, ότι πολύ θα είναι αρκετά μια κοινή υπόθεση. 139 00:08:14,910 --> 00:08:16,600 Έτσι, αυτό είναι αυτό που είναι στον ορίζοντα. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 πίσω μας, συνειδητοποιούν ανά e-mail μου ότι πάντα υπάρχουν λαοί που είναι τόσο χαρούμενος, 141 00:08:21,310 --> 00:08:23,640 είδος του ουδέτερου, και λυπημένος γύρω κουίζ χρόνο 0. 142 00:08:23,640 --> 00:08:26,800 Και παρακαλώ να φτάσει σε μένα, το κεφάλι TF Zamyla, τη δική σας TF, 143 00:08:26,800 --> 00:08:31,180 ή μία από τις αρμόδιες αρχές ότι γνωρίζετε αν θέλετε να συζητήσουμε για το πώς πήγαν τα πράγματα. 144 00:08:31,180 --> 00:08:35,539 >> Έτσι για να εντυπωσιάσουν τους γονείς εδώ στην αίθουσα, ποια είναι η CS50 βιβλιοθήκη; 145 00:08:36,429 --> 00:08:40,390 [Γέλια] Καλή δουλειά. 146 00:08:40,390 --> 00:08:48,340 Ποια είναι η CS50 βιβλιοθήκη; Ναι. >> [Φοιτητής] Είναι ένα προ-γραπτό σύνολο του κώδικα [δεν ακούγεται] 147 00:08:48,340 --> 00:08:49,750 Εντάξει, καλά. 148 00:08:49,750 --> 00:08:53,240 Είναι ένα προ-γραπτό σύνολο του κώδικα που έγραψε το προσωπικό, σας παρέχουμε, 149 00:08:53,240 --> 00:08:55,030 που παρέχει κάποια κοινή λειτουργικότητα, 150 00:08:55,030 --> 00:08:59,020 πράγματα όπως η πάρτε μια σειρά, φέρε μου ένα int - όλες τις λειτουργίες που αναφέρονται εδώ. 151 00:08:59,020 --> 00:09:02,260 >> Ξεκινώντας τώρα, αρχίζουμε να πάρει πραγματικά αυτές τις ρόδες μακριά. 152 00:09:02,260 --> 00:09:05,050 Εμείς πάμε για να ξεκινήσει να πάρει μια σειρά από εσάς, 153 00:09:05,050 --> 00:09:08,870 που ανάκληση ήταν απλά ένα συνώνυμο για το τι πραγματικά τύπο δεδομένων; >> [Πολλαπλές φοιτητές] * Χαρ. 154 00:09:08,870 --> 00:09:12,730 * Χαρ. Για τους γονείς, η οποία ήταν κατά πάσα πιθανότητα [κάνει whooshing ήχου]. Αυτό είναι καλό. 155 00:09:12,730 --> 00:09:17,550 Char * θα αρχίσουμε να βλέπουμε στην οθόνη όλα τα πιο όπως έχουμε αφαιρέσει από το λεξιλόγιό σειρά μας, 156 00:09:17,550 --> 00:09:19,730 τουλάχιστον όταν πρόκειται για την πραγματικότητα γράφοντας κώδικα. 157 00:09:19,730 --> 00:09:22,840 Ομοίως, θα σταματήσει να χρησιμοποιεί κάποια από αυτές τις λειτουργίες, όπως πολύ 158 00:09:22,840 --> 00:09:25,280 επειδή τα προγράμματά μας πρόκειται να πάρει πιο εξελιγμένα. 159 00:09:25,280 --> 00:09:28,480 Αντί να γράφουν απλά προγράμματα που κάθονται εκεί με μια προτροπή να αναβοσβήνει, 160 00:09:28,480 --> 00:09:31,870 περιμένει το χρήστη να τυπώσει κάτι, θα πάρετε τις εισροές σας από κάπου αλλού. 161 00:09:31,870 --> 00:09:35,490 Για παράδειγμα, θα τα πάρετε από μια σειρά από bits στον τοπικό σκληρό δίσκο. 162 00:09:35,490 --> 00:09:38,580 Θα τους πάρει αντ 'αυτού στο μέλλον από μια σύνδεση δικτύου, 163 00:09:38,580 --> 00:09:40,230 κάποια ιστοσελίδα κάπου. 164 00:09:40,230 --> 00:09:44,110 >> Ας φλούδα πίσω αυτό το στρώμα για πρώτη φορά και τραβήξτε το CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 και αυτό το αρχείο ονομάζεται cs50.h, που έχετε # συμπεριλαμβανομένου για εβδομάδες, 166 00:09:49,010 --> 00:09:51,140 αλλά ας δούμε τι πραγματικά είναι μέσα από αυτό. 167 00:09:51,140 --> 00:09:54,430 Η κορυφή του αρχείου στο μπλε είναι απλώς ένα σωρό σχόλια: 168 00:09:54,430 --> 00:09:57,050 πληροφορίες εγγύησης και τη χορήγηση αδειών. 169 00:09:57,050 --> 00:09:59,050 Αυτό είναι ένα είδος κοινό παράδειγμα στον τομέα του λογισμικού 170 00:09:59,050 --> 00:10:01,580 επειδή πολλά από λογισμικό αυτές τις μέρες είναι ό, τι λέγεται open source, 171 00:10:01,580 --> 00:10:05,220 πράγμα που σημαίνει ότι κάποιος έχει γράψει τον κώδικα και το έκανε ελεύθερα διαθέσιμο 172 00:10:05,220 --> 00:10:10,470 όχι μόνο για να τρέξει και να χρησιμοποιήσει, αλλά στην πραγματικότητα για να διαβάσετε και να αλλάξει και να ενσωματώσει στο δικό σας έργο. 173 00:10:10,470 --> 00:10:14,660 Έτσι, αυτό είναι ό, τι έχετε χρησιμοποιήσει, το λογισμικό ανοιχτού κώδικα, αν και σε πολύ μικρή μορφή. 174 00:10:14,660 --> 00:10:18,560 Αν μετακινηθείτε προς τα κάτω μετά από τα σχόλια, όμως, θα αρχίσουμε να βλέπουμε κάποια πράγματα πιο οικεία. 175 00:10:18,560 --> 00:10:25,010 Ανακοίνωση στην κορυφή εδώ ότι το αρχείο cs50.h περιλαμβάνει ένα σωρό αρχεία κεφαλίδας. 176 00:10:25,010 --> 00:10:28,560 Οι περισσότερες από αυτές, δεν έχουμε δει πριν, αλλά ένα είναι εξοικειωμένοι. 177 00:10:28,560 --> 00:10:32,270 Ποια από αυτά έχουμε δει, έστω και για λίγο, μέχρι στιγμής; >> [Φοιτητής] Βασική βιβλιοθήκη. 178 00:10:32,270 --> 00:10:35,810 Ναι, πρότυπη βιβλιοθήκη. stdlib.h έχει malloc. 179 00:10:35,810 --> 00:10:38,320 Μόλις αρχίσαμε να μιλάμε για δυναμική κατανομή μνήμης, 180 00:10:38,320 --> 00:10:41,650 το οποίο θα επανέλθουμε την επόμενη εβδομάδα, καθώς, όπως αρχίσαμε αυτό το αρχείο. 181 00:10:41,650 --> 00:10:46,640 Αποδεικνύεται ότι bool και αληθινό και το ψεύτικο, δεν υπάρχει στην πραγματικότητα σε C per se 182 00:10:46,640 --> 00:10:49,440 εκτός και αν έχετε συμπεριλάβει αυτό το αρχείο εδώ. 183 00:10:49,440 --> 00:10:52,710 Έχουμε εδώ και εβδομάδες έχουν συμπεριλαμβανομένης stdbool.h 184 00:10:52,710 --> 00:10:55,620 έτσι ώστε να μπορείτε να χρησιμοποιήσετε την έννοια του ένα bool, αληθής ή ψευδής. 185 00:10:55,620 --> 00:10:58,620 Χωρίς αυτό, θα πρέπει να ταξινομήσετε από το ψεύτικο και να χρησιμοποιήσετε ένα int 186 00:10:58,620 --> 00:11:02,610 και μόλις αυθαίρετα υποθέσουμε ότι 0 είναι ψευδής και 1 είναι αλήθεια. 187 00:11:02,610 --> 00:11:07,150 Αν μετακινηθείτε προς τα κάτω, εδώ είναι ο ορισμός μας από μια σειρά. 188 00:11:07,150 --> 00:11:11,390 Αποδεικνύεται, όπως έχουμε ξαναπεί, ότι όταν αυτό το αστέρι είναι δεν πειράζει πραγματικά. 189 00:11:11,390 --> 00:11:13,720 Μπορείτε να έχετε ακόμη χώρο γύρω. 190 00:11:13,720 --> 00:11:16,740 Έχουμε αυτό το εξάμηνο έχουν την προώθηση και αυτό να καταστεί σαφές 191 00:11:16,740 --> 00:11:18,620 ότι το αστέρι έχει να κάνει με το είδος, 192 00:11:18,620 --> 00:11:21,700 αλλά αντιλαμβάνονται κάτι πολύ κοινό, αν όχι λίγο πιο κοινή, 193 00:11:21,700 --> 00:11:24,430 είναι να το βάλετε εκεί, αλλά λειτουργικά είναι το ίδιο πράγμα. 194 00:11:24,430 --> 00:11:27,720 Τώρα, όμως, αν διαβάσουμε μειωθεί περαιτέρω, ας ρίξουμε μια ματιά στο GetInt 195 00:11:27,720 --> 00:11:32,190 επειδή χρησιμοποιήσαμε ότι ίσως η πρώτη πριν από οτιδήποτε άλλο αυτό το εξάμηνο. 196 00:11:32,190 --> 00:11:37,440 Εδώ είναι GetInt. Αυτό είναι ό, τι; >> [Φοιτητής] Ένα πρωτότυπο. >> Αυτό είναι μόνο ένα πρωτότυπο. 197 00:11:37,440 --> 00:11:41,410 Συχνά, έχουμε θέσει πρωτότυπα στις κορυφές των μας. Γ αρχεία, 198 00:11:41,410 --> 00:11:46,690 αλλά μπορείτε να βάλετε επίσης σε πρωτότυπα αρχεία κεφαλίδας, αρχεία. h, όπως αυτό εδώ 199 00:11:46,690 --> 00:11:50,840 έτσι ώστε όταν γράφετε σε ορισμένες λειτουργίες που θέλετε άλλους ανθρώπους για να είναι σε θέση να χρησιμοποιήσει, 200 00:11:50,840 --> 00:11:53,550 η οποία είναι ακριβώς η περίπτωση με τη βιβλιοθήκη CS50, 201 00:11:53,550 --> 00:11:57,040 μπορείτε όχι μόνο να εφαρμόσουν τις λειτουργίες σας σε κάτι σαν cs50.c, 202 00:11:57,040 --> 00:12:02,790 βάζετε επίσης τα πρωτότυπα όχι στην κορυφή του εν λόγω φακέλου, αλλά στην κορυφή ενός αρχείου κεφαλίδας. 203 00:12:02,790 --> 00:12:07,170 Στη συνέχεια, το αρχείο κεφαλίδας είναι αυτό που περιλαμβάνει τους φίλους και τους συναδέλφους 204 00:12:07,170 --> 00:12:09,760 # include με το δικό τους κώδικα. 205 00:12:09,760 --> 00:12:12,210 Έτσι, όλο αυτό το διάστημα, έχετε συμπεριλαμβανομένων όλων αυτών των πρωτοτύπων, 206 00:12:12,210 --> 00:12:16,580 αποτελεσματικά στην κορυφή του αρχείου σας, αλλά με τον τρόπο του αυτό περιλαμβάνει # μηχανισμό, 207 00:12:16,580 --> 00:12:20,070 η οποία ουσιαστικά αντίγραφα και πάστες αυτό το αρχείο στο δικό σας. 208 00:12:20,070 --> 00:12:23,070 Εδώ είναι μερικές αρκετά λεπτομερή τεκμηρίωση. 209 00:12:23,070 --> 00:12:25,640 Έχουμε λίγο πολύ δεδομένο ότι GetInt παίρνει μια int, 210 00:12:25,640 --> 00:12:27,640 αλλά αποδεικνύεται ότι υπάρχουν ορισμένες περιπτώσεις γωνία. 211 00:12:27,640 --> 00:12:31,810 Τι θα συμβεί αν ο χρήστης πληκτρολογεί σε έναν αριθμό που είναι πάρα πολύ μεγάλο, ένα τετράκις εκατομμύρια, 212 00:12:31,810 --> 00:12:35,490 που απλά δεν μπορεί να χωρέσει μέσα του έναν int; Ποια είναι η αναμενόμενη συμπεριφορά; 213 00:12:35,490 --> 00:12:38,020 Ιδανικά, αυτό είναι προβλέψιμη. 214 00:12:38,020 --> 00:12:40,280 Έτσι, σε αυτή την περίπτωση, αν διαβάσει πραγματικά τα ψιλά γράμματα, 215 00:12:40,280 --> 00:12:44,500 θα δείτε πραγματικά ότι, αν η γραμμή δεν μπορεί να διαβάσει, αυτό το INT_MAX επιστρέφει. 216 00:12:44,500 --> 00:12:48,320 Εμείς ποτέ δεν έχω μιλήσει για αυτό, αλλά με βάση την κεφαλαιοποίησή της, ποιο είναι κατά πάσα πιθανότητα; 217 00:12:48,320 --> 00:12:50,640 [Φοιτητής] Μια σταθερή. >> Είναι μια σταθερά. 218 00:12:50,640 --> 00:12:54,770 Είναι κάποια ειδική σταθερά που είναι πιθανόν να δηλώνονται σε μία από αυτά τα αρχεία κεφαλίδας 219 00:12:54,770 --> 00:13:00,090 αυτό είναι ψηλότερα στο αρχείο, και INT_MAX είναι πιθανώς κάτι σαν 2 δισεκατομμύρια περίπου, 220 00:13:00,090 --> 00:13:04,990 η ιδέα είναι ότι επειδή πρέπει να δηλώσουν κατά κάποιο τρόπο ότι κάτι πήγε στραβά, 221 00:13:04,990 --> 00:13:10,700 εμείς, ναι, έχουν 4 δισεκατομμύρια αριθμούς στη διάθεσή μας: -2 δισεκατομμύρια ευρώ έως 2 δισ. ευρώ, ή να δώσει. 222 00:13:10,700 --> 00:13:14,710 Λοιπόν, αυτό που είναι κοινό στον προγραμματισμό είναι να κλέψει ένα μόνο από αυτούς τους αριθμούς, 223 00:13:14,710 --> 00:13:18,920 ίσως 0, ίσως 2 δισ. ευρώ, ίσως -2 δισεκατομμύρια, 224 00:13:18,920 --> 00:13:23,280 έτσι ώστε να περάσετε μία από τις πιθανές τιμές σας, έτσι ώστε να μπορείτε να δεσμευτούν για τον κόσμο 225 00:13:23,280 --> 00:13:26,820 ότι αν κάτι πάει στραβά, θα επιστρέψει αυτή την εξαιρετικά μεγάλη αξία. 226 00:13:26,820 --> 00:13:31,030 Αλλά δεν θέλετε ο χρήστης πληκτρολογώντας κάτι αινιγματικά σαν 234 ..., ένα πολύ μεγάλο αριθμό. 227 00:13:31,030 --> 00:13:34,060 Μπορείτε να το γενικεύσουμε, αντί ως σταθερή. 228 00:13:34,060 --> 00:13:38,060 Έτσι, πραγματικά, αν ήταν να πρωκτικό τις τελευταίες εβδομάδες, κάθε φορά που καλείται GetInt, 229 00:13:38,060 --> 00:13:42,900 θα πρέπει να έχουν τον έλεγχο με μια κατάσταση, αν έκανε τον τύπο του χρήστη σε INT_MAX, 230 00:13:42,900 --> 00:13:46,590 ή, πιο συγκεκριμένα, έκανε GetInt INT_MAX επιστροφή, γιατί αν το έκανε, 231 00:13:46,590 --> 00:13:51,830 αυτό σημαίνει ότι στην πραγματικότητα δεν το πληκτρολογήσετε. Κάτι πήγε στραβά σε αυτήν την περίπτωση. 232 00:13:51,830 --> 00:13:56,080 Έτσι, αυτό είναι ό, τι είναι γενικά γνωστό ως αξία φρουρός, που σημαίνει ακριβώς το ιδιαίτερο. 233 00:13:56,080 --> 00:13:58,120 >> Ας στραφούμε τώρα στο αρχείο. C. 234 00:13:58,120 --> 00:14:01,340 Το αρχείο C υπήρχε στη συσκευή για κάποιο χρονικό διάστημα. 235 00:14:01,340 --> 00:14:06,840 Και στην πραγματικότητα, η συσκευή έχει το προ-συγκεντρώθηκε για εσάς σε αυτό το πράγμα που ονομάζεται αντικειμενικό κώδικα, 236 00:14:06,840 --> 00:14:09,540 αλλά αυτό ακριβώς δεν έχει σημασία για εσάς, όπου είναι γιατί το σύστημα ξέρει 237 00:14:09,540 --> 00:14:11,730 στην περίπτωση αυτή, όπου είναι: η συσκευή. 238 00:14:11,730 --> 00:14:17,400 Ας μετακινηθείτε προς τα κάτω για να GetInt τώρα και να δούμε πώς GetInt έχει εργαστεί όλο αυτό το διάστημα. 239 00:14:17,400 --> 00:14:19,460 Εδώ έχουμε παρόμοια σχόλια από πριν. 240 00:14:19,460 --> 00:14:21,660 Επιτρέψτε μου να μεγεθύνετε μόνο το τμήμα κώδικα. 241 00:14:21,660 --> 00:14:23,900 Και ό, τι έχουμε για GetInt είναι η ακόλουθη. 242 00:14:23,900 --> 00:14:25,700 Δεν λαμβάνει είσοδο. 243 00:14:25,700 --> 00:14:29,510 Δεν επιστρέφει int, ενώ η (πραγματική), έτσι έχουμε μια εσκεμμένη άπειρο βρόχο, 244 00:14:29,510 --> 00:14:33,180 αλλά κατά πάσα πιθανότητα θα σπάσει από αυτό με κάποιο τρόπο ή να επιστρέψουν μέσα από αυτό. 245 00:14:33,180 --> 00:14:34,870 >> Ας δούμε πώς αυτό λειτουργεί. 246 00:14:34,870 --> 00:14:39,240 Εμείς φαίνεται να χρησιμοποιούν GetString σε αυτή την πρώτη γραμμή στο εσωτερικό του βρόγχου, 166. 247 00:14:39,240 --> 00:14:43,780 Αυτό τώρα είναι καλή πρακτική, διότι κάτω από ποιες συνθήκες θα μπορούσε να επιστρέψει GetString 248 00:14:43,780 --> 00:14:47,660 το ειδικό κλειδί NULL; >> [Φοιτητής] Αν κάτι πάει στραβά. 249 00:14:47,660 --> 00:14:51,630 Αν κάτι πάει στραβά. Και τι θα μπορούσε να πάει στραβά, όταν σας καλούν κάτι σαν GetString; 250 00:14:54,960 --> 00:14:57,640 Ναι. >> [Φοιτητής] malloc αποτύχει να δώσει τα χαρακτηριστικά της. 251 00:14:57,640 --> 00:14:59,150 Ναι. Ίσως malloc αποτύχει. 252 00:14:59,150 --> 00:15:03,190 Κάπου κάτω από την κουκούλα, GetString καλεί malloc, η οποία διαθέτει μνήμη, 253 00:15:03,190 --> 00:15:06,020 η οποία επιτρέπει το κατάστημα ηλεκτρονικών υπολογιστών όλους τους χαρακτήρες 254 00:15:06,020 --> 00:15:07,750 ότι ο χρήστης πληκτρολογεί στο πληκτρολόγιο. 255 00:15:07,750 --> 00:15:11,590 Και ας υποθέσουμε ότι ο χρήστης είχε ένα πάρα πολύ ελεύθερο χρόνο και δακτυλογραφημένες περισσότερο, για παράδειγμα, 256 00:15:11,590 --> 00:15:16,160 από 2 δισεκατομμύρια χαρακτήρες, περισσότερους χαρακτήρες από τον υπολογιστή έχει ακόμη RAM. 257 00:15:16,160 --> 00:15:19,250 GetString πρέπει να είναι σε θέση να δηλώσουν ότι σε εσάς. 258 00:15:19,250 --> 00:15:22,560 Ακόμη και αν αυτό είναι μια σούπερ, σούπερ ασυνήθιστη περίπτωση γωνία, 259 00:15:22,560 --> 00:15:24,340 πρέπει με κάποιο τρόπο να είναι σε θέση να χειριστεί το θέμα, 260 00:15:24,340 --> 00:15:28,750 και έτσι GetString, αν πήγαμε πίσω και να διαβάσετε τα έγγραφα του, κάνει την επιστροφή στην NULL γεγονός. 261 00:15:28,750 --> 00:15:34,460 Έτσι τώρα, αν δεν GetString με την επιστροφή NULL, GetInt πρόκειται να αποτύχει με την επιστροφή INT_MAX 262 00:15:34,460 --> 00:15:37,690 μόνο ως φρουρός. Αυτά είναι μόνο τα ανθρώπινα. 263 00:15:37,690 --> 00:15:41,450 Ο μόνος τρόπος που θα το γνωρίζουν αυτό είναι η υπόθεση με την ανάγνωση των εγγράφων. 264 00:15:41,450 --> 00:15:45,040 >> Ας μετακινηθείτε προς τα κάτω στο σημείο όπου ο int είναι πραγματικά πάρει. 265 00:15:45,040 --> 00:15:51,160 Αν μετακινηθείτε προς τα κάτω λίγο περισσότερο, σε γραμμή 170, έχουμε ένα σχόλιο πάνω από αυτές τις γραμμές. 266 00:15:51,160 --> 00:15:55,100 Δηλώνουμε σε 172 ένα int, n, και ένα char, γ, και στη συνέχεια η νέα αυτή λειτουργία, 267 00:15:55,100 --> 00:15:58,930 μερικά από τα οποία έχετε σκοντάψει σε όλη πριν, sscanf. 268 00:15:58,930 --> 00:16:00,870 Αυτό σημαίνει scanf εγχόρδων. 269 00:16:00,870 --> 00:16:05,700 Με άλλα λόγια, να μου δώσει μια σειρά και θα το σαρώσει για κομμάτια των πληροφοριών που παρουσιάζουν ενδιαφέρον. 270 00:16:05,700 --> 00:16:07,360 Τι σημαίνει αυτό; 271 00:16:07,360 --> 00:16:11,800 Ας υποθέσουμε ότι εγώ πληκτρολογήσετε, κυριολεκτικά, 123 στο πληκτρολόγιο και στη συνέχεια πατήστε Enter. 272 00:16:11,800 --> 00:16:16,470 Ποιος είναι ο τύπος δεδομένων από 123, όταν επέστρεψε από GetString; >> [Φοιτητής] String. 273 00:16:16,470 --> 00:16:18,380 Είναι προφανώς μια σειρά, έτσι δεν είναι; Πήρα ένα string. 274 00:16:18,380 --> 00:16:23,220 Έτσι, 123 είναι πραγματικά, παραθέτω-unquote, 123 με το \ 0 στο τέλος της. 275 00:16:23,220 --> 00:16:27,110 Αυτό δεν είναι ένα int. Αυτό δεν είναι ένας αριθμός. Μοιάζει με έναν αριθμό αλλά δεν είναι πραγματικά. 276 00:16:27,110 --> 00:16:29,080 Έτσι, αυτό που κάνει GetInt πρέπει να κάνω; 277 00:16:29,080 --> 00:16:35,750 Πρέπει να σαρώσει ότι η σειρά αριστερά προς τα δεξιά - 123 \ 0 - και κατά κάποιο τρόπο μετατρέψει σε πραγματική ακέραιο. 278 00:16:35,750 --> 00:16:37,850 Θα μπορούσα να καταλάβω πώς να το κάνουμε αυτό. 279 00:16:37,850 --> 00:16:41,450 Αν νομίζετε ότι πίσω στο pset2, που κατά πάσα πιθανότητα πήρε λίγο άνετα με Καίσαρα 280 00:16:41,450 --> 00:16:44,820 ή Vigenere, ώστε να μπορείτε να επαναλάβει σε μια σειρά, μπορείτε να μετατρέψετε σε χαρακτήρες ints. 281 00:16:44,820 --> 00:16:46,710 Αλλά καλό, αυτό είναι ένα πάρα πολύ δουλειά. 282 00:16:46,710 --> 00:16:49,860 Γιατί να μην καλέσετε μια συνάρτηση όπως sscanf που το κάνει αυτό για σας; 283 00:16:49,860 --> 00:16:54,230 Έτσι sscanf αναμένει ένα επιχείρημα - σε αυτή την περίπτωση ονομάζεται γραμμή, η οποία είναι μια συμβολοσειρά. 284 00:16:54,230 --> 00:17:01,840 Μπορείτε στη συνέχεια, καθορίστε σε εισαγωγικά, πολύ παρόμοιες με τις printf, τι θα περιμένατε να δείτε σε αυτή την σειρά. 285 00:17:01,840 --> 00:17:09,000 Και αυτό που λέω εδώ είναι περιμένω να δω ένα δεκαδικό αριθμό και ίσως ένα χαρακτήρα. 286 00:17:09,000 --> 00:17:12,000 Και θα δούμε γιατί συμβαίνει αυτό σε μια στιγμή. 287 00:17:12,000 --> 00:17:15,869 Και αποδεικνύεται ότι αυτή η σημείωση είναι πλέον θυμίζει πράγματα αρχίσαμε να μιλάμε για 288 00:17:15,869 --> 00:17:17,619 μόλις πάνω από μία εβδομάδα πριν. 289 00:17:17,619 --> 00:17:21,740 Τι είναι & n & c και κάνει για μας εδώ; >> [Φοιτητής] Διεύθυνση του n και τη διεύθυνση του c. 290 00:17:21,740 --> 00:17:25,400 Ναι. Είναι που μου δίνετε τη διεύθυνση του n και τη διεύθυνση του c. Γιατί είναι αυτό σημαντικό; 291 00:17:25,400 --> 00:17:30,220 Γνωρίζετε ότι με τις λειτουργίες σε C, μπορείτε να επιστρέψετε πάντα μια τιμή ή καμία αξία σε όλα. 292 00:17:30,220 --> 00:17:34,530 Μπορείτε να επιστρέψετε ένα int, μια σειρά, μια float, ένα char, ο, τιδήποτε, ή μπορείτε να επιστρέψετε κενό, 293 00:17:34,530 --> 00:17:38,030 αλλά μπορείτε να επιστρέψετε μόνο ένα πράγμα μέγιστο βαθμό. 294 00:17:38,030 --> 00:17:42,760 Αλλά εδώ θέλουμε sscanf να μου επιστρέψει ίσως ένα int, ένας δεκαδικός αριθμός, 295 00:17:42,760 --> 00:17:46,220 και επίσης μια χαρα, και θα εξηγήσω γιατί το char σε μια στιγμή. 296 00:17:46,220 --> 00:17:51,460 Μπορείτε πραγματικά θέλουν να επιστρέψουν sscanf δύο πράγματα, αλλά αυτό δεν είναι μόνο δυνατή σε C. 297 00:17:51,460 --> 00:17:55,200 Μπορείτε να επιλύσετε ότι με το πέρασμα σε δύο διευθύνσεις 298 00:17:55,200 --> 00:17:57,370 επειδή μόλις ένα χέρι λειτουργία δύο διευθύνσεις, 299 00:17:57,370 --> 00:18:00,470 τι μπορεί να κάνει με τη λειτουργία τους; >> [Φοιτητής] Γράψτε σε αυτές τις διευθύνσεις. 300 00:18:00,470 --> 00:18:02,010 Δεν μπορεί να γράψει σε αυτές τις διευθύνσεις. 301 00:18:02,010 --> 00:18:05,770 Μπορείτε να χρησιμοποιήσετε τη λειτουργία αστέρι και να πάει εκεί, για κάθε μία από αυτές τις διευθύνσεις. 302 00:18:05,770 --> 00:18:11,260 Είναι αυτό το είδος του πίσω πόρτα μηχανισμός, αλλά πολύ κοινό για αλλαγή των τιμών των μεταβλητών 303 00:18:11,260 --> 00:18:14,870 κάτι περισσότερο από ένα μέρος - σε αυτή την περίπτωση, δύο. 304 00:18:14,870 --> 00:18:21,340 Τώρα παρατηρήσετε Φεύγω για == 1 και στη συνέχεια επιστρέφει n αν αυτό σημαίνει, στην πραγματικότητα, να αξιολογήσει αλήθεια. 305 00:18:21,340 --> 00:18:26,170 Λοιπόν, τι συμβαίνει; Τεχνικά, όλοι θέλουμε πραγματικά να συμβεί σε GetInt είναι αυτό. 306 00:18:26,170 --> 00:18:30,740 Θέλουμε να αναλύσει, να το πω έτσι, θέλουμε να διαβάσετε το string - απόσπασμα-unquote 123 - 307 00:18:30,740 --> 00:18:34,560 και αν φαίνεται σαν να υπάρχει ένας αριθμός εκεί, αυτό που λέμε να κάνουμε sscanf 308 00:18:34,560 --> 00:18:38,190 τίθεται ότι ο αριθμός - 123 - σε αυτή τη μεταβλητή n για μένα. 309 00:18:38,190 --> 00:18:42,090 Επομένως, γιατί τότε εγώ πραγματικά έχουν αυτό, καθώς; 310 00:18:42,090 --> 00:18:48,220 Ποιος είναι ο ρόλος του sscanf λέγοντας μπορείτε να πάρετε επίσης ένα χαρακτήρα εδώ; 311 00:18:48,220 --> 00:18:53,470 [Ακούγεται ανταπόκριση των φοιτητών] >> Μια υποδιαστολή στην πραγματικότητα θα μπορούσε να λειτουργήσει. 312 00:18:53,470 --> 00:18:56,330 Ας κρατήσει ότι σκέφτηκε για μια στιγμή. Τι άλλο; 313 00:18:56,330 --> 00:18:59,270 [Φοιτητής] Θα μπορούσε να είναι NULL. >> Καλή σκέψη. Θα μπορούσε να είναι η μηδενική χαρακτήρα. 314 00:18:59,270 --> 00:19:01,660 Είναι πραγματικά δεν είναι σε αυτήν την περίπτωση. Ναι. >> [Φοιτητής] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Ή επιτρέψτε μου να γενικεύσουμε ακόμη περισσότερο. 316 00:19:04,340 --> 00:19:06,640 Το γ% δεν είναι μόνο για τον έλεγχο σφαλμάτων. 317 00:19:06,640 --> 00:19:09,300 Δεν θέλουμε να υπάρχει ένας χαρακτήρας μετά από τον αριθμό, 318 00:19:09,300 --> 00:19:11,870 αλλά αυτό που μου επιτρέπει να κάνω είναι το εξής. 319 00:19:11,870 --> 00:19:18,210 Αποδεικνύεται ότι sscanf, εκτός από την αποθήκευση των τιμών σε n και c στο παράδειγμα αυτό εδώ, 320 00:19:18,210 --> 00:19:24,890 ό, τι δεν είναι, επίσης, να επιστρέφει τον αριθμό των μεταβλητών έθεσε αξίες μέσα 321 00:19:24,890 --> 00:19:30,260 Έτσι, αν πληκτρολογήσετε μόνο σε 123, τότε το μόνο% d πρόκειται να ταιριάζει, 322 00:19:30,260 --> 00:19:33,880 και μόνο n παίρνει αποθηκεύονται με αξία, όπως 123, 323 00:19:33,880 --> 00:19:35,640 και τίποτα δεν παίρνει θέσει σε c. 324 00:19:35,640 --> 00:19:37,620 Γ παραμένει μια αξία σκουπίδια, να το πω έτσι - 325 00:19:37,620 --> 00:19:40,730 σκουπίδια, διότι ποτέ δεν έχει προετοιμαστεί για κάποια αξία. 326 00:19:40,730 --> 00:19:45,520 Έτσι, στην περίπτωση αυτή, sscanf επιστρέφει 1, γιατί κατοικείται 1 των εν λόγω δείκτες, 327 00:19:45,520 --> 00:19:50,190 περίπτωση κατά την οποία μεγάλος, έχω ένα int έτσι ελευθερώσει τη γραμμή για να ελευθερώσετε τη μνήμη 328 00:19:50,190 --> 00:19:54,000 GetString ότι πράγματι διατεθεί, και στη συνέχεια θα επιστρέψει n, 329 00:19:54,000 --> 00:19:58,500 αλλιώς αν ποτέ αναρωτηθεί όπου Επανάληψη δήλωση ότι προέρχεται από, έρχεται από τα δεξιά εδώ. 330 00:19:58,500 --> 00:20:04,390 Έτσι, αν, αντίθετα, θα πληκτρολογήσετε 123foo - μερικά μόνο τυχαία ακολουθία του κειμένου - 331 00:20:04,390 --> 00:20:08,490 sscanf πρόκειται να δείτε τον αριθμό, τον αριθμό, τον αριθμό, στ, 332 00:20:08,490 --> 00:20:16,410 και πρόκειται να θέσει το 123 σε n? πρόκειται να θέσει το f σε c και στη συνέχεια επιστρέφουν 2. 333 00:20:16,410 --> 00:20:20,640 Έτσι έχουμε, απλά χρησιμοποιώντας το βασικό ορισμό της συμπεριφοράς sscanf, ένα πολύ απλό τρόπο - 334 00:20:20,640 --> 00:20:23,900 καλά, σύμπλοκο με την πρώτη ματιά, αλλά στο τέλος της ημέρας αρκετά απλό μηχανισμό - 335 00:20:23,900 --> 00:20:28,320 του λέγοντας ότι είναι ένας int εκεί και αν ναι, είναι ότι το μόνο πράγμα που βρήκα; 336 00:20:28,320 --> 00:20:29,860 Και το κενό εδώ είναι σκόπιμη. 337 00:20:29,860 --> 00:20:34,000 Αν διαβάσετε την τεκμηρίωση για sscanf, σας λέει ότι αν έχετε συμπεριλάβει ένα κομμάτι του whitespace 338 00:20:34,000 --> 00:20:38,810 στην αρχή ή στο τέλος, sscanf επίσης θα επιτρέψει στο χρήστη, για οποιονδήποτε λόγο, 339 00:20:38,810 --> 00:20:41,860 χώρο για να χτυπήσει 123 bar και αυτό θα είναι νόμιμο. 340 00:20:41,860 --> 00:20:44,150 Δεν θα φωνάζω στο χρήστη μόνο και μόνο επειδή χτύπησε το πλήκτρο διαστήματος 341 00:20:44,150 --> 00:20:48,640 στην αρχή ή το τέλος, το οποίο είναι λίγο πιο φιλική προς το χρήστη. 342 00:20:48,640 --> 00:20:52,300 >> Οποιεσδήποτε ερωτήσεις σχετικά με GetInt τότε; Ναι. >> [Φοιτητής] Τι γίνεται αν έχετε μόλις τεθεί σε ένα char; 343 00:20:52,300 --> 00:20:54,030 Καλή ερώτηση. 344 00:20:54,030 --> 00:20:59,890 Τι γίνεται αν έχετε μόλις πληκτρολογήσατε σε ένα char όπως f και πατήστε Enter χωρίς ποτέ να πληκτρολογήσετε 123; 345 00:20:59,890 --> 00:21:02,420 Τι νομίζετε ότι η συμπεριφορά της αυτή τη γραμμή του κώδικα θα είναι τότε; 346 00:21:02,420 --> 00:21:04,730 [Ακούγεται ανταπόκριση των φοιτητών] 347 00:21:04,730 --> 00:21:08,790 Ναι, έτσι sscanf μπορεί να καλύψει ότι πάρα πολύ, διότι σε αυτή την περίπτωση, δεν πρόκειται να γεμίσει n ή γ. 348 00:21:08,790 --> 00:21:15,310 Είναι πρόκειται να επιστρέψει αντί 0, οπότε είμαι αλίευση επίσης ότι το σενάριο 349 00:21:15,310 --> 00:21:18,750 επειδή η αναμενόμενη αξία που θέλω είναι 1. 350 00:21:18,750 --> 00:21:22,000 Θέλω μόνο ένα και μόνο ένα πράγμα που πρέπει να πληρωθεί. Καλή ερώτηση. 351 00:21:22,000 --> 00:21:24,290 >> Άλλοι; Εντάξει. 352 00:21:24,290 --> 00:21:26,250 >> Ας μην πάμε μέσα από όλες τις λειτουργίες εδώ, 353 00:21:26,250 --> 00:21:29,500 αλλά αυτό που φαίνεται να είναι ίσως από τους υπόλοιπους ενδιαφέρον είναι GetString 354 00:21:29,500 --> 00:21:32,790 γιατί αποδεικνύεται ότι GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 όλα κλωτσιά πολλές λειτουργίες τους σε GetString. 356 00:21:36,260 --> 00:21:39,750 Έτσι, ας ρίξουμε μια ματιά στο πώς εφαρμόζεται εδώ. 357 00:21:39,750 --> 00:21:43,630 Αυτός φαίνεται λίγο πολύπλοκη, αλλά χρησιμοποιεί τα ίδια βασικά 358 00:21:43,630 --> 00:21:45,670 ότι αρχίσαμε να μιλάμε για την τελευταία εβδομάδα. 359 00:21:45,670 --> 00:21:49,490 Σε GetString, η οποία λαμβάνει κανένα επιχείρημα σύμφωνα με το κενό μέχρι εδώ 360 00:21:49,490 --> 00:21:53,730 και επιστρέφει μια συμβολοσειρά, προφανώς εγώ είμαι που κηρύσσει μια σειρά που ονομάζεται buffer. 361 00:21:53,730 --> 00:21:56,270 Πραγματικά, δεν ξέρω τι πρόκειται να χρησιμοποιηθεί για ακόμα, αλλά θα δούμε. 362 00:21:56,270 --> 00:21:58,390 Μοιάζει με ικανότητα είναι από προεπιλογή 0. 363 00:21:58,390 --> 00:22:01,350 Δεν είναι σίγουρος εάν αυτό δεν συμβαίνει, βέβαιοι για το τι πρόκειται ν να χρησιμοποιηθεί για ακόμα, 364 00:22:01,350 --> 00:22:03,590 αλλά τώρα είναι να πάρει λίγο πιο ενδιαφέρουσα. 365 00:22:03,590 --> 00:22:06,520 Στη γραμμή 243, δηλώνουμε έναν int, γ. 366 00:22:06,520 --> 00:22:08,800 Αυτό είναι το είδος της μια ηλίθια λεπτομέρεια. 367 00:22:08,800 --> 00:22:15,820 Μια χαρα είναι 8 bit, 8 bits και μπορεί να αποθηκεύσει πόσες διαφορετικές τιμές; >> [Φοιτητής] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Το πρόβλημα είναι, αν θέλετε να έχετε 256 διαφορετικά χαρακτήρες ASCII, τα οποία υπάρχουν 369 00:22:20,730 --> 00:22:23,340 αν νομίζετε ότι πίσω - και αυτό δεν είναι κάτι για να απομνημονεύσουν. 370 00:22:23,340 --> 00:22:25,710 Αλλά αν νομίζετε ότι πίσω σε εκείνη την μεγάλη ASCII διάγραμμα είχαμε εβδομάδες πριν, 371 00:22:25,710 --> 00:22:30,600 υπήρχαν σε αυτή την περίπτωση 128 ή 256 χαρακτήρες ASCII. 372 00:22:30,600 --> 00:22:32,940 Χρησιμοποιήσαμε όλα τα μοντέλα της 0s και 1s επάνω. 373 00:22:32,940 --> 00:22:36,210 Αυτό είναι ένα πρόβλημα, αν θέλετε να είναι σε θέση να ανιχνεύσει ένα σφάλμα 374 00:22:36,210 --> 00:22:40,190 γιατί αν χρησιμοποιείτε ήδη 256 τιμές για τους χαρακτήρες σας, 375 00:22:40,190 --> 00:22:43,050 δεν έχετε πραγματικά προγραμματίσουν το μέλλον, διότι τώρα δεν έχετε κανέναν τρόπο να πούμε, 376 00:22:43,050 --> 00:22:46,270 αυτό δεν είναι μια legit χαρακτήρας, αυτό είναι κάποια εσφαλμένη μήνυμα. 377 00:22:46,270 --> 00:22:50,270 Έτσι, αυτό που κάνει ο κόσμος είναι να χρησιμοποιήσετε την επόμενη μεγαλύτερη αξία, κάτι σαν int, 378 00:22:50,270 --> 00:22:54,720 έτσι ώστε να έχετε ένα τρελό αριθμό των bits, 32, για 4 δισεκατομμύρια πιθανές τιμές 379 00:22:54,720 --> 00:22:58,860 έτσι ώστε να μπορείτε απλά να καταλήγουν να χρησιμοποιούν κατ 'ουσίαν, 257 από αυτούς, 380 00:22:58,860 --> 00:23:01,720 1 εκ των οποίων έχει κάποια ιδιαίτερη σημασία ως σφάλμα. 381 00:23:01,720 --> 00:23:03,120 >> Ας δούμε λοιπόν πώς αυτό λειτουργεί. 382 00:23:03,120 --> 00:23:07,760 Στη γραμμή 246, έχω αυτό το μεγάλο βρόχο while που ζητά fgetc, 383 00:23:07,760 --> 00:23:11,090 στ αρχείο έννοια, έτσι getc, και στη συνέχεια stdin. 384 00:23:11,090 --> 00:23:15,520 Βγάζει αυτό είναι μόνο η πιο ακριβής τρόπος για να πούμε διαβάσουμε είσοδο από το πληκτρολόγιο. 385 00:23:15,520 --> 00:23:19,300 Πρότυπο πληκτρολόγιο μέσο εισόδου, εξόδου σημαίνει πρότυπο οθόνη, 386 00:23:19,300 --> 00:23:23,310 και τυπικό σφάλμα, το οποίο θα δούμε σε pset4, σημαίνει την οθόνη 387 00:23:23,310 --> 00:23:27,490 αλλά ένα ειδικό μέρος της οθόνης έτσι ώστε να είναι δεν συγχέεται με την πραγματική παραγωγή 388 00:23:27,490 --> 00:23:30,750 που προορίζεται για την εκτύπωση. Αλλά περισσότερα για αυτό στο μέλλον. 389 00:23:30,750 --> 00:23:34,440 Έτσι fgetc σημαίνει απλώς διαβάσει ένα χαρακτήρα από το πληκτρολόγιο και το κατάστημα όπου; 390 00:23:34,440 --> 00:23:37,350 Αποθηκεύστε το στο γ. 391 00:23:37,350 --> 00:23:41,360 Και στη συνέχεια, ελέγξτε - έτσι είμαι χρησιμοποιώντας μόνο κάποια Boolean συνδέσμων εδώ - 392 00:23:41,360 --> 00:23:46,000 βεβαιωθείτε ότι δεν ισούται - \ n, έτσι ώστε ο χρήστης έχει πατήστε Enter, θέλουμε να σταματήσει σε εκείνο το σημείο, 393 00:23:46,000 --> 00:23:49,850 τέλος του βρόχου - και θέλουμε επίσης να ελέγξετε για το ειδικό σταθερό ΕΟΦ, 394 00:23:49,850 --> 00:23:53,610 η οποία, αν γνωρίζετε ή να μαντέψει, τι ηρεμήσει; >> [Φοιτητής] Τέλος του αρχείου. Τέλος >> του αρχείου. 395 00:23:53,610 --> 00:23:56,560 Αυτό είναι το είδος της νόημα, γιατί αν είμαι πληκτρολογώντας στο πληκτρολόγιο, 396 00:23:56,560 --> 00:23:58,870 πραγματικά δεν υπάρχει αρχείο που συμμετέχουν σε αυτό, 397 00:23:58,870 --> 00:24:01,150 αλλά αυτό είναι ακριβώς το είδος της γενικός όρος που χρησιμοποιείται για να σημάνει 398 00:24:01,150 --> 00:24:04,220 ότι τίποτα άλλο δεν έρχεται από τα δάχτυλα του ανθρώπου. 399 00:24:04,220 --> 00:24:06,460 ΕΟΦ - τέλος του αρχείου. 400 00:24:06,460 --> 00:24:09,920 Παρεμπιπτόντως, αν έχετε χτυπήσει ποτέ Ελέγχου D στο πληκτρολόγιο σας, όχι ότι θα έχετε ακόμα - 401 00:24:09,920 --> 00:24:15,230 έχετε χτυπήσει Ελέγχου Γ - Δ ελέγχου στέλνει αυτή την ειδική σταθερά που ονομάζεται ΕΟΦ. 402 00:24:15,230 --> 00:24:19,850 Μέχρι τώρα έχουμε μόνο κάποια δυναμική κατανομή μνήμης. 403 00:24:19,850 --> 00:24:23,440 >> Έτσι, αν (n + 1> ικανότητα). Τώρα θα εξηγήσω n. 404 00:24:23,440 --> 00:24:26,100 Ν είναι ακριβώς πόσα bytes είναι επί του παρόντος στο ρυθμιστικό, 405 00:24:26,100 --> 00:24:28,620 η σειρά που είστε σήμερα δημιουργία από το χρήστη. 406 00:24:28,620 --> 00:24:33,450 Εάν έχετε περισσότερους χαρακτήρες στο ρυθμιστικό σας από ό, τι έχετε την ικανότητα στο ρυθμιστικό, 407 00:24:33,450 --> 00:24:37,410 διαισθητικά τι πρέπει να κάνουμε στη συνέχεια διαθέτουν μεγαλύτερη χωρητικότητα. 408 00:24:37,410 --> 00:24:43,330 Έτσι, Πάω να προσπεράσει μερικές από τις αριθμητικές εδώ και να επικεντρωθεί μόνο σε αυτήν την λειτουργία εδώ. 409 00:24:43,330 --> 00:24:46,070 Ξέρεις τι είναι malloc ή είναι τουλάχιστον γενικά εξοικειωμένοι. 410 00:24:46,070 --> 00:24:48,970 Πάρτε μια εικασία τι κάνει realloc. >> [Φοιτητής] Προσθέτει μνήμη. 411 00:24:48,970 --> 00:24:52,920 Δεν είναι αρκετά προσθέτοντας μνήμη. Είναι αναδιανέμει μνήμης ως εξής. 412 00:24:52,920 --> 00:24:57,220 Αν υπάρχει ακόμα περιθώριο στο τέλος του string για να σας δώσουμε περισσότερες της μνήμης 413 00:24:57,220 --> 00:25:00,000 από ό, τι σας δίνει αρχικά, τότε θα πάρετε αυτό το επιπλέον μνήμη. 414 00:25:00,000 --> 00:25:03,460 Έτσι, μπορείτε απλά να κρατήσει τη θέση τους χαρακτήρες της σειράς είναι πλάτη με πλάτη με πλάτη με πλάτη. 415 00:25:03,460 --> 00:25:05,830 Αλλά αν αυτό δεν είναι η περίπτωση, γιατί περίμενε πολύ καιρό 416 00:25:05,830 --> 00:25:07,940 και κάτι τυχαία πήρε plopped στη μνήμη υπάρχει 417 00:25:07,940 --> 00:25:10,290 αλλά υπάρχει επιπλέον μνήμη εδώ κάτω, αυτό είναι εντάξει. 418 00:25:10,290 --> 00:25:13,100 Realloc πρόκειται να κάνει όλη τη δύσκολη δουλειά για εσάς, 419 00:25:13,100 --> 00:25:16,750 μετακινήσετε τη σειρά που έχετε διαβάσει στο έτσι μακριά από εδώ, να το βάλετε εκεί κάτω, 420 00:25:16,750 --> 00:25:19,460 και στη συνέχεια να σας δώσει κάποιες περισσότερες διαδρόμου σε εκείνο το σημείο. 421 00:25:19,460 --> 00:25:22,550 >> Έτσι, με μια κίνηση του χεριού, επιτρέψτε μου να πω ότι αυτό που κάνει GetString 422 00:25:22,550 --> 00:25:26,330 είναι αυτό που αρχίζει με ένα μικρό ρυθμιστικό, ίσως ένα ενιαίο χαρακτήρα, 423 00:25:26,330 --> 00:25:30,820 και αν ο χρήστης πληκτρολογεί σε δύο χαρακτήρες, GetString καταλήγει καλώντας realloc και λέει 424 00:25:30,820 --> 00:25:33,150 ένα χαρακτήρα δεν ήταν αρκετό? να μου δώσει δύο χαρακτήρες. 425 00:25:33,150 --> 00:25:35,950 Στη συνέχεια, αν μπορείτε να διαβάσετε μέσα από τη λογική του βρόχου, πρόκειται να πούμε 426 00:25:35,950 --> 00:25:39,600 ο χρήστης πληκτρολογήσει 3 χαρακτήρες? δώσω τώρα όχι 2, αλλά 4 χαρακτήρες, 427 00:25:39,600 --> 00:25:42,320 τότε να μου δώσει 8, τότε δώσε μου 16 και 32. 428 00:25:42,320 --> 00:25:45,000 Το γεγονός ότι είμαι ο διπλασιασμός της χωρητικότητας κάθε φορά 429 00:25:45,000 --> 00:25:48,570 σημαίνει ότι το ρυθμιστικό δεν πρόκειται να αυξηθεί σιγά-σιγά, πρόκειται να αυξηθεί γρήγορα σούπερ. 430 00:25:48,570 --> 00:25:51,380 Και τι θα μπορούσε να είναι το πλεονέκτημα του ότι; 431 00:25:51,380 --> 00:25:54,600 Γιατί είμαι διπλασιάζοντας το μέγεθος του buffer 432 00:25:54,600 --> 00:25:58,020 ακόμα κι αν ο χρήστης μπορεί να χρειαστεί μόνο ένα επιπλέον χαρακτήρα από το πληκτρολόγιο; 433 00:25:58,020 --> 00:26:01,750 [Ακούγεται ανταπόκριση των φοιτητών] >> Τι είναι αυτό; >> [Φοιτητής] Δεν χρειάζεται να αναπτυχθεί τόσο συχνά. 434 00:26:01,750 --> 00:26:03,300 Ακριβώς. Δεν χρειάζεται να αναπτυχθεί τόσο συχνά. 435 00:26:03,300 --> 00:26:05,510 Και αυτό είναι ακριβώς το είδος της αντιστάθμισης είστε στοιχήματά σας εδώ, 436 00:26:05,510 --> 00:26:10,850 με το σκεπτικό ότι δεν θέλετε να καλέσετε realloc πολλά, επειδή τείνει να είναι αργή. 437 00:26:10,850 --> 00:26:12,910 Κάθε φορά που θα ζητήσει από το λειτουργικό σύστημα για τη μνήμη, 438 00:26:12,910 --> 00:26:16,990 όπως θα δούμε σύντομα σε ένα μελλοντικό πρόβλημα σύνολο, τείνει να πάρει κάποιο χρόνο. 439 00:26:16,990 --> 00:26:20,010 Έτσι, ελαχιστοποιώντας το ποσό του χρόνου, ακόμα και αν χάνουμε κάποιο διάστημα, 440 00:26:20,010 --> 00:26:21,900 τείνει να είναι ένα καλό πράγμα. 441 00:26:21,900 --> 00:26:24,060 >> Αλλά αν διαβάσετε το τελευταίο μέρος της GetString εδώ - 442 00:26:24,060 --> 00:26:27,950 και πάλι την κατανόηση κάθε γραμμή εδώ δεν είναι τόσο σημαντικό σήμερα - 443 00:26:27,950 --> 00:26:30,530 παρατηρήσετε ότι τελικά malloc καλεί και πάλι 444 00:26:30,530 --> 00:26:33,880 και διαθέτει ακριβώς όπως πολλά bytes όσο χρειάζεται για το string 445 00:26:33,880 --> 00:26:38,060 και στη συνέχεια ρίχνει μακριά καλώντας δωρεάν το υπερβολικά μεγάλο ρυθμιστικό 446 00:26:38,060 --> 00:26:40,080 αν πράγματι πήρε διπλασίασε πάρα πολλές φορές. 447 00:26:40,080 --> 00:26:42,730 Έτσι, με λίγα λόγια, αυτό είναι το πώς GetString έχει εργαστεί όλο αυτό το διάστημα. 448 00:26:42,730 --> 00:26:47,060 Το μόνο που κάνει είναι να διαβάσει ένα χαρακτήρα σε μια στιγμή ξανά και ξανά και ξανά, 449 00:26:47,060 --> 00:26:50,750 και κάθε φορά που χρειάζεται κάποια επιπλέον μνήμη, ζητεί από το λειτουργικό σύστημα για να 450 00:26:50,750 --> 00:26:53,670 καλώντας realloc. 451 00:26:53,670 --> 00:26:57,890 >> Οποιεσδήποτε ερωτήσεις; Εντάξει. 452 00:26:57,890 --> 00:26:59,270 >> Μια επίθεση. 453 00:26:59,270 --> 00:27:04,060 Τώρα που καταλαβαίνουμε δείκτες ή τουλάχιστον είναι όλο και πιο εξοικειωμένοι με δείκτες, 454 00:27:04,060 --> 00:27:06,700 ας αναλογιστούμε πως όλος ο κόσμος αρχίζει να καταρρέει 455 00:27:06,700 --> 00:27:10,030 αν δεν είναι αρκετά υπερασπιστεί κατά αντιμωλία των χρηστών, 456 00:27:10,030 --> 00:27:11,850 οι άνθρωποι που προσπαθούν να χαράξει στο σύστημά σας, 457 00:27:11,850 --> 00:27:16,890 οι άνθρωποι που προσπαθούν να κλέψουν το λογισμικό σας με κάποια παράκαμψη κωδικό εγγραφής 458 00:27:16,890 --> 00:27:19,090 ότι θα μπορούσαν διαφορετικά να πληκτρολογήσετε μέσα 459 00:27:19,090 --> 00:27:22,990 >> Ρίξτε μια ματιά σε αυτό το παράδειγμα εδώ, το οποίο είναι απλά κώδικας C που έχει μια κύρια λειτουργία στο κάτω μέρος 460 00:27:22,990 --> 00:27:26,380 που καλεί μια συνάρτηση foo. Και τι είναι αυτό που περνά για foo; 461 00:27:26,380 --> 00:27:29,680 [Φοιτητής] Ένα μοναδικό επιχείρημα. >> [Malan] Ένα μοναδικό επιχείρημα. 462 00:27:29,680 --> 00:27:33,450 Έτσι, argv [1], το οποίο σημαίνει ότι η πρώτη λέξη που ο χρήστης πληκτρολογήσει στη γραμμή εντολών 463 00:27:33,450 --> 00:27:36,360 μετά a.out ή οτιδήποτε άλλο, το πρόγραμμα ονομάζεται. 464 00:27:36,360 --> 00:27:41,680 Έτσι foo στην κορυφή παίρνει σε ένα char *. Αλλά char * είναι ακριβώς αυτό; >> [Φοιτητής] Μια συμβολοσειρά. 465 00:27:41,680 --> 00:27:43,350 [Malan] Μια συμβολοσειρά, έτσι δεν υπάρχει τίποτα νέο εδώ. 466 00:27:43,350 --> 00:27:45,420 Ότι η σειρά είναι αυθαίρετα που ονομάζεται μπαρ. 467 00:27:45,420 --> 00:27:51,430 Σε αυτή τη γραμμή εδώ, char c [12]? Σε είδος ημι-τεχνικά Αγγλικά, τι είναι αυτή η γραμμή να κάνει; 468 00:27:51,430 --> 00:27:55,220 [Φοιτητής] Μια σειρά από - >> Array της; >> [Φοιτητής] Χαρακτήρες. Χαρακτήρες >>. 469 00:27:55,220 --> 00:27:58,870 Δώσε μου μια σειρά από 12 χαρακτήρες. Έτσι, θα μπορούσαμε να ονομάσουμε αυτό ένα ρυθμιστικό. 470 00:27:58,870 --> 00:28:02,920 Είναι τεχνικά ονομάζεται c, αλλά ένα ρυθμιστικό στον προγραμματισμό σημαίνει απλά ένα μάτσο χώρου 471 00:28:02,920 --> 00:28:04,800 ότι μπορείτε να βάλετε κάποια πράγματα μέσα 472 00:28:04,800 --> 00:28:07,940 Στη συνέχεια, τέλος, memcpy έχουμε δεν χρησιμοποιήθηκαν στο παρελθόν, αλλά μπορείτε να μαντέψετε τι κάνει. 473 00:28:07,940 --> 00:28:10,480 Αυτό αντιγράφει τη μνήμη. Τι κάνει; 474 00:28:10,480 --> 00:28:19,270 Είναι προφανώς αντιγράφει μπαρ, εισόδου, σε c αλλά μόνο μέχρι το μήκος της ράβδου. 475 00:28:19,270 --> 00:28:24,930 Αλλά υπάρχει ένα bug εδώ. >> [Φοιτητής] Χρειάζεται το sizeof χαρακτήρα. Εντάξει >>. 476 00:28:24,930 --> 00:28:30,860 Τεχνικά, θα πρέπει να κάνουμε πραγματικά strlen (bar) * sizeof (char)). Αυτό είναι σωστό. 477 00:28:30,860 --> 00:28:33,930 Όμως, στη χειρότερη περίπτωση εδώ, ας υποθέσουμε ότι that's - 478 00:28:33,930 --> 00:28:35,950 Εντάξει. Στη συνέχεια υπάρχουν δύο σφάλματα. 479 00:28:35,950 --> 00:28:39,160 Έτσι, sizeof (char))? 480 00:28:39,160 --> 00:28:41,290 Ας κάνουμε αυτό το λίγο μεγαλύτερο. 481 00:28:41,290 --> 00:28:44,910 Έτσι τώρα υπάρχει ακόμα ένα bug, το οποίο είναι αυτό; >> [Ακούγεται ανταπόκριση των φοιτητών] 482 00:28:44,910 --> 00:28:46,990 Δείτε για ποιο λόγο; >> [Φοιτητής] Check for null. 483 00:28:46,990 --> 00:28:50,270 Θα πρέπει γενικά να είναι ο έλεγχος για NULL γιατί συμβαίνουν κακά πράγματα 484 00:28:50,270 --> 00:28:53,200 όταν ο δείκτης είναι NULL σας, επειδή μπορεί να καταλήξουν εκεί, 485 00:28:53,200 --> 00:28:57,630 και δεν θα πρέπει ποτέ να πρόκειται να NULL από εύρεση τιμών με το χειριστή αστέρι. 486 00:28:57,630 --> 00:29:01,050 Έτσι, αυτό είναι καλό. Και ό, τι άλλο κάνουμε; Λογικά, υπάρχει ένα ελάττωμα εδώ. 487 00:29:01,050 --> 00:29:04,450 [Φοιτητής] Ελέγξτε αν argc είναι> = έως 2. 488 00:29:04,450 --> 00:29:10,550 Έτσι, ελέγξτε αν argc είναι> = 2. Εντάξει, έτσι είναι τρία σφάλματα σε αυτό το πρόγραμμα εδώ. 489 00:29:10,550 --> 00:29:16,630 Είμαστε τώρα τον έλεγχο αν ο χρήστης πληκτρολογήσει πραγματικά σε οτιδήποτε σε argv [1]. Καλή. 490 00:29:16,630 --> 00:29:20,950 Έτσι, αυτό που είναι το τρίτο σφάλμα; Ναι. >> [Φοιτητής] C μπορεί να μην είναι αρκετά μεγάλη. 491 00:29:20,950 --> 00:29:23,320 Καλή. Ελέγξαμε ένα σενάριο. 492 00:29:23,320 --> 00:29:29,520 Θα ελέγχεται εμμέσως μην αντιγράψετε περισσότερη μνήμη από ό, τι θα υπερβαίνει το μήκος της ράβδου. 493 00:29:29,520 --> 00:29:32,510 Έτσι, αν το string ο χρήστης πληκτρολογήσει είναι 10 χαρακτήρες, 494 00:29:32,510 --> 00:29:36,020 αυτό λέει μόνο αντιγράψετε 10 χαρακτήρες. Και αυτό είναι εντάξει. 495 00:29:36,020 --> 00:29:39,940 Αλλά τι θα γινόταν αν ο χρήστης πληκτρολογήσει σε μια λέξη στη γραμμή εντολών σαν μια λέξη 20-χαρακτήρων; 496 00:29:39,940 --> 00:29:44,900 Αυτό που λέει αντίγραφο 20 χαρακτήρες από τη γραμμή σε ό, τι; 497 00:29:44,900 --> 00:29:49,750 C, αλλιώς γνωστή ως ρυθμιστικό μας, το οποίο σημαίνει ότι έγραψε μόνο τα δεδομένα 498 00:29:49,750 --> 00:29:52,540 έως 8 θέσεις byte που δεν έχουν στην ιδιοκτησία τους, 499 00:29:52,540 --> 00:29:54,870 και δεν τα κατέχουν, με την έννοια ότι ποτέ δεν τους διατίθενται. 500 00:29:54,870 --> 00:30:00,370 Έτσι, αυτό είναι ό, τι είναι γενικά γνωστή ως επίθεση ή υπερχείλιση buffer επίθεση υπέρβασης. 501 00:30:00,370 --> 00:30:05,580 Και είναι μια επίθεση με την έννοια ότι, αν ο χρήστης ή το πρόγραμμα που σας καλεί η λειτουργία σας 502 00:30:05,580 --> 00:30:10,490 κάνει αυτό κακόβουλα, τι πραγματικά θα συμβεί στη συνέχεια θα μπορούσε πραγματικά να είναι αρκετά κακό. 503 00:30:10,490 --> 00:30:12,450 >> Έτσι, ας ρίξουμε μια ματιά σε αυτή την εικόνα εδώ. 504 00:30:12,450 --> 00:30:16,060 Αυτή η εικόνα αντιπροσωπεύει το stack σας μνήμη. 505 00:30:16,060 --> 00:30:19,580 Θυμηθείτε ότι κάθε φορά που θα καλέσετε μια συνάρτηση μπορείτε να πάρετε αυτό το μικρό πλαίσιο στη στοίβα 506 00:30:19,580 --> 00:30:21,520 και στη συνέχεια ένα άλλο και στη συνέχεια ένα άλλο και άλλο. 507 00:30:21,520 --> 00:30:24,300 Και μέχρι στιγμής, έχουμε ακριβώς το είδος του αντλούμενου αυτά ως ορθογώνια 508 00:30:24,300 --> 00:30:26,290 είτε στο ταμπλό ή στην οθόνη εδώ. 509 00:30:26,290 --> 00:30:30,580 Αλλά αν κάνετε ζουμ σε ένα από αυτά τα ορθογώνια, όταν καλείτε μια συνάρτηση foo, 510 00:30:30,580 --> 00:30:35,880 αποδεικνύεται ότι υπάρχει κάτι περισσότερο στο εσωτερικό της στοίβας αυτό το πλαίσιο σε αυτό το ορθογώνιο 511 00:30:35,880 --> 00:30:40,060 από ό, τι ακριβώς x και y και α και β, όπως κάναμε μιλάμε για swap. 512 00:30:40,060 --> 00:30:44,410 Αποδεικνύεται ότι υπάρχει κάποια χαμηλότερο επίπεδο λεπτομέρειες, μεταξύ των οποίων Διεύθυνση επιστροφής. 513 00:30:44,410 --> 00:30:49,550 Έτσι αποδεικνύεται όταν η κύρια καλεί foo, κυρίως έχει να ενημερώσει foo 514 00:30:49,550 --> 00:30:53,520 ποια διεύθυνση είναι κύριος στη μνήμη του υπολογιστή 515 00:30:53,520 --> 00:30:57,770 γιατί διαφορετικά, το συντομότερο foo γίνεται εκτέλεση, όπως στην προκειμένη περίπτωση εδώ, 516 00:30:57,770 --> 00:31:00,830 μόλις φτάσετε σε αυτό το κλειστό άγκιστρο στο τέλος του foo, 517 00:31:00,830 --> 00:31:05,310 πώς στο καλό δεν ξέρει πού foo ο έλεγχος του προγράμματος υποτίθεται ότι θα πάει; 518 00:31:05,310 --> 00:31:08,970 Αποδεικνύεται ότι η απάντηση στο ερώτημα αυτό είναι σε αυτό το κόκκινο ορθογώνιο εδώ. 519 00:31:08,970 --> 00:31:12,670 Αυτό αντιπροσωπεύει ένα δείκτη, και είναι στο χέρι του υπολογιστή για την προσωρινή αποθήκευση 520 00:31:12,670 --> 00:31:17,030 για το λεγόμενο στοίβα τη διεύθυνση της κύριας έτσι ώστε το συντομότερο foo γίνεται εκτέλεση, 521 00:31:17,030 --> 00:31:21,120 ο υπολογιστής ξέρει πού και τι γραμμή στην κύρια να πάει πίσω. 522 00:31:21,120 --> 00:31:23,940 Αποθηκεύτηκε δείκτη Frame σχετίζεται παρομοίως προς αυτό. 523 00:31:23,940 --> 00:31:26,310 Char μπαρ * εδώ τι αντιπροσωπεύει; 524 00:31:26,310 --> 00:31:31,350 Τώρα, αυτό το μπλε τμήμα είναι εδώ πλαίσιο του foo. Τι είναι το μπαρ; 525 00:31:31,570 --> 00:31:35,010 Bar είναι ακριβώς το επιχείρημα για τη λειτουργία foo. 526 00:31:35,010 --> 00:31:37,500 Έτσι τώρα είμαστε πίσω στο είδος του οικείου εικόνα. 527 00:31:37,500 --> 00:31:39,850 Υπάρχουν κι άλλα πράγματα και περισσότερο περισπασμούς στην οθόνη, 528 00:31:39,850 --> 00:31:43,380 αλλά αυτό το γαλάζιο τμήμα είναι ακριβώς αυτό που έχουμε με βάση την μαυροπίνακα 529 00:31:43,380 --> 00:31:45,790 για κάτι σαν swap. Αυτό είναι το πλαίσιο για foo. 530 00:31:45,790 --> 00:31:51,490 Και το μόνο πράγμα που αυτή τη στιγμή είναι το μπαρ, το οποίο είναι αυτή η παράμετρος. 531 00:31:51,490 --> 00:31:55,220 Αλλά τι άλλο θα πρέπει να είναι στη στοίβα, σύμφωνα με αυτόν τον κώδικα εδώ; 532 00:31:55,220 --> 00:31:57,760 [Φοιτητής] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Θα πρέπει να δούμε επίσης 12 πλατείες της μνήμης που εκχωρείται σε μια μεταβλητή που ονομάζεται γ, 534 00:32:02,810 --> 00:32:04,970 και μάλιστα έχουμε ότι στην οθόνη. 535 00:32:04,970 --> 00:32:08,480 Η κορυφή δεν υπάρχει c [0], και στη συνέχεια, ο συγγραφέας αυτού του διαγράμματος 536 00:32:08,480 --> 00:32:11,850 δεν ενοχλεί την κατάρτιση όλων των τετραγώνων, αλλά υπάρχουν πράγματι υπάρχουν 12 537 00:32:11,850 --> 00:32:16,590 γιατί αν κοιτάξετε στο κάτω δεξιό μέρος, γ [11], αν μετράνε από το 0 είναι η 12η τέτοια byte. 538 00:32:16,590 --> 00:32:18,400 Αλλά εδώ είναι το πρόβλημα. 539 00:32:18,400 --> 00:32:22,390 Σε ποια κατεύθυνση γ αυξάνεται; 540 00:32:22,390 --> 00:32:27,080 Ταξινόμηση των άνω προς τα κάτω, αν ξεκινά από την κορυφή και μεγαλώνει προς τα κάτω. 541 00:32:27,080 --> 00:32:30,110 Δεν μοιάζει αφήσαμε τους εαυτούς μας πολύ διάδρομο εδώ καθόλου. 542 00:32:30,110 --> 00:32:32,090 Έχουμε το είδος του εαυτού μας ζωγράφισε σε μια γωνιά, 543 00:32:32,090 --> 00:32:36,940 και ότι c [11] είναι σωστό επάνω ενάντια μπαρ, το οποίο βρίσκεται ακριβώς επάνω ενάντια Αποθηκευμένες δείκτη Πλαίσιο, 544 00:32:36,940 --> 00:32:39,960 το οποίο είναι σωστό επάνω ενάντια Διεύθυνση επιστροφής. Δεν υπάρχει μεγαλύτερο περιθώριο. 545 00:32:39,960 --> 00:32:42,810 Έτσι ποια είναι η επίπτωση στη συνέχεια, αν τα κάνεις θάλασσα 546 00:32:42,810 --> 00:32:46,500 και θα προσπαθήσουμε να διαβάσουμε 20 bytes σε ένα 12-byte buffer; 547 00:32:46,500 --> 00:32:50,060 Σε περίπτωση που αυτές οι 8 επιπλέον bytes πρόκειται να πάει; >> [Φοιτητής] Μέσα - 548 00:32:50,060 --> 00:32:53,200 Μέσα από οτιδήποτε άλλο, μερικές από τις οποίες είναι εξαιρετικά σημαντικό. 549 00:32:53,200 --> 00:32:57,260 Και το πιο σημαντικό πράγμα, ενδεχομένως, είναι το κόκκινο κουτί εκεί, Διεύθυνση επιστροφής, 550 00:32:57,260 --> 00:33:03,560 γιατί ας υποθέσουμε ότι έχετε είτε τυχαία είτε adversarially αντικαταστήσετε τα 4 bytes, 551 00:33:03,560 --> 00:33:07,260 ότι η διεύθυνση δείκτης, όχι μόνο με τα σκουπίδια, αλλά με έναν αριθμό 552 00:33:07,260 --> 00:33:09,810 αυτό συμβαίνει για να αντιπροσωπεύουν μια πραγματική διεύθυνση στη μνήμη. 553 00:33:09,810 --> 00:33:13,880 Ποια είναι η επίπτωση, λογικά; >> [Φοιτητής] Λειτουργία πρόκειται να επιστρέψει σε μια διαφορετική θέση. 554 00:33:13,880 --> 00:33:15,250 Ακριβώς. 555 00:33:15,250 --> 00:33:19,170 Όταν επιστρέφει foo και χτυπήματα που στήριγμα σγουρά, το πρόγραμμα πρόκειται να προχωρήσει 556 00:33:19,170 --> 00:33:25,060 όχι για να επιστρέψετε στο κύριο, πρόκειται να επιστρέψει στην διεύθυνση ό, τι είναι σε αυτό το κόκκινο κουτί. 557 00:33:25,060 --> 00:33:28,600 >> Σε περίπτωση καταστρατήγησης εγγραφής λογισμικού, 558 00:33:28,600 --> 00:33:32,260 τι θα γινόταν αν η διεύθυνση που είναι να επιστραφεί στο είναι η λειτουργία που συνήθως παίρνει ονομάζεται 559 00:33:32,260 --> 00:33:35,690 αφού έχετε πληρώσει για το λογισμικό και εισάγεται κωδικό εγγραφής σας; 560 00:33:35,690 --> 00:33:39,870 Μπορείτε να ταξινομήσετε του τέχνασμα ο υπολογιστής δεν πρόκειται σε εδώ, αλλά αντ 'αυτού θα αυξηθεί μέχρι εδώ. 561 00:33:39,870 --> 00:33:45,100 Ή αν είστε πραγματικά έξυπνος, ένας αντίπαλος μπορεί πραγματικά να πληκτρολογήσετε στο πληκτρολόγιο, για παράδειγμα, 562 00:33:45,100 --> 00:33:50,690 δεν είναι μια πραγματική λέξη, δεν 20 χαρακτήρες, αλλά ας υποθέσουμε ότι αυτός ή αυτή πραγματικά σε τύπους 563 00:33:50,690 --> 00:33:52,770 ορισμένοι χαρακτήρες που αντιπροσωπεύουν κώδικα. 564 00:33:52,770 --> 00:33:55,320 Και αυτό δεν πρόκειται να είναι C κώδικα, αυτό είναι πραγματικά πρόκειται να είναι οι χαρακτήρες 565 00:33:55,320 --> 00:33:59,290 που αντιπροσωπεύουν το δυαδικό κώδικα μηχανής, 0s και 1s. 566 00:33:59,290 --> 00:34:01,290 Αλλά ας υποθέσουμε ότι είσαι αρκετά έξυπνος για να το κάνουμε αυτό, 567 00:34:01,290 --> 00:34:06,500 με κάποιο τρόπο να επικολλήσετε την άμεση GetString κάτι που είναι ουσιαστικά μεταγλωττισμένο κώδικα, 568 00:34:06,500 --> 00:34:09,980 και τα τελευταία 4 bytes αντικαταστήσετε αυτή τη διεύθυνση επιστροφής. 569 00:34:09,980 --> 00:34:13,360 Και τι σημαίνει ότι η διεύθυνση εισόδου κάνουμε; 570 00:34:13,360 --> 00:34:18,630 Αποθηκεύει πράγματι σε αυτό το κόκκινο ορθογώνιο η διεύθυνση του πρώτου byte του ρυθμιστικού διαλύματος. 571 00:34:18,630 --> 00:34:23,070 Έτσι, θα πρέπει να είναι πραγματικά έξυπνος, και αυτό είναι ένα πολύ δοκιμής και λάθους για τους κακούς ανθρώπους εκεί έξω, 572 00:34:23,070 --> 00:34:25,639 αλλά αν μπορείτε να καταλάβετε πόσο μεγάλη είναι αυτή η ρυθμιστικού 573 00:34:25,639 --> 00:34:28,820 έτσι ώστε τα τελευταία λίγα bytes στην είσοδο που παρέχει στο πρόγραμμα 574 00:34:28,820 --> 00:34:33,540 τυχαίνει να είναι ισοδύναμη με την διεύθυνση της έναρξης του ρυθμιστικού σας, μπορείτε να το κάνετε αυτό. 575 00:34:33,540 --> 00:34:39,320 Αν πούμε κανονικά γεια και \ 0, αυτό είναι ό, τι καταλήγει στο ρυθμιστικό. 576 00:34:39,320 --> 00:34:44,420 Αλλά αν είμαστε πιο έξυπνοι και έχουμε γεμίσει το buffer με το τι θα καλέσουμε γενικά κώδικα επίθεσης - 577 00:34:44,420 --> 00:34:48,860 ΑΑΑ, επίθεση, επίθεση, επίθεση - όπου αυτό είναι κάτι που κάνει κάτι κακό, 578 00:34:48,860 --> 00:34:51,820 τι θα συμβεί αν είστε πραγματικά έξυπνο, μπορείτε να το κάνετε αυτό. 579 00:34:51,820 --> 00:34:58,610 Στο κόκκινο κουτί εδώ είναι μια ακολουθία αριθμών - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Παρατηρήστε ότι ταιριάζει με τον αριθμό που είναι εδώ. 581 00:35:01,610 --> 00:35:04,430 Είναι σε αντίστροφη σειρά, αλλά περισσότερο για αυτό κάποια άλλη στιγμή. 582 00:35:04,430 --> 00:35:08,140 Σημειώστε ότι αυτή η διεύθυνση επιστροφής έχει σκόπιμα μεταβληθεί 583 00:35:08,140 --> 00:35:12,020 να ισούται με τη διεύθυνση εδώ, δεν είναι η διεύθυνση της κύριας. 584 00:35:12,020 --> 00:35:17,500 Έτσι, αν ο κακός είναι εξαιρετικά έξυπνος, αυτός ή αυτή πρόκειται να περιληφθούν στο εν λόγω κώδικα επίθεσης 585 00:35:17,500 --> 00:35:20,930 κάτι σαν να διαγράψετε όλα τα αρχεία του χρήστη ή να αντιγράψετε τους κωδικούς πρόσβασης 586 00:35:20,930 --> 00:35:24,680 ή να δημιουργήσετε ένα λογαριασμό χρήστη που μπορεί στη συνέχεια να συνδεθείτε στο - οτιδήποτε. 587 00:35:24,680 --> 00:35:26,950 >> Και αυτό είναι τόσο ο κίνδυνος και η δύναμη του C. 588 00:35:26,950 --> 00:35:29,840 Επειδή έχετε πρόσβαση στη μνήμη μέσω των δεικτών 589 00:35:29,840 --> 00:35:32,520 και μπορείτε να γράψετε ως εκ τούτου ό, τι θέλετε στη μνήμη ενός υπολογιστή, 590 00:35:32,520 --> 00:35:35,080 μπορείτε να κάνετε έναν υπολογιστή κάνει ό, τι θέλετε 591 00:35:35,080 --> 00:35:39,550 απλά με το να το ρίξουν μια ματιά στο δικό του χώρο μνήμης του. 592 00:35:39,550 --> 00:35:44,650 Και έτσι σε αυτήν την ημέρα τόσα πολλά προγράμματα και τόσες πολλές ιστοσελίδες που είναι σε κίνδυνο 593 00:35:44,650 --> 00:35:46,200 συνοψίζεται στους ανθρώπους να επωφεληθούν από αυτό. 594 00:35:46,200 --> 00:35:50,760 Και αυτό μπορεί να φαίνεται σαν ένα σούπερ εξελιγμένα επίθεση, αλλά δεν ξεκινά πάντα με αυτόν τον τρόπο. 595 00:35:50,760 --> 00:35:53,560 Η πραγματικότητα είναι ότι ό, τι κακοί άνθρωποι θα κάνουν συνήθως είναι, 596 00:35:53,560 --> 00:35:58,200 είτε πρόκειται για ένα πρόγραμμα σε μια γραμμή εντολών ή ένα πρόγραμμα GUI ή μια ιστοσελίδα, 597 00:35:58,200 --> 00:35:59,940 μόλις ξεκινήσει την παροχή ανοησίες. 598 00:35:59,940 --> 00:36:03,980 Πληκτρολογείτε σε μια πραγματικά μεγάλη λέξη στο πεδίο αναζήτησης και πατήστε Enter, 599 00:36:03,980 --> 00:36:05,780 και σας περιμένουμε για να δούμε αν η ιστοσελίδα συντρίβει 600 00:36:05,780 --> 00:36:09,990 ή θα περιμένουμε να δούμε αν το πρόγραμμα εκδηλώνεται κάποιο μήνυμα σφάλματος 601 00:36:09,990 --> 00:36:14,330 γιατί αν πάρετε τυχεροί ως ο κακός και σας παρέχει κάποια τρελή εισόδου 602 00:36:14,330 --> 00:36:18,980 που κολλάει το πρόγραμμα, αυτό σημαίνει ότι ο προγραμματιστής δεν πρόλαβε την κακή συμπεριφορά σας, 603 00:36:18,980 --> 00:36:23,630 το οποίο σημαίνει ότι μπορείτε να πιθανώς με αρκετή προσπάθεια, ώστε δοκιμής και του λάθους, 604 00:36:23,630 --> 00:36:26,650 καταλάβω πώς να ξεκινήσουν έναν πιο ακριβή επίθεση. 605 00:36:26,650 --> 00:36:31,410 Έτσι, τόσο ένα μέρος της ασφάλειας δεν είναι απλώς αποφεύγοντας τις επιθέσεις αυτές συνολικά 606 00:36:31,410 --> 00:36:34,100 αλλά και την ανίχνευση τους και πραγματικά κοιτάζοντας κούτσουρα 607 00:36:34,100 --> 00:36:36,780 και να δει τι τρελό είσοδοι έχουν πληκτρολογήσει τους ανθρώπους στην ιστοσελίδα σας, 608 00:36:36,780 --> 00:36:38,960 τι όρους αναζήτησης έχουν οι άνθρωποι πληκτρολογήσει στην ιστοσελίδα σας 609 00:36:38,960 --> 00:36:42,870 με την ελπίδα κάποια υπερχείλιση buffer. 610 00:36:42,870 --> 00:36:45,500 Και αυτό όλα βράζει κάτω στην απλή βασικά του τι είναι ένας πίνακας 611 00:36:45,500 --> 00:36:49,080 και τι σημαίνει αυτό για την κατανομή και τη χρήση της μνήμης. 612 00:36:49,080 --> 00:36:51,710 >> Σχετικά με αυτό, τότε είναι πάρα πολύ αυτό. 613 00:36:51,710 --> 00:36:54,280 Ας ρίξουμε μια ματιά στο εσωτερικό του σκληρού δίσκου και πάλι. 614 00:36:54,280 --> 00:36:58,440 Θυμάστε από μια εβδομάδα ή δύο πριν ότι όταν μεταφέρετε αρχεία στο κάδο ανακύκλωσης ή σκουπίδια σας μπορεί, 615 00:36:58,440 --> 00:37:03,710 τι συμβαίνει; >> [Φοιτητής] Τίποτα. >> Απολύτως τίποτα, έτσι δεν είναι; 616 00:37:03,710 --> 00:37:05,740 Τελικά, αν είναι χαμηλό χώρο στο δίσκο, 617 00:37:05,740 --> 00:37:08,190 Windows ή Mac OS θα ξεκινήσει τη διαγραφή των αρχείων για εσάς. 618 00:37:08,190 --> 00:37:10,390 Αλλά αν σύρετε κάτι εκεί μέσα, αυτό δεν είναι καθόλου ασφαλή. 619 00:37:10,390 --> 00:37:13,800 Όλα συγκάτοικό σας ή φίλο ή μέλος της οικογένειας που έχει να κάνει είναι διπλό κλικ και, voila, 620 00:37:13,800 --> 00:37:16,310 υπάρχει όλοι οι πρόχειρες αρχεία που προσπαθήσατε να διαγράψετε. 621 00:37:16,310 --> 00:37:19,590 Οι περισσότεροι από εμάς γνωρίζουν τουλάχιστον ότι θα πρέπει να κάνετε δεξί κλικ ή κάντε κλικ στο κουμπί ελέγχου 622 00:37:19,590 --> 00:37:22,310 και αδειάστε το κάδο απορριμμάτων ή κάτι τέτοιο. 623 00:37:22,310 --> 00:37:25,000 Αλλά ακόμα και τότε που δεν κάνει αρκετά το τέχνασμα 624 00:37:25,000 --> 00:37:28,010 γιατί ό, τι συμβαίνει όταν έχετε ένα αρχείο στο σκληρό σας δίσκο 625 00:37:28,010 --> 00:37:32,770 που αντιπροσωπεύει περίπου το έγγραφο του Word ή κάποιο JPEG, και αυτό αντιπροσωπεύει τον σκληρό σας δίσκο, 626 00:37:32,770 --> 00:37:35,350 και ας πούμε ότι αυτή η σχίζα εδώ αντιπροσωπεύει αυτό το αρχείο, 627 00:37:35,350 --> 00:37:38,390 και αυτό είναι που αποτελείται από ένα σωρό 0s και 1s. 628 00:37:38,390 --> 00:37:42,470 Τι συμβαίνει όταν δεν μπορείτε να σύρετε μόνο το αρχείο στον κάδο απορριμμάτων μπορεί ή κάδο ανακύκλωσης 629 00:37:42,470 --> 00:37:48,020 αλλά επίσης αδειάσει; Ταξινόμηση του τίποτα. 630 00:37:48,020 --> 00:37:49,640 Δεν είναι απολύτως τίποτα τώρα. 631 00:37:49,640 --> 00:37:54,290 Τώρα είναι ακριβώς επειδή δεν είναι λίγο κάτι που συμβαίνει με τη μορφή του πίνακα αυτού. 632 00:37:54,290 --> 00:37:58,370 Έτσι, υπάρχει κάποιο είδος της βάσης δεδομένων ή πίνακα στο εσωτερικό της μνήμης ενός υπολογιστή 633 00:37:58,370 --> 00:38:03,850 που έχει ουσιαστικά μία στήλη για τα αρχεία τα ονόματα και μία στήλη για τα αρχεία "τοποθεσία, 634 00:38:03,850 --> 00:38:07,720 όπου αυτό θα μπορούσε να θέση 123, μόνο ένα τυχαίο αριθμό. 635 00:38:07,720 --> 00:38:14,560 Έτσι, θα μπορούσαμε να έχουμε κάτι σαν x.jpeg και τη θέση 123. 636 00:38:14,560 --> 00:38:18,800 Τι θα συμβεί στη συνέχεια, όταν έχετε αδειάσει πραγματικά σκουπίδια σας; 637 00:38:18,800 --> 00:38:20,330 Αυτό πηγαίνει μακριά. 638 00:38:20,330 --> 00:38:23,610 Αλλά ό, τι δεν πάει μακριά είναι η 0s και 1s. 639 00:38:23,610 --> 00:38:26,270 >> Λοιπόν, τι είναι τότε η σύνδεση με pset4; 640 00:38:26,270 --> 00:38:31,240 Λοιπόν, με pset4, μόνο και μόνο επειδή έχουμε διαγραφεί κατά λάθος την κάρτα Compact Flash 641 00:38:31,240 --> 00:38:35,750 που είχε όλα αυτά τα φωτογραφίες ή απλά επειδή είναι από κακή τύχη έγινε κατεστραμμένο 642 00:38:35,750 --> 00:38:38,000 δεν σημαίνει ότι η 0s και 1s δεν είναι ακόμα εκεί. 643 00:38:38,000 --> 00:38:40,410 Ίσως μερικά από αυτά χάνονται επειδή κάτι έχει καταστραφεί 644 00:38:40,410 --> 00:38:43,320 με την έννοια ότι ορισμένες 0s και 1s έγινε 1s έγινε 0s. 645 00:38:43,320 --> 00:38:47,240 Κακά πράγματα μπορούν να συμβούν λόγω της προβληματικό λογισμικό ή ελαττωματικό υλικό. 646 00:38:47,240 --> 00:38:50,370 Αλλά πολλά από αυτά τα κομμάτια, ίσως ακόμη και 100% από αυτούς, είναι ακόμα εκεί. 647 00:38:50,370 --> 00:38:55,050 Είναι απλά ότι ο υπολογιστής ή η φωτογραφική μηχανή δεν ξέρει πού ξεκίνησε JPEG1 648 00:38:55,050 --> 00:38:56,910 όπου και ξεκίνησε JPEG2. 649 00:38:56,910 --> 00:39:01,070 Αλλά αν, ο προγραμματιστής, ξέρετε με λίγο καταλαβαίνω πού είναι αυτά τα αρχεία JPEG 650 00:39:01,070 --> 00:39:06,010 ή τι μοιάζουν, έτσι ώστε να μπορεί να αναλύσει το 0s και 1s και να πω JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 μπορείτε να γράψετε ένα πρόγραμμα με ουσιαστικά μόνο ένα βρόχο for ή while 652 00:39:09,440 --> 00:39:12,820 που ανακτά κάθε ένα από αυτά τα αρχεία. 653 00:39:12,820 --> 00:39:16,030 Έτσι, το μάθημα είναι στη συνέχεια να ξεκινήσει με ασφάλεια τη διαγραφή αρχείων σας 654 00:39:16,030 --> 00:39:18,340 αν θέλετε να το αποφύγετε αυτό εντελώς. Ναι. 655 00:39:18,340 --> 00:39:21,010 >> [Φοιτητής] Πώς γίνεται να λέει στον υπολογιστή σας 656 00:39:21,010 --> 00:39:23,550 ότι έχετε περισσότερη μνήμη από ό, τι κάνατε πριν; 657 00:39:23,550 --> 00:39:27,820 Έχουν περισσότερη μνήμη από ό, τι κάνατε πριν - >> [φοιτητής] Περισσότερα διαθέσιμη μνήμη. 658 00:39:27,820 --> 00:39:29,630 Αχ. Καλή ερώτηση. 659 00:39:29,630 --> 00:39:32,360 Γιατί, λοιπόν, στη συνέχεια, μετά το άδειασμα του κάδου απορριμμάτων ο υπολογιστής σας να σας πω 660 00:39:32,360 --> 00:39:34,910 ότι έχετε περισσότερο ελεύθερο χώρο από ό, τι κάνατε πριν; 661 00:39:34,910 --> 00:39:36,770 Με λίγα λόγια, επειδή είναι ψέματα. 662 00:39:36,770 --> 00:39:40,740 Περισσότερα τεχνικά, έχετε περισσότερο χώρο, γιατί τώρα είπατε 663 00:39:40,740 --> 00:39:43,680 μπορείτε να βάλετε άλλα πράγματα όταν το αρχείο ήταν κάποτε. 664 00:39:43,680 --> 00:39:45,450 Αλλά αυτό δεν σημαίνει ότι τα bits πρόκειται μακριά, 665 00:39:45,450 --> 00:39:48,590 και αυτό δεν σημαίνει ότι τα δυαδικά ψηφία που αλλάζουν σε όλες 0s, για παράδειγμα, 666 00:39:48,590 --> 00:39:50,150 για την προστασία σας. 667 00:39:50,150 --> 00:39:54,640 Έτσι, αντίθετα, αν διαγράψετε με ασφάλεια τα αρχεία ή φυσικά καταστρέψει τη συσκευή, 668 00:39:54,640 --> 00:39:57,300 αυτό είναι πραγματικά ο μόνος τρόπος μερικές φορές γύρω από αυτό. 669 00:39:57,300 --> 00:40:02,020 >> Γιατί λοιπόν να μην αφήσουμε σε αυτό το ημι-τρομακτικό σημείωμα, και εμείς θα σας δούμε τη Δευτέρα. 670 00:40:02,020 --> 00:40:07,000 [Χειροκροτήματα] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]