1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. MALAN: Εντάξει. 4 00:00:12,640 --> 00:00:14,525 Αυτό είναι CS50. 5 00:00:14,525 --> 00:00:16,009 Και αυτή είναι η αρχή της εβδομάδας 5. 6 00:00:16,009 --> 00:00:18,050 Και όπως ίσως έχετε παρατηρήσει, μέρος του υλικού 7 00:00:18,050 --> 00:00:21,050 είναι να πάρει λίγο περισσότερο συγκρότημα, το μικρό πυκνότερο. 8 00:00:21,050 --> 00:00:24,560 >> Και είναι πολύ εύκολο, ειδικά αν ήσαστε στη συνήθεια για κάποιο χρονικό διάστημα, 9 00:00:24,560 --> 00:00:28,600 να προσπαθεί να κακογραφία κάτω πιο οτιδήποτε κάνουμε, λέμε στην τάξη. 10 00:00:28,600 --> 00:00:31,626 Αλλά συνειδητοποιούν, ότι δεν είναι ίσως η ιδανική παιδαγωγική προσέγγιση 11 00:00:31,626 --> 00:00:34,250 στην εκμάθηση αυτό το είδος του υλικού, και το υλικό γενικότερα. 12 00:00:34,250 --> 00:00:37,250 Και έτσι είμαστε στην ευχάριστη θέση να ανακοινώσει τις δικές Gheng αυτού του CS50 του 13 00:00:37,250 --> 00:00:39,780 Gong έχει αρχίσει να προετοιμάζει μια κανονική σειρά των σημειώσεων 14 00:00:39,780 --> 00:00:42,100 για την πορεία, η ελπίδα η οποία είναι ότι, ένα, αυτά 15 00:00:42,100 --> 00:00:44,030 όχι μόνο να χρησιμεύσει ως μια αναφοράς και ένας πόρος 16 00:00:44,030 --> 00:00:47,410 για την αναθεώρηση υλικό και θα πίσω διαμέσου του υλικού που μπορεί να έχουν 17 00:00:47,410 --> 00:00:51,230 θα ξεφύγει από την πρώτη φορά, αλλά Επίσης, έτσι ώστε το κεφάλι σας μπορεί να είναι πιο 18 00:00:51,230 --> 00:00:53,740 up από τα κάτω, όταν έρχεται η ώρα να μιλήσει, 19 00:00:53,740 --> 00:00:56,960 έτσι ώστε να μπορεί να συμμετάσχει πιο προσεκτικά, όπως 20 00:00:56,960 --> 00:00:59,170 σε αντίθεση με πιο scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Με αυτόν εν λόγω, αυτό που θα βρείτε στο η ιστοσελίδα είναι τέτοια έγγραφα όπως αυτό. 22 00:01:02,510 --> 00:01:04,660 Και προειδοποίηση, στο επάνω αριστερό μέρος, υπάρχει όχι μόνο έναν πίνακα περιεχομένων, 23 00:01:04,660 --> 00:01:06,920 αλλά και τους κωδικούς του χρόνου ότι θα πηδήξει αμέσως 24 00:01:06,920 --> 00:01:09,077 στο κατάλληλο μέρος σε απευθείας σύνδεση βίντεο. 25 00:01:09,077 --> 00:01:11,410 Και τι Chang εδώ έχει γίνει είναι, κατ 'ουσίαν, τεκμηριωμένη 26 00:01:11,410 --> 00:01:13,340 τι συνέβη σε αυτό το Ειδικότερα διάλεξη. 27 00:01:13,340 --> 00:01:16,370 Και πολλές από τις διαλέξεις είναι ήδη σε απευθείας σύνδεση τώρα με αυτό το URL. 28 00:01:16,370 --> 00:01:20,110 Και θα συνεχίσουμε να δημοσιεύσετε το υπόλοιπο των στοιχείων αυτών από το τέλος αυτής της εβδομάδας, 29 00:01:20,110 --> 00:01:22,380 έτσι ώστε να επωφεληθούν αυτού του πόρου. 30 00:01:22,380 --> 00:01:25,740 >> Έτσι, χωρίς άλλη καθυστέρηση, αρχίσαμε να ξεκολλήσετε 31 00:01:25,740 --> 00:01:28,180 το στρώμα που έχει κορδόνι για κάποιο χρονικό διάστημα. 32 00:01:28,180 --> 00:01:30,670 Και τι να πούμε ένα string στην πραγματικότητα είναι η τελευταία εβδομάδα; 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Έτσι char αστέρι. 35 00:01:32,900 --> 00:01:34,900 Και char αστέρι, καλά, τι έκανε ότι πραγματικά σημαίνει; 36 00:01:34,900 --> 00:01:37,150 Λοιπόν, όλο αυτό το διάστημα, αν έχουμε ζητούν μια λειτουργία, 37 00:01:37,150 --> 00:01:40,450 όπως GetString και αποθήκευση η λεγόμενη επιστροφή 38 00:01:40,450 --> 00:01:42,910 αξία των GetString σε ένα variable-- λέγεται 39 00:01:42,910 --> 00:01:47,721 s τύπου string-- έχουμε γράψει η γραμμή του κώδικα μέχρι εκεί πάνω. 40 00:01:47,721 --> 00:01:49,970 Και αυτό είναι μόνο όταν βλέπω μου χειρογράφου μεγεθύνονται εδώ 41 00:01:49,970 --> 00:01:51,930 μπορώ να συνειδητοποιήσουμε πόσο φρικτό είναι αυτό. 42 00:01:51,930 --> 00:01:54,180 >> Ωστόσο, ας υποθέσουμε ότι, στη δεξιά πλευρά 43 00:01:54,180 --> 00:01:57,070 Είναι, ωστόσο, μια λογική απεικόνιση του τι είναι 44 00:01:57,070 --> 00:01:58,880 συνεχίζεται σε όλα αυτά χρόνο με GetString. 45 00:01:58,880 --> 00:02:00,380 GetString, φυσικά, παίρνει ένα string. 46 00:02:00,380 --> 00:02:01,691 Αλλά τι σημαίνει αυτό στην πράξη; 47 00:02:01,691 --> 00:02:04,190 Αυτό σημαίνει ότι παίρνει ένα κομμάτι της μνήμη από το λειτουργικό σύστημα 48 00:02:04,190 --> 00:02:06,040 καλώντας μια συνάρτηση, που ονομάζεται malloc. 49 00:02:06,040 --> 00:02:07,390 Αλλά περισσότερα για αυτό αργότερα. 50 00:02:07,390 --> 00:02:09,139 Και τότε συμπληρώνει ότι κομμάτι της μνήμης 51 00:02:09,139 --> 00:02:11,764 με τις επιστολές που ο χρήστης έχει πληκτρολογήσει, ακολουθούμενη από, φυσικά, 52 00:02:11,764 --> 00:02:14,800 ένα κενό χαρακτήρα, ή backslash μηδέν στο τέλος. 53 00:02:14,800 --> 00:02:18,280 >> Εν τω μεταξύ, από την αριστερή πλευρά από αυτή την ιστορία, όλο αυτό το διάστημα, 54 00:02:18,280 --> 00:02:20,850 έχουμε δηλώνοντας μια μεταβλητή, όπως το s. 55 00:02:20,850 --> 00:02:24,770 Και αυτή η μεταβλητή είναι ό, τι τώρα θα ξεκινήσει την κλήση ενός δείκτη. 56 00:02:24,770 --> 00:02:29,190 Δεν είναι ένα κουτί στο εσωτερικό του οποίου βάζουμε το string, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 αλλά μάλλον βάζουμε σε αυτό το τετράγωνο κουτί στα αριστερά τι ακριβώς; 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Ναι; 60 00:02:35,390 --> 00:02:37,118 >> ΚΟΙΝΟ: Η διεύθυνση της όπου βρίσκονται στη μνήμη. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. MALAN: Ακριβώς. 62 00:02:38,118 --> 00:02:40,690 Η διεύθυνση του όπου Daven βρίσκεται στη μνήμη. 63 00:02:40,690 --> 00:02:44,650 Και όχι όπου όλα Daven βρίσκεται, per se, αλλά ειδικά η διεύθυνση 64 00:02:44,650 --> 00:02:45,150 από τι; 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Ναι; 67 00:02:46,810 --> 00:02:47,460 >> ΚΟΙΝΟ: Πρώτη χαρακτήρα. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. MALAN: Ο πρώτος χαρακτήρας σε Daven, η οποία, στην περίπτωση αυτή, 69 00:02:50,209 --> 00:02:53,820 Μου πρότεινε ήταν αυθαίρετα και εξωπραγματικά 1, ΟΧ1, 70 00:02:53,820 --> 00:02:55,910 που απλά σημαίνει ότι η δεκαεξαδικό αριθμό 1. 71 00:02:55,910 --> 00:02:57,993 Αλλά κατά πάσα πιθανότητα θα να είναι ένα πολύ μεγαλύτερο αριθμό 72 00:02:57,993 --> 00:03:01,260 ότι θα μπορούσαμε να επιστήσει με 0x ως πρόθεμα, 73 00:03:01,260 --> 00:03:02,806 αντιπροσωπεύει ένα δεκαεξαδικό χαρακτήρα. 74 00:03:02,806 --> 00:03:05,930 Και επειδή εμείς δεν χρειάζεται να γνωρίζουν πού το υπόλοιπο από τους χαρακτήρες του Daven 75 00:03:05,930 --> 00:03:09,860 είναι, γιατί από ό, τι απλό σχεδιασμό απόφαση που είχε γίνει πριν από πολλά χρόνια; 76 00:03:09,860 --> 00:03:10,548 Ναι; 77 00:03:10,548 --> 00:03:11,651 >> ΚΟΙΝΟ: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. MALAN: Ναι, ακριβώς. 79 00:03:12,900 --> 00:03:18,100 Το backslash 0 σας επιτρέπει, έστω και σε γραμμικό χρόνο, για να διασχίσει το string, 80 00:03:18,100 --> 00:03:20,400 με τα πόδια από τα αριστερά προς τα δεξιά, με ένα βρόχο for, ή λίγο 81 00:03:20,400 --> 00:03:22,608 βρόχου, ή κάτι παρόμοιο ότι, και καθορίζουν, oh, εδώ 82 00:03:22,608 --> 00:03:24,751 είναι το τέλος αυτής της συγκεκριμένης σειράς. 83 00:03:24,751 --> 00:03:27,000 Έτσι, με μόνο τη διεύθυνση η αρχή μιας συμβολοσειράς, 84 00:03:27,000 --> 00:03:30,290 μπορούμε να έχουμε πρόσβαση το σύνολο των αυτό, γιατί όλο αυτό το διάστημα, 85 00:03:30,290 --> 00:03:32,030 ένα string έχει μόλις ένα αστέρι char. 86 00:03:32,030 --> 00:03:36,370 >> Έτσι, είναι σίγουρα μια χαρά να συνεχίσετε να χρησιμοποιείτε η βιβλιοθήκη CS50 και αυτή η αφαίρεση, 87 00:03:36,370 --> 00:03:38,440 να το πω έτσι, αλλά θα αρχίσετε να βλέπετε ακριβώς 88 00:03:38,440 --> 00:03:41,230 τι συμβαίνει στις κάτω από όλο αυτό το χρονικό διάστημα. 89 00:03:41,230 --> 00:03:45,260 Έτσι, μπορείτε να ανακαλέσετε αυτό το παράδειγμα, πάρα πολύ, από την τελευταία φορά, να συγκρίνουν 0, 90 00:03:45,260 --> 00:03:47,300 η οποία στην πραγματικότητα δεν συγκρίνετε. 91 00:03:47,300 --> 00:03:49,070 Αλλά αρχίσαμε να λύσουμε αυτό. 92 00:03:49,070 --> 00:03:52,020 >> Αλλά, όπως ίσως μια επανεκπαίδευση, θα μπορούσα να ενδιαφέρουν κάποιον 93 00:03:52,020 --> 00:03:54,261 σε ένα ροζ ελέφαντα σήμερα, επίσης από Chang; 94 00:03:54,261 --> 00:03:55,760 Πώς για σας μπροστά; [Δεν ακούγεται]. 95 00:03:55,760 --> 00:03:56,660 Έλα πάνω. 96 00:03:56,660 --> 00:03:58,740 >> Και εν τω μεταξύ, καθώς έρχεστε επάνω, ας 97 00:03:58,740 --> 00:04:01,670 σκεφτείτε για μια στιγμή τι αυτός ο κώδικας ήταν στην πραγματικότητα κάνει. 98 00:04:01,670 --> 00:04:04,917 Είναι δηλώνοντας δύο μεταβλητές up κορυφή, s και t, και καλώντας GetString. 99 00:04:04,917 --> 00:04:08,250 Αυτό δεν είναι ένα πολύ φιλικό προς το χρήστη πρόγραμμα, γιατί δεν σας πω τι να κάνετε. 100 00:04:08,250 --> 00:04:10,541 Αλλά το αφήσουμε υποθέσουμε είμαστε με επίκεντρο το ζουμερό μέρος. 101 00:04:10,541 --> 00:04:14,470 Και τότε θα κάνουμε, αν s ισούται ισούται με t, θα πρέπει να πούμε printf, 102 00:04:14,470 --> 00:04:16,170 έχετε πληκτρολογήσει το ίδιο πράγμα. 103 00:04:16,170 --> 00:04:16,670 Γεια σας. 104 00:04:16,670 --> 00:04:17,050 Ποιο είναι το όνομά σου; 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. MALAN: Janelle, Χαίρω πολύ. 107 00:04:19,529 --> 00:04:21,800 Έτσι πρόκληση σας σε χέρι για αυτό το ελέφαντα 108 00:04:21,800 --> 00:04:25,230 είναι η πρώτη για να επιστήσει μας μια εικόνα του τι είναι που εκπροσωπούνται σε αυτά τα δύο πρώτα 109 00:04:25,230 --> 00:04:25,970 γραμμές. 110 00:04:25,970 --> 00:04:28,139 Έτσι s και το t μπορεί να είναι αντιπροσώπευε το πώς εμφανίζονται στην οθόνη; 111 00:04:28,139 --> 00:04:30,680 Και μπορείτε να σχεδιάσετε μόνο με το δάχτυλό σας για αυτή τη μεγάλη οθόνη. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Έτσι, υπάρχουν δύο μισά να κάθε πλευρά αυτής της εξίσωσης. 114 00:04:34,510 --> 00:04:37,760 Έτσι, υπάρχει s για την αριστερά, και Στη συνέχεια GetString στα δεξιά. 115 00:04:37,760 --> 00:04:40,540 Και έπειτα υπάρχει t στα αριστερά, και στη συνέχεια GetString στα δεξιά. 116 00:04:40,540 --> 00:04:42,630 Λοιπόν, πώς θα μπορούσαμε να αρχίσουμε με βάση μια εικόνα ότι 117 00:04:42,630 --> 00:04:46,340 αντιπροσωπεύει ό, τι συμβαίνει εδώ στη μνήμη, θα λέγατε; 118 00:04:46,340 --> 00:04:49,150 Και επιτρέψτε μου να σας εξηγήσω τι κάνεις as you go. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Λοιπόν, πρώτα, θα πρέπει να ζητά μπορείτε να πάρετε το string εισόδου. 121 00:04:58,890 --> 00:05:00,439 Και θα store-- Ω, συγγνώμη. 122 00:05:00,439 --> 00:05:01,230 DAVID J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Καλή. 124 00:05:01,730 --> 00:05:03,330 Και αυτό λέγεται αυτό; 125 00:05:03,330 --> 00:05:03,950 Ω, εντάξει. 126 00:05:03,950 --> 00:05:04,450 Συνεχίστε. 127 00:05:04,450 --> 00:05:05,575 Δεν ήθελα να διακόψω. 128 00:05:05,575 --> 00:05:07,060 Janelle: Συγγνώμη. 129 00:05:07,060 --> 00:05:14,237 Έτσι θα εισόδου του σε η διεύθυνση δεν of-- σίγουρος. 130 00:05:14,237 --> 00:05:17,320 Δεν μπορώ να θυμηθώ ακριβώς τον αριθμό, αλλά πιστεύω ότι είχε αρχίσει με 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. MALAN: Αυτό είναι εντάξει, γιατί έκανα τους αριθμούς επάνω, 132 00:05:18,420 --> 00:05:19,650 οπότε δεν υπάρχει σωστή απάντηση. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Ξεκινώντας με το 0 τόξο. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. MALAN: Εντάξει, έτσι το στοιχείο 0. 135 00:05:24,000 --> 00:05:24,765 Σίγουρα. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: Και στη συνέχεια, αν ήταν όπως ακριβώς ένα δύο-letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. MALAN: Εντάξει, πίσω σε σας. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Έτσι στοιχείο 0, και τότε το στοιχείο 1 ή στοιχείο 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. MALAN: Και ποιο κομμάτι της η εικόνα σας σύρουν τώρα; 140 00:05:36,670 --> 00:05:37,690 Η κλήση προς GetString; 141 00:05:37,690 --> 00:05:38,830 Ή η δήλωση του s; 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Η δήλωση του s, πιστεύω. 143 00:05:42,890 --> 00:05:45,980 Ω, η GetString, επειδή θα να εισάγονται σε κάθε [? περιοχή. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. MALAN: Καλή. 145 00:05:46,510 --> 00:05:47,051 Ακριβώς. 146 00:05:47,051 --> 00:05:49,300 Ακόμα κι αν αυτό αποτελεσματικά επιστρέφει ένα array, ανάκληση, 147 00:05:49,300 --> 00:05:53,300 όταν παίρνουμε πίσω ένα string, μπορούμε δείκτη σε αυτή string χρησιμοποιώντας 01 και 2. 148 00:05:53,300 --> 00:05:56,180 Από τεχνική άποψη, αυτοί είναι πιθανώς αντιπροσωπεύεται από μεμονωμένες διευθύνσεις, 149 00:05:56,180 --> 00:05:57,100 αλλά αυτό είναι εντάξει. 150 00:05:57,100 --> 00:06:00,170 >> Έτσι, ας υποθέσουμε ότι, αν μπορώ απλά γρήγορα διαβιβάσει στο σημείο όπου είχαμε μείνει 151 00:06:00,170 --> 00:06:04,320 τελευταία φορά, εάν ένας από οι χορδές ήταν g α β ε, 152 00:06:04,320 --> 00:06:10,337 backslash 0, πράγμα που σημαίνει ότι ο Gabe του εισόδου, πώς θα μπορούσαμε να εκπροσωπεί s τώρα; 153 00:06:10,337 --> 00:06:12,670 Αν αυτή είναι η μνήμη που είναι έχουν επιστραφεί από GetString; 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Θα ήταν αντιπροσωπεύεται από ένα τόξο; 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. MALAN: Με ένα τόξο; 157 00:06:18,750 --> 00:06:19,130 Λοιπόν, όχι. 158 00:06:19,130 --> 00:06:21,171 Ας πούμε, εικαστικά, επιτρέψτε μου να πάμε μπροστά 159 00:06:21,171 --> 00:06:25,710 και προτείνει ότι, εάν αυτό είναι s, αυτό είναι η τιμή επιστροφής της GetString. 160 00:06:25,710 --> 00:06:29,482 Και έχετε αυτό που ως 0, 1, 2, η οποία είναι απολύτως λογικό, γιατί εμείς 161 00:06:29,482 --> 00:06:30,940 μπορεί δείκτη σε string, ως τέτοιο. 162 00:06:30,940 --> 00:06:33,340 Αλλά ακριβώς για να είναι συνεπείς με τελευταία φορά, επιτρέψτε μου να πάμε μπροστά 163 00:06:33,340 --> 00:06:37,310 και αυθαίρετα προτείνουν ότι αυτή η είναι η διεύθυνση 1, αυτό είναι διεύθυνση 2, 164 00:06:37,310 --> 00:06:39,597 Αυτή είναι η διεύθυνση 3, και ούτω καθεξής. 165 00:06:39,597 --> 00:06:41,430 Και αυτό, ακριβώς για να είναι super σαφής, τι συμβαίνει 166 00:06:41,430 --> 00:06:44,580 να πάει σε s ως αποτέλεσμα του ότι πρώτη γραμμή του κώδικα, θα λέγατε; 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Διεύθυνση 1; 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. MALAN: Ακριβώς. 169 00:06:46,420 --> 00:06:47,190 Έτσι αντιμετώπιση 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Και εν τω μεταξύ, επιτρέψτε μου να πάει μπροστά και επαναλαμβάνουν πολλά από αυτά που έχετε κάνει 172 00:06:51,230 --> 00:06:52,740 και να προσθέσετε το δικό μου t εδώ. 173 00:06:52,740 --> 00:06:56,340 Αν ήταν να πληκτρολογήσετε Gabe πάλι, μια δεύτερη φορά, 174 00:06:56,340 --> 00:07:01,530 όταν σας ζητηθεί με GetString, όπου, Φυσικά, είναι Gabe πρόκειται να πάει; 175 00:07:01,530 --> 00:07:02,280 Λοιπόν, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Όπως εδώ; 178 00:07:05,975 --> 00:07:06,850 DAVID J. MALAN: Ναι. 179 00:07:06,850 --> 00:07:08,516 Janelle: Ή είναι, επίσης, στις ίδιες θέσεις; 180 00:07:08,516 --> 00:07:11,940 DAVID J. MALAN: Επιτρέψτε μου να προτείνω, ναι, ακριβώς, οπότε σε αυτές τις πρόσθετες θέσεις. 181 00:07:11,940 --> 00:07:15,230 Αλλά τι είναι το κλειδί τώρα είναι ότι, ακόμα και αν και έχω σχεδιάσει αυτά αρκετά κοντά 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, αυτό είναι 0x2-- στην πραγματικότητα, 183 00:07:18,650 --> 00:07:25,750 Αυτό τώρα μπορεί να είναι η διεύθυνση 0x10, για παράδειγμα, και 0x11 και 0x12, 184 00:07:25,750 --> 00:07:26,870 και ούτω καθεξής. 185 00:07:26,870 --> 00:07:29,955 Και έτσι, αν αυτή είναι η περίπτωση, τι πρόκειται να καταλήξουμε εδώ σε t; 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10; 187 00:07:30,830 --> 00:07:31,830 DAVID J. MALAN: Ακριβώς. 188 00:07:31,830 --> 00:07:33,180 Έτσι, 0x10. 189 00:07:33,180 --> 00:07:34,570 Και έτσι τώρα, τελευταία ερώτηση. 190 00:07:34,570 --> 00:07:37,510 Έχετε, κατά πολύ, έπρεπε να λειτουργήσει το πιο δύσκολο για έναν ελέφαντα μέχρι στιγμής. 191 00:07:37,510 --> 00:07:42,650 Μέχρι τώρα, αν έχω σηκώσει τον κωδικό και πάλι, όταν το κάνω, στην γραμμή των τριών, 192 00:07:42,650 --> 00:07:47,630 αν s ισούται ισούται με t, τι είμαι πραγματικά συγκρίνοντας ότι έχουμε που εδώ; 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Οι δύο διευθύνσεις; 194 00:07:49,271 --> 00:07:50,270 DAVID J. MALAN: Ακριβώς. 195 00:07:50,270 --> 00:07:53,350 Γι 'αυτό λέω είναι s ίση ίσο με t; 196 00:07:53,350 --> 00:07:56,210 Με άλλα λόγια, είναι ίση 1 ίσο με 10; 197 00:07:56,210 --> 00:07:59,710 Και φυσικά, ο προφανής απάντηση είναι τώρα, όχι. 198 00:07:59,710 --> 00:08:02,920 Και έτσι αυτό το πρόγραμμα είναι τελικά πρόκειται να εκτυπώσετε ό, τι θα λέγατε; 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Θα ήταν, έχετε πληκτρολογήσει το ίδιο πράγμα; 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. MALAN: Έτσι, αν το s είναι 1 και το t είναι 10; 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Έχετε πληκτρολογήσει διαφορετικά πράγματα. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. MALAN: Ακριβώς. 204 00:08:13,570 --> 00:08:14,480 Έχετε πληκτρολογήσει διαφορετικά πράγματα. 205 00:08:14,480 --> 00:08:14,850 Εντάξει. 206 00:08:14,850 --> 00:08:16,714 Έτσι, ένας γύρος χειροκρότημα, αν μπορούσαμε, εδώ. 207 00:08:16,714 --> 00:08:17,214 [Χειροκρότημα] 208 00:08:17,214 --> 00:08:17,708 Αυτό ήταν οδυνηρή. 209 00:08:17,708 --> 00:08:18,208 Το ξέρω. 210 00:08:18,208 --> 00:08:19,684 Όμορφα γίνει. 211 00:08:19,684 --> 00:08:24,690 Έτσι, τώρα ας δούμε αν δεν μπορούμε πειράζω χώρια ό, τι η λύση ήταν. 212 00:08:24,690 --> 00:08:28,040 Και φυσικά, όταν έχουμε σταθερό αυτό-- η οποία θα εκπροσωπεί τώρα στην green-- 213 00:08:28,040 --> 00:08:29,690 κάναμε μερικές βελτιώσεις εδώ. 214 00:08:29,690 --> 00:08:32,409 Πρώτον, όπως ακριβώς μια λογική ελέγχει, είμαι πρώτα τον έλεγχο 215 00:08:32,409 --> 00:08:35,110 αν s ισούται με μηδέν και t ισούται με μηδέν. 216 00:08:35,110 --> 00:08:39,440 Και ακριβώς για να είναι σαφής, όταν θα μπορούσε s ή t να είναι μηδενική σε κώδικα όπως αυτό; 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Πότε μπορεί να s ή t να είναι null. 219 00:08:44,490 --> 00:08:44,990 Ναι; 220 00:08:44,990 --> 00:08:45,990 >> ΚΟΙΝΟ: [δεν ακούγεται]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. MALAN: Ακριβώς. 223 00:08:50,510 --> 00:08:52,840 Εάν η συμβολοσειρά ότι ο χρήστης πληκτρολογήσει είναι πάρα πολύ καιρό 224 00:08:52,840 --> 00:08:56,140 να χωρέσει σε μνήμη, ή κάποια παράξενο υπόθεση γωνία, όπως ότι, 225 00:08:56,140 --> 00:08:59,010 GetString, όπως θα δούμε, κυριολεκτικά Σήμερα, στην τεκμηρίωση του, 226 00:08:59,010 --> 00:09:02,330 λέει ότι θα επιστρέψει null ως μια ιδιαίτερη αξία φρουρού, 227 00:09:02,330 --> 00:09:05,417 ή ακριβώς το είδος της ένα ειδικό σύμβολο αυτό σημαίνει ότι κάτι πήγε στραβά. 228 00:09:05,417 --> 00:09:07,500 Θέλουμε, λοιπόν, να ελέγξετε για ότι, επειδή αποδεικνύεται 229 00:09:07,500 --> 00:09:09,720 ότι null είναι μια πολύ επικίνδυνη αξία. 230 00:09:09,720 --> 00:09:14,250 >> Συχνά, αν προσπαθήσετε να κάνετε κάτι με null περιλαμβάνει ένα function-- περνώντας 231 00:09:14,250 --> 00:09:17,470 ως πρώτη ύλη, για instance-- ότι η λειτουργία ίσως πολύ θα συντριβή και, με αυτό, 232 00:09:17,470 --> 00:09:19,090 πάρει κάτω από ολόκληρο το πρόγραμμα σας. 233 00:09:19,090 --> 00:09:22,570 Έτσι, αυτή η τρίτη γραμμή τώρα είναι απλά μια λογική ελέγχει, έλεγχος σφαλμάτων, αν θέλετε. 234 00:09:22,570 --> 00:09:25,450 Αυτό είναι μια καλή συνήθεια τώρα μας να μπει σε οποιαδήποτε στιγμή έχουμε 235 00:09:25,450 --> 00:09:28,050 προσπαθήστε να χρησιμοποιήσετε μια τιμή που θα μπορούσε, ενδεχομένως, να είναι null. 236 00:09:28,050 --> 00:09:32,000 >> Τώρα, στην τέταρτη γραμμή εδώ, "Αν strcmp (s, t)," καλά, 237 00:09:32,000 --> 00:09:33,180 Τι είναι αυτό αναφέρεστε; 238 00:09:33,180 --> 00:09:36,750 Λοιπόν, είπαμε ότι αυτό ήταν ένα πολύ συνοπτικά ονομάζεται συνάρτηση σύγκρισης συμβολοσειράς. 239 00:09:36,750 --> 00:09:40,370 Και ο σκοπός του στη ζωή είναι να συγκρίνετε το πρώτο επιχείρημα της εναντίον της δεύτερης, 240 00:09:40,370 --> 00:09:44,640 αλλά όχι όσον αφορά τις διευθύνσεις τους, όπως κάναμε λάθος μια στιγμή 241 00:09:44,640 --> 00:09:48,270 πριν με το κόκκινο κώδικα, αλλά αντί να συγκρίνει αυτά τα δύο 242 00:09:48,270 --> 00:09:53,210 χορδές του ανθρωπίνως διαισθητικό τρόπος συγκρίνοντας αυτό, ενάντια σε αυτό, 243 00:09:53,210 --> 00:09:56,690 ενάντια σε αυτό, ενάντια σε αυτό, και τότε σταματώντας εάν και όταν ένας 244 00:09:56,690 --> 00:09:59,590 ή και τα δύο από τα δάχτυλά μου χτυπά μια ανάστροφη κάθετο 0. 245 00:09:59,590 --> 00:10:04,530 Έτσι, κάποιος χρόνια πριν εφαρμοστεί strcmp να εφαρμόσουν για εμάς η λειτουργικότητα 246 00:10:04,530 --> 00:10:08,890 ότι ελπίζαμε ότι θα έχουν πάρει με απλά συγκρίνοντας δύο απλές αξίες. 247 00:10:08,890 --> 00:10:14,929 >> Τώρα ειλικρινά, έχω κρατήσει σχέδιο όλες αυτές διάφορους αριθμούς. 248 00:10:14,929 --> 00:10:17,470 Αλλά η πραγματικότητα είναι, έχω πάει καθιστώντας αυτά τα επάνω όλη την ώρα. 249 00:10:17,470 --> 00:10:19,580 Και έτσι επιτρέψτε μου να πάμε μπροστά και scribble αυτών έξω 250 00:10:19,580 --> 00:10:23,100 να κάνω μια παρατήρηση ότι, στο τέλος της ημέρας και κινείται προς τα εμπρός, 251 00:10:23,100 --> 00:10:30,160 δεν είμαστε πραγματικά πρόκειται να νοιάζονται για τι αντιμετωπίζει τα πράγματα είναι στην πραγματικότητα 252 00:10:30,160 --> 00:10:30,790 στη μνήμη. 253 00:10:30,790 --> 00:10:34,320 Γι 'αυτό και δεν πρόκειται να μπω σε αυτά τα είδη των αριθμών τόσο πολύ πια, 254 00:10:34,320 --> 00:10:38,970 Είμαι απλά ένα αφηρημένο αυτό μακριά ένα λίγο πιο φιλικό με απλά βέλη. 255 00:10:38,970 --> 00:10:42,060 >> Με άλλα λόγια, εάν το s είναι ένας δείκτης, καλά, ας το συντάξει, κυριολεκτικά, 256 00:10:42,060 --> 00:10:45,430 ως δείκτη, ένα βέλος που δείχνει από μόνη της σε κάτι άλλο, 257 00:10:45,430 --> 00:10:48,280 και μην ανησυχείτε πάρα πολύ για η minutia από αυτές τις διευθύνσεις 258 00:10:48,280 --> 00:10:49,910 η οποία, και πάλι, έκανα έτσι κι αλλιώς. 259 00:10:49,910 --> 00:10:52,680 Αλλά θα δούμε αυτές τις διευθύνσεις, Μερικές φορές, όταν τον εντοπισμό σφαλμάτων κώδικα. 260 00:10:52,680 --> 00:10:56,450 >> Τώρα, εν τω μεταξύ, το πρόγραμμα εδώ διορθώσεις, φυσικά, 261 00:10:56,450 --> 00:10:58,720 ότι πρόβλημα συγκρίνοντας οι δύο χορδές. 262 00:10:58,720 --> 00:11:00,260 Αλλά τρέξαμε σε ένα άλλο πρόβλημα. 263 00:11:00,260 --> 00:11:03,180 Αυτό ήταν από το αντίγραφο προγραμματίσετε την τελευταία φορά, 264 00:11:03,180 --> 00:11:06,880 σύμφωνα με την οποία, προσπαθούσα να κεφαλαιοποιήσει μόνο ο πρώτος χαρακτήρας σε μια σειρά. 265 00:11:06,880 --> 00:11:09,620 Αλλά αυτό ήταν το σύμπτωμα είδαμε την τελευταία φορά, όταν 266 00:11:09,620 --> 00:11:14,150 ένας χρήστης πληκτρολογήσει σε μια αξία, όπως Gabe σε πεζά, για s, 267 00:11:14,150 --> 00:11:19,310 Στη συνέχεια βάλαμε s στο t, όπως στην τρίτη γραμμή εκεί, 268 00:11:19,310 --> 00:11:22,900 και στη συνέχεια προσπάθησα να κεφαλαιοποιήσει t βραχίονα 0; 269 00:11:22,900 --> 00:11:25,950 Ποιο ήταν το αποτέλεσμα της Αλλάζοντας το t βραχίονα 0 εδώ; 270 00:11:25,950 --> 00:11:27,150 >> ΚΟΙΝΟ: Θα αλλάξει s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. MALAN: Ναι, Άλλαξα s, καθώς και. 272 00:11:29,360 --> 00:11:31,050 Επειδή ό, τι πραγματικά συμβαίνει; 273 00:11:31,050 --> 00:11:34,130 Λοιπόν, επιτρέψτε μου να δω αν μπορώ να καθαρίσετε μέχρι αυτή την εικόνα, ως εξής. 274 00:11:34,130 --> 00:11:41,390 >> Εάν το s είναι, και πάλι, η λέξη g, a, b, e, backslash, 0, και δ 275 00:11:41,390 --> 00:11:44,084 εμείς θα συνεχίσουμε το σχέδιο ως ένα κουτί εδώ, αλλά όχι περισσότερες διευθύνσεις. 276 00:11:44,084 --> 00:11:45,250 Ας σταματήσουμε να κάνουμε πράγματα. 277 00:11:45,250 --> 00:11:47,510 Ας σχεδιάσετε μια εικόνα να απλοποιήσει τον κόσμο. 278 00:11:47,510 --> 00:11:52,640 >> Όταν t δηλώνουμε με κορδόνι t, που δημιουργεί αυτό το κομμάτι της μνήμης. 279 00:11:52,640 --> 00:11:55,850 Πλατεία συμβαίνει να είναι 32 bits σε περισσότερους υπολογιστές. 280 00:11:55,850 --> 00:11:59,530 Στην πραγματικότητα, αν έχετε ποτέ ακούσει για ένα υπολογιστή που έχει μία αρχιτεκτονική 32-bit, 281 00:11:59,530 --> 00:12:03,000 πολύ φανταχτερό-μιλούν, που μόλις σημαίνει ότι χρησιμοποιεί διευθύνσεις 32-bit. 282 00:12:03,000 --> 00:12:05,370 Και ως ένα τεχνικό μέρος, αν έχετε αναρωτηθεί ποτέ 283 00:12:05,370 --> 00:12:09,630 γιατί παλαιότερους υπολογιστές, αν πραγματικά Προσπάθησα να σούπα τους με μεγάλο μέρος της RAM, 284 00:12:09,630 --> 00:12:12,360 θα μπορούσε να έχει μόνο ένα μέγιστο από τέσσερα gigabytes μνήμης RAM, 285 00:12:12,360 --> 00:12:14,860 και αυτό γιατί, κυριολεκτικά, παλιό υπολογιστή σας θα μπορούσε μόνο 286 00:12:14,860 --> 00:12:17,250 μετράει ως 4 δισεκατομμύρια, 4 δις bytes, 287 00:12:17,250 --> 00:12:20,590 διότι χρησιμοποιούσε 32-bit αριθμούς για τις διευθύνσεις. 288 00:12:20,590 --> 00:12:23,260 >> Αλλά σε κάθε περίπτωση, σε αυτό παράδειγμα, η ιστορία είναι πολύ πιο απλή. 289 00:12:23,260 --> 00:12:27,250 t είναι απλώς άλλο ένα δείκτη, ή πραγματικά ένα αστέρι char, γνωστός και κορδόνι. 290 00:12:27,250 --> 00:12:30,860 Και πώς μπορώ να θέλετε να ενημερώσετε αυτή την εικόνα τώρα με τη δεύτερη γραμμή του κώδικα, 291 00:12:30,860 --> 00:12:31,950 μετά την τελεία, τελεία, τελεία; 292 00:12:31,950 --> 00:12:35,845 Όταν κάνω κορδόνι t ισούται με s ερωτηματικό, πώς αλλάζει αυτή η εικόνα; 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Ναι; 295 00:12:38,000 --> 00:12:38,916 >> ΚΟΙΝΟ: [δεν ακούγεται]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. MALAN: Ναι. 298 00:12:42,020 --> 00:12:42,600 Ακριβώς. 299 00:12:42,600 --> 00:12:45,620 Μόλις έβαλα ένα βέλος από το t κουτί στην ίδια διεύθυνση, 300 00:12:45,620 --> 00:12:47,570 το ίδιο το πρώτο γράμμα στο έδωσε. 301 00:12:47,570 --> 00:12:50,850 Ή τεχνικώς, εάν αυτό τύπος ήταν ακόμα σε 0x1, 302 00:12:50,850 --> 00:12:53,052 Είναι σαν να είχα 0x1 εδώ και 0x1 εδώ. 303 00:12:53,052 --> 00:12:54,760 Αλλά και πάλι, ποιος νοιάζεται σχετικά με τις διευθύνσεις; 304 00:12:54,760 --> 00:12:56,345 Είναι ακριβώς η ιδέα που έχει σημασία τώρα. 305 00:12:56,345 --> 00:12:57,720 Έτσι, αυτό είναι ό, τι συμβαίνει εδώ. 306 00:12:57,720 --> 00:13:02,690 Έτσι, φυσικά, αν το κάνετε t βραχίονα 0, η οποία είναι σημειογραφία συστοιχία, 307 00:13:02,690 --> 00:13:05,650 από course-- και ειλικρινά, φαίνεται σαν να υπάρχει μια σειρά πάνω από εδώ, 308 00:13:05,650 --> 00:13:07,340 αλλά τώρα υπάρχει αυτό το παράξενο πράγμα. 309 00:13:07,340 --> 00:13:11,160 Να ξέρετε ότι η γλώσσα προγραμματισμού, C, σας προσφέρει αυτή τη δυνατότητα, 310 00:13:11,160 --> 00:13:14,650 σύμφωνα με την οποία, ακόμη και εάν το t είναι ένα δείκτη, ή s είναι ένας δείκτης, 311 00:13:14,650 --> 00:13:18,050 μπορείτε ακόμα να χρησιμοποιήσετε εκείνο το γνωστό, άνετα αγκύλη 312 00:13:18,050 --> 00:13:22,520 σημειογραφία για να μεταβείτε στο πρώτο στοιχείο, ή το δεύτερο στοιχείο, ή κάθε στοιχείο 313 00:13:22,520 --> 00:13:26,130 ότι ο δείκτης δείχνει να γιατί, προφανώς, αυτό 314 00:13:26,130 --> 00:13:29,410 είναι, όπως στην προκειμένη περίπτωση, δείχνοντας κάποια σειρά. 315 00:13:29,410 --> 00:13:30,340 >> Λοιπόν, πώς μπορούμε να το διορθώσω αυτό; 316 00:13:30,340 --> 00:13:33,660 Ειλικρινά, αυτό είναι όπου πήρε ένα λίγο συντριπτική με την πρώτη ματιά. 317 00:13:33,660 --> 00:13:35,340 Αλλά εδώ είναι μια νέα και βελτιωμένη έκδοση. 318 00:13:35,340 --> 00:13:37,460 >> Έτσι, η πρώτη, παίρνω απαλλαγούμε από τη βιβλιοθήκη CS50, 319 00:13:37,460 --> 00:13:41,170 μόνο για να εκθέσει ότι s είναι πράγματι ένα αστέρι char, απλά ένα συνώνυμο. 320 00:13:41,170 --> 00:13:43,540 Και t είναι επίσης ένα αστέρι char. 321 00:13:43,540 --> 00:13:48,290 Αλλά τι συμβαίνει σχετικά με την δεξιά πλευρά της εν λόγω γραμμής 322 00:13:48,290 --> 00:13:49,970 όπου t αποδίδεται αξία; 323 00:13:49,970 --> 00:13:50,790 >> Τι είναι η malloc; 324 00:13:50,790 --> 00:13:51,630 Τι είναι strlen; 325 00:13:51,630 --> 00:13:52,547 Τι είναι sizeof (char); 326 00:13:52,547 --> 00:13:54,380 Γιατί στο καλό κάνει αυτό γραμμή ματιά τόσο περίπλοκο; 327 00:13:54,380 --> 00:13:55,713 Τι κάνει σε υψηλό επίπεδο; 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Τι είναι αυτό αποθήκευση σε t; 330 00:13:57,440 --> 00:13:58,646 Ναι; 331 00:13:58,646 --> 00:14:01,104 ΚΟΙΝΟ: Είναι μια κατανομή ορισμένο ποσό του χώρου μνήμης. 332 00:14:01,104 --> 00:14:03,032 Είναι για την αποθήκευση, υποθέτω, γράμματα [δεν ακούγεται]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Τέλεια. 335 00:14:04,540 --> 00:14:06,650 Είναι κατανομή ένα ορισμένο ποσό του χώρου μνήμης 336 00:14:06,650 --> 00:14:08,940 για την αποθήκευση, κατά πάσα πιθανότητα, στο μέλλον γράμματα. 337 00:14:08,940 --> 00:14:11,310 Και ιδίως, malloc Ως εκ τούτου, επιστρέφοντας τι; 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> ΚΟΙΝΟ: Η επιστροφή του [δεν ακούγεται]; 340 00:14:14,851 --> 00:14:15,850 DAVID J. MALAN: Ακριβώς. 341 00:14:15,850 --> 00:14:18,850 Επιστρέφοντας τη διεύθυνση της μνήμης, το οποίο είναι ένα φανταχτερό τρόπο λέγοντας, 342 00:14:18,850 --> 00:14:21,640 επιστρέφει τη διεύθυνση του πρώτο byte της εν λόγω μνήμης. 343 00:14:21,640 --> 00:14:25,460 Η ευθύνη είναι για μένα να θυμάμαι πόση μνήμη έχω πραγματικά 344 00:14:25,460 --> 00:14:27,140 διατίθενται ή ζήτησε malloc για. 345 00:14:27,140 --> 00:14:28,384 >> Τώρα, πόσο είναι αυτό; 346 00:14:28,384 --> 00:14:30,550 Λοιπόν, ακόμα κι αν δεν υπάρχει πολλοί από παρενθέσεις εδώ, 347 00:14:30,550 --> 00:14:32,970 malloc παίρνει ένα μόνο επιχείρημα. 348 00:14:32,970 --> 00:14:37,250 Και είμαι διευκρινίζοντας strlen του s, έτσι ώστε να δώσει με όσες bytes, καθώς υπάρχουν σε s, 349 00:14:37,250 --> 00:14:37,800 αλλά προσθέστε ένα. 350 00:14:37,800 --> 00:14:38,300 Γιατί; 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Ναι; 353 00:14:39,530 --> 00:14:40,840 >> ΚΟΙΝΟ: Το backslash 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. MALAN: Ακριβώς. 355 00:14:41,840 --> 00:14:43,423 Έχουμε να κάνουμε ένα μικρό νοικοκυριό. 356 00:14:43,423 --> 00:14:45,970 Έτσι, επειδή υπάρχει μια ανάστροφη κάθετο 0, εμείς θα θυμούνται καλύτερα αυτό. 357 00:14:45,970 --> 00:14:47,310 Διαφορετικά, θα πάμε για να δημιουργήσει μια σειρά ότι 358 00:14:47,310 --> 00:14:49,170 δεν διαθέτει το εν λόγω ειδικό τερματισμού. 359 00:14:49,170 --> 00:14:52,640 >> Εν τω μεταξύ, ακριβώς για να είναι super πρωκτικό, I sizeof (char) έχει, 360 00:14:52,640 --> 00:14:55,730 μόνο σε περίπτωση που κάποιος τρέχει μου κωδικός δεν την συσκευή CS50, 361 00:14:55,730 --> 00:14:58,220 αλλά ίσως ένα διαφορετικό υπολογιστή συνολικά, όπου χαρακτήρες 362 00:14:58,220 --> 00:15:01,470 είναι ένα byte, κατά συνθήκη, αλλά δύο bytes, ή κάτι μεγαλύτερο από αυτό. 363 00:15:01,470 --> 00:15:04,490 Είναι ακριβώς για να είναι σούπερ, super αντίθετος σε λάθη. 364 00:15:04,490 --> 00:15:06,940 Ακόμη και αν, στην πραγματικότητα, είναι πιθανότατα πρόκειται να είναι ένα 1. 365 00:15:06,940 --> 00:15:11,490 >> Τώρα, εν τω μεταξύ, θα πάω μπροστά και να αντιγράψετε το εγχόρδων, t βραχίονα i ισούται με t βραχίονα s. 366 00:15:11,490 --> 00:15:14,962 Και εγώ θα αναβάλει για την τελευταία εβδομάδα κώδικα για να δείτε τι συμβαίνει. 367 00:15:14,962 --> 00:15:17,670 Αλλά το βασικό πακέτο, και η λόγο έβαλα τον κώδικα τώρα σε πράσινο, 368 00:15:17,670 --> 00:15:22,520 Είναι επειδή αυτό το πολύ τελευταία γραμμή, t βραχίονα 0 ισούται toupper, 369 00:15:22,520 --> 00:15:25,230 έχει ως αποτέλεσμα την Αξιοποιώντας τα οποία κορδόνι; 370 00:15:25,230 --> 00:15:26,960 t ή / και s; 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Η τελευταία γραμμή του κώδικα. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Απλά t, γιατί ό, τι είναι συνέβη αυτή τη φορά, 375 00:15:35,560 --> 00:15:41,500 αν μπορώ να αναιρέσω λίγο αυτό το τελευταίο βήμα, τι συνέβηκε, όταν καλώ malloc, 376 00:15:41,500 --> 00:15:45,380 Παίρνω ουσιαστικά ένα κομμάτι της μνήμης ότι είναι το ίδιο μέγεθος με το πρωτότυπο, 377 00:15:45,380 --> 00:15:47,020 γιατί αυτή είναι η αριθμητική έκανα. 378 00:15:47,020 --> 00:15:50,920 Είμαι αποθήκευση σε t διεύθυνση του εν λόγω κομμάτι της μνήμης. 379 00:15:50,920 --> 00:15:53,370 Ακόμα κι αν αυτό φαίνεται ωραίο και όμορφη, ωραία και κενό, 380 00:15:53,370 --> 00:15:56,882 η πραγματικότητα είναι εκεί, τι θα κρατήσει καλώντας, τιμές σκουπίδια εδώ. 381 00:15:56,882 --> 00:15:59,340 Αυτό το κομμάτι της μνήμης θα μπορούσε πολύ και έχουν χρησιμοποιηθεί στο παρελθόν, 382 00:15:59,340 --> 00:16:00,940 μερικά δευτερόλεπτα, πριν από λίγα λεπτά. 383 00:16:00,940 --> 00:16:04,410 Έτσι, θα μπορούσε απολύτως να υπάρξουν αριθμοί ή γράμματα εκεί, μόνο από ατύχημα. 384 00:16:04,410 --> 00:16:08,580 Αλλά δεν είναι έγκυρη, μέχρι να εγώ συμπληρώσετε αυτό το κομμάτι της μνήμης 385 00:16:08,580 --> 00:16:12,510 με πραγματικό χαρακτήρες, όπως κάνουμε ότι για βρόχο εκεί. 386 00:16:12,510 --> 00:16:13,180 Εντάξει; 387 00:16:13,180 --> 00:16:16,180 >> Μέχρι τώρα, το αποκορύφωμα της αυτά τα τρία παραδείγματα 388 00:16:16,180 --> 00:16:20,730 που χρησιμοποιήθηκαν με φαινομενικά σπασμένα τελευταία φορά, αυτό το Swap παράδειγμα, αυτή η λειτουργία 389 00:16:20,730 --> 00:16:23,670 εργαστεί με την έννοια ότι άλλαζε a και b. 390 00:16:23,670 --> 00:16:25,620 Αλλά αυτό δεν λειτούργησε σε ό, τι άλλο νόημα; 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Ναι; 393 00:16:28,614 --> 00:16:29,612 >> ΚΟΙΝΟ: [δεν ακούγεται]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. MALAN: Ακριβώς. 396 00:16:36,700 --> 00:16:39,530 Αν ήταν να καλέσετε τη λειτουργία αυτή από another-- για παράδειγμα, 397 00:16:39,530 --> 00:16:42,870 από μια συνάρτηση σαν κύριο, όπου Έχω μια μεταβλητή, χ και γ, καθώς εγώ 398 00:16:42,870 --> 00:16:46,160 έκανε την περασμένη εβδομάδα, ίδιο κωδικό, και έχω περάσει σε x και y 399 00:16:46,160 --> 00:16:49,860 να Swap, και στη συνέχεια να καλέσετε Swap-- αυτό, φυσικά, είναι η σωστή εκδοχή 400 00:16:49,860 --> 00:16:52,220 είναι ό, τι είμαστε έτοιμοι να see-- δεν λειτούργησε. 401 00:16:52,220 --> 00:16:53,770 Έτσι ποια είναι η λύση; 402 00:16:53,770 --> 00:16:56,850 >> Λοιπόν, έτσι απλά να είναι σαφής, επιτρέψτε μου να πάμε μπροστά 403 00:16:56,850 --> 00:17:05,450 και-- μου δώσει ένα δευτερόλεπτο εδώ, και να δείτε αν μπορώ να σας δείξω το τελευταίο, το οποίο 404 00:17:05,450 --> 00:17:12,464 θα είναι in-- ας δούμε αν μπορώ να βρω αυτό το πραγματικό fast-- OK, [δεν ακούγεται]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 Εντάξει, εκεί είναι. 407 00:17:19,240 --> 00:17:21,000 Έτσι αγνοούν τις εντολές είμαι απλά πληκτρολογώντας. 408 00:17:21,000 --> 00:17:23,780 Θέλω να ανακτήσετε σε την τελευταία στιγμή ένα παράδειγμα 409 00:17:23,780 --> 00:17:27,960 από την τελευταία φορά, που καλείται τώρα δεν Swap. 410 00:17:27,960 --> 00:17:30,200 >> Έτσι, δεν Swap είναι όπου φύγαμε από την τελευταία φορά, 411 00:17:30,200 --> 00:17:32,930 σύμφωνα με την οποία, θα προετοιμαστεί x με 1 και y 2. 412 00:17:32,930 --> 00:17:35,840 Στη συνέχεια καλέστε Swap, περνώντας σε 1 και 2. 413 00:17:35,840 --> 00:17:37,930 Και στη συνέχεια αυτή η λειτουργία εργαστεί σε κάποια έννοια, 414 00:17:37,930 --> 00:17:40,750 αλλά δεν είχε μόνιμη επίδραση στην x και y. 415 00:17:40,750 --> 00:17:45,430 Έτσι, το ερώτημα στο χέρι είναι, πώς τώρα Δεν έχουμε καθορίσει πραγματικά αυτό το πρόβλημα; 416 00:17:45,430 --> 00:17:47,820 Ποια είναι η λύση στο χέρι; 417 00:17:47,820 --> 00:17:53,150 >> Λοιπόν, σε swap.c, η οποία είναι νέα και σήμερα, παρατηρήσετε ένα ζευγάρι των διαφορών. 418 00:17:53,150 --> 00:17:54,700 Χ και Υ είναι τα ίδια. 419 00:17:54,700 --> 00:17:57,250 Αλλά αυτό είναι σαφώς διαφορετικά για την γραμμή 25; 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Τι νέο υπάρχει εκεί, αν θυμάστε τι έμοιαζε πριν από ένα δευτερόλεπτο; 422 00:18:01,715 --> 00:18:02,565 >> ΚΟΙΝΟ: [δεν ακούγεται]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. MALAN: Ναι. 424 00:18:03,440 --> 00:18:06,680 Έτσι, τα συμπλεκτικά σύμβολα είναι ένα νέο κομμάτι της σύνταξης, όχι μόνο σε αυτό το πρόγραμμα, 425 00:18:06,680 --> 00:18:08,560 αλλά και γενικότερα σε CS50. 426 00:18:08,560 --> 00:18:10,680 Μέχρι σήμερα, δεν νομίζω έχουμε δει κάποια παραδείγματα 427 00:18:10,680 --> 00:18:14,070 ή πραγματικά μίλησε για τους σε οποιαδήποτε λεπτομέρεια, πλην, ίσως, προληπτικά 428 00:18:14,070 --> 00:18:16,467 στο τμήμα, ένα εμπορικό και σαν αυτό. 429 00:18:16,467 --> 00:18:19,300 Λοιπόν, αποδεικνύεται εμπορικό και είναι ένα από τα τελευταία κομμάτια της νέας σύνταξης 430 00:18:19,300 --> 00:18:20,174 θα πάμε για να μάθουν. 431 00:18:20,174 --> 00:18:23,500 Όλα αυτό σημαίνει ότι είναι η διεύθυνση κάποιας μεταβλητής. 432 00:18:23,500 --> 00:18:25,070 Σε ποια διεύθυνση έχει x ζουν; 433 00:18:25,070 --> 00:18:26,510 Αλλά ποια διεύθυνση δεν y ζει; 434 00:18:26,510 --> 00:18:28,700 Διότι, αν η θεμελιώδες πρόβλημα πριν 435 00:18:28,700 --> 00:18:32,970 ήταν ότι οι x και y έχουν μετακυλιστεί αντίγραφα, αυτό που πραγματικά θέλουμε να κάνουμε 436 00:18:32,970 --> 00:18:38,780 είναι να παρέχει Swap με σαν ένα θησαυρό χάρτης που οδηγεί σε όπου x και y πράγματι 437 00:18:38,780 --> 00:18:41,910 βρίσκονται στη μνήμη RAM, έτσι ώστε Swap μπορεί να ακολουθήσει αυτό το χάρτη 438 00:18:41,910 --> 00:18:47,760 και να πάει οπουδήποτε x ή y σηματοδοτεί το σημείο και να αλλάξετε τις πραγματικές τιμές 1 και 2 439 00:18:47,760 --> 00:18:48,270 εκεί. 440 00:18:48,270 --> 00:18:50,710 >> Έτσι Swap πρέπει να αλλάξει ελαφρώς πάρα πολύ. 441 00:18:50,710 --> 00:18:53,760 Και με την πρώτη ματιά, αυτό θα μπορούσε φαίνεται λίγο παρόμοια με char αστέρι. 442 00:18:53,760 --> 00:18:54,850 Και πράγματι είναι. 443 00:18:54,850 --> 00:18:59,635 Έτσι, ένα είναι ένας δείκτης για το τι είδος των δεδομένων, με βάση αυτό το επισημασμένο μέρος; 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Έτσι είναι ένα int. 446 00:19:01,620 --> 00:19:04,880 >> Έτσι, ένα δεν είναι πλέον ένα int, είναι η διεύθυνση ενός int. 447 00:19:04,880 --> 00:19:07,910 Και ομοίως, b είναι τώρα σε εξέλιξη να είναι η διεύθυνση ενός ενδ. 448 00:19:07,910 --> 00:19:12,470 Έτσι, όταν Καλώ τώρα Swap από τον κεντρικό, Είμαι δεν πρόκειται να δώσει Swap 1 και 2. 449 00:19:12,470 --> 00:19:15,540 Πάω να το δώσει, όπως Ox-κάτι και Ox-κάτι, 450 00:19:15,540 --> 00:19:19,820 δύο διευθύνσεις που θα οδηγήσει Εναλλαγή σε πραγματικές θέσεις τους 451 00:19:19,820 --> 00:19:21,310 στη μνήμη του υπολογιστή μου. 452 00:19:21,310 --> 00:19:25,580 >> Μέχρι τώρα, απομένει η εφαρμογή μου χρειάζεται να αλλάξει ένα αγοράκι. 453 00:19:25,580 --> 00:19:28,650 Τι είναι προφανώς διαφορετικά τώρα σε αυτές τις τρεις γραμμές κώδικα; 454 00:19:28,650 --> 00:19:31,350 Υπάρχουν αυτά τα αστέρια δεκάρα όλα όλη τη χώρα, εντάξει; 455 00:19:31,350 --> 00:19:33,014 Λοιπόν, τι συμβαίνει εδώ; 456 00:19:33,014 --> 00:19:33,514 Ναι; 457 00:19:33,514 --> 00:19:35,055 >> ΚΟΙΝΟ: Είναι προφανές ότι [δεν ακούγεται]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. MALAN: Ακριβώς. 460 00:19:37,990 --> 00:19:41,560 Έτσι, σε αυτό το context-- και αυτό δεν ήταν η καλύτερη απόφαση σχεδιασμού, κατά γενική ομολογία, 461 00:19:41,560 --> 00:19:42,530 χρόνια πριν. 462 00:19:42,530 --> 00:19:45,110 Σε αυτό το πλαίσιο, όπου έχετε μόνο ένα αστέρι, 463 00:19:45,110 --> 00:19:48,240 και δεν έχετε έναν τύπο δεδομένων, όπως int, αμέσως προς τα αριστερά, 464 00:19:48,240 --> 00:19:53,146 αντί να έχετε ένα σύμβολο της ισότητας, σαφώς, Στο πλαίσιο αυτό, όταν λέτε πρωταγωνιστήσει ένα, 465 00:19:53,146 --> 00:19:56,980 αυτό σημαίνει ότι πάει για το διεύθυνση που είναι στο ένα. 466 00:19:56,980 --> 00:19:58,870 Ακολουθήστε το χάρτη θησαυρού, να το πω έτσι. 467 00:19:58,870 --> 00:20:01,720 >> Και εν τω μεταξύ, σε γραμμή 37, αυτό σημαίνει το ίδιο πράγμα. 468 00:20:01,720 --> 00:20:05,460 Πηγαίνετε στη διεύθυνση μια, και να θέσει ό, τι υπάρχει; 469 00:20:05,460 --> 00:20:09,520 Όποια και αν είναι η θέση που β ορίζει. 470 00:20:09,520 --> 00:20:10,980 Με άλλα λόγια, πηγαίνετε στο b. 471 00:20:10,980 --> 00:20:12,130 Πάρτε αυτή την τιμή. 472 00:20:12,130 --> 00:20:15,620 Πηγαίνετε στο ένα και, ανά την ίση υπογράψει, ο τελεστής ανάθεσης, 473 00:20:15,620 --> 00:20:17,010 τεθεί η αξία εκεί. 474 00:20:17,010 --> 00:20:19,272 >> Ομοίως, int temp είναι απλά ένας int. 475 00:20:19,272 --> 00:20:20,730 Τίποτα δεν πρέπει να αλλάξει για temp. 476 00:20:20,730 --> 00:20:24,810 Είναι απλά ένα ανταλλακτικό γυαλί από Annenberg για κάποιο γάλα ή χυμό πορτοκαλιού. 477 00:20:24,810 --> 00:20:27,630 Αλλά δεν χρειάζεται να πω, πηγαίνετε στο b. 478 00:20:27,630 --> 00:20:31,449 Πηγαίνετε προς τον προορισμό και θέσει την αξία σε θερμοκρασία εκεί. 479 00:20:31,449 --> 00:20:32,490 Έτσι τι συμβαίνει τότε; 480 00:20:32,490 --> 00:20:36,540 Όταν πραγματικά καλέστε Swap αυτή τη φορά, αν αυτό το πρώτο δίσκο εδώ αντιπροσωπεύει Main, 481 00:20:36,540 --> 00:20:42,270 αυτό το δεύτερο δίσκο αντιπροσωπεύει Swap, όταν Περνώ ampersand x και y ampersand 482 00:20:42,270 --> 00:20:47,150 από τον κεντρικό προς Swap, ακριβώς για να είναι σαφής, τι είναι αυτό στοίβα λήψης καρέ; 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Ναι; 485 00:20:49,200 --> 00:20:50,180 >> ΚΟΙΝΟ: [δεν ακούγεται]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. MALAN: Ακριβώς. 487 00:20:51,180 --> 00:20:53,129 Η διεύθυνση του x και η διεύθυνση του y. 488 00:20:53,129 --> 00:20:55,170 Και μπορείτε να σκεφτείτε αυτά όπως ταχυδρομικές διευθύνσεις. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street και 35 Oxford Street, και σας 490 00:20:58,772 --> 00:21:01,230 θέλετε να μετακινήσετε τα δύο κτίρια που βρίσκονται σε αυτές τις τοποθεσίες. 491 00:21:01,230 --> 00:21:04,680 >> Είναι το είδος της μια γελοία ιδέα, αλλά αυτό είναι όλο εννοούμε με τη διεύθυνση. 492 00:21:04,680 --> 00:21:07,000 Σε περίπτωση που στον κόσμο μπορεί να μπορείτε να βρείτε αυτές τις δύο ints; 493 00:21:07,000 --> 00:21:09,470 Σε περίπτωση που στον κόσμο μπορεί να σας βρείτε αυτά τα δύο κτίρια; 494 00:21:09,470 --> 00:21:15,170 Έτσι, αν τελικά, μετά από όλο αυτό το διάστημα I πηγαίνετε στον πηγαίο κώδικα του σήμερα και την κατάρτιση 495 00:21:15,170 --> 00:21:22,110 Swap και να τρέξει ./swap, τέλος, για το πρώτη φορά δεν μπορούμε πραγματικά να δείτε ότι 496 00:21:22,110 --> 00:21:25,330 αξίες μου έχουν όντως έχει μετατραπεί επιτυχώς. 497 00:21:25,330 --> 00:21:30,860 Και τώρα, μπορούμε να πάρουμε ακόμα σημειώματος αυτού, ας πούμε, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Έτσι, επιτρέψτε μου να πάω στο ίδιο αρχείο. 499 00:21:32,740 --> 00:21:35,010 Επιτρέψτε μου να πάει μπροστά και να τρέξει gdb της ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Και τώρα, το Swap, Πάω να πάει μπροστά και να ορίσετε ένα σημείο καμπής στο Main. 502 00:21:40,547 --> 00:21:42,630 Και τώρα είμαι πρόκειται να πάει μπροστά και να τρέξει το πρόγραμμα. 503 00:21:42,630 --> 00:21:45,810 Και τώρα βλέπουμε τον κωδικό μου παύση σε αυτή τη γραμμή. 504 00:21:45,810 --> 00:21:48,330 >> Αν πάω μπροστά και εκτύπωση x, τι πρέπει να δούμε εδώ; 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Είναι ένα ερώτημα. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Πείτε ξανά; 509 00:21:51,530 --> 00:21:52,295 >> ΚΟΙΝΟ: [δεν ακούγεται]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. MALAN: Έτσι, τυχαίους αριθμούς, ίσως. 511 00:21:53,910 --> 00:21:56,010 Ίσως είμαι τυχερός, και είναι ωραίο και απλό, όπως το 0. 512 00:21:56,010 --> 00:21:57,230 Αλλά ίσως είναι κάποιο τυχαίο αριθμό. 513 00:21:57,230 --> 00:21:58,090 Σε αυτή την περίπτωση, ήμουν τυχερός. 514 00:21:58,090 --> 00:21:59,030 Απλά τυχαίνει να είναι 0. 515 00:21:59,030 --> 00:22:00,780 Αλλά είναι πράγματι τύχη, γιατί όχι μέχρι να 516 00:22:00,780 --> 00:22:06,280 πληκτρολογήστε το επόμενο και στη συνέχεια να εκτυπώσετε x έχει ότι γραμμή κώδικα, γραμμή 19, έχουν εκτελεστεί. 517 00:22:06,280 --> 00:22:10,942 >> Εν τω μεταξύ, αν πληκτρολογήσετε την επόμενη φορά, και τώρα να εκτυπώσετε y, Πάω να δείτε 2. 518 00:22:10,942 --> 00:22:13,900 Τώρα, αν πληκτρολογήσετε την επόμενη, πρόκειται να να πάρει μια μικρή σύγχυση, γιατί τώρα, 519 00:22:13,900 --> 00:22:17,250 η printf πρόκειται να εμφανιστεί στην η οθόνη, όπως το έκανε. το χ είναι 1. 520 00:22:17,250 --> 00:22:18,606 >> Ας το κάνουμε και πάλι. 521 00:22:18,606 --> 00:22:20,480 Και τώρα, εδώ είναι όπου τα πράγματα γίνονται ενδιαφέροντα. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Πριν Καλώ Swap ή ακόμη βήμα σε αυτό, ας ρίξουμε μια μικρή ματιά. 524 00:22:26,580 --> 00:22:28,980 χ είναι, πάλι, 1. 525 00:22:28,980 --> 00:22:33,240 Υ είναι, φυσικά, γρήγορη λογική ελέγχει, 2, έτσι δεν είναι δύσκολο εκεί. 526 00:22:33,240 --> 00:22:35,740 Αλλά τι είναι εμπορικό και x; 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Απάντηση, αυτό είναι το είδος του funky αναζητούν. 529 00:22:39,350 --> 00:22:43,500 Αλλά το αστέρι int στις παρενθέσεις είναι απλά τρόπο αεπ της λέγοντας ότι αυτό είναι μια διεύθυνση. 530 00:22:43,500 --> 00:22:48,290 Είναι δεν είναι int, είναι ένας δείκτης σε μια Int, ή αλλιώς γνωστή ως μια διεύθυνση. 531 00:22:48,290 --> 00:22:49,742 >> Τι είναι αυτό το τρελό πράγμα; 532 00:22:49,742 --> 00:22:51,825 Εμείς ποτέ δεν έχω δει κάτι αρκετά όπως αυτό πριν. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Έτσι, αυτή είναι η διεύθυνση του υπολογιστή μου μνήμη όπου x συμβαίνει να ζήσουν. 535 00:22:58,120 --> 00:22:59,040 Είναι Ox-κάτι. 536 00:22:59,040 --> 00:23:01,290 Και αυτό είναι, ειλικρινά, γιατί Έχω αρχίσει να τραβούν βέλη, 537 00:23:01,290 --> 00:23:03,340 αντί για αριθμούς, γιατί ποιος πραγματικά νοιάζεται 538 00:23:03,340 --> 00:23:06,890 ότι int σας είναι σε μια συγκεκριμένη διεύθυνση που είναι τόσο μεγάλο. 539 00:23:06,890 --> 00:23:12,160 Αλλά bffff0c4, αυτά είναι όλα Πράγματι δεκαεξαδικά ψηφία, 540 00:23:12,160 --> 00:23:13,720 που είναι από 0 έως f. 541 00:23:13,720 --> 00:23:16,590 >> Γι 'αυτό και δεν πρόκειται να σταθώ πάρα πολύ καιρό για το τι είναι αυτά τα πράγματα. 542 00:23:16,590 --> 00:23:19,400 Αλλά αν εκτυπώσετε y, Φυσικά, βλέπω 2. 543 00:23:19,400 --> 00:23:22,440 Αλλά ampersand y, βλέπω αυτή τη διεύθυνση. 544 00:23:22,440 --> 00:23:26,527 Και ειδοποίηση, για την περίεργη, πόσο μακριά είναι x και y; 545 00:23:26,527 --> 00:23:27,985 Μπορείτε να αγνοήσετε το μεγαλύτερο μέρος της διεύθυνσης. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Τέσσερα bytes. 548 00:23:29,920 --> 00:23:33,510 Και αυτό είναι σύμφωνο με μας νωρίτερα ισχυρίζονται ότι το πόσο μεγάλο είναι ένα int; 549 00:23:33,510 --> 00:23:34,130 Τέσσερα bytes. 550 00:23:34,130 --> 00:23:37,420 Έτσι μοιάζει με επένδυση τα πάντα είναι μέχρι όμορφα, όπως ίσως ελπίδα, στη μνήμη. 551 00:23:37,420 --> 00:23:40,010 >> Μέχρι τώρα, ας fast forward στο τέλος αυτής της ιστορίας. 552 00:23:40,010 --> 00:23:43,290 Ας πάμε μπροστά και πληκτρολογήστε το βήμα, να βουτήξει τη λειτουργία Swap. 553 00:23:43,290 --> 00:23:46,880 Τώρα, προσέξτε, αν πληκτρολογήσετε ένα, είναι ταυτόσημη με την διεύθυνση του x. 554 00:23:46,880 --> 00:23:52,130 Αν πληκτρολογήσετε b, είναι πανομοιότυπα στη διεύθυνση του y. 555 00:23:52,130 --> 00:23:57,020 Λοιπόν, τι πρέπει να δω αν έχω ας πούμε, πηγαίνετε στη διεύθυνση ενός; 556 00:23:57,020 --> 00:23:58,120 Έτσι εκτυπώσετε ένα αστέρι. 557 00:23:58,120 --> 00:24:00,130 Έτσι αστέρι σημαίνει ότι εκεί, σε αυτό το πλαίσιο. 558 00:24:00,130 --> 00:24:02,730 Ampersand σημαίνει ποια είναι η διεύθυνση του. 559 00:24:02,730 --> 00:24:05,000 Έτσι πρωταγωνιστήσει ένα μέσο 1. 560 00:24:05,000 --> 00:24:09,590 Και αστέρων εκτύπωσης b μου δίνει 2. 561 00:24:09,590 --> 00:24:15,750 >> Και επιτρέψτε μου να υποθέσουμε, προς το παρόν, ότι τουλάχιστον ο κώδικας που 562 00:24:15,750 --> 00:24:18,950 εκτελέσει την πλέον μπορεί να αιτιολογημένη με αυτόν τον τρόπο. 563 00:24:18,950 --> 00:24:21,150 Αλλά εμείς θα επανεξετάσουμε αυτή την ιδέα πριν από καιρό. 564 00:24:21,150 --> 00:24:23,850 Έτσι, αυτή η έκδοση του Swap είναι τώρα σωστό και επιτρέπει 565 00:24:23,850 --> 00:24:26,650 μας για να ανταλλάξουν το συγκεκριμένο τύπο δεδομένων. 566 00:24:26,650 --> 00:24:29,120 >> Έτσι, οποιεσδήποτε ερωτήσεις, στη συνέχεια, στο Swap; 567 00:24:29,120 --> 00:24:29,890 Την αστέρι; 568 00:24:29,890 --> 00:24:30,690 Την διεύθυνση της; 569 00:24:30,690 --> 00:24:33,270 Και θα δείτε, με πρόβλημα που 4, είδος, 570 00:24:33,270 --> 00:24:37,310 αλλά το πρόβλημα που 5, σίγουρα, πως αυτά τα πράγματα είναι χρήσιμα και να πάρει πολύ περισσότερα 571 00:24:37,310 --> 00:24:39,584 άνετα μαζί τους, ως αποτέλεσμα. 572 00:24:39,584 --> 00:24:40,430 Τίποτα από όλα αυτά; 573 00:24:40,430 --> 00:24:40,930 Εντάξει. 574 00:24:40,930 --> 00:24:44,350 Έτσι malloc είναι, και πάλι, αυτή η λειτουργία ότι διαθέτει μόνο τη μνήμη, τη μνήμη 575 00:24:44,350 --> 00:24:45,330 κατανομής. 576 00:24:45,330 --> 00:24:47,024 Και γιατί είναι αυτό χρήσιμο; 577 00:24:47,024 --> 00:24:48,940 Λοιπόν, όλο αυτό το διάστημα, έχετε χρησιμοποιήσει malloc. 578 00:24:48,940 --> 00:24:52,230 Αν εξετάσουμε τώρα πώς GetString έργα, προφανώς, είναι 579 00:24:52,230 --> 00:24:56,140 έχουν ζητήσει κάποιος για ένα κομμάτι της μνήμη, οποτεδήποτε ο χρήστης πληκτρολογεί ένα string 580 00:24:56,140 --> 00:24:59,040 σε, γιατί σίγουρα Δεν ήξερε, όπως το προσωπικό CS50, 581 00:24:59,040 --> 00:25:02,710 πόσο μεγάλη είναι αυτοί οι χορδές που οι άνθρωποι πρόκειται να πληκτρολογείτε μπορεί να είναι. 582 00:25:02,710 --> 00:25:07,910 >> Οπότε ας, για πρώτη φορά, να αρχίσει να φλούδα πίσω το πώς λειτουργεί η βιβλιοθήκη CS50, 583 00:25:07,910 --> 00:25:10,990 με τον τρόπο του ένα ζευγάρι των παραδειγμάτων ότι θα μας οδηγήσει εκεί. 584 00:25:10,990 --> 00:25:15,300 Έτσι, αν ανοίξει το gedit και να ανοίξει scanf 0, 585 00:25:15,300 --> 00:25:17,055 θα πάμε να δούμε τον παρακάτω κώδικα. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, διατίθεται στον δικτυακό τόπο για την σήμερα, έχει σχετικά λίγες γραμμές κώδικα 588 00:25:23,530 --> 00:25:25,351 Εδώ, 14 έως 20. 589 00:25:25,351 --> 00:25:26,600 Και ας δούμε τι κάνει. 590 00:25:26,600 --> 00:25:28,920 Δηλώνει μια int, που ονομάζεται x. 591 00:25:28,920 --> 00:25:30,850 Λέει κάτι σαν, τον αριθμό παρακαλώ. 592 00:25:30,850 --> 00:25:33,940 Και τώρα λέει, scanf% i, & x. 593 00:25:33,940 --> 00:25:35,620 Έτσι, υπάρχει ένα σωρό νέα πράγματα εκεί. 594 00:25:35,620 --> 00:25:38,420 >> Αλλά scanf, μπορείτε να σκεφτείτε το είδος των της ως το αντίθετο της printf. 595 00:25:38,420 --> 00:25:40,090 printf, φυσικά, εκτυπώσεις στην οθόνη. 596 00:25:40,090 --> 00:25:44,410 scanf είδος των σαρώσεων από το χρήστη κάτι πληκτρολόγιο αυτός ή αυτή έχει πληκτρολογήσει. 597 00:25:44,410 --> 00:25:46,550 >> % I είναι ακριβώς όπως printf. 598 00:25:46,550 --> 00:25:49,410 Αυτό σημαίνει ότι αναμένουμε η χρήστη να πληκτρολογήσει έναν int. 599 00:25:49,410 --> 00:25:52,820 Και τώρα, γιατί νομίζεις ότι μπορεί να περνά scanf & x; 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Αν ο σκοπός της ζωής της scanf είναι να πάρει κάτι από το χρήστη, 602 00:25:57,770 --> 00:26:02,480 ποια είναι η έννοια του περνώντας, και x, τώρα; 603 00:26:02,480 --> 00:26:02,980 Ναι; 604 00:26:02,980 --> 00:26:03,896 >> ΚΟΙΝΟ: [δεν ακούγεται]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. MALAN: Ακριβώς. 607 00:26:06,540 --> 00:26:12,900 Ό, τι εγώ, ο άνθρωπος, πληκτρολογήστε το, είσοδος μου πρόκειται να αποθηκευτεί σε αυτή τη θέση. 608 00:26:12,900 --> 00:26:17,660 Δεν είναι επαρκής, υπενθυμίζουν, απλά περάσει σε x, επειδή έχουμε ήδη δει, 609 00:26:17,660 --> 00:26:21,630 κάθε φορά που θα περάσει μόνο μια ακατέργαστη μεταβλητή, σαν int, σε κάποια άλλη λειτουργία, 610 00:26:21,630 --> 00:26:25,640 Σίγουρα, μπορεί να το αλλάξει αυτό μεταβλητή, αλλά όχι μόνιμα. 611 00:26:25,640 --> 00:26:27,360 Δεν μπορεί να έχει μια επίδραση στο Main. 612 00:26:27,360 --> 00:26:29,420 Μπορεί να αλλάξει μόνο τη δική τοπικό αντίγραφο της. 613 00:26:29,420 --> 00:26:32,560 Αλλά αν, αντ 'αυτού, δεν έχετε να μου δώσει την πραγματική int, 614 00:26:32,560 --> 00:26:36,640 αλλά να μου δώσει οδηγίες για ότι int, εγώ τώρα, είναι scanf, 615 00:26:36,640 --> 00:26:41,050 σίγουρα, μπορώ να ακολουθήσω ότι αντιμετωπίσει και να βάλει έναν αριθμό εκεί 616 00:26:41,050 --> 00:26:43,280 έτσι ώστε να έχουν πρόσβαση σε αυτό, καθώς και. 617 00:26:43,280 --> 00:26:45,120 >> Έτσι, όταν τρέχω το πρόγραμμα αυτό, ας δούμε. 618 00:26:45,120 --> 00:26:49,660 Κάντε scanf 0 dot κάθετος, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Και αν τώρα πληκτρολογήστε έναν αριθμό όπως 50, ευχαριστώ για την 50. 620 00:26:54,030 --> 00:26:58,150 Αν τώρα πληκτρολογήσετε έναν αριθμό, όπως αρνητικός 1, για την αρνητική 1. 621 00:26:58,150 --> 00:27:04,200 Τώρα πληκτρολογήστε έναν αριθμό όπως το 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Γιατί το πρόγραμμά μου αγνοήσει μου; 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Λοιπόν, γιατί απλά, είπα να αναμένουν μόνο μια int. 625 00:27:09,880 --> 00:27:10,380 Εντάξει. 626 00:27:10,380 --> 00:27:11,630 Έτσι, αυτό είναι μια έκδοση του αυτό. 627 00:27:11,630 --> 00:27:16,600 Ας πάρουμε όμως τα πράγματα επάνω μια εγκοπή και προτείνουν ότι αυτό δεν είναι καλό. 628 00:27:16,600 --> 00:27:20,530 Και εδώ βρίσκεται ένα πολύ απλό παράδειγμα πώς μπορούμε να αρχίσουμε το γράψιμο κώδικα 629 00:27:20,530 --> 00:27:24,450 ότι οι άλλοι άνθρωποι μπορούν να εκμεταλλευτούν ή συμβιβαστεί με το να κάνουν κακά πράγματα. 630 00:27:24,450 --> 00:27:28,336 Έτσι η γραμμή 16, τόσο όμοια στο πνεύμα με πριν, 631 00:27:28,336 --> 00:27:29,960 αλλά δεν είμαι δηλώνοντας ότι int αυτή τη φορά. 632 00:27:29,960 --> 00:27:32,970 Είμαι δηλώνοντας ότι char αστέρι, γνωστός και κορδόνι. 633 00:27:32,970 --> 00:27:35,190 >> Αλλά τι σημαίνει αυτό στην πράξη; 634 00:27:35,190 --> 00:27:38,790 Έτσι, αν δεν καθορίσετε μια address-- και Είμαι χαρακτηρίζοντάς αυθαίρετα, ρυθμιστικό, 635 00:27:38,790 --> 00:27:43,370 αλλά θα μπορούσα να το ονομάσουμε s, να simple-- και, στη συνέχεια, να κάνω αυτό, να μου εξηγήσει, 636 00:27:43,370 --> 00:27:48,630 αν μπορούσε, με βάση την προηγούμενη λογική, αυτό που κάνει scanf στη γραμμή 18, 637 00:27:48,630 --> 00:27:55,000 εάν πέρασμα% s και ρυθμιστικό, η οποία είναι μια διεύθυνση; 638 00:27:55,000 --> 00:27:58,210 Τι είναι η scanf, αν ισχύει η ακριβώς την ίδια λογική με την έκδοση 0, 639 00:27:58,210 --> 00:28:00,640 Θα προσπαθήσουμε να κάνουμε εδώ, όταν το κάτι τύπους χρηστών σε; 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Ναι; 642 00:28:03,409 --> 00:28:04,407 >> ΚΟΙΝΟ: [δεν ακούγεται]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. MALAN: Ακριβώς. 645 00:28:08,890 --> 00:28:11,577 Scanf, με τη λογική νωρίτερα, πρόκειται να πάρει το string 646 00:28:11,577 --> 00:28:13,410 ότι το ανθρώπινο δακτυλογραφημένο in-- είναι τώρα ένα κορδόνι, 647 00:28:13,410 --> 00:28:15,790 δεν είναι ένας αριθμός, κατά πάσα πιθανότητα, αν αυτός ή αυτή cooperates-- 648 00:28:15,790 --> 00:28:19,310 και πρόκειται να προσπαθήσω να θέσω κορδόνι στη μνήμη, ανεξάρτητα από τη διεύθυνση 649 00:28:19,310 --> 00:28:20,340 ρυθμιστικό καθορίζει. 650 00:28:20,340 --> 00:28:23,870 Και αυτό είναι μεγάλη, επειδή ρυθμιστικό πράγματι προορίζεται να είναι μια διεύθυνση. 651 00:28:23,870 --> 00:28:30,470 >> Αλλά εγώ υποστηρίζουν το πρόγραμμα αυτό είναι προβληματικό σε μια πολύ σοβαρό τρόπο, επειδή ό, τι αξία είναι 652 00:28:30,470 --> 00:28:31,330 ρυθμιστικό από προεπιλογή; 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Τι έχω προετοιμαστεί μέσα; 655 00:28:34,790 --> 00:28:35,770 Ποιο κομμάτι της μνήμης; 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Δεν έχω, σωστά; 658 00:28:38,620 --> 00:28:42,265 >> Έτσι, ακόμα κι αν έχω διατεθεί ένα αστέρι char που έχει πλέον ονομάζεται s, 659 00:28:42,265 --> 00:28:48,030 αυτό είναι αντ 'αυτού που ονομάζεται, buffer-- έτσι ας συντάξει το όνομα της μεταβλητής 660 00:28:48,030 --> 00:28:53,380 τώρα όπως buffer-- αν δεν έχουν ονομάζεται GetString ή malloc εδώ, 661 00:28:53,380 --> 00:28:56,030 Αυτό σημαίνει ουσιαστικά ότι buffer είναι μόνο κάποια αξία σκουπίδια. 662 00:28:56,030 --> 00:28:57,030 >> Τώρα τι σημαίνει αυτό; 663 00:28:57,030 --> 00:29:00,220 Αυτό σημαίνει ότι έχω πει scanf να αναμένουν μια σειρά από το χρήστη. 664 00:29:00,220 --> 00:29:01,300 Και ξέρετε τι; 665 00:29:01,300 --> 00:29:03,883 Όποια και αν είναι αυτό το πράγμα που δείχνει να-- και ήθελα να επιστήσω ερωτηματικό, 666 00:29:03,883 --> 00:29:07,060 αλλά στην πραγματικότητα, πρόκειται να κάτι σαν ΟΧ1, 2, 3, σωστά; 667 00:29:07,060 --> 00:29:10,730 Είναι μερικές ψεύτικες αξία ότι μόνο συμβαίνει να είναι εκεί από πριν. 668 00:29:10,730 --> 00:29:13,440 Έτσι, με άλλα λόγια, είναι σαν buffer είναι απλά 669 00:29:13,440 --> 00:29:16,180 δείχνουν προς κάτι στη μνήμη. 670 00:29:16,180 --> 00:29:17,610 Δεν έχω ιδέα τι. 671 00:29:17,610 --> 00:29:24,130 >> Έτσι, αν πληκτρολογήσετε Gabe τώρα, πρόκειται να προσπαθήσει να βάλει g-a-b-e / 0 εκεί. 672 00:29:24,130 --> 00:29:25,530 Αλλά ποιος ξέρει τι είναι αυτό; 673 00:29:25,530 --> 00:29:27,480 Και κατά το παρελθόν, οποιαδήποτε φορά που έχουμε προσπαθήσει να αγγίξει 674 00:29:27,480 --> 00:29:29,770 μνήμης που δεν ανήκουν για μας, ό, τι έχει συμβεί; 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Ή σχεδόν κάθε χρόνο. 677 00:29:32,870 --> 00:29:34,310 Τμηματοποίηση σφάλμα, σωστά; 678 00:29:34,310 --> 00:29:37,829 >> Αυτό το βέλος, δεν έχω καμία ιδέα για το πού είναι κατάδειξης. είναι μερικά μόνο τυχαία τιμή. 679 00:29:37,829 --> 00:29:40,370 Και φυσικά, αν ερμηνεύσει μια τυχαία τιμή ως μια διεύθυνση, 680 00:29:40,370 --> 00:29:42,610 θα πάμε για να πάει στο κάποιο τυχαίο προορισμό. 681 00:29:42,610 --> 00:29:46,810 Έτσι, Gabe μπορεί πράγματι να συντριβή το πρόγραμμά μου σε αυτήν την περίπτωση εδώ. 682 00:29:46,810 --> 00:29:50,600 >> Τι μπορούμε λοιπόν να κάνουμε ότι είναι σχεδόν τόσο κακή; 683 00:29:50,600 --> 00:29:52,660 Σκεφτείτε το τρίτο και τελευταίο παράδειγμα της scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Αυτή η έκδοση είναι καλύτερη με ποια έννοια; 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Εάν είστε άνετοι με το προηγούμενο πρόβλημα, αυτό είναι καλύτερο. 688 00:30:01,400 --> 00:30:02,250 Γιατί; 689 00:30:02,250 --> 00:30:03,250 >> ΚΟΙΝΟ: [δεν ακούγεται]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. MALAN: Καλή. 692 00:30:07,110 --> 00:30:09,970 Έτσι, η υπόθεση της γραμμής 16 είναι καλύτερη, με την έννοια 693 00:30:09,970 --> 00:30:12,030 ότι είμαστε σαφώς την κατανομή κάποια μνήμη. 694 00:30:12,030 --> 00:30:14,190 Εμείς δεν χρησιμοποιείτε malloc, είμαστε χρησιμοποιώντας την εβδομάδα 2 695 00:30:14,190 --> 00:30:16,060 προσέγγιση του απλά δηλώνοντας μια σειρά. 696 00:30:16,060 --> 00:30:18,130 Και έχουμε ξαναπεί ότι ένα string είναι απλά μια σειρά από χαρακτήρες, 697 00:30:18,130 --> 00:30:19,690 έτσι αυτό είναι απολύτως θεμιτό. 698 00:30:19,690 --> 00:30:22,910 Αλλά είναι, φυσικά, καθώς μπορείτε να σημειώσετε, σταθερού μεγέθους, 16. 699 00:30:22,910 --> 00:30:25,440 >> Έτσι, αυτό το πρόγραμμα είναι απόλυτα ασφαλής, αν πληκτρολογήσετε 700 00:30:25,440 --> 00:30:29,760 στις χορδές ενός χαρακτήρα, δύο χαρακτήρων χορδές, 15 στοιχειοσειρές. 701 00:30:29,760 --> 00:30:34,970 Αλλά μόλις αρχίσω να πληκτρολογείτε 16, 17, 18, 1000 χορδές χαρακτήρα, 702 00:30:34,970 --> 00:30:37,390 όπου αυτή η συμβολοσειρά θα καταλήξουμε; 703 00:30:37,390 --> 00:30:39,570 Είναι πρόκειται να καταλήξει εν μέρει εδώ. 704 00:30:39,570 --> 00:30:42,820 Αλλά τότε ποιος ξέρει τι άλλο είναι πέρα ​​από τα όρια 705 00:30:42,820 --> 00:30:44,270 της συγκεκριμένης συστοιχίας; 706 00:30:44,270 --> 00:30:48,015 >> Είναι σαν να έχω δηλωθεί 16 κουτιά εδώ. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Έτσι, αντί να αντλήσει από όλες τις 16, θα προσποιηθείς ότι έχω σχεδιάσει 16. 709 00:30:52,690 --> 00:30:56,540 Αλλά αν στη συνέχεια, δοκιμάστε να διαβάσετε ένα string ότι είναι πολύ περισσότερο, όπως και 50 χαρακτήρες, 710 00:30:56,540 --> 00:31:01,270 Πάω να αρχίσει η εφαρμογή α, β, γ, δ, χ, y, z. 711 00:31:01,270 --> 00:31:04,916 Και αυτό είναι προφανώς κάποιο άλλο τμήμα μνήμης 712 00:31:04,916 --> 00:31:06,790 ότι, και πάλι, μπορεί να προκαλέσει το πρόγραμμά μου για να συντρίψει, 713 00:31:06,790 --> 00:31:10,600 γιατί δεν έχω ζητήσει τίποτα περισσότερο από ό, τι μόλις 16 bytes. 714 00:31:10,600 --> 00:31:12,260 >> Έτσι, ποιος νοιάζεται; 715 00:31:12,260 --> 00:31:13,880 Λοιπόν, εδώ είναι η βιβλιοθήκη CS50. 716 00:31:13,880 --> 00:31:17,220 Και τα περισσότερα από αυτά είναι απλά όπως οδηγίες επάνω στην κορυφή. 717 00:31:17,220 --> 00:31:21,670 Η βιβλιοθήκη CS50, όλο αυτό το διάστημα, είχε αυτή τη γραμμή στην γραμμή 52. 718 00:31:21,670 --> 00:31:23,680 Έχουμε δει typedef, ή θα δείτε typedef 719 00:31:23,680 --> 00:31:27,930 σε 4 το chipset, το οποίο δημιουργεί μόνο ένα συνώνυμο με την οποία char αστέρι μπορεί να είναι πιο 720 00:31:27,930 --> 00:31:29,290 απλά αναφέρεται ως συμβολοσειρά. 721 00:31:29,290 --> 00:31:31,540 Έτσι, αυτό είναι ένα από τα λίγα ρόδες 722 00:31:31,540 --> 00:31:34,120 έχουμε χρησιμοποιήσει κρυφά κάτω από το καπό. 723 00:31:34,120 --> 00:31:36,490 >> Εν τω μεταξύ, εδώ είναι η λειτουργία, getchar. 724 00:31:36,490 --> 00:31:38,190 Τώρα, προφανώς, δεν υπάρχει σώμα για να το. 725 00:31:38,190 --> 00:31:40,273 Και στην πραγματικότητα, αν κρατώ κύλιση, δεν το κάνω πραγματικότητα 726 00:31:40,273 --> 00:31:42,080 δείτε οποιεσδήποτε εφαρμογές από αυτές τις λειτουργίες. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Ως έλεγχος λογική, γιατί είναι αυτό; 729 00:31:45,516 --> 00:31:46,795 >> ΚΟΙΝΟ: [δεν ακούγεται]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. MALAN: Ναι. 731 00:31:47,670 --> 00:31:48,950 Έτσι, αυτό είναι το αρχείο κεφαλίδας. 732 00:31:48,950 --> 00:31:52,520 Και τα αρχεία header περιέχει πρωτότυπα, συν κάποια άλλα πράγματα, όπως φαίνεται, 733 00:31:52,520 --> 00:31:53,780 όπως typedefs. 734 00:31:53,780 --> 00:31:56,910 Αλλά σε CS50.c, που έχουμε Ποτέ δεν θα δοθεί οριστικές, 735 00:31:56,910 --> 00:32:02,100 αλλά έχει στην συσκευή CS50 όλα αυτή τη φορά, βαθιά μέσα από τους φακέλους της, 736 00:32:02,100 --> 00:32:04,990 παρατηρήσετε ότι υπάρχει μια ολόκληρη δέσμη των λειτουργιών εδώ. 737 00:32:04,990 --> 00:32:06,720 >> Στην πραγματικότητα, ας κύλιση προς τα κάτω. 738 00:32:06,720 --> 00:32:08,810 Ας αγνοήσουμε τα περισσότερα από αυτά, για τώρα. 739 00:32:08,810 --> 00:32:12,670 Όμως, μετακινηθείτε προς τα κάτω για να getInt και να δούμε πώς λειτουργεί getInt. 740 00:32:12,670 --> 00:32:13,890 Έτσι, εδώ είναι getInt. 741 00:32:13,890 --> 00:32:17,727 Και αν ποτέ νοιαζόταν πραγματικά πώς να πάρει int λειτουργεί, εδώ είναι η τεκμηρίωση της. 742 00:32:17,727 --> 00:32:19,560 Και ανάμεσα στα πράγματα λέει ότι είναι αυτό που λέει 743 00:32:19,560 --> 00:32:21,340 τι οι σειρές των τιμών μπορεί να επιστρέψει. 744 00:32:21,340 --> 00:32:24,400 Είναι ουσιαστικά αρνητικό 2000000000 σε θετική 2000000000, ή να δώσει. 745 00:32:24,400 --> 00:32:26,420 >> Και αποδεικνύεται, όλα αυτά χρόνο, ακόμα κι αν έχουμε ποτέ 746 00:32:26,420 --> 00:32:28,570 είχε να ελέγξετε για αυτό, αν κάτι πάει στραβά, 747 00:32:28,570 --> 00:32:30,680 αποδεικνύεται ότι όλα αυτή τη φορά, getInt έχει 748 00:32:30,680 --> 00:32:33,600 έχουν επιστροφή ενός ειδικού σταθερή, δεν είναι μηδενική, 749 00:32:33,600 --> 00:32:36,760 αλλά μάλλον INT_MAX, η οποία είναι σύμβαση μόνο ενός προγραμματιστή. 750 00:32:36,760 --> 00:32:38,846 Αυτό σημαίνει ότι εδώ είναι μια ιδιαίτερη αξία. 751 00:32:38,846 --> 00:32:41,470 Σιγουρευτείτε για να ελέγξετε για αυτό, απλά σε περίπτωση που κάτι πάει στραβά. 752 00:32:41,470 --> 00:32:43,261 Αλλά ποτέ δεν έχω ενοχλήσει με ότι μέχρι σήμερα, 753 00:32:43,261 --> 00:32:45,200 επειδή πάλι, αυτό έχει ως στόχο να απλοποιήσει. 754 00:32:45,200 --> 00:32:46,950 >> Αλλά πώς getInt να εφαρμοστεί; 755 00:32:46,950 --> 00:32:48,450 Λοιπόν, το ένα, αυτό δεν παίρνει επιχειρήματα. 756 00:32:48,450 --> 00:32:49,390 Γνωρίζουμε ότι. 757 00:32:49,390 --> 00:32:50,820 Επιστρέφει έναν int. 758 00:32:50,820 --> 00:32:51,950 Γνωρίζουμε ότι. 759 00:32:51,950 --> 00:32:54,460 Έτσι, πώς λειτουργεί κάτω από την κουκούλα; 760 00:32:54,460 --> 00:32:58,290 >> Έτσι, υπάρχει προφανώς μια άπειρη βρόχος, τουλάχιστον η εμφάνιση του ενός. 761 00:32:58,290 --> 00:33:00,290 Παρατηρήστε ότι είμαστε χρησιμοποιώντας GetString. 762 00:33:00,290 --> 00:33:04,000 Έτσι, αυτό είναι ενδιαφέρον. getInt καλεί τη δική μας λειτουργία, GetString. 763 00:33:04,000 --> 00:33:05,645 Και τώρα γιατί θα μπορούσε αυτό να συμβεί; 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Γιατί είναι αμυντικός εδώ στη γραμμή 165; 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Τι θα μπορούσε να συμβεί στη γραμμή 164, ακριβώς για να είναι σαφές; 768 00:33:15,639 --> 00:33:16,930 Είναι η ίδια απάντηση όπως και πριν. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Θα μπορούσε απλώς να είναι έξω από τη μνήμη. 771 00:33:20,089 --> 00:33:23,130 Κάτι πάει στραβά με GetString, έχουμε για να είναι σε θέση να χειριστεί αυτό. 772 00:33:23,130 --> 00:33:27,070 Και ο λόγος που δεν επιστρέφουν null είναι ότι, από τεχνική άποψη, η μηδενική είναι ένας δείκτης. 773 00:33:27,070 --> 00:33:29,120 getInt πρέπει να επιστρέψει ένα int. 774 00:33:29,120 --> 00:33:31,060 Έτσι έχω αυθαίρετα αποφάσισε, κατ 'ουσίαν, 775 00:33:31,060 --> 00:33:34,600 ότι 2 δισεκατομμύρια, ή να δώσει, πρόκειται να είναι μια ιδιαίτερη αξία, τι μπορώ ποτέ 776 00:33:34,600 --> 00:33:35,970 πραγματικά να πάρει από το χρήστη. 777 00:33:35,970 --> 00:33:39,930 Είναι μόνο η μία τιμή Πάω τα απόβλητα να αποτελούν έναν κωδικό σφάλματος. 778 00:33:39,930 --> 00:33:41,540 >> Μέχρι τώρα, τα πράγματα παίρνουν λίγο φανταχτερό. 779 00:33:41,540 --> 00:33:44,670 Και αυτό δεν είναι ακριβώς το ίδιο λειτουργία όπως και πριν, αλλά είναι πολύ παρόμοια. 780 00:33:44,670 --> 00:33:50,120 Έτσι παρατηρήσετε, δηλώνω εδώ, στη γραμμή 172, και ένα int n και ένα char c. 781 00:33:50,120 --> 00:33:53,600 Και τότε μπορώ να χρησιμοποιήσω αυτό το funky γραμμή, sscanf, η οποία αποδεικνύεται 782 00:33:53,600 --> 00:33:55,990 δεν σαρώνει ένα string από το πληκτρολόγιο. 783 00:33:55,990 --> 00:33:59,226 Στέκεται μια υπάρχουσα συμβολοσειρά που ο χρήστης έχει ήδη πληκτρολογήσει. 784 00:33:59,226 --> 00:34:02,100 Γι 'αυτό και ήδη ονομάζεται GetString, η οποία σημαίνει ότι έχω ένα string στη μνήμη. 785 00:34:02,100 --> 00:34:05,020 sscanf είναι αυτό που έπαιρνα καλέσετε μια συνάρτηση ανάλυσης. 786 00:34:05,020 --> 00:34:07,760 Εξετάζει το κορδόνι που έχω πληκτρολογήσει, χαρακτήρα προς χαρακτήρα, 787 00:34:07,760 --> 00:34:09,250 και να κάνει κάτι χρήσιμο. 788 00:34:09,250 --> 00:34:10,969 Αυτό κειμένου αποθηκεύεται στη γραμμή. 789 00:34:10,969 --> 00:34:13,560 Και ξέρω ότι μόνο με τη μετάβαση δημιουργήσετε αντίγραφα ασφαλείας εδώ και λέει, OH, OK, 790 00:34:13,560 --> 00:34:15,143 Μου ζήτησε να μην s αυτή τη φορά, αλλά γραμμή. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Και τώρα αυτή είναι λίγο διαφορετική. 793 00:34:18,080 --> 00:34:22,480 Αλλά αυτό σημαίνει ουσιαστικά, για λόγους θα κύμα κάπως τα χέρια μας σήμερα, 794 00:34:22,480 --> 00:34:26,070 ότι έχουμε τον έλεγχο για να δείτε αν ο χρήστης πληκτρολογήσει το 795 00:34:26,070 --> 00:34:29,909 και int και ίσως ένα άλλο χαρακτήρα. 796 00:34:29,909 --> 00:34:33,610 Εάν ο χρήστης πληκτρολογήσει σε ένα int, είναι πρόκειται να αποθηκευτούν σε n, επειδή είμαι 797 00:34:33,610 --> 00:34:36,739 πέρασμα αυτό από τη διεύθυνση, η νέο τέχνασμα που είδαμε σήμερα. 798 00:34:36,739 --> 00:34:41,570 Εάν ο χρήστης πληκτρολογήσει επίσης σε παρόμοια 123x, ότι x 799 00:34:41,570 --> 00:34:45,060 πρόκειται να τελειώσει μέχρι ένα επιστολή στον χαρακτήρα c. 800 00:34:45,060 --> 00:34:48,739 >> Τώρα αποδεικνύεται ότι sscanf Θα μου πείτε, έξυπνα, 801 00:34:48,739 --> 00:34:54,750 πόσες μεταβλητές ήταν sscanf με επιτυχία σε θέση να καλύψει. 802 00:34:54,750 --> 00:34:58,770 Έτσι, με αυτή τη λογική, εάν η λειτουργία Είμαι εφαρμογή είναι getInt, 803 00:34:58,770 --> 00:35:00,900 αλλά είμαι έλεγχο, δυνητικά, για τον χρήστη 804 00:35:00,900 --> 00:35:04,190 να έχετε πληκτρολογήσει σε ένα int ακολουθείται από κάτι άλλο, 805 00:35:04,190 --> 00:35:08,580 τι θέλω sscanf του τιμή επιστροφής πραγματικά να είναι; 806 00:35:08,580 --> 00:35:10,950 Αν ο σκοπός είναι να πάρετε μόλις ένα int από το χρήστη; 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Έτσι, αν sscanf αποδόσεις 2, τι σημαίνει αυτό; 809 00:35:19,300 --> 00:35:21,660 Ο χρήστης πληκτρολογήσει κάτι σαν, κυριολεκτικά, 810 00:35:21,660 --> 00:35:24,770 123x, το οποίο είναι απλά ανοησίες. 811 00:35:24,770 --> 00:35:27,490 Είναι μια κατάσταση σφάλματος, και Θέλω να ελέγξει για αυτό. 812 00:35:27,490 --> 00:35:32,960 >> Έτσι, αν ο χρήστης πληκτρολογεί αυτό το, από αυτή η λογική, αυτό που κάνει sscanf επιστρέψει, 813 00:35:32,960 --> 00:35:33,740 θα λέγατε; 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Έτσι πρόκειται να επιστρέψει 2, επειδή η 123 πρόκειται να πάει εδώ, 816 00:35:39,130 --> 00:35:41,580 και το χ πρόκειται να καταλήξετε εδώ. 817 00:35:41,580 --> 00:35:43,970 Αλλά δεν θέλω το x για να γεμίσει. 818 00:35:43,970 --> 00:35:48,580 Θέλω να sscanf μόνο για να πετύχει στο συμπληρώνοντας την πρώτη από τις μεταβλητές του. 819 00:35:48,580 --> 00:35:52,490 Και έτσι γι 'αυτό sscanf θέλουν να επιστρέψουν 1. 820 00:35:52,490 --> 00:35:55,750 >> Και, εάν αυτό είναι λίγο πάνω από το κεφάλι Προς το παρόν, αυτό είναι εντελώς καλά. 821 00:35:55,750 --> 00:36:00,030 Συνειδητοποίησε όμως, ότι ένα από τα τιμές των getInt και GetString 822 00:36:00,030 --> 00:36:03,630 είναι ότι κάνουμε ένα καλό από μια Πολλοί από έλεγχο σφαλμάτων, όπως αυτό έτσι 823 00:36:03,630 --> 00:36:07,130 ότι, μέχρι σήμερα, μπορείτε λίγο πολύ πληκτρολογήσετε τίποτα στο πληκτρολόγιό σας, 824 00:36:07,130 --> 00:36:08,490 και εμείς θα το πιάσει. 825 00:36:08,490 --> 00:36:10,592 Και σίγουρα, η προσωπικό, σίγουρα δεν θα 826 00:36:10,592 --> 00:36:13,300 να είναι η πηγή ενός σφάλματος σε σας πρόγραμμα, γιατί είμαστε αμυντικά 827 00:36:13,300 --> 00:36:16,270 έλεγχο για όλα τα ηλίθια πράγματα που ένας χρήστης μπορεί να κάνει, 828 00:36:16,270 --> 00:36:18,900 όπως πληκτρολογώντας μια σειρά, όταν ήθελες πραγματικά int. 829 00:36:18,900 --> 00:36:21,350 Έτσι, για now-- θα έρθει πίσω σε αυτό πριν long-- 830 00:36:21,350 --> 00:36:23,710 αλλά όλο αυτό το διάστημα, GetString και getInt έχουν 831 00:36:23,710 --> 00:36:29,950 ήταν κάτω από την κουκούλα χρησιμοποιώντας αυτό βασική ιδέα των διευθύνσεων της μνήμης. 832 00:36:29,950 --> 00:36:32,580 >> Μέχρι τώρα, ας κάνει τα πράγματα λίγο πιο φιλική προς το χρήστη. 833 00:36:32,580 --> 00:36:38,740 Όπως ίσως θυμάστε, από Binky τελευταία time-- αν το ποντίκι μου θα συνεργαστείτε ώστε 834 00:36:38,740 --> 00:36:42,560 είχαμε αυτόν τον κώδικα, η οποία ειλικρινά, είναι αρκετά ανόητο. 835 00:36:42,560 --> 00:36:45,330 Ο κωδικός αυτός δεν επιτυγχάνει τίποτα χρήσιμος, αλλά ήταν ο παράδειγμα 836 00:36:45,330 --> 00:36:48,330 ο καθηγητής Parlante χρησιμοποιείται για να αντιπροσωπεύσει 837 00:36:48,330 --> 00:36:51,840 ό, τι συνέβαινε σε μια πρόγραμμα που θα περιλαμβάνει τη μνήμη. 838 00:36:51,840 --> 00:36:54,850 >> Οπότε ας ξαναλέγω αυτό ιστορία super σύντομα. 839 00:36:54,850 --> 00:36:58,720 Αυτές οι δύο πρώτες γραμμές, σε Αγγλικά, κάνει ό, τι θα λέγατε; 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Ακριβώς σε λογικά ανθρώπινα, αλλά ελαφρώς τεχνικούς όρους, να λάβει μια μαχαιριά. 842 00:37:05,430 --> 00:37:06,346 ΚΟΙΝΟ: [δεν ακούγεται]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. MALAN: Εντάξει, είστε για την ίδρυση διευθύνσεις x και y μεταβλητές. 845 00:37:11,080 --> 00:37:15,520 Όχι ακριβώς, επειδή το x και το y δεν είναι μεταβλητές με την παραδοσιακή έννοια. 846 00:37:15,520 --> 00:37:18,054 x και y είναι οι διευθύνσεις ή θα αποθηκεύσετε τη διεύθυνση. 847 00:37:18,054 --> 00:37:19,220 Οπότε ας προσπαθήσουμε άλλη μία φορά. 848 00:37:19,220 --> 00:37:21,010 Δεν είναι ένα κακό ξεκίνημα, όμως. 849 00:37:21,010 --> 00:37:21,510 Ναι; 850 00:37:21,510 --> 00:37:22,426 >> ΚΟΙΝΟ: [δεν ακούγεται]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. MALAN: Καλή. 853 00:37:24,840 --> 00:37:26,173 Νομίζω ότι είναι λίγο καθαρότερο. 854 00:37:26,173 --> 00:37:28,630 Δηλώνοντας δίποντα, δύο ακέραιοι. 855 00:37:28,630 --> 00:37:30,150 Και είμαστε καλώντας τους x και y. 856 00:37:30,150 --> 00:37:32,790 Ή αν ήταν να συντάξει αυτό ως μια εικόνα, και πάλι, 857 00:37:32,790 --> 00:37:36,410 Υπενθυμίζουμε απλώς ότι όλα κάνουμε με την πρώτη γραμμή 858 00:37:36,410 --> 00:37:39,690 πλησιάζει ένα κουτί σαν αυτό, με κάποια αξία σκουπίδια σε αυτό, 859 00:37:39,690 --> 00:37:41,920 και καλώντας x, και στη συνέχεια, ένα άλλο πλαίσιο, όπως αυτό, 860 00:37:41,920 --> 00:37:43,880 με κάποια αξία σκουπίδια σε αυτό, καλώντας y. 861 00:37:43,880 --> 00:37:45,810 Έχουμε δηλώσει δύο δείκτες που τελικά 862 00:37:45,810 --> 00:37:47,860 θα αποθηκεύσει τη διεύθυνση ενός int. 863 00:37:47,860 --> 00:37:49,170 Έτσι ώστε να είναι όλα εκεί. 864 00:37:49,170 --> 00:37:53,290 >> Έτσι, όταν Binky έκανε αυτό, η πηλό ακριβώς έμοιαζε με αυτό. 865 00:37:53,290 --> 00:37:55,350 Και Nick ακριβώς το είδος της συνόψισε τα βέλη, 866 00:37:55,350 --> 00:37:57,590 σαν να μην είστε δείχνουν πουθενά ιδίως, επειδή είναι ακριβώς 867 00:37:57,590 --> 00:37:58,250 τιμές σκουπίδια. 868 00:37:58,250 --> 00:38:01,670 Δεν είστε προετοιμαστεί ρητά οπουδήποτε ειδικότερα. 869 00:38:01,670 --> 00:38:03,980 >> Τώρα, η επόμενη γραμμή κώδικα, ανάκληση, ήταν αυτό. 870 00:38:03,980 --> 00:38:07,510 Έτσι, σε λογικά φιλική προς το χρήστη, αλλά κάπως τεχνικά Αγγλικά, 871 00:38:07,510 --> 00:38:09,790 τι είναι αυτή η γραμμή του κώδικα που κάνει; 872 00:38:09,790 --> 00:38:10,391 Ναι; 873 00:38:10,391 --> 00:38:11,333 >> ΚΟΙΝΟ: [δεν ακούγεται]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. MALAN: Perfect. 876 00:38:13,950 --> 00:38:17,016 Είναι κατανομή της κομμάτι της μνήμης που είναι το μέγεθος ενός int. 877 00:38:17,016 --> 00:38:18,140 Και αυτό είναι η μισή απάντηση. 878 00:38:18,140 --> 00:38:20,056 Απαντήσατε το δικαίωμα ήμισυ της έκφρασης. 879 00:38:20,056 --> 00:38:22,473 Τι συμβαίνει σχετικά με την αριστερή πλευρά του συμβόλου του ίσον; 880 00:38:22,473 --> 00:38:22,972 Ναι; 881 00:38:22,972 --> 00:38:24,814 ΚΟΙΝΟ: Και εκδοχείς αυτό με τη μεταβλητή x; 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. MALAN: Και εκδοχείς να την μεταβλητή x. 883 00:38:27,690 --> 00:38:31,650 Έτσι, για να ανακεφαλαιώσουμε, δεξιά πλευρά διαθέτει η αρκετή μνήμη για την αποθήκευση ενός int. 884 00:38:31,650 --> 00:38:34,150 Αλλά malloc ειδικά επιστρέφει τη διεύθυνση 885 00:38:34,150 --> 00:38:37,270 του εν λόγω κομμάτι της μνήμης, το οποίο έχετε ακριβώς προτείνεται παίρνει αποθηκεύονται στο x. 886 00:38:37,270 --> 00:38:42,560 >> Έτσι, ό, τι Νικ έκανε την τελευταία φορά με Binky είναι έσυρε αυτό το δείκτη έξω, ο πηλός, 887 00:38:42,560 --> 00:38:46,820 να επισημάνω τώρα σε ένα λευκό κομμάτι της μνήμης ότι είναι ίση με το μέγεθος ενός ενδ. 888 00:38:46,820 --> 00:38:49,360 Και πράγματι, αυτό σήμαινε να εκπροσωπεί τέσσερα bytes. 889 00:38:49,360 --> 00:38:55,310 >> Τώρα, η επόμενη γραμμή κώδικα έκανε αυτό, αστέρι x παίρνει 42. 890 00:38:55,310 --> 00:38:58,530 Έτσι, 42 είναι απλή για το δεξιά πλευρά, νόημα της ζωής. 891 00:38:58,530 --> 00:39:00,500 Αριστερή πλευρά, αστέρι x σημαίνει αυτό; 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Αυτό επίσης θα μπορούσε να έχει gone-- αυτό είναι εντάξει. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> ΚΟΙΝΟ: Βασικά, πηγαίνετε στο [δεν ακούγεται] 896 00:39:06,875 --> 00:39:07,750 DAVID J. MALAN: Καλή. 897 00:39:07,750 --> 00:39:08,760 ΚΟΙΝΟ: [δεν ακούγεται]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. MALAN: Ακριβώς. 899 00:39:09,760 --> 00:39:11,979 Αριστερή πλευρά σημαίνει να πάει στο x. 900 00:39:11,979 --> 00:39:12,520 x είναι η διεύθυνση. 901 00:39:12,520 --> 00:39:15,520 Είναι σαν 33 Oxford Street, ή OX1. 902 00:39:15,520 --> 00:39:18,690 Και αστέρι x σημαίνει να πάει στο ότι αντιμετωπίσει και να θέσει ό, τι υπάρχει; 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Έτσι, πράγματι, αυτό είναι ακριβώς ό, τι έκανε ο Νικ. 905 00:39:21,290 --> 00:39:23,740 Ξεκίνησε με με, κατ 'ουσίαν, διανοητικά 906 00:39:23,740 --> 00:39:26,270 δείχνοντας με το δάχτυλο χ, μετά από το βέλος 907 00:39:26,270 --> 00:39:30,670 στο λευκό κουτί με το δεξί χέρι πλευρά, και βάζοντας τον αριθμό 42 εκεί. 908 00:39:30,670 --> 00:39:34,120 Αλλά τότε τα πράγματα πήραν μια λίγο επικίνδυνο, σωστά; 909 00:39:34,120 --> 00:39:35,860 Binky είναι έτοιμος να χάσει το κεφάλι του. 910 00:39:35,860 --> 00:39:39,465 >> Κατηγορία y ισούται με 13, κακή τύχη, σημαίνει τι; 911 00:39:39,465 --> 00:39:43,620 Έτσι αστέρι y μέσα πάει στην διεύθυνση y. 912 00:39:43,620 --> 00:39:45,630 Αλλά ποια είναι η διεύθυνση του y; 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Εντάξει, είναι αξία σκουπίδια, σωστά; 915 00:39:49,440 --> 00:39:50,800 I επέστησε ως ένα ερωτηματικό. 916 00:39:50,800 --> 00:39:54,850 Nick επέστησε ως κουλουριαστεί βέλος. 917 00:39:54,850 --> 00:39:59,600 Και μόλις θα προσπαθήσουμε να κάνει αστέρι y, λέγοντας ότι πάει εκεί, 918 00:39:59,600 --> 00:40:03,872 αλλά δεν υπάρχει νόμιμη διεύθυνση, είναι μερικές ψεύτικες θέση, 919 00:40:03,872 --> 00:40:05,080 το πρόγραμμα πρόκειται να συντριβή. 920 00:40:05,080 --> 00:40:08,580 Και το κεφάλι του Binky πρόκειται να πετάξει από εδώ, όπως έκανε. 921 00:40:08,580 --> 00:40:12,130 >> Έτσι, στο τέλος, αυτό το πρόγραμμα ήταν μόνο κατ 'έξω ελάττωμα. 922 00:40:12,130 --> 00:40:13,540 Ήταν ένα πρόγραμμα λάθη. 923 00:40:13,540 --> 00:40:14,760 Και θα έπρεπε να καθοριστεί. 924 00:40:14,760 --> 00:40:18,260 Και ο μόνος τρόπος, πραγματικά, για να το φτιάξω θα ήταν, για παράδειγμα, αυτή η γραμμή, 925 00:40:18,260 --> 00:40:21,010 που δεν είχαμε ακόμη και να, επειδή το πρόγραμμα έπεσε πολύ σύντομα. 926 00:40:21,010 --> 00:40:26,170 Αλλά αν ήταν να το διορθώσετε αυτό, ό, τι επίδραση έχει κάνει y ίση x έχουν; 927 00:40:26,170 --> 00:40:30,010 Λοιπόν, αυτό δείχνει ουσιαστικά y σε ανεξαρτήτως της αξίας x είναι δείχνοντας. 928 00:40:30,010 --> 00:40:32,430 >> Έτσι, στην ιστορία του Νικ, ή ιστορία Binky, τόσο 929 00:40:32,430 --> 00:40:34,640 x και y έχουν δείχνοντας το λευκό κομμάτι της μνήμης, 930 00:40:34,640 --> 00:40:38,300 έτσι ώστε, τελικά, όταν να πρωταγωνιστήσει y ισούται με 13 και πάλι, 931 00:40:38,300 --> 00:40:43,080 θα καταλήξετε βάζοντας σε 13 η κατάλληλη τοποθεσία. 932 00:40:43,080 --> 00:40:47,640 Έτσι, όλες αυτές οι γραμμές είναι τέλεια νόμιμο, εκτός από αυτό, 933 00:40:47,640 --> 00:40:51,730 όταν αυτό συνέβη πριν σας στην πραγματικότητα αποδίδεται y κάποια αξία. 934 00:40:51,730 --> 00:40:54,290 >> Τώρα, ευτυχώς, δεν το κάνετε πρέπει να τον λόγο με όλα 935 00:40:54,290 --> 00:40:56,560 από αυτά τα είδη των θεμάτων για τη δική σας. 936 00:40:56,560 --> 00:40:59,310 Επιτρέψτε μου να πάει μπροστά και να ανοίξει μέχρι ένα παράθυρο τερματικού εδώ 937 00:40:59,310 --> 00:41:03,050 και να ανοίξει, για μια στιγμή, ένα σούπερ μικρό πρόγραμμα το οποίο 938 00:41:03,050 --> 00:41:04,360 Επίσης, είναι το είδος της νόημα. 939 00:41:04,360 --> 00:41:05,152 Είναι άσχημο. 940 00:41:05,152 --> 00:41:06,610 Δεν έχει επιτευχθεί τίποτα χρήσιμο. 941 00:41:06,610 --> 00:41:10,180 Αλλά αυτό δεν αποδεικνύει θέματα της μνήμης, οπότε ας ρίξουμε μια ματιά. 942 00:41:10,180 --> 00:41:11,830 >> Main, εξαιρετικά απλή. 943 00:41:11,830 --> 00:41:14,830 Καλεί προφανώς μια λειτουργία, f, και στη συνέχεια επιστρέφει 0. 944 00:41:14,830 --> 00:41:16,310 Είναι λίγο δύσκολο να το χάος αυτό επάνω. 945 00:41:16,310 --> 00:41:18,540 Έτσι Main είναι αρκετά καλή, μέχρι στιγμής. 946 00:41:18,540 --> 00:41:20,100 >> Έτσι f είναι προβληματική. 947 00:41:20,100 --> 00:41:22,120 Και απλά δεν έθεσε πολύ προσπάθεια σε ονομάζοντάς 948 00:41:22,120 --> 00:41:23,990 εδώ, για να κρατήσει την εστίαση σχετικά με τον κώδικα. 949 00:41:23,990 --> 00:41:25,740 f έχει δύο γραμμές. 950 00:41:25,740 --> 00:41:27,610 Και ας δούμε τι συμβαίνει σήμερα στην. 951 00:41:27,610 --> 00:41:29,840 Έτσι αφενός here-- και επιτρέψτε μου να 952 00:41:29,840 --> 00:41:32,680 Αυτό το σύμφωνο με την προηγούμενη example-- αφενός, 953 00:41:32,680 --> 00:41:35,830 η αριστερή πλευρά είναι κάνει ό, τι, στα αγγλικά; 954 00:41:35,830 --> 00:41:36,493 Είναι is-- 955 00:41:36,493 --> 00:41:37,701 ΚΟΙΝΟ: Δημιουργία ενός δείκτη. 956 00:41:37,701 --> 00:41:40,830 DAVID J. MALAN: Δημιουργία ενός δείκτη σε int και αποκαλώντας το x. 957 00:41:40,830 --> 00:41:43,789 Έτσι είναι η δημιουργία ενός από αυτά τα κουτιά Συνεχίζω με βάση την οθόνη αφής. 958 00:41:43,789 --> 00:41:45,913 Και τώρα, στη δεξιά πλευρά πλευρά, malloc, φυσικά, 959 00:41:45,913 --> 00:41:47,420 κατανέμει ένα μεγάλο κομμάτι της μνήμης. 960 00:41:47,420 --> 00:41:49,989 Και ακριβώς για να είναι σαφές, πώς πολύ μνήμη είναι προφανώς 961 00:41:49,989 --> 00:41:52,030 κατανομή, αν απλά το είδος του κάνει τα μαθηματικά εδώ; 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Έτσι είναι 40 bytes. 964 00:41:54,040 --> 00:41:57,400 Και ξέρω ότι μόνο και μόνο επειδή γνωρίζω ότι μια int, σχετικά με τη συσκευή CS50, τουλάχιστον, 965 00:41:57,400 --> 00:41:58,060 είναι τέσσερα bytes. 966 00:41:58,060 --> 00:41:59,610 Έτσι, 10 φορές 4 είναι 40. 967 00:41:59,610 --> 00:42:04,924 Έτσι, αυτό είναι η αποθήκευση ενός x, η διεύθυνση του πρώτου από 40 ints ότι 968 00:42:04,924 --> 00:42:07,340 έχουν διατεθεί χώρος πίσω, προς τα πίσω, προς τα πίσω, προς τα πίσω. 969 00:42:07,340 --> 00:42:08,470 >> Και αυτό είναι το κλειδί για την malloc. 970 00:42:08,470 --> 00:42:11,261 Δεν παίρνει μια μικρή μνήμη Εδώ, λίγο εδώ, λίγο εδώ. 971 00:42:11,261 --> 00:42:14,220 Σας δίνει ένα κομμάτι της μνήμης, εφαπτόμενα, από το λειτουργικό 972 00:42:14,220 --> 00:42:15,240 σύστημα. 973 00:42:15,240 --> 00:42:18,500 >> Τώρα τι γίνεται με αυτό, x βραχίονα 10 ισούται με 0; 974 00:42:18,500 --> 00:42:19,470 Αυθαίρετη γραμμή κώδικα. 975 00:42:19,470 --> 00:42:21,100 Δεν έχει επιτευχθεί τίποτα χρήσιμο. 976 00:42:21,100 --> 00:42:26,128 Αλλά είναι ενδιαφέρον, επειδή x στήριγμα 10--; 977 00:42:26,128 --> 00:42:26,628 Ναι; 978 00:42:26,628 --> 00:42:27,912 >> ΚΟΙΝΟ: [δεν ακούγεται]; 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. MALAN: x βραχίονα 10 δεν πρέπει να είναι μηδενική. 980 00:42:30,500 --> 00:42:35,070 Η λεπτομέρεια null έρχεται μόνο στο παιχνίδι με χορδές, στο τέλος μιας συμβολοσειράς. 981 00:42:35,070 --> 00:42:36,700 Αλλά μια καλή σκέψη. 982 00:42:36,700 --> 00:42:39,615 >> Πόσο μεγάλη είναι αυτή η σειρά, ακόμα και αν έχω διατεθεί 40 bytes; 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Είναι 0 έως εννέα, σωστά; 985 00:42:43,690 --> 00:42:45,120 Είναι 10 πόντους, κάτι συνολικά. 986 00:42:45,120 --> 00:42:48,790 40 bytes, αλλά 10 πόντους, κάτι αναπροσαρμόζονται από 0 έως 0. 987 00:42:48,790 --> 00:42:50,930 >> Έτσι τι είναι αυτό βραχίονα x 10; 988 00:42:50,930 --> 00:42:53,090 Είναι πραγματικά κάποια άγνωστης αξίας σκουπίδια. 989 00:42:53,090 --> 00:42:54,780 Είναι μνήμη που δεν ανήκει σε μένα. 990 00:42:54,780 --> 00:42:59,650 Δεν θα πρέπει να αγγίζετε ότι byte αριθμό 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Πάω λίγο πολύ μακριά. 992 00:43:01,420 --> 00:43:04,490 >> Και πράγματι, αν τρέχω προγράμματος, θα μπορούσε κάλλιστα συντριβή. 993 00:43:04,490 --> 00:43:05,790 Αλλά μερικές φορές, να σταθούμε τυχεροί. 994 00:43:05,790 --> 00:43:07,706 Και έτσι απλά για να επιδείξουν Αυτό-- και ειλικρινά, 995 00:43:07,706 --> 00:43:11,000 ποτέ δεν ξέρεις προτού Δεν it-- ας τρέξει αυτό. 996 00:43:11,000 --> 00:43:12,480 Είναι στην πραγματικότητα δεν συντριβή. 997 00:43:12,480 --> 00:43:15,032 >> Αλλά αν μπορώ να αλλάξω αυτό, για παράδειγμα, να είναι σαν 1000, 998 00:43:15,032 --> 00:43:16,740 να κάνει αυτό πραγματικά σκόπιμη, ας δούμε 999 00:43:16,740 --> 00:43:18,710 αν μπορούμε να το πάρει για να συντρίψει αυτή τη φορά. 1000 00:43:18,710 --> 00:43:20,070 Εντάξει, αυτό δεν συντριβή. 1001 00:43:20,070 --> 00:43:22,600 Πόσο περίπου 100.000; 1002 00:43:22,600 --> 00:43:25,000 Ας το ξανακάνω, και τώρα επαναληφθεί. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Φτου. 1005 00:43:25,960 --> 00:43:26,460 Εντάξει. 1006 00:43:26,460 --> 00:43:29,090 Έτσι προφανώς, πάλι, αυτά τμήματα της μνήμης, να το πω έτσι, 1007 00:43:29,090 --> 00:43:32,660 είναι αρκετά μεγάλο, ώστε να μπορούμε να να πάρει και πάλι και πάλι τυχεροί. 1008 00:43:32,660 --> 00:43:36,510 Αλλά τελικά, μόλις πάρετε γελοίο και πραγματικά να πάει μακριά από την οθόνη, 1009 00:43:36,510 --> 00:43:39,120 αγγίξετε τη μνήμη που πραγματικά, πραγματικά δεν ανήκει σε σας. 1010 00:43:39,120 --> 00:43:40,870 >> Αλλά ειλικρινά, αυτά του είδους τα προβλήματα θα 1011 00:43:40,870 --> 00:43:43,020 να είναι όλο και πιο δύσκολο για να καταλάβω από μόνος σας. 1012 00:43:43,020 --> 00:43:47,880 Αλλά ευτυχώς, όπως προγραμματιστές, έχουμε εργαλεία που μας επιτρέπουν να το κάνουμε αυτό για μας. 1013 00:43:47,880 --> 00:43:50,140 Έτσι, αυτό είναι, ίσως, ένας από τις πιο άσχημες προγραμμάτων, 1014 00:43:50,140 --> 00:43:52,060 ακόμα πιο άσχημο από έξοδο gdb του. 1015 00:43:52,060 --> 00:43:55,670 Αλλά έχει πάντα μια γραμμή ή δύο που είναι εξαιρετικά χρήσιμο. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind είναι ένα πρόγραμμα που βοηθά δεν debug ένα πρόγραμμα, per se, 1017 00:44:00,310 --> 00:44:03,500 αλλά να βρει μνήμη-σχετικές προβλήματα, συγκεκριμένα. 1018 00:44:03,500 --> 00:44:07,590 Θα τρέξει αυτόματα τον κωδικό σας για σας και να αναζητήσουν τουλάχιστον δύο πράγματα. 1019 00:44:07,590 --> 00:44:10,680 Ένα, έκανες κάτι τυχαία όπως η μνήμη αφής 1020 00:44:10,680 --> 00:44:11,980 ότι δεν ανήκει σε σας; 1021 00:44:11,980 --> 00:44:13,590 Θα σας βοηθήσει να βρείτε τις υποθέσεις αυτές. 1022 00:44:13,590 --> 00:44:15,710 >> Και τα δύο, θα βοηθήσει μπορείτε να βρείτε κάτι που ονομάζεται 1023 00:44:15,710 --> 00:44:19,270 διαρροές μνήμης, το οποίο έχουμε αγνοείται παντελώς, αφελώς, 1024 00:44:19,270 --> 00:44:21,380 για κάποιο χρονικό διάστημα και μακάρια. 1025 00:44:21,380 --> 00:44:23,140 Αλλά τελικά, όλα Αυτή τη φορά, όποτε 1026 00:44:23,140 --> 00:44:26,620 έχετε καλέσει GetString σε έτσι πολλά από τα προγράμματά μας, 1027 00:44:26,620 --> 00:44:28,930 ζητάς το λειτουργικό συστήματος για τη μνήμη, 1028 00:44:28,930 --> 00:44:32,070 αλλά έχετε κάποια ανάμνηση από αυτό δίνει ποτέ 1029 00:44:32,070 --> 00:44:36,169 πίσω, κάνει UNALLOC, ή δωρεάν, όπως λέγεται. 1030 00:44:36,169 --> 00:44:37,960 Όχι, γιατί έχουμε ποτέ σας ζητηθεί να το πράξουν. 1031 00:44:37,960 --> 00:44:41,250 >> Αλλά όλο αυτό το διάστημα, τα προγράμματα έχετε γράψει σε C 1032 00:44:41,250 --> 00:44:43,800 έχουν διαρροή μνήμης, ζητώντας από το λειτουργικό 1033 00:44:43,800 --> 00:44:46,190 συστήματος για όλο και περισσότερο μνήμη για έγχορδα και εταζέρα, 1034 00:44:46,190 --> 00:44:47,870 αλλά ποτέ δεν παραδίδοντας πίσω. 1035 00:44:47,870 --> 00:44:50,080 Και τώρα αυτό είναι ένα κομμάτι μιας υπεραπλούστευση, 1036 00:44:50,080 --> 00:44:53,550 αλλά αν έχετε τρέξει ποτέ Mac σας ή PC σας για αρκετό καιρό, το άνοιγμα 1037 00:44:53,550 --> 00:44:55,790 πολλά από τα προγράμματα, ίσως το κλείσιμο των προγραμμάτων, 1038 00:44:55,790 --> 00:44:57,795 και ακόμα κι αν σας ο υπολογιστής δεν έχει συνετρίβη, 1039 00:44:57,795 --> 00:45:01,690 είναι να πάρει τόσο πολύ πιο αργή, σαν να είναι πραγματικά 1040 00:45:01,690 --> 00:45:04,290 χρησιμοποιούν πολλή μνήμη ή πόροι, παρότι, 1041 00:45:04,290 --> 00:45:06,070 αν δεν είστε ακόμη αγγίξετε το πληκτρολόγιο, 1042 00:45:06,070 --> 00:45:10,430 ότι θα μπορούσε να είναι-- αλλά δεν μπορούσα always-- είναι ότι τα προγράμματα που τρέχετε 1043 00:45:10,430 --> 00:45:11,920 έχουν οι ίδιοι διαρροές μνήμης. 1044 00:45:11,920 --> 00:45:15,645 Και να κρατήσει ζητώντας από το λειτουργικό σύστημα για περισσότερες και περισσότερη μνήμη, αλλά ξεχνώντας γι 'αυτό, 1045 00:45:15,645 --> 00:45:18,470 στην πραγματικότητα δεν το χρησιμοποιεί, αλλά Ως εκ τούτου, λαμβάνοντας μνήμης μακριά 1046 00:45:18,470 --> 00:45:20,500 από άλλα προγράμματα που μπορεί να το θέλουν. 1047 00:45:20,500 --> 00:45:23,940 Έτσι, αυτό είναι μια κοινή εξήγηση. 1048 00:45:23,940 --> 00:45:25,940 Τώρα εδώ είναι όπου Valgrind του εξόδου είναι τελείως 1049 00:45:25,940 --> 00:45:29,290 αποτρόπαια στους λιγότερο και όσο πιο άνετα. 1050 00:45:29,290 --> 00:45:32,690 Αλλά το ενδιαφέρον πράγματα είναι ακριβώς εδώ. 1051 00:45:32,690 --> 00:45:37,060 Αυτό μου λέει μια μη έγκυρη εγγραφή του μέγεθος τέσσερις συμβαίνει σε αυτό το πρόγραμμα, 1052 00:45:37,060 --> 00:45:40,640 ειδικότερα, στη γραμμή 21 του memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Αν πάω στην γραμμή 21, hm, πράγματι, υπάρχει είναι μια άκυρη εγγραφής του μεγέθους τέσσερα. 1054 00:45:45,450 --> 00:45:46,250 Γιατί το μέγεθος τέσσερα; 1055 00:45:46,250 --> 00:45:49,500 Λοιπόν, αυτό number-- και θα μπορούσε να είναι anything-- είναι ένα int. 1056 00:45:49,500 --> 00:45:50,450 Έτσι είναι τέσσερα bytes. 1057 00:45:50,450 --> 00:45:52,550 Έτσι Βάζω τέσσερα bytes όπου δεν ανήκουν. 1058 00:45:52,550 --> 00:45:55,080 Αυτό είναι ό, τι Valgrind είναι στην πραγματικότητα μου λέει. 1059 00:45:55,080 --> 00:45:57,600 Επιπλέον, θα είναι επίσης πες μου, όπως θα δούμε, 1060 00:45:57,600 --> 00:46:01,490 καθώς τρέχετε αυτό σε ένα μέλλον το chipset, αν και όταν έχετε διέρρευσαν μνήμη, η οποία μάλιστα 1061 00:46:01,490 --> 00:46:05,300 Δεν έχω, γιατί έχω ονομάζεται malloc, αλλά δεν έχουν στην πραγματικότητα 1062 00:46:05,300 --> 00:46:08,010 ονομάζεται, στην περίπτωση αυτή, ελεύθερο, που θα δούμε τελικά 1063 00:46:08,010 --> 00:46:09,830 είναι το αντίθετο της malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Μέχρι τώρα, νομίζω, ένα τελευταίο παράδειγμα. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Έτσι, αυτό είναι λίγο πιο απόκρυφες, αλλά είναι ίσως 1068 00:46:16,690 --> 00:46:19,180 ο μεγαλύτερος λόγος για να να είστε προσεκτικοί με τη μνήμη, 1069 00:46:19,180 --> 00:46:24,490 και ο λόγος που πολλά προγράμματα ή / και web servers, ακόμα και σε αυτήν την ημέρα, 1070 00:46:24,490 --> 00:46:28,200 έχουν ληφθεί πάνω από κακούς κάπου στο διαδίκτυο που είναι κατά κάποιο τρόπο 1071 00:46:28,200 --> 00:46:33,390 αποστολή ψευδών πακέτα στον server σας προσπαθούν να θέσουν σε κίνδυνο τους λογαριασμούς σας, 1072 00:46:33,390 --> 00:46:36,420 ή να πάρετε τα δεδομένα σας, ή απλά γενικά αναλάβει μια μηχανή. 1073 00:46:36,420 --> 00:46:38,910 Υπερχείλιση μνήμης, καθώς η υποδηλώνει το όνομα, μέσα 1074 00:46:38,910 --> 00:46:40,740 ξεχειλίζει όχι ένα int, αλλά ένα buffer. 1075 00:46:40,740 --> 00:46:43,490 Και ένα ρυθμιστικό είναι μόνο ένα φανταχτερό τρόπο του λέγοντας ότι είναι ένα μάτσο μνήμης. 1076 00:46:43,490 --> 00:46:46,710 >> Και πράγματι, κάλεσα ένα string πριν από ρυθμιστικό διάλυμα, αντί του s. 1077 00:46:46,710 --> 00:46:49,234 Διότι αν είναι ένα ρυθμιστικό, όπως και με την έννοια του YouTube, 1078 00:46:49,234 --> 00:46:52,400 ή κάθε φορά που βλέπετε ένα βίντεο, μπορεί να έχετε δει τη λέξη buffering, 1079 00:46:52,400 --> 00:46:53,040 τελεία, τελεία, τελεία. 1080 00:46:53,040 --> 00:46:54,240 Είναι απίστευτα ενοχλητικό. 1081 00:46:54,240 --> 00:46:55,990 Και αυτό σημαίνει ότι μόνο ότι το video player σας 1082 00:46:55,990 --> 00:46:58,710 προσπαθεί να κατεβάσετε πολλά των bytes, πολλά bytes 1083 00:46:58,710 --> 00:47:00,170 από ένα βίντεο από το διαδίκτυο. 1084 00:47:00,170 --> 00:47:02,920 Αλλά η διαδικασία είναι αργή, γι 'αυτό προσπαθεί για να κατεβάσετε ένα σωρό από αυτούς 1085 00:47:02,920 --> 00:47:06,430 για να γεμίσει ένα ρυθμιστικό διάλυμα, ένα δοχείο, έτσι ώστε έχετε αρκετά bytes ότι μπορεί στη συνέχεια 1086 00:47:06,430 --> 00:47:09,174 σας δείξει το βίντεο, χωρίς να σταματάτε συνεχώς. 1087 00:47:09,174 --> 00:47:11,340 Αλλά τελικά, μπορείτε να έχουν ένα ρυθμιστικό διάλυμα σε αυτό το μεγάλο. 1088 00:47:11,340 --> 00:47:15,710 Αλλά προσπαθήστε να βάλετε αυτό το πολύ τα δεδομένα σε αυτό, και πολύ κακά πράγματα μπορούν να συμβούν. 1089 00:47:15,710 --> 00:47:22,780 Έτσι, για παράδειγμα, ας εξετάσουμε αυτό το τελικό τρέιλερ ενός παραδείγματος. 1090 00:47:22,780 --> 00:47:24,720 Αυτό είναι ένα άλλο πρόγραμμα ότι, με την πρώτη ματιά, 1091 00:47:24,720 --> 00:47:26,540 δεν κάνει τίποτα σούπερ χρήσιμο. 1092 00:47:26,540 --> 00:47:29,590 Έχει μια Κύρια λειτουργία που καλεί τη λειτουργία, f. 1093 00:47:29,590 --> 00:47:36,640 Και αυτή η λειτουργία, f, μέχρι εδώ, έχει μια σειρά char, που ονομάζεται c, μεγέθους 12. 1094 00:47:36,640 --> 00:47:39,340 Και τότε είναι που χρησιμοποιούν αυτό το νέα λειτουργία που ονομάζεται strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Αποδεικνύεται ότι, με αυτό το απλό, απλή γραμμή κώδικα, μόλις δύο γραμμές, 1097 00:47:45,190 --> 00:47:49,130 έχουμε κάνει ολόκληρο το πρόγραμμα μου, και, ως εκ τούτου, ολόκληρο τον υπολογιστή μου, 1098 00:47:49,130 --> 00:47:54,000 και ο λογαριασμός χρήστη μου, και τη σκληρή μου οδηγούν δυνητικά ευάλωτα σε κανέναν 1099 00:47:54,000 --> 00:47:58,170 ποιος ξέρει και είναι αρκετά καλή για να τρέξει αυτό το πρόγραμμα με μια ορισμένη γραμμή εντολών 1100 00:47:58,170 --> 00:47:58,900 επιχείρημα. 1101 00:47:58,900 --> 00:48:03,400 Με άλλα λόγια, εάν αυτό το κακό βάζει μέσα από argvargv [1] πληκτρολογώντας 1102 00:48:03,400 --> 00:48:08,750 στο πληκτρολόγιο ένα πολύ ειδικά δημιουργημένο εγχόρδων, δεν abc, 123, αλλά κατ 'ουσίαν, 1103 00:48:08,750 --> 00:48:15,180 δυαδικά σύμβολα που αντιπροσωπεύουν εκτελέσιμο κώδικα, ένα πρόγραμμα που αυτός ή αυτή έγραψε, 1104 00:48:15,180 --> 00:48:19,190 με αυτό το απλό πρόγραμμα, το οποίο είναι εκπρόσωπος των χιλιάδων προγραμμάτων 1105 00:48:19,190 --> 00:48:23,610 που είναι εξίσου ευάλωτες, daresay, αυτός ή αυτή μπορεί τελικά να διαγράψετε όλα 1106 00:48:23,610 --> 00:48:26,680 τα αρχεία στο σκληρό δίσκο μου, να πάρει ένα αναβοσβήνει εντολών, έτσι ώστε αυτός ή αυτή μπορεί να 1107 00:48:26,680 --> 00:48:30,170 πληκτρολογήστε τις εντολές για τη δική τους, email όλα τα αρχεία για τον εαυτό μου. 1108 00:48:30,170 --> 00:48:34,660 Ό, τι μπορώ να κάνω, αυτός ή μπορεί να το κάνει με αυτόν τον κωδικό. 1109 00:48:34,660 --> 00:48:36,575 >> Εμείς δεν θα λύσει εντελώς αυτό ακόμα. 1110 00:48:36,575 --> 00:48:38,700 Και στην πραγματικότητα, πρόκειται για περιλαμβάνει μια μικρή εικόνα 1111 00:48:38,700 --> 00:48:41,470 όπως αυτό, το οποίο θα έρθει σύντομα να κατανοήσουν τόσο το καλύτερο. 1112 00:48:41,470 --> 00:48:44,480 Αλλά για σήμερα, ας καταλήξει σε τι είναι, ελπίζω, μια ελαφρώς πιο 1113 00:48:44,480 --> 00:48:48,360 κατανοητό αστείο XKCD, μέχρι να επαναλάβει την επόμενη φορά. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Εντάξει. 1116 00:48:51,600 --> 00:48:53,446 Τα λέμε την Τετάρτη. 1117 00:48:53,446 --> 00:48:54,754 >> [ΜΟΥΣΙΚΗ ΠΑΙΖΟΝΤΑΣ] 1118 00:48:54,754 --> 00:48:57,790 >> ΟΜΙΛΗΤΗΣ: Και τώρα, βαθιά σκέψεις, από Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Η μνήμη είναι σαν το άλμα σε ένα σωρό από χρυσά φύλλα σε ένα απόγευμα Κυριακής. 1121 00:49:04,770 --> 00:49:09,000 Άνεμος φυσά, πετώντας σας hair-- OH, μου λείπει τις ημέρες when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Γέλια] 1124 00:49:12,650 --> 00:49:13,750