1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MUSIC PLAYING] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. Malan: Baiklah. 4 00:00:12,640 --> 00:00:14,525 Ini adalah CS50. 5 00:00:14,525 --> 00:00:16,009 Dan ini adalah awal minggu 5. 6 00:00:16,009 --> 00:00:18,050 Dan seperti yang Anda mungkin telah memperhatikan, beberapa materi 7 00:00:18,050 --> 00:00:21,050 semakin sedikit lebih kompleks, padat kecil. 8 00:00:21,050 --> 00:00:24,560 >> Dan itu sangat mudah, terutama jika Anda sudah berada di kebiasaan untuk beberapa waktu, 9 00:00:24,560 --> 00:00:28,600 akan mencoba untuk mencoret-coret turun sebagian apa pun yang kita lakukan, kita katakan di kelas. 10 00:00:28,600 --> 00:00:31,626 Tapi menyadari, bahwa tidak mungkin pendekatan pedagogis yang ideal 11 00:00:31,626 --> 00:00:34,250 untuk belajar jenis bahan, dan bahan yang lebih umum. 12 00:00:34,250 --> 00:00:37,250 Dan jadi kami sangat senang untuk mengumumkan Gheng bahwa CS50 sendiri 13 00:00:37,250 --> 00:00:39,780 Gong telah mulai mempersiapkan satu set kanonik catatan 14 00:00:39,780 --> 00:00:42,100 untuk kursus, harapan yaitu bahwa, satu, ini 15 00:00:42,100 --> 00:00:44,030 tidak hanya berfungsi sebagai referensi dan sumber daya 16 00:00:44,030 --> 00:00:47,410 untuk meninjau materi dan pergi kembali melalui materi yang mungkin 17 00:00:47,410 --> 00:00:51,230 melarikan diri Anda pertama kali sekitar, tapi juga agar kepala Anda bisa lebih 18 00:00:51,230 --> 00:00:53,740 up dari bawah, ketika tiba saatnya untuk kuliah, 19 00:00:53,740 --> 00:00:56,960 sehingga Anda mungkin terlibat lebih serius, seperti 20 00:00:56,960 --> 00:00:59,170 lawan lebih Scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Dengan mengatakan bahwa, apa yang akan anda temukan di website ini dokumen-dokumen seperti ini. 22 00:01:02,510 --> 00:01:04,660 Dan pemberitahuan, di sebelah kiri atas, ada tidak hanya daftar isi, 23 00:01:04,660 --> 00:01:06,920 tapi juga kode waktu itu akan segera melompat Anda 24 00:01:06,920 --> 00:01:09,077 ke bagian yang sesuai dalam video online. 25 00:01:09,077 --> 00:01:11,410 Dan apa Chang sini telah dilakukan adalah, pada dasarnya, didokumentasikan 26 00:01:11,410 --> 00:01:13,340 apa yang terjadi dalam hal ini kuliah tertentu. 27 00:01:13,340 --> 00:01:16,370 Dan banyak dari kuliah adalah sudah online sekarang dengan URL ini. 28 00:01:16,370 --> 00:01:20,110 Dan kami akan terus mengirim sisanya orang-orang pada akhir pekan ini, 29 00:01:20,110 --> 00:01:22,380 jadi jangan mengambil keuntungan dari sumber daya itu. 30 00:01:22,380 --> 00:01:25,740 >> Jadi tanpa basa-basi lagi, kami mulai mengupas 31 00:01:25,740 --> 00:01:28,180 lapisan yang telah tali untuk beberapa waktu. 32 00:01:28,180 --> 00:01:30,670 Dan apa yang kita katakan string sebenarnya minggu lalu? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Bintang Jadi arang. 35 00:01:32,900 --> 00:01:34,900 Dan Bintang char, baik, apa apakah itu benar-benar berarti? 36 00:01:34,900 --> 00:01:37,150 Nah, selama ini, jika kita sudah telah memanggil fungsi, 37 00:01:37,150 --> 00:01:40,450 seperti getString, dan penyimpanan yang disebut pulang 38 00:01:40,450 --> 00:01:42,910 nilai getString dalam variable-- itu disebut 39 00:01:42,910 --> 00:01:47,721 s Jenis string-- kami telah menulis baris kode di atas sana di atas. 40 00:01:47,721 --> 00:01:49,970 Dan itu hanya ketika saya melihat saya tulisan tangan diperbesar sini 41 00:01:49,970 --> 00:01:51,930 apakah saya menyadari betapa mengerikan ini. 42 00:01:51,930 --> 00:01:54,180 >> Namun, mari kita asumsikan bahwa, di sisi kanan 43 00:01:54,180 --> 00:01:57,070 adalah, namun, wajar penggambaran apa 44 00:01:57,070 --> 00:01:58,880 terjadi pada semua ini waktu dengan getString. 45 00:01:58,880 --> 00:02:00,380 getString, tentu saja, mendapatkan string. 46 00:02:00,380 --> 00:02:01,691 Tapi apa yang benar-benar berarti? 47 00:02:01,691 --> 00:02:04,190 Ini berarti mendapat sepotong memori dari sistem operasi 48 00:02:04,190 --> 00:02:06,040 dengan memanggil fungsi, yang disebut malloc. 49 00:02:06,040 --> 00:02:07,390 Tapi lebih pada nanti. 50 00:02:07,390 --> 00:02:09,139 Dan kemudian Mempopulai bahwa sepotong memori 51 00:02:09,139 --> 00:02:11,764 dengan huruf pengguna memiliki mengetik, diikuti oleh, tentu saja, 52 00:02:11,764 --> 00:02:14,800 karakter null, atau backslash nol di akhir. 53 00:02:14,800 --> 00:02:18,280 >> Sementara itu, di sisi kiri dari cerita ini, selama ini, 54 00:02:18,280 --> 00:02:20,850 kami telah menyatakan variabel, seperti s. 55 00:02:20,850 --> 00:02:24,770 Dan variabel itulah yang sekarang akan mulai memanggil pointer. 56 00:02:24,770 --> 00:02:29,190 Ini bukan kotak yang di dalamnya kami menempatkan string, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 melainkan kita masukkan ke dalam kotak yang kotak di sebelah kiri apa sebenarnya? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Ya? 60 00:02:35,390 --> 00:02:37,118 >> AUDIENCE: Alamat di mana itu terletak dalam memori. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. Malan: Tepat. 62 00:02:38,118 --> 00:02:40,690 Alamat di mana Daven terletak di memori. 63 00:02:40,690 --> 00:02:44,650 Dan tidak di mana semua Daven berada, per se, namun secara khusus alamat 64 00:02:44,650 --> 00:02:45,150 apa? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Ya? 67 00:02:46,810 --> 00:02:47,460 >> AUDIENCE: Karakter pertama. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. Malan: Karakter pertama di Daven, yang, dalam hal ini, 69 00:02:50,209 --> 00:02:53,820 Saya diusulkan adalah sewenang-wenang dan realistis 1, OX1, 70 00:02:53,820 --> 00:02:55,910 yang hanya berarti angka heksadesimal dari 1. 71 00:02:55,910 --> 00:02:57,993 Tapi itu mungkin akan menjadi jumlah yang jauh lebih besar 72 00:02:57,993 --> 00:03:01,260 bahwa kita mungkin menarik dengan 0x sebagai awalan, 73 00:03:01,260 --> 00:03:02,806 mewakili karakter heksadesimal. 74 00:03:02,806 --> 00:03:05,930 Dan karena kita tidak perlu tahu di mana sisa karakter Daven 75 00:03:05,930 --> 00:03:09,860 adalah, karena apa desain yang sederhana keputusan yang dibuat beberapa tahun yang lalu? 76 00:03:09,860 --> 00:03:10,548 Ya? 77 00:03:10,548 --> 00:03:11,651 >> AUDIENCE: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. Malan: Ya, persis. 79 00:03:12,900 --> 00:03:18,100 Backslash 0 memungkinkan Anda, meskipun dalam waktu linier, untuk melintasi string, 80 00:03:18,100 --> 00:03:20,400 berjalan dari kiri ke kanan, dengan untuk loop, atau beberapa saat 81 00:03:20,400 --> 00:03:22,608 lingkaran, atau sesuatu seperti itu, dan menentukan, oh, di sini 82 00:03:22,608 --> 00:03:24,751 adalah akhir dari string tertentu ini. 83 00:03:24,751 --> 00:03:27,000 Jadi dengan hanya alamat di awal string, 84 00:03:27,000 --> 00:03:30,290 kita dapat mengakses keseluruhan itu, karena selama ini, 85 00:03:30,290 --> 00:03:32,030 string baru saja menjadi bintang arang. 86 00:03:32,030 --> 00:03:36,370 >> Jadi itu pasti baik-baik saja untuk terus menggunakan perpustakaan CS50 dan abstraksi ini, 87 00:03:36,370 --> 00:03:38,440 sehingga untuk berbicara, tapi kita akan mulai untuk melihat secara tepat 88 00:03:38,440 --> 00:03:41,230 apa yang telah terjadi bawah sepanjang waktu ini. 89 00:03:41,230 --> 00:03:45,260 Jadi Anda mungkin ingat contoh ini, juga, dari terakhir kali, bandingkan 0, 90 00:03:45,260 --> 00:03:47,300 yang tidak benar-benar membandingkan. 91 00:03:47,300 --> 00:03:49,070 Tapi kita mulai untuk memecahkan masalah ini. 92 00:03:49,070 --> 00:03:52,020 >> Tapi seperti yang mungkin penyegaran, mungkin saya menarik seseorang 93 00:03:52,020 --> 00:03:54,261 di gajah merah muda hari ini, juga dibuat oleh Chang? 94 00:03:54,261 --> 00:03:55,760 Bagaimana Anda di depan? [Tak terdengar]. 95 00:03:55,760 --> 00:03:56,660 Ayo up. 96 00:03:56,660 --> 00:03:58,740 >> Dan sementara itu, Anda datang, mari kita 97 00:03:58,740 --> 00:04:01,670 Pertimbangkan untuk sesaat apa kode ini benar-benar melakukan. 98 00:04:01,670 --> 00:04:04,917 Ini menyatakan dua variabel up atas, dan t, dan memanggil getString. 99 00:04:04,917 --> 00:04:08,250 Ini bukan program sangat user-friendly, karena tidak memberitahu Anda apa yang harus dilakukan. 100 00:04:08,250 --> 00:04:10,541 Tapi mari kita asumsikan kita berfokus pada bagian juicy. 101 00:04:10,541 --> 00:04:14,470 Dan kemudian kita lakukan, jika s sama sama t, itu harus mengatakan printf, 102 00:04:14,470 --> 00:04:16,170 Anda mengetik hal yang sama. 103 00:04:16,170 --> 00:04:16,670 Hello. 104 00:04:16,670 --> 00:04:17,050 Siapa nama Anda? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. Malan: Janelle, Senang bertemu denganmu. 107 00:04:19,529 --> 00:04:21,800 Jadi tantangan di tangan untuk gajah ini 108 00:04:21,800 --> 00:04:25,230 adalah untuk pertama menarik kita gambaran tentang apa yang yang diwakili pada mereka pertama dua 109 00:04:25,230 --> 00:04:25,970 baris. 110 00:04:25,970 --> 00:04:28,139 Jadi s dan t mungkin direpresentasikan bagaimana di layar? 111 00:04:28,139 --> 00:04:30,680 Dan Anda hanya dapat menarik dengan jari Anda pada layar besar ini. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Jadi ada dua bagian untuk setiap sisi persamaan itu. 114 00:04:34,510 --> 00:04:37,760 Jadi ada s di sebelah kiri, dan kemudian getString di sebelah kanan. 115 00:04:37,760 --> 00:04:40,540 Dan kemudian ada t di sebelah kiri, dan kemudian getString di sebelah kanan. 116 00:04:40,540 --> 00:04:42,630 Jadi bagaimana mungkin kita mulai menggambar gambar yang 117 00:04:42,630 --> 00:04:46,340 mewakili apa yang terjadi di sini dalam memori, yang akan Anda katakan? 118 00:04:46,340 --> 00:04:49,150 Dan biarkan aku memberitahu Anda menjelaskan apa yang Anda lakukan saat Anda pergi. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Yah, pertama, itu akan meminta Anda untuk mendapatkan input string. 121 00:04:58,890 --> 00:05:00,439 Dan itu akan store-- oh, maaf. 122 00:05:00,439 --> 00:05:01,230 DAVID J. Malan: OK. 123 00:05:01,230 --> 00:05:01,730 Baik. 124 00:05:01,730 --> 00:05:03,330 Dan ini disebut apa? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Terus. 127 00:05:04,450 --> 00:05:05,575 Aku tidak bermaksud mengganggu. 128 00:05:05,575 --> 00:05:07,060 Janelle: Maaf. 129 00:05:07,060 --> 00:05:14,237 Jadi itu akan menjadi masukan alamat tidak of-- yakin. 130 00:05:14,237 --> 00:05:17,320 Saya tidak ingat persis nomor, tapi saya percaya itu dimulai dengan 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. Malan: Tidak apa-apa, karena saya membuat angka sampai, 132 00:05:18,420 --> 00:05:19,650 jadi tidak ada jawaban yang tepat. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Dimulai dengan 0 busur. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. Malan: OK, jadi elemen 0. 135 00:05:24,000 --> 00:05:24,765 Tentu. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: Dan kemudian jika itu seperti hanya dua-letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. Malan: OK, kembali kepada Anda. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Jadi elemen 0, dan maka elemen 1 atau elemen 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. Malan: Dan yang sepotong gambar yang Anda menggambar sekarang? 140 00:05:36,670 --> 00:05:37,690 Panggilan untuk getString? 141 00:05:37,690 --> 00:05:38,830 Atau deklarasi s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Deklarasi dari s, saya percaya. 143 00:05:42,890 --> 00:05:45,980 Oh, yang getString, karena akan akan diinput ke dalam setiap [? daerah. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. Malan: Good. 145 00:05:46,510 --> 00:05:47,051 Tepat. 146 00:05:47,051 --> 00:05:49,300 Meskipun ini efektif mengembalikan sebuah array, ingat, 147 00:05:49,300 --> 00:05:53,300 ketika kita kembali string, kita bisa indeks ke string menggunakan 01 dan 2. 148 00:05:53,300 --> 00:05:56,180 Secara teknis, ini mungkin diwakili oleh alamat individu, 149 00:05:56,180 --> 00:05:57,100 tapi itu baik-baik saja. 150 00:05:57,100 --> 00:06:00,170 >> Jadi misalkan, kalau bisa hanya cepat maju ke tempat kami tinggalkan 151 00:06:00,170 --> 00:06:04,320 terakhir kali, jika salah satu dari string adalah g b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, sehingga mewakili gabe dunia masukan, bagaimana kita mungkin mewakili s sekarang? 153 00:06:10,337 --> 00:06:12,670 Jika ini adalah memori yang dikembalikan oleh getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Apakah akan diwakili oleh busur? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. Malan: Dengan busur? 157 00:06:18,750 --> 00:06:19,130 Yah, tidak ada. 158 00:06:19,130 --> 00:06:21,171 Mari kita katakan saja, pictorially, saya hanya pergi ke depan 159 00:06:21,171 --> 00:06:25,710 dan mengusulkan bahwa, jika ini adalah s, ini adalah nilai pengembalian getString. 160 00:06:25,710 --> 00:06:29,482 Dan Anda telah ditarik ini sebagai 0, 1, 2, yang adalah sangat masuk akal, karena kita 161 00:06:29,482 --> 00:06:30,940 dapat mengindeks ke dalam string, seperti itu. 162 00:06:30,940 --> 00:06:33,340 Tapi hanya untuk konsisten dengan terakhir kali, biarkan aku pergi ke depan 163 00:06:33,340 --> 00:06:37,310 dan sewenang-wenang mengusulkan bahwa ini adalah alamat 1, ini adalah alamat 2, 164 00:06:37,310 --> 00:06:39,597 ini adalah alamat 3, dan sebagainya. 165 00:06:39,597 --> 00:06:41,430 Jadi, hanya untuk menjadi super jelas, apa yang terjadi 166 00:06:41,430 --> 00:06:44,580 untuk masuk sebagai akibat dari itu baris pertama kode, akan Anda katakan? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Alamat 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. Malan: Tepat. 169 00:06:46,420 --> 00:06:47,190 Jadi alamat 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Dan sementara itu, biarkan aku pergi ke depan dan duplikat banyak dari apa yang telah Anda lakukan 172 00:06:51,230 --> 00:06:52,740 dan menambahkan t saya sendiri di sini. 173 00:06:52,740 --> 00:06:56,340 Jika saya mengetikkan gabe lagi, untuk kedua kalinya, 174 00:06:56,340 --> 00:07:01,530 ketika diminta dengan getString, di mana, tentu saja, gabe akan pergi? 175 00:07:01,530 --> 00:07:02,280 Nah, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Seperti di sini? 178 00:07:05,975 --> 00:07:06,850 DAVID J. Malan: Ya. 179 00:07:06,850 --> 00:07:08,516 Janelle: Atau itu juga dalam kotak yang sama? 180 00:07:08,516 --> 00:07:11,940 DAVID J. Malan: Biarkan saya mengusulkan, ya, persis, sehingga dalam kotak-kotak tambahan. 181 00:07:11,940 --> 00:07:15,230 Tapi apa kuncinya sekarang adalah bahwa, bahkan meskipun aku sudah ditarik ini cukup dekat 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, ini adalah 0x2-- pada kenyataannya, 183 00:07:18,650 --> 00:07:25,750 ini sekarang mungkin alamat 0x10, misalnya, dan 0x11, 0x12 dan, 184 00:07:25,750 --> 00:07:26,870 dan lain sebagainya. 185 00:07:26,870 --> 00:07:29,955 Jadi, jika itu yang terjadi, apa yang akan berakhir di sini di t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. Malan: Tepat. 188 00:07:31,830 --> 00:07:33,180 Jadi 0x10. 189 00:07:33,180 --> 00:07:34,570 Dan sekarang, pertanyaan terakhir. 190 00:07:34,570 --> 00:07:37,510 Anda telah, sejauh ini, harus bekerja paling sulit untuk gajah sejauh ini. 191 00:07:37,510 --> 00:07:42,650 Sekarang, jika saya menarik kode lagi, ketika saya lakukan, sejalan tiga, 192 00:07:42,650 --> 00:07:47,630 jika s sama sama t, apa aku benar-benar perbandingan antara bahwa kita telah ditarik di sini? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Dua alamat? 194 00:07:49,271 --> 00:07:50,270 DAVID J. Malan: Tepat. 195 00:07:50,270 --> 00:07:53,350 Jadi saya katakan adalah s sama sama dengan t? 196 00:07:53,350 --> 00:07:56,210 Dengan kata lain, adalah 1 sama sama dengan 10? 197 00:07:56,210 --> 00:07:59,710 Dan tentu saja, jawaban yang jelas saat ini adalah, tidak ada. 198 00:07:59,710 --> 00:08:02,920 Jadi program ini pada akhirnya akan mencetak apa, akan Anda katakan? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Apakah akan, Anda mengetik hal yang sama? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. Malan: Jadi, jika s adalah 1 dan t adalah 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Anda mengetik hal yang berbeda. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. Malan: Tepat. 204 00:08:13,570 --> 00:08:14,480 Anda mengetik hal yang berbeda. 205 00:08:14,480 --> 00:08:14,850 Baiklah. 206 00:08:14,850 --> 00:08:16,714 Jadi tepuk tangan, jika kita bisa, di sini. 207 00:08:16,714 --> 00:08:17,214 [Tepuk Tangan] 208 00:08:17,214 --> 00:08:17,708 Itu menyakitkan. 209 00:08:17,708 --> 00:08:18,208 Aku tahu. 210 00:08:18,208 --> 00:08:19,684 Bagus sekali. 211 00:08:19,684 --> 00:08:24,690 Jadi sekarang mari kita lihat apakah kita tidak bisa menggoda selain apa memperbaiki itu. 212 00:08:24,690 --> 00:08:28,040 Dan tentu saja, ketika kita tetap ini-- yang saya sekarang akan mewakili di green-- 213 00:08:28,040 --> 00:08:29,690 kami melakukan beberapa tambahan di sini. 214 00:08:29,690 --> 00:08:32,409 Pertama, seperti kewarasan cek, aku pertama memeriksa 215 00:08:32,409 --> 00:08:35,110 jika s sama dengan nol dan t sama dengan nol. 216 00:08:35,110 --> 00:08:39,440 Dan hanya harus jelas, ketika mungkin s atau t null dalam kode seperti ini? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Kapan s atau t null. 219 00:08:44,490 --> 00:08:44,990 Ya? 220 00:08:44,990 --> 00:08:45,990 >> AUDIENCE: [Tak terdengar]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. Malan: Tepat. 223 00:08:50,510 --> 00:08:52,840 Jika string bahwa pengguna mengetik terlalu lama 224 00:08:52,840 --> 00:08:56,140 untuk masuk ke dalam memori, atau aneh sudut kasus seperti itu, 225 00:08:56,140 --> 00:08:59,010 GetString, seperti yang akan kita lihat, secara harfiah hari ini, dalam dokumentasi, 226 00:08:59,010 --> 00:09:02,330 mengatakan akan mengembalikan null sebagai nilai sentinel khusus, 227 00:09:02,330 --> 00:09:05,417 atau hanya semacam simbol khusus itu berarti ada yang tidak beres. 228 00:09:05,417 --> 00:09:07,500 Jadi kami ingin memeriksa itu, karena ternyata 229 00:09:07,500 --> 00:09:09,720 nol itu adalah nilai yang sangat berbahaya. 230 00:09:09,720 --> 00:09:14,250 >> Seringkali, jika Anda mencoba untuk melakukan sesuatu dengan nol melibatkan function-- lewat itu 231 00:09:14,250 --> 00:09:17,470 sebagai masukan, untuk instance-- fungsi yang mungkin sangat akan crash dan, dengan itu, 232 00:09:17,470 --> 00:09:19,090 mencatat seluruh program Anda. 233 00:09:19,090 --> 00:09:22,570 Jadi baris ketiga ini sekarang hanya kewarasan cek, pengecekan error, jika Anda mau. 234 00:09:22,570 --> 00:09:25,450 Itu kebiasaan yang baik sekarang ke kita untuk masuk ke setiap kali kita 235 00:09:25,450 --> 00:09:28,050 mencoba untuk menggunakan nilai yang bisa, berpotensi, null. 236 00:09:28,050 --> 00:09:32,000 >> Sekarang, di baris keempat di sini, "Jika strcmp (s, t)," baik, 237 00:09:32,000 --> 00:09:33,180 apa itu maksud? 238 00:09:33,180 --> 00:09:36,750 Yah, kami mengatakan ini adalah sangat ringkas fungsi bernama untuk perbandingan string. 239 00:09:36,750 --> 00:09:40,370 Dan tujuannya dalam hidup adalah untuk membandingkan argumen pertama menentangnya kedua, 240 00:09:40,370 --> 00:09:44,640 tapi tidak dalam hal alamat mereka, seperti yang kita lakukan tidak sengaja saat 241 00:09:44,640 --> 00:09:48,270 lalu dengan kode merah, tapi bukan untuk membandingkan dua 242 00:09:48,270 --> 00:09:53,210 string dalam manusiawi intuitif cara dengan membandingkan ini, melawan ini, 243 00:09:53,210 --> 00:09:56,690 melawan ini, melawan ini, dan kemudian berhenti jika dan ketika salah satu 244 00:09:56,690 --> 00:09:59,590 atau kedua jari saya hits backslash 0. 245 00:09:59,590 --> 00:10:04,530 Jadi seseorang tahun yang lalu dilaksanakan strcmp untuk menerapkan bagi kita fungsi 246 00:10:04,530 --> 00:10:08,890 bahwa kita berharap kita akan mendapatkan dengan hanya membandingkan dua nilai sederhana. 247 00:10:08,890 --> 00:10:14,929 >> Sekarang terus terang, aku terus menggambar semua ini berbagai nomor. 248 00:10:14,929 --> 00:10:17,470 Tetapi kenyataannya adalah, aku sudah membuat ini up sepanjang waktu. 249 00:10:17,470 --> 00:10:19,580 Jadi biarkan aku hanya pergi ke depan dan mencoret-coret ini keluar 250 00:10:19,580 --> 00:10:23,100 untuk membuat titik itu, di akhir hari dan bergerak maju, 251 00:10:23,100 --> 00:10:30,160 kita tidak benar-benar akan peduli apa alamat hal-hal yang benar-benar 252 00:10:30,160 --> 00:10:30,790 dalam memori. 253 00:10:30,790 --> 00:10:34,320 Jadi aku tidak akan menarik ini jenis nomor begitu banyak lagi, 254 00:10:34,320 --> 00:10:38,970 Aku hanya abstrak ini away sedikit lebih ramah dengan hanya panah. 255 00:10:38,970 --> 00:10:42,060 >> Dengan kata lain, jika s adalah pointer, baik, mari kita menarik itu, secara harfiah, 256 00:10:42,060 --> 00:10:45,430 sebagai pointer, panah menunjuk dari dirinya sendiri untuk sesuatu yang lain, 257 00:10:45,430 --> 00:10:48,280 dan tidak terlalu khawatir tentang minutia alamat ini 258 00:10:48,280 --> 00:10:49,910 yang, sekali lagi, saya dibuat pula. 259 00:10:49,910 --> 00:10:52,680 Tapi kita akan melihat alamat tersebut, kadang-kadang, ketika mencari kesalahan kode. 260 00:10:52,680 --> 00:10:56,450 >> Sekarang sementara itu, program ini di sini perbaikan, tentu saja, 261 00:10:56,450 --> 00:10:58,720 bahwa masalah dengan membandingkan dua string. 262 00:10:58,720 --> 00:11:00,260 Tapi kami berlari ke masalah lain. 263 00:11:00,260 --> 00:11:03,180 Ini adalah dari salinan memprogram terakhir kali, 264 00:11:03,180 --> 00:11:06,880 dimana, saya mencoba untuk memanfaatkan hanya karakter pertama dalam string. 265 00:11:06,880 --> 00:11:09,620 Tapi apa gejala kita melihat terakhir kali ketika 266 00:11:09,620 --> 00:11:14,150 pengguna mengetik nilai, seperti gabe dalam huruf kecil, untuk s, 267 00:11:14,150 --> 00:11:19,310 maka kita ditugaskan s ke t, seperti pada baris ketiga ada, 268 00:11:19,310 --> 00:11:22,900 dan kemudian saya mencoba untuk memanfaatkan t braket 0? 269 00:11:22,900 --> 00:11:25,950 Apa efek mengubah t braket 0 di sini? 270 00:11:25,950 --> 00:11:27,150 >> AUDIENCE: Ini mengubah s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. Malan: Ya, Saya mengubah s, juga. 272 00:11:29,360 --> 00:11:31,050 Karena apa yang sebenarnya terjadi? 273 00:11:31,050 --> 00:11:34,130 Nah, biarkan aku melihat apakah saya bisa membersihkan up gambar ini, sebagai berikut. 274 00:11:34,130 --> 00:11:41,390 >> Jika s adalah, sekali lagi, kata g, a, b, e, backslash, 0, dan s 275 00:11:41,390 --> 00:11:44,084 kami akan terus menggambar sebagai kotak di sini, tapi alamat tidak lebih. 276 00:11:44,084 --> 00:11:45,250 Mari kita berhenti membuat segalanya. 277 00:11:45,250 --> 00:11:47,510 Mari kita menggambar untuk menyederhanakan dunia. 278 00:11:47,510 --> 00:11:52,640 >> Ketika saya menyatakan t dengan tali t, yang menciptakan bahwa sepotong memori. 279 00:11:52,640 --> 00:11:55,850 Persegi terjadi menjadi 32 bit di kebanyakan komputer. 280 00:11:55,850 --> 00:11:59,530 Bahkan, jika Anda pernah mendengar tentang komputer memiliki arsitektur 32-bit, 281 00:11:59,530 --> 00:12:03,000 benar-benar mewah-bicara, yang hanya berarti menggunakan alamat 32-bit. 282 00:12:03,000 --> 00:12:05,370 Dan sebagai teknis samping, jika Anda pernah bertanya-tanya 283 00:12:05,370 --> 00:12:09,630 mengapa komputer lama, jika Anda benar-benar mencoba sup mereka dengan banyak RAM, 284 00:12:09,630 --> 00:12:12,360 hanya bisa maksimal empat gigabyte RAM, 285 00:12:12,360 --> 00:12:14,860 baik itu karena, secara harfiah, komputer lama Anda hanya bisa 286 00:12:14,860 --> 00:12:17,250 menghitung setinggi 4 miliar, 4 miliar bytes, 287 00:12:17,250 --> 00:12:20,590 karena itu menggunakan 32-bit angka untuk alamat. 288 00:12:20,590 --> 00:12:23,260 >> Tapi dalam hal apapun, dalam hal ini Misalnya, cerita jauh lebih sederhana. 289 00:12:23,260 --> 00:12:27,250 t hanya pointer lain, atau benar-benar bintang char, string yang aka. 290 00:12:27,250 --> 00:12:30,860 Dan bagaimana saya ingin memperbarui gambar ini sekarang dengan baris kedua kode, 291 00:12:30,860 --> 00:12:31,950 setelah titik, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Ketika saya melakukan tali t sama dengan s koma, bagaimana mengubah gambar ini? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Ya? 295 00:12:38,000 --> 00:12:38,916 >> AUDIENCE: [Tak terdengar]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. Malan: Ya. 298 00:12:42,020 --> 00:12:42,600 Tepat. 299 00:12:42,600 --> 00:12:45,620 Aku hanya menempatkan panah dari t kotak ke alamat yang sama, 300 00:12:45,620 --> 00:12:47,570 huruf pertama yang sama di berikan. 301 00:12:47,570 --> 00:12:50,850 Atau secara teknis, apakah ini orang masih di 0x1, 302 00:12:50,850 --> 00:12:53,052 itu seolah-olah saya telah 0x1 sini dan 0x1 sini. 303 00:12:53,052 --> 00:12:54,760 Tapi sekali lagi, siapa yang peduli tentang alamat? 304 00:12:54,760 --> 00:12:56,345 Hanya saja gagasan bahwa sekarang penting. 305 00:12:56,345 --> 00:12:57,720 Jadi ini adalah apa yang terjadi di sini. 306 00:12:57,720 --> 00:13:02,690 Jadi tentu saja, jika Anda melakukan t braket 0, yang merupakan notasi array, 307 00:13:02,690 --> 00:13:05,650 dari course-- dan terus terang, tampak seperti ada sebuah array di sini, 308 00:13:05,650 --> 00:13:07,340 tapi sekarang ada hal yang aneh ini. 309 00:13:07,340 --> 00:13:11,160 Ketahuilah bahwa bahasa pemrograman, C, menawarkan fitur ini, 310 00:13:11,160 --> 00:13:14,650 dimana, bahkan jika t adalah pointer, atau s adalah pointer, 311 00:13:14,650 --> 00:13:18,050 Anda masih dapat menggunakan familiar, braket persegi nyaman 312 00:13:18,050 --> 00:13:22,520 notasi untuk pergi ke elemen pertama, atau elemen kedua, atau setiap elemen 313 00:13:22,520 --> 00:13:26,130 bahwa pointer yang menunjuk untuk karena, mungkin, itu 314 00:13:26,130 --> 00:13:29,410 adalah, seperti dalam kasus ini, menunjuk beberapa array. 315 00:13:29,410 --> 00:13:30,340 >> Jadi bagaimana kita mengatasinya? 316 00:13:30,340 --> 00:13:33,660 Terus terang, ini adalah di mana ia mendapat sedikit berlebihan pada pandangan pertama. 317 00:13:33,660 --> 00:13:35,340 Tapi di sini adalah versi baru dan lebih baik. 318 00:13:35,340 --> 00:13:37,460 >> Jadi pertama, saya mendapatkan menyingkirkan perpustakaan CS50, 319 00:13:37,460 --> 00:13:41,170 hanya untuk mengekspos bahwa s memang bintang char, hanya sinonim. 320 00:13:41,170 --> 00:13:43,540 Dan t juga merupakan bintang arang. 321 00:13:43,540 --> 00:13:48,290 Tapi apa yang terjadi pada sisi kanan dari garis yang 322 00:13:48,290 --> 00:13:49,970 dimana t ditugaskan nilai? 323 00:13:49,970 --> 00:13:50,790 >> Apa itu malloc? 324 00:13:50,790 --> 00:13:51,630 Apa itu strlen? 325 00:13:51,630 --> 00:13:52,547 Apa sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Kenapa sih melakukan hal ini garis terlihat begitu rumit? 327 00:13:54,380 --> 00:13:55,713 Apa itu lakukan pada tingkat tinggi? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Apa itu menyimpan di t? 330 00:13:57,440 --> 00:13:58,646 Ya? 331 00:13:58,646 --> 00:14:01,104 AUDIENCE: Ini mengalokasikan sejumlah ruang memori. 332 00:14:01,104 --> 00:14:03,032 Ini untuk menyimpan, saya kira, surat [Tak terdengar]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. Malan Perfect. 334 00:14:04,032 --> 00:14:04,540 Sempurna. 335 00:14:04,540 --> 00:14:06,650 Ini mengalokasikan tertentu jumlah ruang memori 336 00:14:06,650 --> 00:14:08,940 untuk menyimpan, mungkin, surat masa depan. 337 00:14:08,940 --> 00:14:11,310 Dan khususnya, malloc Oleh karena itu kembali apa? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> AUDIENCE: Mengembalikan [Tak terdengar]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. Malan: Tepat. 341 00:14:15,850 --> 00:14:18,850 Kembali alamat memori yang, yang merupakan cara mewah mengatakan, 342 00:14:18,850 --> 00:14:21,640 mengembalikan alamat dari byte pertama memori itu. 343 00:14:21,640 --> 00:14:25,460 Tanggung jawab berada pada saya untuk mengingat berapa banyak memori saya benar-benar 344 00:14:25,460 --> 00:14:27,140 dialokasikan atau meminta malloc untuk. 345 00:14:27,140 --> 00:14:28,384 >> Sekarang berapa banyak itu? 346 00:14:28,384 --> 00:14:30,550 Yah, meskipun ada banyak tanda kurung di sini, 347 00:14:30,550 --> 00:14:32,970 malloc hanya butuh satu argumen. 348 00:14:32,970 --> 00:14:37,250 Dan aku menentukan strlen dari s, sehingga memberikan saya sebagai banyak byte seperti yang ada di s, 349 00:14:37,250 --> 00:14:37,800 tapi menambahkan satu. 350 00:14:37,800 --> 00:14:38,300 Mengapa? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Ya? 353 00:14:39,530 --> 00:14:40,840 >> AUDIENCE: The backslash 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. Malan: Tepat. 355 00:14:41,840 --> 00:14:43,423 Kami harus melakukan pembenahan sedikit. 356 00:14:43,423 --> 00:14:45,970 Jadi karena ada backslash 0, sebaiknya kita ingat itu. 357 00:14:45,970 --> 00:14:47,310 Jika tidak, kita akan untuk membuat string yang 358 00:14:47,310 --> 00:14:49,170 tidak memiliki terminator khusus. 359 00:14:49,170 --> 00:14:52,640 >> Sementara itu, hanya untuk menjadi super anal, saya memiliki sizeof (char), 360 00:14:52,640 --> 00:14:55,730 hanya dalam kasus seseorang berjalan saya kode tidak pada alat CS50, 361 00:14:55,730 --> 00:14:58,220 tapi mungkin komputer yang berbeda sama sekali di mana karakter 362 00:14:58,220 --> 00:15:01,470 adalah salah satu byte, dengan konvensi, tapi dua byte, atau sesuatu yang lebih besar dari itu. 363 00:15:01,470 --> 00:15:04,490 Hanya saja untuk menjadi super, Super menolak untuk kesalahan. 364 00:15:04,490 --> 00:15:06,940 Meskipun, pada kenyataannya, itu kemungkinan besar akan menjadi 1. 365 00:15:06,940 --> 00:15:11,490 >> Sekarang, sementara itu, aku pergi ke depan dan salin String, t braket i sama dengan t braket s. 366 00:15:11,490 --> 00:15:14,962 Dan saya akan tunduk kepada minggu lalu kode sumber untuk melihat apa yang terjadi. 367 00:15:14,962 --> 00:15:17,670 Tapi takeaway kunci, dan Alasan saya menempatkan kode tersebut sekarang dalam warna hijau, 368 00:15:17,670 --> 00:15:22,520 karena baris terakhir, t braket 0 sama dengan toupper, 369 00:15:22,520 --> 00:15:25,230 memiliki efek Memanfaatkan string mana? 370 00:15:25,230 --> 00:15:26,960 t dan / atau s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Itu baris terakhir kode. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Hanya t, karena apa yang terjadi saat ini, 375 00:15:35,560 --> 00:15:41,500 jika saya sedikit membatalkan langkah terakhir, apa yang terjadi adalah, ketika saya sebut malloc, 376 00:15:41,500 --> 00:15:45,380 Saya pada dasarnya mendapatkan sepotong memori itu adalah ukuran yang sama seperti aslinya, 377 00:15:45,380 --> 00:15:47,020 karena itulah aritmetik saya lakukan. 378 00:15:47,020 --> 00:15:50,920 Aku menyimpan di t alamat itu sepotong memori. 379 00:15:50,920 --> 00:15:53,370 Meskipun ini terlihat bagus dan cantik, bagus dan kosong, 380 00:15:53,370 --> 00:15:56,882 kenyataannya adalah ada, apa yang kita akan terus menelepon, nilai sampah di sini. 381 00:15:56,882 --> 00:15:59,340 Potongan itu dari memori mungkin sangat baik memiliki pernah digunakan sebelumnya, 382 00:15:59,340 --> 00:16:00,940 beberapa detik, beberapa menit yang lalu. 383 00:16:00,940 --> 00:16:04,410 Jadi benar-benar bisa menjadi nomor atau surat sana, hanya kebetulan. 384 00:16:04,410 --> 00:16:08,580 Tapi mereka tidak sah, sampai aku diriku mengisi sepotong ini memori 385 00:16:08,580 --> 00:16:12,510 dengan karakter yang sebenarnya, seperti yang saya dilakukan dalam untuk loop di sana. 386 00:16:12,510 --> 00:16:13,180 Baiklah? 387 00:16:13,180 --> 00:16:16,180 >> Jadi sekarang, klimaks dari tiga contoh 388 00:16:16,180 --> 00:16:20,730 yang tampaknya rusak terakhir kali, contoh Swap ini, fungsi ini 389 00:16:20,730 --> 00:16:23,670 bekerja dalam arti bahwa bertukar a dan b. 390 00:16:23,670 --> 00:16:25,620 Tapi itu tidak berhasil dalam arti lain apa? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Ya? 393 00:16:28,614 --> 00:16:29,612 >> AUDIENCE: [Tak terdengar]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. Malan: Tepat. 396 00:16:36,700 --> 00:16:39,530 Jika saya harus memanggil fungsi ini dari another-- misalnya, 397 00:16:39,530 --> 00:16:42,870 dari fungsi seperti utama, di mana Saya memiliki variabel, x dan y, seperti yang saya 398 00:16:42,870 --> 00:16:46,160 lakukan minggu lalu, kode yang sama, dan saya lulus dalam x dan y 399 00:16:46,160 --> 00:16:49,860 untuk swap, dan kemudian memanggil Swap-- ini, tentu saja, adalah versi yang benar 400 00:16:49,860 --> 00:16:52,220 adalah apa yang kita akan see-- tidak berhasil. 401 00:16:52,220 --> 00:16:53,770 Jadi apa memperbaiki? 402 00:16:53,770 --> 00:16:56,850 >> Nah, jadi hanya menjadi jelas, biarkan aku pergi ke depan 403 00:16:56,850 --> 00:17:05,450 dan-- Beri aku satu detik di sini, dan melihat jika saya bisa menunjukkan yang terakhir, yang 404 00:17:05,450 --> 00:17:12,464 akan in-- mari kita lihat apakah saya dapat menemukan OK ini fast-- nyata, [Tak terdengar]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, itu dia. 407 00:17:19,240 --> 00:17:21,000 Jadi mengabaikan perintah saya hanya mengetik. 408 00:17:21,000 --> 00:17:23,780 Aku ingin mengambil di menit terakhir contoh 409 00:17:23,780 --> 00:17:27,960 dari terakhir kali, yang sekarang disebut tidak Swap. 410 00:17:27,960 --> 00:17:30,200 >> Jadi tidak ada Swap adalah di mana kami tinggalkan terakhir kali, 411 00:17:30,200 --> 00:17:32,930 dimana, saya diinisialisasi x 1 dan y 2. 412 00:17:32,930 --> 00:17:35,840 Saya kemudian menelepon Swap, lewat di 1 dan 2. 413 00:17:35,840 --> 00:17:37,930 Dan kemudian fungsi ini bekerja dalam arti tertentu, 414 00:17:37,930 --> 00:17:40,750 tapi itu tidak ada yang permanen berpengaruh terhadap x dan y. 415 00:17:40,750 --> 00:17:45,430 Jadi pertanyaan di tangan adalah, bagaimana sekarang kita benar-benar memperbaiki masalah ini? 416 00:17:45,430 --> 00:17:47,820 Apa solusi di tangan? 417 00:17:47,820 --> 00:17:53,150 >> Nah, di swap.c, yang baru hari ini, melihat beberapa perbedaan. 418 00:17:53,150 --> 00:17:54,700 x dan y adalah sama. 419 00:17:54,700 --> 00:17:57,250 Tapi apa yang jelas berbeda tentang garis 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Apa yang baru di sana, jika Anda ingat apa yang tampak seperti detik yang lalu? 422 00:18:01,715 --> 00:18:02,565 >> AUDIENCE: [Tak terdengar]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. Malan: Ya. 424 00:18:03,440 --> 00:18:06,680 Jadi ampersands adalah bagian baru sintaksis tidak hanya dalam program ini, 425 00:18:06,680 --> 00:18:08,560 tetapi juga lebih umum di CS50. 426 00:18:08,560 --> 00:18:10,680 Sampai saat ini, saya tidak berpikir kita telah melihat contoh-contoh 427 00:18:10,680 --> 00:18:14,070 atau benar-benar berbicara tentang mereka dalam detail, selain, mungkin, Terlebih Dahulu 428 00:18:14,070 --> 00:18:16,467 dalam bagian, ampersand seperti ini. 429 00:18:16,467 --> 00:18:19,300 Nah, ternyata ampersand adalah salah satu potongan terakhir dari sintaks baru 430 00:18:19,300 --> 00:18:20,174 kita akan belajar. 431 00:18:20,174 --> 00:18:23,500 Semua itu berarti adalah alamat beberapa variabel. 432 00:18:23,500 --> 00:18:25,070 Apa alamat yang x hidup? 433 00:18:25,070 --> 00:18:26,510 Tapi apa alamat yang y hidup? 434 00:18:26,510 --> 00:18:28,700 Karena jika masalah mendasar sebelum 435 00:18:28,700 --> 00:18:32,970 adalah bahwa x dan y sedang berlalu sebagai salinan, apa yang kita ingin lakukan 436 00:18:32,970 --> 00:18:38,780 adalah menyediakan Swap dengan seperti harta peta yang mengarah ke mana x dan y benar-benar 437 00:18:38,780 --> 00:18:41,910 dalam RAM, sehingga Swap dapat mengikuti peta yang 438 00:18:41,910 --> 00:18:47,760 dan pergi ke mana pun x atau y menandai tempat dan mengubah nilai-nilai aktual 1 dan 2 439 00:18:47,760 --> 00:18:48,270 ada. 440 00:18:48,270 --> 00:18:50,710 >> Jadi Swap perlu mengubah sedikit terlalu. 441 00:18:50,710 --> 00:18:53,760 Dan pada pandangan pertama, kekuatan ini tampak sedikit mirip dengan bintang arang. 442 00:18:53,760 --> 00:18:54,850 Dan sesungguhnya adalah. 443 00:18:54,850 --> 00:18:59,635 Jadi adalah pointer ke jenis data, sesuai porsi yang disorot ini? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Jadi itu adalah int. 446 00:19:01,620 --> 00:19:04,880 >> Jadi tidak lagi int, itu adalah alamat dari sebuah int. 447 00:19:04,880 --> 00:19:07,910 Dan sama, b sekarang akan menjadi alamat dari sebuah int. 448 00:19:07,910 --> 00:19:12,470 Jadi ketika saya sekarang memanggil swap dari Main, Aku tidak akan memberikan Swap 1 dan 2. 449 00:19:12,470 --> 00:19:15,540 Aku akan memberikannya seperti Ox-sesuatu dan Ox-sesuatu, 450 00:19:15,540 --> 00:19:19,820 dua alamat yang akan memimpin Swap ke lokasi mereka yang sebenarnya 451 00:19:19,820 --> 00:19:21,310 dalam memori komputer saya. 452 00:19:21,310 --> 00:19:25,580 >> Jadi sekarang, implementasi saya yang tersisa perlu mengubah anak laki-laki. 453 00:19:25,580 --> 00:19:28,650 Apa jelas berbeda sekarang dalam tiga baris kode? 454 00:19:28,650 --> 00:19:31,350 Ada bintang sialan ini semua tempat, oke? 455 00:19:31,350 --> 00:19:33,014 Jadi apa yang terjadi di sini? 456 00:19:33,014 --> 00:19:33,514 Ya? 457 00:19:33,514 --> 00:19:35,055 >> AUDIENCE: Ini jelas [Tak terdengar]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. Malan: Tepat. 460 00:19:37,990 --> 00:19:41,560 Jadi dalam context-- ini dan ini tidak keputusan desain yang terbaik, diakui, 461 00:19:41,560 --> 00:19:42,530 tahun yang lalu. 462 00:19:42,530 --> 00:19:45,110 Dalam konteks ini, di mana Anda hanya memiliki bintang, 463 00:19:45,110 --> 00:19:48,240 dan Anda tidak memiliki tipe data, seperti int, segera ke kiri, 464 00:19:48,240 --> 00:19:53,146 sebaliknya Anda memiliki tanda yang sama, jelas, dalam konteks ini, ketika Anda mengatakan membintangi sebuah, 465 00:19:53,146 --> 00:19:56,980 itu berarti pergi ke alamat yang di. 466 00:19:56,980 --> 00:19:58,870 Ikuti peta harta karun, sehingga untuk berbicara. 467 00:19:58,870 --> 00:20:01,720 >> Dan sementara itu, sejalan 37, itu berarti hal yang sama. 468 00:20:01,720 --> 00:20:05,460 Pergi ke alamat, dan menempatkan apa ada? 469 00:20:05,460 --> 00:20:09,520 Apapun yang di lokasi yang b menentukan. 470 00:20:09,520 --> 00:20:10,980 Dengan kata lain, pergi ke b. 471 00:20:10,980 --> 00:20:12,130 Dapatkan nilai tersebut. 472 00:20:12,130 --> 00:20:15,620 Pergi ke dan, per sederajat menandatangani, operator penugasan, 473 00:20:15,620 --> 00:20:17,010 menempatkan nilai yang ada. 474 00:20:17,010 --> 00:20:19,272 >> Demikian pula, int temp hanya int. 475 00:20:19,272 --> 00:20:20,730 Tidak perlu mengubah tentang temp. 476 00:20:20,730 --> 00:20:24,810 Ini hanya segelas cadang dari Annenberg untuk beberapa susu atau jus jeruk. 477 00:20:24,810 --> 00:20:27,630 Tapi aku harus mengatakan, pergi ke b. 478 00:20:27,630 --> 00:20:31,449 Pergi ke tujuan itu dan menempatkan nilai dalam suhu di sana. 479 00:20:31,449 --> 00:20:32,490 Jadi apa yang terjadi kemudian? 480 00:20:32,490 --> 00:20:36,540 Ketika saya benar-benar menyebutnya Swap saat ini, jika baki pertama ini di sini mewakili Main, 481 00:20:36,540 --> 00:20:42,270 tray kedua ini merupakan Swap, ketika Saya lulus ampersand x dan y ampersand 482 00:20:42,270 --> 00:20:47,150 dari Main untuk swap, hanya harus jelas, apa frame ini menerima tumpukan? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Ya? 485 00:20:49,200 --> 00:20:50,180 >> AUDIENCE: [Tak terdengar]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. Malan: Tepat. 487 00:20:51,180 --> 00:20:53,129 Alamat x dan alamat y. 488 00:20:53,129 --> 00:20:55,170 Dan Anda bisa memikirkan ini seperti alamat pos. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street dan 35 Oxford Street, dan Anda 490 00:20:58,772 --> 00:21:01,230 ingin memindahkan dua bangunan yang berada di lokasi tersebut. 491 00:21:01,230 --> 00:21:04,680 >> Ini semacam ide konyol, tapi itu semua kita maksud dengan alamat. 492 00:21:04,680 --> 00:21:07,000 Dimana di dunia dapat Anda menemukan dua ints? 493 00:21:07,000 --> 00:21:09,470 Dimana di dunia dapat Anda menemukan dua bangunan? 494 00:21:09,470 --> 00:21:15,170 Jadi, jika akhirnya, setelah sekian lama saya masuk ke kode sumber saat ini dan kompilasi 495 00:21:15,170 --> 00:21:22,110 Swap dan menjalankan ./swap, akhirnya, untuk pertama kalinya kita benar-benar melihat bahwa 496 00:21:22,110 --> 00:21:25,330 nilai-nilai saya memang memiliki telah bertukar berhasil. 497 00:21:25,330 --> 00:21:30,860 Dan sekarang, kita bahkan dapat mengambil catatan ini, katakanlah, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Jadi biarkan aku pergi ke file yang sama. 499 00:21:32,740 --> 00:21:35,010 Biarkan aku pergi ke depan dan menjalankan gdb dari ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Dan sekarang, di Swap, aku akan pergi depan dan menetapkan titik istirahat di Main. 502 00:21:40,547 --> 00:21:42,630 Dan sekarang aku akan pergi depan dan menjalankan program. 503 00:21:42,630 --> 00:21:45,810 Dan sekarang kita melihat kode saya berhenti di jalur itu. 504 00:21:45,810 --> 00:21:48,330 >> Jika saya pergi ke depan dan mencetak x, apa yang harus saya lihat di sini? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Ini pertanyaan. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Katakanlah lagi? 509 00:21:51,530 --> 00:21:52,295 >> AUDIENCE: [Tak terdengar]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. Malan: Jadi nomor acak, mungkin. 511 00:21:53,910 --> 00:21:56,010 Mungkin aku beruntung, dan itu bagus dan sederhana, seperti 0. 512 00:21:56,010 --> 00:21:57,230 Tapi mungkin itu beberapa nomor acak. 513 00:21:57,230 --> 00:21:58,090 Dalam hal ini, aku beruntung. 514 00:21:58,090 --> 00:21:59,030 Itu hanya kebetulan 0. 515 00:21:59,030 --> 00:22:00,780 Tapi itu memang keberuntungan, karena tidak sampai aku 516 00:22:00,780 --> 00:22:06,280 ketik berikutnya dan kemudian cetak x memiliki yang baris kode, baris 19, telah dieksekusi. 517 00:22:06,280 --> 00:22:10,942 >> Sementara itu, jika saya ketik berikutnya lagi, dan sekarang mencetak y, aku akan melihat 2. 518 00:22:10,942 --> 00:22:13,900 Sekarang, jika saya ketik selanjutnya, itu akan mendapatkan sedikit membingungkan, karena sekarang, 519 00:22:13,900 --> 00:22:17,250 printf ini akan muncul di layar, seperti yang terjadi. x adalah 1. 520 00:22:17,250 --> 00:22:18,606 >> Mari kita lakukan ini lagi. 521 00:22:18,606 --> 00:22:20,480 Dan sekarang, di sinilah hal-hal menarik. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Sebelum saya sebut Swap atau bahkan langkah ke dalamnya, mari kita sedikit mengintip. 524 00:22:26,580 --> 00:22:28,980 x adalah, sekali lagi, 1. 525 00:22:28,980 --> 00:22:33,240 Y adalah, tentu saja, kewarasan cepat cek, 2, jadi tidak keras di sana. 526 00:22:33,240 --> 00:22:35,740 Tapi apa ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Jawaban, itu agak funky mencari. 529 00:22:39,350 --> 00:22:43,500 Tapi bintang int dalam kurung hanya Cara GDP ini mengatakan ini adalah alamat. 530 00:22:43,500 --> 00:22:48,290 Ini bukan sebuah int, itu adalah pointer ke int, atau dikenal sebagai alamat. 531 00:22:48,290 --> 00:22:49,742 >> Apa hal gila ini? 532 00:22:49,742 --> 00:22:51,825 Kami belum pernah melihat sesuatu cukup seperti itu sebelumnya. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Jadi ini adalah alamat di komputer saya memori di mana x kebetulan tinggal. 535 00:22:58,120 --> 00:22:59,040 Ini Ox-sesuatu. 536 00:22:59,040 --> 00:23:01,290 Dan ini, terus terang, mengapa Saya sudah mulai menggambar panah, 537 00:23:01,290 --> 00:23:03,340 bukan angka, karena siapa yang benar-benar peduli 538 00:23:03,340 --> 00:23:06,890 bahwa int Anda berada pada tertentu alamat yang begitu besar. 539 00:23:06,890 --> 00:23:12,160 Tapi bffff0c4, ini semua memang digit heksadesimal, 540 00:23:12,160 --> 00:23:13,720 yang adalah 0 sampai f. 541 00:23:13,720 --> 00:23:16,590 >> Jadi kita tidak akan tinggal terlalu panjang tentang apa hal-hal itu. 542 00:23:16,590 --> 00:23:19,400 Tapi kalau aku mencetak y, tentu saja, saya melihat 2. 543 00:23:19,400 --> 00:23:22,440 Tapi ampersand y, saya melihat alamat ini. 544 00:23:22,440 --> 00:23:26,527 Dan perhatikan, bagi yang penasaran, seberapa jauh adalah x dan y? 545 00:23:26,527 --> 00:23:27,985 Anda dapat mengabaikan sebagian besar alamat. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Empat bytes. 548 00:23:29,920 --> 00:23:33,510 Dan itu konsisten dengan kami sebelumnya mengklaim bahwa seberapa besar adalah int? 549 00:23:33,510 --> 00:23:34,130 Empat bytes. 550 00:23:34,130 --> 00:23:37,420 Jadi sepertinya semuanya berbaris baik, seperti yang mungkin Anda harapkan, dalam memori. 551 00:23:37,420 --> 00:23:40,010 >> Jadi sekarang, mari kita maju cepat sampai akhir cerita ini. 552 00:23:40,010 --> 00:23:43,290 Mari kita pergi ke depan dan ketik langkah, untuk menyelam ke dalam fungsi Swap. 553 00:23:43,290 --> 00:23:46,880 Sekarang perhatikan, jika saya ketik, itu identik dengan alamat x. 554 00:23:46,880 --> 00:23:52,130 Jika saya ketik b, itu identik ke alamat y. 555 00:23:52,130 --> 00:23:57,020 Jadi apa yang harus saya melihat apakah saya mengatakan, pergi ke alamat itu? 556 00:23:57,020 --> 00:23:58,120 Jadi mencetak membintangi sebuah. 557 00:23:58,120 --> 00:24:00,130 Jadi Bintang berarti pergi ke sana, dalam konteks ini. 558 00:24:00,130 --> 00:24:02,730 Ampersand berarti apa alamat. 559 00:24:02,730 --> 00:24:05,000 Jadi membintangi sarana 1. 560 00:24:05,000 --> 00:24:09,590 Dan Bintang cetak b memberi saya 2. 561 00:24:09,590 --> 00:24:15,750 >> Dan biarkan aku berasumsi, untuk saat ini, bahwa setidaknya kode yang 562 00:24:15,750 --> 00:24:18,950 hasil untuk mengeksekusi sekarang dapat beralasan melalui cara itu. 563 00:24:18,950 --> 00:24:21,150 Tapi kita akan kembali ide ini tak lama. 564 00:24:21,150 --> 00:24:23,850 Jadi versi Swap sekarang benar dan memungkinkan 565 00:24:23,850 --> 00:24:26,650 kita untuk menukar jenis data tertentu. 566 00:24:26,650 --> 00:24:29,120 >> Jadi pertanyaan kemudian Swap? 567 00:24:29,120 --> 00:24:29,890 Pada bintang? 568 00:24:29,890 --> 00:24:30,690 Pada alamat? 569 00:24:30,690 --> 00:24:33,270 Dan Anda akan melihat, dengan masalah set 4, semacam, 570 00:24:33,270 --> 00:24:37,310 tapi masalahnya set 5, pasti, bagaimana hal-hal yang berguna dan mendapatkan lebih banyak 571 00:24:37,310 --> 00:24:39,584 nyaman dengan mereka, sebagai hasilnya. 572 00:24:39,584 --> 00:24:40,430 Apa saja? 573 00:24:40,430 --> 00:24:40,930 Baiklah. 574 00:24:40,930 --> 00:24:44,350 Jadi malloc adalah, sekali lagi, fungsi ini yang hanya mengalokasikan memori, memori 575 00:24:44,350 --> 00:24:45,330 alokasi. 576 00:24:45,330 --> 00:24:47,024 Dan mengapa ini berguna? 577 00:24:47,024 --> 00:24:48,940 Nah, selama ini, Anda telah menggunakan malloc. 578 00:24:48,940 --> 00:24:52,230 Jika Anda menganggap sekarang bagaimana GetString bekerja, mungkin, itu 579 00:24:52,230 --> 00:24:56,140 telah meminta seseorang untuk sepotong memori, kapan saja pengguna jenis string 580 00:24:56,140 --> 00:24:59,040 in, karena kita pasti tidak tahu, sebagai staf CS50, 581 00:24:59,040 --> 00:25:02,710 seberapa besar mereka string bahwa manusia akan mengetik mungkin. 582 00:25:02,710 --> 00:25:07,910 >> Jadi mari kita, untuk pertama kalinya, mulai mengupas kembali cara kerja perpustakaan CS50, 583 00:25:07,910 --> 00:25:10,990 dengan cara beberapa contoh yang akan membawa kita ke sana. 584 00:25:10,990 --> 00:25:15,300 Jadi jika saya membuka gedit dan membuka scanf 0, 585 00:25:15,300 --> 00:25:17,055 kita akan melihat kode berikut. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, tersedia di situs web untuk hari ini, relatif sedikit baris kode 588 00:25:23,530 --> 00:25:25,351 di sini, 14 sampai 20. 589 00:25:25,351 --> 00:25:26,600 Dan mari kita lihat apa yang dilakukannya. 590 00:25:26,600 --> 00:25:28,920 Ini menyatakan int, yang disebut x. 591 00:25:28,920 --> 00:25:30,850 Ia mengatakan sesuatu seperti, nomor silakan. 592 00:25:30,850 --> 00:25:33,940 Dan sekarang ia mengatakan, scanf% i, & x. 593 00:25:33,940 --> 00:25:35,620 Jadi ada banyak hal baru di sana. 594 00:25:35,620 --> 00:25:38,420 >> Tapi scanf, Anda dapat jenis berpikir sebagai kebalikan dari printf. 595 00:25:38,420 --> 00:25:40,090 printf, tentu saja, cetakan ke layar. 596 00:25:40,090 --> 00:25:44,410 semacam scanf scan dari pengguna Keyboard sesuatu ia telah diketik. 597 00:25:44,410 --> 00:25:46,550 >> % I adalah seperti printf. 598 00:25:46,550 --> 00:25:49,410 Ini berarti mengharapkan pengguna untuk mengetik int. 599 00:25:49,410 --> 00:25:52,820 Dan sekarang, mengapa kau pikir aku mungkin lewat scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Jika tujuan dalam kehidupan scanf adalah untuk mendapatkan sesuatu dari pengguna, 602 00:25:57,770 --> 00:26:02,480 apa arti dari lewat itu, & x, sekarang? 603 00:26:02,480 --> 00:26:02,980 Ya? 604 00:26:02,980 --> 00:26:03,896 >> AUDIENCE: [Tak terdengar]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. Malan: Tepat. 607 00:26:06,540 --> 00:26:12,900 Apa pun yang saya, manusia, ketik, masukan saya akan disimpan di lokasi itu. 608 00:26:12,900 --> 00:26:17,660 Ini tidak cukup, ingat, hanya lulus dalam x, karena kita telah melihat sudah, 609 00:26:17,660 --> 00:26:21,630 setiap kali Anda melewati hanya variabel baku, seperti int, beberapa fungsi lain, 610 00:26:21,630 --> 00:26:25,640 yakin, itu bisa mengubah itu variabel, tapi tidak secara permanen. 611 00:26:25,640 --> 00:26:27,360 Hal ini tidak dapat memiliki efek pada Main. 612 00:26:27,360 --> 00:26:29,420 Ini hanya dapat mengubah salinan lokal sendiri. 613 00:26:29,420 --> 00:26:32,560 Tapi jika, sebaliknya, Anda tidak memberi saya int sebenarnya, 614 00:26:32,560 --> 00:26:36,640 tapi Anda memberi saya petunjuk untuk bahwa int, saya sekarang, menjadi scanf, 615 00:26:36,640 --> 00:26:41,050 pasti, saya bisa mengikuti alamat dan menempatkan nomor ada 616 00:26:41,050 --> 00:26:43,280 sehingga Anda memiliki akses ke sana juga. 617 00:26:43,280 --> 00:26:45,120 >> Jadi ketika saya menjalankan program ini, mari kita lihat. 618 00:26:45,120 --> 00:26:49,660 Membuat scanf 0 dot slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Dan jika sekarang saya ketik nomor seperti 50, terima kasih atas 50. 620 00:26:54,030 --> 00:26:58,150 Jika sekarang saya mengetik nomor seperti negatif 1, untuk yang negatif 1. 621 00:26:58,150 --> 00:27:04,200 Sekarang saya ketik nomor seperti 1.5, hm. 622 00:27:04,200 --> 00:27:06,030 Mengapa program saya mengabaikan saya? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Nah, karena sederhana, saya mengatakan untuk mengharapkan int saja. 625 00:27:09,880 --> 00:27:10,380 Baiklah. 626 00:27:10,380 --> 00:27:11,630 Jadi itu salah satu versi ini. 627 00:27:11,630 --> 00:27:16,600 Mari kita mengambil hal-hal takik dan mengusulkan bahwa ini tidak baik. 628 00:27:16,600 --> 00:27:20,530 Dan di sinilah letak contoh yang sangat sederhana tentang bagaimana kita dapat mulai menulis kode 629 00:27:20,530 --> 00:27:24,450 bahwa orang lain dapat memanfaatkan atau kompromi dengan melakukan hal-hal buruk. 630 00:27:24,450 --> 00:27:28,336 Jadi baris 16, jadi mirip semangat yang sebelumnya, 631 00:27:28,336 --> 00:27:29,960 tapi aku tidak menyatakannya int saat ini. 632 00:27:29,960 --> 00:27:32,970 Saya menyatakan itu bintang char, alias tali. 633 00:27:32,970 --> 00:27:35,190 >> Tapi apa yang benar-benar berarti? 634 00:27:35,190 --> 00:27:38,790 Jadi jika saya tidak menentukan address-- dan Aku menyebutnya sewenang-wenang, penyangga, 635 00:27:38,790 --> 00:27:43,370 tapi aku bisa menyebutnya s, menjadi simple-- dan kemudian saya melakukan ini, menjelaskan kepada saya, 636 00:27:43,370 --> 00:27:48,630 jika Anda bisa, berdasarkan sebelumnya logika, apa yang scanf lakukan di baris 18, 637 00:27:48,630 --> 00:27:55,000 jika lulus% s dan penyangga, yang merupakan alamat? 638 00:27:55,000 --> 00:27:58,210 Apa scanf, jika Anda menerapkan Logika yang sama persis seperti versi 0, 639 00:27:58,210 --> 00:28:00,640 akan mencoba untuk lakukan di sini, ketika jenis pengguna sesuatu? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Ya? 642 00:28:03,409 --> 00:28:04,407 >> AUDIENCE: [Tak terdengar]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. Malan: Tepat. 645 00:28:08,890 --> 00:28:11,577 Scanf, berdasarkan logika sebelumnya, akan mengambil string 646 00:28:11,577 --> 00:28:13,410 bahwa diketik manusia in-- itu sekarang string, 647 00:28:13,410 --> 00:28:15,790 itu bukan angka, mungkin, jika ia cooperates-- 648 00:28:15,790 --> 00:28:19,310 dan itu akan mencoba untuk menempatkan bahwa string dalam memori pada alamat apapun 649 00:28:19,310 --> 00:28:20,340 penyangga menentukan. 650 00:28:20,340 --> 00:28:23,870 Dan ini besar, karena penyangga memang dimaksudkan untuk menjadi alamat. 651 00:28:23,870 --> 00:28:30,470 >> Tapi saya mengklaim program ini adalah kereta di cara yang sangat serius, karena apa yang nilainya 652 00:28:30,470 --> 00:28:31,330 penyangga secara default? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Apa yang telah saya diinisialisasi ke? 655 00:28:34,790 --> 00:28:35,770 Apa sepotong memori? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Aku belum, kan? 658 00:28:38,620 --> 00:28:42,265 >> Jadi meskipun aku sudah dialokasikan Bintang arang yang tidak lagi disebut s, 659 00:28:42,265 --> 00:28:48,030 itu bukan disebut, buffer-- sehingga mari kita menggambar nama variabel 660 00:28:48,030 --> 00:28:53,380 sekarang seperti buffer-- jika saya belum disebut getString atau malloc sini, 661 00:28:53,380 --> 00:28:56,030 yang secara efektif berarti bahwa buffer hanyalah beberapa nilai sampah. 662 00:28:56,030 --> 00:28:57,030 >> Sekarang apa artinya? 663 00:28:57,030 --> 00:29:00,220 Ini berarti bahwa saya telah mengatakan kepada scanf yang diharapkan string dari pengguna. 664 00:29:00,220 --> 00:29:01,300 Dan kau tahu apa? 665 00:29:01,300 --> 00:29:03,883 Apapun hal ini menunjuk untuk-- dan saya menggambar tanda tanya, 666 00:29:03,883 --> 00:29:07,060 namun pada kenyataannya, itu akan menjadi sesuatu seperti OX1, 2, 3, kan? 667 00:29:07,060 --> 00:29:10,730 Ini beberapa nilai palsu yang hanya kebetulan ada dari sebelumnya. 668 00:29:10,730 --> 00:29:13,440 Jadi dengan kata lain, itu seolah-olah penyangga hanya 669 00:29:13,440 --> 00:29:16,180 menunjuk ke sesuatu dalam memori. 670 00:29:16,180 --> 00:29:17,610 Saya tidak tahu apa. 671 00:29:17,610 --> 00:29:24,130 >> Jadi jika saya ketik di gabe sekarang, itu akan mencoba untuk menempatkan g-a-b-e / 0 sana. 672 00:29:24,130 --> 00:29:25,530 Tapi siapa yang tahu apa itu? 673 00:29:25,530 --> 00:29:27,480 Dan di masa lalu, setiap Waktu kita sudah mencoba untuk menyentuh 674 00:29:27,480 --> 00:29:29,770 memori yang bukan milik kepada kami, apa yang terjadi? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Atau hampir setiap waktu. 677 00:29:32,870 --> 00:29:34,310 Segmentation fault, kan? 678 00:29:34,310 --> 00:29:37,829 >> Panah ini, saya tidak tahu di mana itu menunjuk. itu hanya beberapa nilai acak. 679 00:29:37,829 --> 00:29:40,370 Dan tentu saja, jika Anda menafsirkan nilai acak sebagai alamat, 680 00:29:40,370 --> 00:29:42,610 Anda akan pergi ke beberapa tujuan acak. 681 00:29:42,610 --> 00:29:46,810 Jadi gabe mungkin memang kecelakaan program saya dalam hal ini di sini. 682 00:29:46,810 --> 00:29:50,600 >> Jadi apa yang bisa kita lakukan itu hampir sama buruknya? 683 00:29:50,600 --> 00:29:52,660 Pertimbangkan ini ketiga dan Contoh terakhir dari scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Versi ini lebih baik dalam arti apa? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Jika Anda merasa nyaman dengan soal sebelumnya, ini lebih baik. 688 00:30:01,400 --> 00:30:02,250 Mengapa? 689 00:30:02,250 --> 00:30:03,250 >> AUDIENCE: [Tak terdengar]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. Malan: Good. 692 00:30:07,110 --> 00:30:09,970 Jadi hal ini baris 16 lebih baik, dalam arti 693 00:30:09,970 --> 00:30:12,030 bahwa kita secara eksplisit mengalokasikan beberapa memori. 694 00:30:12,030 --> 00:30:14,190 Kami tidak menggunakan malloc, kita menggunakan minggu 2 695 00:30:14,190 --> 00:30:16,060 Pendekatan hanya mendeklarasikan array. 696 00:30:16,060 --> 00:30:18,130 Dan kami telah mengatakan sebelumnya bahwa string hanya sebuah array karakter, 697 00:30:18,130 --> 00:30:19,690 jadi ini benar-benar sah. 698 00:30:19,690 --> 00:30:22,910 Tapi itu, tentu saja, seperti Anda perhatikan, ukuran tetap, 16. 699 00:30:22,910 --> 00:30:25,440 >> Jadi program ini adalah benar-benar aman, jika saya ketik 700 00:30:25,440 --> 00:30:29,760 dalam satu karakter string, dua karakter string, 15 string karakter. 701 00:30:29,760 --> 00:30:34,970 Tapi begitu aku mulai mengetik 16, 17, 18, 1.000 string karakter, 702 00:30:34,970 --> 00:30:37,390 di mana string yang akan berakhir? 703 00:30:37,390 --> 00:30:39,570 Ini akan berakhir sebagian di sini. 704 00:30:39,570 --> 00:30:42,820 Tapi kemudian siapa tahu apa lagi berada di luar batas-batas 705 00:30:42,820 --> 00:30:44,270 array tertentu? 706 00:30:44,270 --> 00:30:48,015 >> Seolah-olah aku sudah menyatakan 16 kotak di sini. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Jadi daripada menarik keluar semua 16, kita akan hanya berpura-pura bahwa saya telah ditarik 16. 709 00:30:52,690 --> 00:30:56,540 Tapi jika saya kemudian mencoba untuk membaca string itu lebih lama, seperti 50 karakter, 710 00:30:56,540 --> 00:31:01,270 Aku akan mulai menempatkan a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Dan ini mungkin beberapa segmen memori lain 712 00:31:04,916 --> 00:31:06,790 itu, sekali lagi, dapat menyebabkan program saya untuk kecelakaan, 713 00:31:06,790 --> 00:31:10,600 karena saya sudah tidak meminta sesuatu yang lebih dari hanya 16 byte. 714 00:31:10,600 --> 00:31:12,260 >> Jadi siapa yang peduli? 715 00:31:12,260 --> 00:31:13,880 Nah, inilah perpustakaan CS50. 716 00:31:13,880 --> 00:31:17,220 Dan sebagian besar ini hanya seperti petunjuk di bagian atas. 717 00:31:17,220 --> 00:31:21,670 The CS50 perpustakaan, selama ini, memiliki baris ini sejalan 52. 718 00:31:21,670 --> 00:31:23,680 Kami telah melihat typedef, atau Anda akan melihat typedef 719 00:31:23,680 --> 00:31:27,930 di PSET 4, yang hanya menciptakan sinonim dimana bintang arang bisa lebih 720 00:31:27,930 --> 00:31:29,290 hanya disebut sebagai string. 721 00:31:29,290 --> 00:31:31,540 Jadi ini adalah salah satu beberapa roda pelatihan 722 00:31:31,540 --> 00:31:34,120 kami telah digunakan secara diam-diam di bawah tenda. 723 00:31:34,120 --> 00:31:36,490 >> Sementara itu, inilah fungsi, getchar. 724 00:31:36,490 --> 00:31:38,190 Sekarang tampaknya, tidak ada tubuh untuk itu. 725 00:31:38,190 --> 00:31:40,273 Dan pada kenyataannya, jika aku terus bergulir, saya tidak benar-benar 726 00:31:40,273 --> 00:31:42,080 melihat implementasi fungsi ini. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Sebagai sebuah pemeriksaan, kenapa begitu? 729 00:31:45,516 --> 00:31:46,795 >> AUDIENCE: [Tak terdengar]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. Malan: Ya. 731 00:31:47,670 --> 00:31:48,950 Jadi ini adalah file header. 732 00:31:48,950 --> 00:31:52,520 Dan file header berisi prototipe, ditambah beberapa hal lain, tampaknya, 733 00:31:52,520 --> 00:31:53,780 seperti typedef. 734 00:31:53,780 --> 00:31:56,910 Tapi di CS50.c, yang kami telah tidak pernah memberi Anda langsung, 735 00:31:56,910 --> 00:32:02,100 namun telah di alat CS50 semua kali ini, jauh di dalam folder tersebut, 736 00:32:02,100 --> 00:32:04,990 melihat bahwa ada seluruh banyak fungsi di sini. 737 00:32:04,990 --> 00:32:06,720 >> Bahkan, mari kita gulir ke bawah. 738 00:32:06,720 --> 00:32:08,810 Mari kita mengabaikan sebagian besar dari mereka, untuk saat ini. 739 00:32:08,810 --> 00:32:12,670 Tapi gulir ke bawah ke getInt dan melihat bagaimana getInt bekerja. 740 00:32:12,670 --> 00:32:13,890 Jadi di sini adalah getInt. 741 00:32:13,890 --> 00:32:17,727 Dan jika Anda pernah benar-benar peduli bagaimana mendapatkan int bekerja, di sini adalah dokumentasinya. 742 00:32:17,727 --> 00:32:19,560 Dan di antara hal-hal yang dikatakannya adalah ia memberitahu Anda 743 00:32:19,560 --> 00:32:21,340 apa rentang nilai dapat kembali. 744 00:32:21,340 --> 00:32:24,400 Ini dasarnya negatif 2 miliar ke positif 2 miliar, memberi atau mengambil. 745 00:32:24,400 --> 00:32:26,420 >> Dan ternyata, semua ini waktu, meskipun kita belum pernah 746 00:32:26,420 --> 00:32:28,570 telah Anda memeriksa untuk itu, jika terjadi kesalahan, 747 00:32:28,570 --> 00:32:30,680 ternyata semua kali ini, getInt memiliki 748 00:32:30,680 --> 00:32:33,600 telah kembali khusus konstan, tidak nol, 749 00:32:33,600 --> 00:32:36,760 melainkan INT_MAX, yang konvensi hanya programmer. 750 00:32:36,760 --> 00:32:38,846 Artinya di sini adalah nilai khusus. 751 00:32:38,846 --> 00:32:41,470 Pastikan untuk memeriksa ini, hanya jika sesuatu berjalan salah. 752 00:32:41,470 --> 00:32:43,261 Tapi kami tidak pernah terganggu dengan bahwa sampai saat ini, 753 00:32:43,261 --> 00:32:45,200 karena lagi-lagi, ini dimaksudkan untuk menyederhanakan. 754 00:32:45,200 --> 00:32:46,950 >> Tapi bagaimana getInt bisa dilaksanakan? 755 00:32:46,950 --> 00:32:48,450 Nah, satu, dibutuhkan tanpa argumen. 756 00:32:48,450 --> 00:32:49,390 Kita tahu bahwa. 757 00:32:49,390 --> 00:32:50,820 Ini mengembalikan sebuah int. 758 00:32:50,820 --> 00:32:51,950 Kita tahu bahwa. 759 00:32:51,950 --> 00:32:54,460 Jadi bagaimana cara kerjanya di bawah tenda? 760 00:32:54,460 --> 00:32:58,290 >> Jadi ada tampaknya tak terbatas lingkaran, setidaknya munculnya satu. 761 00:32:58,290 --> 00:33:00,290 Perhatikan bahwa kita menggunakan getString. 762 00:33:00,290 --> 00:33:04,000 Jadi itu menarik. getInt panggilan fungsi kita sendiri, getString. 763 00:33:04,000 --> 00:33:05,645 Dan sekarang, mengapa hal ini menjadi kasus ini? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Mengapa saya menjadi defensif di sini sejalan 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Apa yang bisa terjadi sejalan 164, hanya harus jelas? 768 00:33:15,639 --> 00:33:16,930 Ini jawaban yang sama seperti sebelumnya. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Mungkin saja dari memori. 771 00:33:20,089 --> 00:33:23,130 Sesuatu yang tidak beres dengan getString, kita harus bisa mengatasinya. 772 00:33:23,130 --> 00:33:27,070 Dan alasan saya tidak kembali nol itu, secara teknis, null pointer. 773 00:33:27,070 --> 00:33:29,120 getInt harus mengembalikan int. 774 00:33:29,120 --> 00:33:31,060 Jadi saya sudah sewenang-wenang memutuskan, pada dasarnya, 775 00:33:31,060 --> 00:33:34,600 bahwa 2 miliar, memberi atau mengambil, akan menjadi nilai khusus yang saya tidak pernah bisa 776 00:33:34,600 --> 00:33:35,970 benar-benar mendapatkan dari pengguna. 777 00:33:35,970 --> 00:33:39,930 Hanya saja satu nilai aku akan menyia-nyiakan untuk mewakili kode kesalahan. 778 00:33:39,930 --> 00:33:41,540 >> Jadi sekarang, hal-hal yang sedikit mewah. 779 00:33:41,540 --> 00:33:44,670 Dan itu tidak cukup fungsi yang sama seperti sebelumnya, tapi itu sangat mirip. 780 00:33:44,670 --> 00:33:50,120 Jadi perhatikan, saya menyatakan di sini, sejalan 172, baik sebagai n int dan char c. 781 00:33:50,120 --> 00:33:53,600 Dan kemudian saya menggunakan baris yang funky ini, sscanf, yang ternyata 782 00:33:53,600 --> 00:33:55,990 tidak memindai string dari keyboard. 783 00:33:55,990 --> 00:33:59,226 Ia berdiri string yang sudah ada yang pengguna telah diketik dalam. 784 00:33:59,226 --> 00:34:02,100 Jadi saya sudah menelepon getString, yang berarti saya punya string dalam memori. 785 00:34:02,100 --> 00:34:05,020 sscanf adalah apa yang akan Anda memanggil fungsi parsing. 786 00:34:05,020 --> 00:34:07,760 Ini terlihat pada string saya sudah mengetik, karakter demi karakter, 787 00:34:07,760 --> 00:34:09,250 dan melakukan sesuatu yang bermanfaat. 788 00:34:09,250 --> 00:34:10,969 String yang disimpan dalam antrean. 789 00:34:10,969 --> 00:34:13,560 Dan aku tahu bahwa hanya dengan pergi cadangan sini dan berkata, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Aku menyebutnya tidak s kali ini, tapi garis. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Dan sekarang ini sedikit berbeda. 793 00:34:18,080 --> 00:34:22,480 Tapi ini secara efektif berarti, karena alasan kita akan agak gelombang tangan kami di hari ini, 794 00:34:22,480 --> 00:34:26,070 bahwa kita memeriksa untuk melihat apakah pengguna mengetik 795 00:34:26,070 --> 00:34:29,909 dan int dan mungkin karakter lain. 796 00:34:29,909 --> 00:34:33,610 Jika pengguna mengetik int, itu akan disimpan dalam n, karena aku 797 00:34:33,610 --> 00:34:36,739 melewati ini dengan alamat, yang trik baru kita lihat hari ini. 798 00:34:36,739 --> 00:34:41,570 Jika pengguna juga diketik dalam seperti 123x, bahwa x 799 00:34:41,570 --> 00:34:45,060 akan berakhir suatu huruf dalam karakter c. 800 00:34:45,060 --> 00:34:48,739 >> Sekarang ternyata sscanf yang akan saya kirim, cerdas, 801 00:34:48,739 --> 00:34:54,750 berapa banyak variabel yang sscanf berhasil mampu mengisi. 802 00:34:54,750 --> 00:34:58,770 Jadi dengan logika ini, jika fungsi Aku menerapkan adalah getInt, 803 00:34:58,770 --> 00:35:00,900 tapi aku memeriksa, berpotensi, bagi pengguna 804 00:35:00,900 --> 00:35:04,190 telah diketik dalam int diikuti oleh sesuatu yang lain, 805 00:35:04,190 --> 00:35:08,580 apa yang ingin saya sscanf dunia nilai kembali benar-benar menjadi? 806 00:35:08,580 --> 00:35:10,950 Jika tujuannya adalah untuk mendapatkan hanya int dari pengguna? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Jadi jika sscanf kembali 2, apa artinya? 809 00:35:19,300 --> 00:35:21,660 Pengguna mengetik sesuatu seperti, secara harfiah, 810 00:35:21,660 --> 00:35:24,770 123x, yang hanya omong kosong. 811 00:35:24,770 --> 00:35:27,490 Ini kondisi kesalahan, dan Saya ingin memeriksa untuk itu. 812 00:35:27,490 --> 00:35:32,960 >> Jadi jika pengguna jenis ini di, berdasarkan logika ini, apa sscanf kembali, 813 00:35:32,960 --> 00:35:33,740 yang akan Anda katakan? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Jadi itu akan kembali 2, karena 123 akan masuk di sini, 816 00:35:39,130 --> 00:35:41,580 dan x yang akan berakhir di sini. 817 00:35:41,580 --> 00:35:43,970 Tapi aku tidak ingin x untuk mendapatkan diisi. 818 00:35:43,970 --> 00:35:48,580 Saya ingin sscanf hanya berhasil dalam mengisi pertama variabel tersebut. 819 00:35:48,580 --> 00:35:52,490 Dan itulah mengapa saya ingin sscanf untuk kembali 1. 820 00:35:52,490 --> 00:35:55,750 >> Dan jika ini adalah sedikit di atas kepala untuk saat ini, itu benar-benar baik-baik saja. 821 00:35:55,750 --> 00:36:00,030 Sadarilah meskipun, bahwa salah satu nilai getInt dan getString 822 00:36:00,030 --> 00:36:03,630 adalah bahwa kita sedang melakukan heck of a banyak pengecekan error seperti ini sehingga 823 00:36:03,630 --> 00:36:07,130 bahwa, sampai saat ini, Anda dapat cukup banyak mengetikkan apapun di keyboard Anda, 824 00:36:07,130 --> 00:36:08,490 dan kami akan menangkapnya. 825 00:36:08,490 --> 00:36:10,592 Dan kita yang pasti, staf, pasti akan tidak 826 00:36:10,592 --> 00:36:13,300 menjadi sumber bug dalam Anda Program, karena kita membela diri 827 00:36:13,300 --> 00:36:16,270 memeriksa semua bodoh hal-hal yang pengguna dapat lakukan, 828 00:36:16,270 --> 00:36:18,900 seperti mengetik string, ketika Anda benar-benar ingin int. 829 00:36:18,900 --> 00:36:21,350 Jadi untuk sekarang-- akan kita datang kembali ke ini sebelum long-- 830 00:36:21,350 --> 00:36:23,710 tapi selama ini, getString dan getInt memiliki 831 00:36:23,710 --> 00:36:29,950 pernah di bawah kap menggunakan ini Ide dasar dari alamat memori. 832 00:36:29,950 --> 00:36:32,580 >> Jadi sekarang, mari kita membuat hal-hal sedikit lebih user-friendly. 833 00:36:32,580 --> 00:36:38,740 Seperti yang Anda ingat, dari Binky lalu time-- jika mouse saya akan cooperate-- sehingga 834 00:36:38,740 --> 00:36:42,560 kami memiliki kode ini, yang terus terang, cukup masuk akal. 835 00:36:42,560 --> 00:36:45,330 Kode ini mencapai apa-apa berguna, tapi itu contoh 836 00:36:45,330 --> 00:36:48,330 bahwa profesor Parlante digunakan untuk mewakili 837 00:36:48,330 --> 00:36:51,840 apa yang sedang terjadi di program yang melibatkan memori. 838 00:36:51,840 --> 00:36:54,850 >> Jadi mari kita menyadur ini cerita yang super singkat. 839 00:36:54,850 --> 00:36:58,720 Kedua baris pertama, di Inggris, melakukan apa, akan Anda katakan? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Hanya dalam cukup manusia, tetapi sedikit istilah teknis, mengambil bacokan. 842 00:37:05,430 --> 00:37:06,346 AUDIENCE: [Tak terdengar]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. Malan: OK, Anda membangun alamat untuk x dan variabel y. 845 00:37:11,080 --> 00:37:15,520 Tidak cukup, karena x dan y tidak variabel dalam arti tradisional. 846 00:37:15,520 --> 00:37:18,054 x dan y adalah alamat atau akan menyimpan alamat. 847 00:37:18,054 --> 00:37:19,220 Jadi mari kita coba ini sekali lagi. 848 00:37:19,220 --> 00:37:21,010 Bukan awal yang buruk, meskipun. 849 00:37:21,010 --> 00:37:21,510 Ya? 850 00:37:21,510 --> 00:37:22,426 >> AUDIENCE: [Tak terdengar]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. Malan: Good. 853 00:37:24,840 --> 00:37:26,173 Saya pikir itu sedikit lebih bersih. 854 00:37:26,173 --> 00:37:28,630 Mendeklarasikan dua pointer, dua bilangan bulat. 855 00:37:28,630 --> 00:37:30,150 Dan kami memanggil mereka x dan y. 856 00:37:30,150 --> 00:37:32,790 Atau jika kita menggambar ini sebagai sebuah gambaran, sekali lagi, 857 00:37:32,790 --> 00:37:36,410 ingat cukup sederhana bahwa semua kita lakukan dengan baris pertama 858 00:37:36,410 --> 00:37:39,690 menggambar kotak seperti ini, dengan beberapa nilai sampah di dalamnya, 859 00:37:39,690 --> 00:37:41,920 dan menyebutnya x, dan kemudian kotak yang lain seperti ini, 860 00:37:41,920 --> 00:37:43,880 dengan beberapa nilai sampah di dalamnya, menyebutnya y. 861 00:37:43,880 --> 00:37:45,810 Kami telah menyatakan dua pointer yang pada akhirnya 862 00:37:45,810 --> 00:37:47,860 akan menyimpan alamat dari sebuah int. 863 00:37:47,860 --> 00:37:49,170 Jadi itu semua ada. 864 00:37:49,170 --> 00:37:53,290 >> Jadi ketika Binky melakukan ini, liat hanya tampak seperti ini. 865 00:37:53,290 --> 00:37:55,350 Dan Nick hanya jenis membungkus panah, 866 00:37:55,350 --> 00:37:57,590 seolah-olah mereka tidak menunjuk mana saja khususnya, karena mereka hanya 867 00:37:57,590 --> 00:37:58,250 nilai sampah. 868 00:37:58,250 --> 00:38:01,670 Mereka tidak secara eksplisit diinisialisasi mana saja pada khususnya. 869 00:38:01,670 --> 00:38:03,980 >> Sekarang baris berikutnya kode, ingat, adalah ini. 870 00:38:03,980 --> 00:38:07,510 Jadi cukup user-friendly, tetapi bahasa Inggris agak teknis, 871 00:38:07,510 --> 00:38:09,790 apa baris kode lakukan? 872 00:38:09,790 --> 00:38:10,391 Ya? 873 00:38:10,391 --> 00:38:11,333 >> AUDIENCE: [Tak terdengar]. 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 Ini mengalokasikan sepotong dari memori yang ukuran int. 877 00:38:17,016 --> 00:38:18,140 Dan itu setengah jawabannya. 878 00:38:18,140 --> 00:38:20,056 Anda menjawab kanan setengah dari ekspresi. 879 00:38:20,056 --> 00:38:22,473 Apa yang terjadi pada sisi kiri dari tanda sama? 880 00:38:22,473 --> 00:38:22,972 Ya? 881 00:38:22,972 --> 00:38:24,814 AUDIENCE: Dan menugaskan ke variabel x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. Malan: Dan menugaskan ke variabel x. 883 00:38:27,690 --> 00:38:31,650 Jadi untuk rekap, kanan mengalokasikan sisi memori yang cukup untuk menyimpan int. 884 00:38:31,650 --> 00:38:34,150 Tapi malloc khusus mengembalikan alamat 885 00:38:34,150 --> 00:38:37,270 itu sepotong memori, yang Anda sudah hanya diusulkan akan disimpan di x. 886 00:38:37,270 --> 00:38:42,560 >> Jadi apa Nick lakukan terakhir kali dengan Binky adalah ia menyeret pointer yang keluar, tanah liat, 887 00:38:42,560 --> 00:38:46,820 untuk menunjuk sekarang di sepotong putih memori yang sama dengan ukuran sebuah int. 888 00:38:46,820 --> 00:38:49,360 Dan memang, yang dimaksudkan untuk mewakili empat byte. 889 00:38:49,360 --> 00:38:55,310 >> Sekarang, baris berikutnya kode melakukan ini, bintang x mendapat 42. 890 00:38:55,310 --> 00:38:58,530 Jadi 42 sangat mudah di sisi kanan, makna hidup. 891 00:38:58,530 --> 00:39:00,500 Sisi kiri, bintang x berarti apa? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Itu juga mungkin memiliki gone-- itu OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> AUDIENCE: Pada dasarnya, pergi ke [Tak terdengar] 896 00:39:06,875 --> 00:39:07,750 DAVID J. Malan: Good. 897 00:39:07,750 --> 00:39:08,760 AUDIENCE: [Tak terdengar]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. Malan: Tepat. 899 00:39:09,760 --> 00:39:11,979 Sisi kiri berarti pergi ke x. 900 00:39:11,979 --> 00:39:12,520 x adalah alamat. 901 00:39:12,520 --> 00:39:15,520 Hal ini seperti 33 Oxford Street, atau OX1. 902 00:39:15,520 --> 00:39:18,690 Dan Bintang x berarti pergi ke yang alamat dan menempatkan apa ada? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Jadi memang, itulah yang dilakukan Nick. 905 00:39:21,290 --> 00:39:23,740 Dia mulai dengan oleh, dasarnya, mental 906 00:39:23,740 --> 00:39:26,270 menunjuk jari pada x, berikut panah 907 00:39:26,270 --> 00:39:30,670 ke kotak putih di kanan sisi, dan menempatkan nomor 42 di sana. 908 00:39:30,670 --> 00:39:34,120 Tapi kemudian hal mendapat sedikit berbahaya, kan? 909 00:39:34,120 --> 00:39:35,860 Binky tentang kehilangan kepalanya. 910 00:39:35,860 --> 00:39:39,465 >> Bintang y sama dengan 13, nasib buruk, berarti apa? 911 00:39:39,465 --> 00:39:43,620 Jadi Bintang y cara pergi ke alamat di y. 912 00:39:43,620 --> 00:39:45,630 Tapi apa adalah alamat di y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Baiklah, itu adalah nilai sampah, kan? 915 00:39:49,440 --> 00:39:50,800 Aku menarik sebagai tanda tanya. 916 00:39:50,800 --> 00:39:54,850 Nick menarik sebagai meringkuk panah. 917 00:39:54,850 --> 00:39:59,600 Dan segera setelah Anda mencoba untuk melakukan star y, mengatakan pergi ke sana, 918 00:39:59,600 --> 00:40:03,872 tapi tidak ada yang sah alamat, itu beberapa lokasi palsu, 919 00:40:03,872 --> 00:40:05,080 program akan crash. 920 00:40:05,080 --> 00:40:08,580 Dan kepala Binky ini akan untuk terbang di sini, seperti yang terjadi. 921 00:40:08,580 --> 00:40:12,130 >> Jadi pada akhirnya, program ini hanya datar keluar cacat. 922 00:40:12,130 --> 00:40:13,540 Itu program kereta. 923 00:40:13,540 --> 00:40:14,760 Dan itu perlu diperbaiki. 924 00:40:14,760 --> 00:40:18,260 Dan satu-satunya cara, benar-benar, untuk memperbaikinya akan, misalnya, baris ini, 925 00:40:18,260 --> 00:40:21,010 yang kita bahkan tidak bisa, karena Program jatuh terlalu cepat. 926 00:40:21,010 --> 00:40:26,170 Tapi jika kita untuk memperbaiki hal ini, apa yang Efek tidak melakukan y sama x miliki? 927 00:40:26,170 --> 00:40:30,010 Yah, pada dasarnya poin y di nilai apa pun x menunjuk. 928 00:40:30,010 --> 00:40:32,430 >> Jadi dalam cerita Nick, atau cerita Binky, baik 929 00:40:32,430 --> 00:40:34,640 x dan y yang menunjuk potongan putih memori, 930 00:40:34,640 --> 00:40:38,300 sehingga, akhirnya, ketika Anda jangan membintangi y sama dengan 13 lagi, 931 00:40:38,300 --> 00:40:43,080 Anda akhirnya menempatkan 13 di lokasi yang sesuai. 932 00:40:43,080 --> 00:40:47,640 Jadi semua lini ini sempurna sah, kecuali untuk yang satu ini, 933 00:40:47,640 --> 00:40:51,730 ketika itu terjadi sebelum Anda sebenarnya ditugaskan y beberapa nilai. 934 00:40:51,730 --> 00:40:54,290 >> Sekarang untungnya, Anda tidak harus melalui semua alasan 935 00:40:54,290 --> 00:40:56,560 jenis-jenis masalah pada Anda sendiri. 936 00:40:56,560 --> 00:40:59,310 Biarkan aku pergi ke depan dan membuka sebuah jendela terminal sini 937 00:40:59,310 --> 00:41:03,050 dan membuka, untuk sesaat, program super pendek yang 938 00:41:03,050 --> 00:41:04,360 juga adalah semacam sia-sia. 939 00:41:04,360 --> 00:41:05,152 Ini jelek. 940 00:41:05,152 --> 00:41:06,610 Itu tidak mencapai sesuatu yang berguna. 941 00:41:06,610 --> 00:41:10,180 Tapi itu menunjukkan masalah memori, jadi mari kita lihat. 942 00:41:10,180 --> 00:41:11,830 >> Main, super sederhana. 943 00:41:11,830 --> 00:41:14,830 Rupanya panggilan fungsi, f, dan kemudian kembali 0. 944 00:41:14,830 --> 00:41:16,310 Ini agak sulit untuk kekacauan ini. 945 00:41:16,310 --> 00:41:18,540 Jadi Main cukup baik, sejauh ini. 946 00:41:18,540 --> 00:41:20,100 >> Jadi f bermasalah. 947 00:41:20,100 --> 00:41:22,120 Dan hanya tidak menempatkan banyak usaha dalam penamaan itu 948 00:41:22,120 --> 00:41:23,990 di sini, untuk menjaga fokus pada kode. 949 00:41:23,990 --> 00:41:25,740 f memiliki dua jalur. 950 00:41:25,740 --> 00:41:27,610 Dan mari kita lihat apa yang sekarang terjadi. 951 00:41:27,610 --> 00:41:29,840 Jadi di satu sisi di sini-dan biarkan aku membuat 952 00:41:29,840 --> 00:41:32,680 ini konsisten dengan sebelumnya example-- di satu sisi, 953 00:41:32,680 --> 00:41:35,830 sisi kiri adalah melakukan apa, dalam bahasa Inggris? 954 00:41:35,830 --> 00:41:36,493 Ini Ini-- 955 00:41:36,493 --> 00:41:37,701 AUDIENCE: Menciptakan pointer. 956 00:41:37,701 --> 00:41:40,830 DAVID J. Malan: Membuat pointer ke int dan menyebutnya x. 957 00:41:40,830 --> 00:41:43,789 Jadi itu membuat salah satu kotak Aku terus menggambar pada layar sentuh. 958 00:41:43,789 --> 00:41:45,913 Dan sekarang, di kanan sisi, malloc, tentu saja, 959 00:41:45,913 --> 00:41:47,420 mengalokasikan sepotong memori. 960 00:41:47,420 --> 00:41:49,989 Dan hanya harus jelas, bagaimana banyak memori itu rupanya 961 00:41:49,989 --> 00:41:52,030 mengalokasikan, jika Anda hanya jenis melakukan matematika di sini? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Jadi 40 byte. 964 00:41:54,040 --> 00:41:57,400 Dan aku tahu bahwa hanya karena saya tahu suatu int, pada alat CS50, setidaknya, 965 00:41:57,400 --> 00:41:58,060 adalah empat byte. 966 00:41:58,060 --> 00:41:59,610 Jadi 10 kali 4 adalah 40. 967 00:41:59,610 --> 00:42:04,924 Jadi ini adalah menyimpan suatu x, alamat dari keluar pertama dari 40 int yang 968 00:42:04,924 --> 00:42:07,340 telah dialokasikan ruang belakang, ke belakang, ke belakang, ke belakang. 969 00:42:07,340 --> 00:42:08,470 >> Dan itulah yang penting tentang malloc. 970 00:42:08,470 --> 00:42:11,261 Tidak perlu memori kecil di sini, sedikit di sini, sedikit di sini. 971 00:42:11,261 --> 00:42:14,220 Ini memberi Anda satu sepotong memori, contiguously, dari operasi 972 00:42:14,220 --> 00:42:15,240 sistem. 973 00:42:15,240 --> 00:42:18,500 >> Sekarang apa tentang hal ini, x braket 10 sama dengan 0? 974 00:42:18,500 --> 00:42:19,470 Baris Sewenang-wenang kode. 975 00:42:19,470 --> 00:42:21,100 Itu tidak mencapai sesuatu yang berguna. 976 00:42:21,100 --> 00:42:26,128 Tapi itu menarik, karena x braket 10--? 977 00:42:26,128 --> 00:42:26,628 Ya? 978 00:42:26,628 --> 00:42:27,912 >> AUDIENCE: [Tak terdengar]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. Malan: x braket 10 tidak harus nol. 980 00:42:30,500 --> 00:42:35,070 Null rinci hanya datang ke dalam bermain dengan string, pada akhir string. 981 00:42:35,070 --> 00:42:36,700 Tapi pikiran yang baik. 982 00:42:36,700 --> 00:42:39,615 >> Seberapa besar adalah array ini, bahkan meskipun aku sudah dialokasikan 40 bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Ini 0 sampai sembilan, kan? 985 00:42:43,690 --> 00:42:45,120 Ini 10 int, jumlah. 986 00:42:45,120 --> 00:42:48,790 40 byte, tetapi 10 int, diindeks dari 0 sampai 0. 987 00:42:48,790 --> 00:42:50,930 >> Jadi apa itu x braket 10? 988 00:42:50,930 --> 00:42:53,090 Ini sebenarnya beberapa nilai sampah yang tidak diketahui. 989 00:42:53,090 --> 00:42:54,780 Ini memori yang bukan milik saya. 990 00:42:54,780 --> 00:42:59,650 Aku tidak boleh menyentuh bahwa byte nomor 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Aku akan sedikit terlalu jauh. 992 00:43:01,420 --> 00:43:04,490 >> Dan memang, jika saya menjalankan ini program, mungkin sangat baik kecelakaan. 993 00:43:04,490 --> 00:43:05,790 Tapi kadang-kadang, kita akan beruntung. 994 00:43:05,790 --> 00:43:07,706 Dan jadi hanya untuk menunjukkan ini-- dan terus terang, 995 00:43:07,706 --> 00:43:11,000 Anda tidak pernah tahu sebelum Anda jangan itu-- mari kita jalankan ini. 996 00:43:11,000 --> 00:43:12,480 Itu tidak benar-benar kecelakaan. 997 00:43:12,480 --> 00:43:15,032 >> Tapi jika saya mengubah ini, untuk Misalnya, untuk menjadi seperti 1.000, 998 00:43:15,032 --> 00:43:16,740 untuk membuat ini benar-benar disengaja, mari kita lihat 999 00:43:16,740 --> 00:43:18,710 jika kita bisa mendapatkannya untuk kecelakaan kali ini. 1000 00:43:18,710 --> 00:43:20,070 OK, itu tidak crash. 1001 00:43:20,070 --> 00:43:22,600 Bagaimana sekitar 100.000? 1002 00:43:22,600 --> 00:43:25,000 Mari kita membuat kembali, dan sekarang jalankan kembali itu. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Fiuh. 1005 00:43:25,960 --> 00:43:26,460 Baiklah. 1006 00:43:26,460 --> 00:43:29,090 Jadi tampaknya, sekali lagi, ini segmen memori, sehingga untuk berbicara, 1007 00:43:29,090 --> 00:43:32,660 yang cukup besar, sehingga kami dapat beruntung lagi dan lagi. 1008 00:43:32,660 --> 00:43:36,510 Tapi akhirnya, setelah Anda mendapatkan konyol dan benar-benar pergi jauh keluar di layar, 1009 00:43:36,510 --> 00:43:39,120 Anda menyentuh memori yang benar-benar, benar-benar bukan milik Anda. 1010 00:43:39,120 --> 00:43:40,870 >> Tapi terus terang, ini jenis bug akan 1011 00:43:40,870 --> 00:43:43,020 lebih sulit dan lebih sulit untuk mencari tahu sendiri. 1012 00:43:43,020 --> 00:43:47,880 Tapi untungnya, sebagai programmer, kita harus alat yang memungkinkan kita untuk melakukan hal ini untuk kita. 1013 00:43:47,880 --> 00:43:50,140 Jadi ini, mungkin, salah satu program paling jelek, 1014 00:43:50,140 --> 00:43:52,060 bahkan lebih jelek dari keluaran gdb ini. 1015 00:43:52,060 --> 00:43:55,670 Namun selalu memiliki garis atau dua yang super berguna. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind adalah program yang membantu Anda tidak men-debug program, per se, 1017 00:44:00,310 --> 00:44:03,500 tetapi menemukan memori terkait masalah, khususnya. 1018 00:44:03,500 --> 00:44:07,590 Ini akan otomatis menjalankan kode Anda untuk Anda dan mencari setidaknya dua hal. 1019 00:44:07,590 --> 00:44:10,680 Satu, apakah Anda melakukan sesuatu disengaja seperti memori sentuh 1020 00:44:10,680 --> 00:44:11,980 yang bukan milik Anda? 1021 00:44:11,980 --> 00:44:13,590 Ini akan membantu Anda menemukan kasus-kasus. 1022 00:44:13,590 --> 00:44:15,710 >> Dan dua, itu akan membantu Anda menemukan sesuatu yang disebut 1023 00:44:15,710 --> 00:44:19,270 kebocoran memori, yang kita miliki benar-benar diabaikan, naif, 1024 00:44:19,270 --> 00:44:21,380 untuk beberapa waktu dan bahagia. 1025 00:44:21,380 --> 00:44:23,140 Tapi ternyata, semua kali ini, setiap kali 1026 00:44:23,140 --> 00:44:26,620 Anda telah disebut getString di begitu banyak program kita, 1027 00:44:26,620 --> 00:44:28,930 Anda meminta operasi sistem memori, 1028 00:44:28,930 --> 00:44:32,070 tetapi Anda memiliki ingatan apapun dari yang pernah memberikan 1029 00:44:32,070 --> 00:44:36,169 kembali, melakukan unalloc, atau bebas, seperti disebut. 1030 00:44:36,169 --> 00:44:37,960 Tidak, karena kami belum pernah meminta Anda untuk melakukannya. 1031 00:44:37,960 --> 00:44:41,250 >> Tapi selama ini, program-program Anda telah menulis di C 1032 00:44:41,250 --> 00:44:43,800 telah bocor memori, meminta operasi 1033 00:44:43,800 --> 00:44:46,190 sistem untuk lebih dan lebih memori untuk string dan yang lainnya, 1034 00:44:46,190 --> 00:44:47,870 tetapi tidak pernah menyerahkan kembali. 1035 00:44:47,870 --> 00:44:50,080 Dan sekarang ini agak sedikit terlalu menyederhanakan sebuah, 1036 00:44:50,080 --> 00:44:53,550 tetapi jika Anda sudah pernah menjalankan Mac atau PC Anda untuk beberapa waktu, pembukaan 1037 00:44:53,550 --> 00:44:55,790 banyak program, mungkin menutup program, 1038 00:44:55,790 --> 00:44:57,795 dan meskipun Anda komputer belum jatuh, 1039 00:44:57,795 --> 00:45:01,690 itu semakin jauh lebih lambat, seolah-olah itu benar-benar 1040 00:45:01,690 --> 00:45:04,290 menggunakan banyak memori atau sumber daya, meskipun, 1041 00:45:04,290 --> 00:45:06,070 jika Anda tidak bahkan menyentuh keyboard, 1042 00:45:06,070 --> 00:45:10,430 yang bisa akan-- tapi tidak bisa always-- bahwa program yang Anda jalankan 1043 00:45:10,430 --> 00:45:11,920 memiliki sendiri kebocoran memori. 1044 00:45:11,920 --> 00:45:15,645 Dan mereka terus bertanya OS untuk lebih dan lebih banyak memori, tetapi melupakan tentang hal itu, 1045 00:45:15,645 --> 00:45:18,470 tidak benar-benar menggunakannya, tapi Oleh karena itu mengambil memori menjauhi 1046 00:45:18,470 --> 00:45:20,500 dari program lain yang mungkin menginginkannya. 1047 00:45:20,500 --> 00:45:23,940 Jadi itulah penjelasan umum. 1048 00:45:23,940 --> 00:45:25,940 Sekarang di sinilah Valgrind ini Output benar-benar 1049 00:45:25,940 --> 00:45:29,290 mengerikan untuk mereka yang kurang dan lebih mirip nyaman. 1050 00:45:29,290 --> 00:45:32,690 Tapi yang menarik hal yang benar di sini. 1051 00:45:32,690 --> 00:45:37,060 Hal ini memberitahu saya sebuah menulis tidak valid ukuran empat terjadi dalam program ini, 1052 00:45:37,060 --> 00:45:40,640 khususnya, pada baris 21 dari memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Jika saya pergi ke baris 21, hm, memang ada adalah menulis valid ukuran empat. 1054 00:45:45,450 --> 00:45:46,250 Mengapa ukuran empat? 1055 00:45:46,250 --> 00:45:49,500 Nah, number-- ini dan itu bisa anything-- adalah int. 1056 00:45:49,500 --> 00:45:50,450 Jadi empat byte. 1057 00:45:50,450 --> 00:45:52,550 Jadi aku menempatkan empat byte di mana mereka tidak termasuk. 1058 00:45:52,550 --> 00:45:55,080 Itulah yang Valgrind sebenarnya mengatakan. 1059 00:45:55,080 --> 00:45:57,600 Selain itu, juga akan katakan padaku, karena kami akan melihat, 1060 00:45:57,600 --> 00:46:01,490 karena Anda menjalankan ini dalam PSET masa depan, jika dan ketika Anda sudah bocor memori, yang memang 1061 00:46:01,490 --> 00:46:05,300 Aku punya, karena saya sudah menelepon malloc, tapi aku belum benar-benar 1062 00:46:05,300 --> 00:46:08,010 disebut, dalam hal ini, gratis, yang pada akhirnya kita akan melihat 1063 00:46:08,010 --> 00:46:09,830 adalah kebalikan dari malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Jadi sekarang, saya pikir, contoh terakhir. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Jadi yang satu ini sedikit lebih misterius, tapi itu mungkin 1068 00:46:16,690 --> 00:46:19,180 alasan terbesar untuk berhati-hati dengan memori, 1069 00:46:19,180 --> 00:46:24,490 dan alasan bahwa banyak program dan / atau server web, bahkan sampai hari ini, 1070 00:46:24,490 --> 00:46:28,200 diambil alih oleh orang-orang jahat di suatu tempat di internet yang entah bagaimana 1071 00:46:28,200 --> 00:46:33,390 mengirimkan paket palsu ke server Anda mencoba untuk berkompromi account Anda, 1072 00:46:33,390 --> 00:46:36,420 atau mengambil data Anda, atau hanya umumnya mengambil alih mesin. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, sebagai nama menyarankan, berarti 1074 00:46:38,910 --> 00:46:40,740 meluap bukan int, tapi penyangga. 1075 00:46:40,740 --> 00:46:43,490 Dan buffer adalah cara mewah mengatakan itu adalah sekelompok memori. 1076 00:46:43,490 --> 00:46:46,710 >> Dan memang, aku menelepon string sebelum penyangga, bukan s. 1077 00:46:46,710 --> 00:46:49,234 Karena jika itu penyangga, seperti dalam arti YouTube, 1078 00:46:49,234 --> 00:46:52,400 atau setiap kali Anda sedang menonton video, Anda mungkin telah melihat buffering kata, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 Ini sangat menjengkelkan. 1081 00:46:54,240 --> 00:46:55,990 Dan itu hanya berarti bahwa pemutar video Anda 1082 00:46:55,990 --> 00:46:58,710 sedang mencoba untuk men-download banyak byte, banyak byte 1083 00:46:58,710 --> 00:47:00,170 dari video dari internet. 1084 00:47:00,170 --> 00:47:02,920 Tapi itu lambat, sehingga mencoba untuk men-download banyak dari mereka 1085 00:47:02,920 --> 00:47:06,430 untuk mengisi buffer, wadah, sehingga Anda memiliki cukup bytes yang kemudian dapat 1086 00:47:06,430 --> 00:47:09,174 menampilkan video, tanpa berhenti terus-menerus. 1087 00:47:09,174 --> 00:47:11,340 Tapi ternyata, Anda bisa memiliki buffer ini besar. 1088 00:47:11,340 --> 00:47:15,710 Tapi cobalah untuk menempatkan banyak data ini dalam itu, dan sangat hal-hal buruk bisa terjadi. 1089 00:47:15,710 --> 00:47:22,780 Jadi misalnya, mari kita lihat teaser akhir ini sebuah contoh. 1090 00:47:22,780 --> 00:47:24,720 Ini adalah program lain itu, pada pandangan pertama, 1091 00:47:24,720 --> 00:47:26,540 tidak melakukan sesuatu yang super berguna. 1092 00:47:26,540 --> 00:47:29,590 Itu punya fungsi utama yang memanggil fungsi itu, f. 1093 00:47:29,590 --> 00:47:36,640 Dan fungsi itu, f, di sini, memiliki array char, disebut c, ukuran 12. 1094 00:47:36,640 --> 00:47:39,340 Dan kemudian ia menggunakan ini fungsi baru yang disebut strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Ternyata, dengan sederhana, baris kode sederhana, hanya dua baris, 1097 00:47:45,190 --> 00:47:49,130 kami telah membuat seluruh program saya, dan oleh karena itu, seluruh komputer saya, 1098 00:47:49,130 --> 00:47:54,000 dan akun pengguna saya, dan kerasku mendorong berpotensi rentan terhadap siapa pun 1099 00:47:54,000 --> 00:47:58,170 yang tahu dan cukup baik untuk menjalankan program ini dengan baris perintah tertentu 1100 00:47:58,170 --> 00:47:58,900 argumen. 1101 00:47:58,900 --> 00:48:03,400 Dengan kata lain, jika orang jahat ini menempatkan dalam argvargv [1] dengan mengetikkan 1102 00:48:03,400 --> 00:48:08,750 pada keyboard sangat khusus dibuat String, tidak abc, 123, tapi pada dasarnya, 1103 00:48:08,750 --> 00:48:15,180 simbol biner yang mewakili executable code, sebuah program yang ia menulis, 1104 00:48:15,180 --> 00:48:19,190 dengan program sederhana ini, yang perwakilan dari ribuan program 1105 00:48:19,190 --> 00:48:23,610 yang sama rentan, berani bilang, ia akhirnya dapat menghapus semua 1106 00:48:23,610 --> 00:48:26,680 file di harddisk, mendapatkan berkedip cepat sehingga ia dapat 1107 00:48:26,680 --> 00:48:30,170 mengetik perintah sendiri, email semua file untuk diriku sendiri. 1108 00:48:30,170 --> 00:48:34,660 Apa pun yang bisa saya lakukan, dia atau dia bisa lakukan dengan kode ini. 1109 00:48:34,660 --> 00:48:36,575 >> Kami tidak akan cukup mengatasi ini. 1110 00:48:36,575 --> 00:48:38,700 Dan pada kenyataannya, itu akan melibatkan sedikit gambaran 1111 00:48:38,700 --> 00:48:41,470 seperti ini, yang kami akan segera datang untuk memahami semua yang lebih baik. 1112 00:48:41,470 --> 00:48:44,480 Tapi untuk saat ini, mari kita berakhir pada apa, mudah-mudahan, sedikit lebih 1113 00:48:44,480 --> 00:48:48,360 dimengerti XKCD lelucon, sampai kita melanjutkan waktu berikutnya. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Baiklah. 1116 00:48:51,600 --> 00:48:53,446 Sampai jumpa pada hari Rabu. 1117 00:48:53,446 --> 00:48:54,754 >> [MUSIC PLAYING] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: Dan sekarang, dalam pikiran, berdasarkan Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Memori adalah seperti melompat ke tumpukan daun emas pada hari Minggu sore. 1121 00:49:04,770 --> 00:49:09,000 Angin bertiup, melemparkan Anda hair-- oh, aku rindu hari-hari when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Tertawa] 1124 00:49:12,650 --> 00:49:13,750