1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MUZIK bermain] 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 permulaan minggu 5. 6 00:00:16,009 --> 00:00:18,050 Dan seperti yang anda mungkin perasan, beberapa bahan 7 00:00:18,050 --> 00:00:21,050 semakin sedikit kompleks, lebih padat kecil. 8 00:00:21,050 --> 00:00:24,560 >> Dan ia sangat mudah, terutamanya jika anda berada dalam tabiat itu untuk beberapa waktu, 9 00:00:24,560 --> 00:00:28,600 yang akan cuba untuk tulisan oragn ayam turun paling apa-apa yang kita lakukan, kita katakan di dalam kelas. 10 00:00:28,600 --> 00:00:31,626 Tetapi sedar, yang tidak mungkin pendekatan pedagogi yang sesuai 11 00:00:31,626 --> 00:00:34,250 untuk pembelajaran jenis ini bahan, dan bahan amnya. 12 00:00:34,250 --> 00:00:37,250 Dan kami gembira mengumumkan bahawa Gheng CS50 sendiri 13 00:00:37,250 --> 00:00:39,780 Gong telah mula menyediakan satu set nota berkanun 14 00:00:39,780 --> 00:00:42,100 untuk kursus ini, harapan yang ialah, satu, ini 15 00:00:42,100 --> 00:00:44,030 bukan sahaja berfungsi sebagai rujukan dan sumber yang 16 00:00:44,030 --> 00:00:47,410 mengkaji bahan dan pergi kembali melalui bahan yang mungkin mempunyai 17 00:00:47,410 --> 00:00:51,230 melarikan diri anda kali pertama sekitar, tetapi juga supaya kepala anda boleh menjadi lebih 18 00:00:51,230 --> 00:00:53,740 sehingga dari bawah, apabila ia tiba masa untuk bersyarah, 19 00:00:53,740 --> 00:00:56,960 supaya kamu melibatkan diri lebih teliti, sebagai 20 00:00:56,960 --> 00:00:59,170 berbanding dengan lebih scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Dengan itu berkata, apa yang anda dapati dari laman web ini adalah apa-apa dokumen seperti ini. 22 00:01:02,510 --> 00:01:04,660 Dan notis, di sebelah kiri atas, ada bukan sahaja isi kandungan, 23 00:01:04,660 --> 00:01:06,920 tetapi juga kod masa itu dengan serta-merta akan melompat anda 24 00:01:06,920 --> 00:01:09,077 kepada bahagian yang berkenaan dalam talian video. 25 00:01:09,077 --> 00:01:11,410 Dan apa Chang di sini telah dilakukan adalah, pada dasarnya, didokumenkan 26 00:01:11,410 --> 00:01:13,340 apa yang berlaku di ini kuliah tertentu. 27 00:01:13,340 --> 00:01:16,370 Dan banyak kuliah adalah sudah dalam talian sekarang dengan URL ini. 28 00:01:16,370 --> 00:01:20,110 Dan kami akan terus pos selebihnya dari orang-orang pada akhir minggu ini, 29 00:01:20,110 --> 00:01:22,380 jadi jangan mengambil kesempatan daripada sumber itu. 30 00:01:22,380 --> 00:01:25,740 >> Jadi tanpa berlengah-lengah lagi, kami mula mengupas kembali 31 00:01:25,740 --> 00:01:28,180 lapisan yang telah tali untuk beberapa ketika. 32 00:01:28,180 --> 00:01:30,670 Dan apa yang kita katakan tali sebenarnya minggu lepas? 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 char bintang, baik, apa adakah yang benar-benar bermakna? 36 00:01:34,900 --> 00:01:37,150 Nah, selama ini, jika kita telah telah memanggil fungsi, 37 00:01:37,150 --> 00:01:40,450 seperti getString, dan penyimpanan pulangan yang dipanggil 38 00:01:40,450 --> 00:01:42,910 nilai getString dalam variable-- ia dipanggil 39 00:01:42,910 --> 00:01:47,721 s Jenis string-- kita telah menulis garis kod di sana atas. 40 00:01:47,721 --> 00:01:49,970 Dan ia hanya apabila saya melihat saya tulisan tangan diperbesarkan di sini 41 00:01:49,970 --> 00:01:51,930 saya menyedari betapa kejam ini. 42 00:01:51,930 --> 00:01:54,180 >> Walau bagaimanapun, mari kita andaikan bahawa, di sebelah kanan 43 00:01:54,180 --> 00:01:57,070 adalah, bagaimanapun, yang munasabah gambaran apa yang 44 00:01:57,070 --> 00:01:58,880 telah berlaku semua ini masa dengan getString. 45 00:01:58,880 --> 00:02:00,380 getString, sudah tentu, mendapat rentetan. 46 00:02:00,380 --> 00:02:01,691 Tapi apa yang benar-benar bermakna? 47 00:02:01,691 --> 00:02:04,190 Ini bermakna ia menjadi sebahagian daripada memori dari sistem operasi 48 00:02:04,190 --> 00:02:06,040 dengan memanggil fungsi, yang dipanggil malloc. 49 00:02:06,040 --> 00:02:07,390 Tetapi lebih kepada yang kemudian. 50 00:02:07,390 --> 00:02:09,139 Dan kemudian ia populates bahawa sebahagian daripada memori 51 00:02:09,139 --> 00:02:11,764 dengan huruf yang pengguna mempunyai ditaip dalam, diikuti oleh, sudah tentu, 52 00:02:11,764 --> 00:02:14,800 watak batal, atau garis sendeng terbalik sifar pada akhirnya. 53 00:02:14,800 --> 00:02:18,280 >> Sementara itu, di sebelah kiri cerita ini, selama ini, 54 00:02:18,280 --> 00:02:20,850 kita telah mengisytiharkan pembolehubah, seperti s. 55 00:02:20,850 --> 00:02:24,770 Dan berubah itulah yang kini akan mula memanggil penunjuk. 56 00:02:24,770 --> 00:02:29,190 Ia bukan satu kotak di dalam yang kita meletakkan tali, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 tetapi sebaliknya kita masukkan ke dalam persegi 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 Yeah? 60 00:02:35,390 --> 00:02:37,118 >> PENONTON: Alamat di mana ia terletak di ingatan. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. MALAN: Tepat sekali. 62 00:02:38,118 --> 00:02:40,690 Alamat di mana Daven terletak dalam ingatan. 63 00:02:40,690 --> 00:02:44,650 Dan tidak di mana semua Daven terletak, per se, tetapi khususnya alamat 64 00:02:44,650 --> 00:02:45,150 daripada apa? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Yeah? 67 00:02:46,810 --> 00:02:47,460 >> PENONTON: aksara Pertama. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. MALAN: Watak pertama di Daven, yang, dalam kes ini, 69 00:02:50,209 --> 00:02:53,820 Saya dicadangkan adalah sewenang-wenangnya dan unrealistically 1, Ox1, 70 00:02:53,820 --> 00:02:55,910 yang hanya bermaksud nombor perenambelasan 1. 71 00:02:55,910 --> 00:02:57,993 Tetapi ia mungkin akan menjadi nombor yang lebih besar 72 00:02:57,993 --> 00:03:01,260 bahawa kita mungkin menarik dengan 0x sebagai awalan, 73 00:03:01,260 --> 00:03:02,806 mewakili watak perenambelasan. 74 00:03:02,806 --> 00:03:05,930 Dan kerana kita tidak perlu tahu di mana yang lain daripada watak-watak Daven 75 00:03:05,930 --> 00:03:09,860 adalah dengan sebab apa reka bentuk yang mudah keputusan yang telah dibuat bertahun-tahun yang lalu? 76 00:03:09,860 --> 00:03:10,548 Yeah? 77 00:03:10,548 --> 00:03:11,651 >> PENONTON: backslash 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. MALAN: Ya, betul-betul. 79 00:03:12,900 --> 00:03:18,100 Backslash 0 membolehkan anda, walaupun dalam masa linear, untuk merentasi tali, 80 00:03:18,100 --> 00:03:20,400 berjalan dari kiri ke kanan, dengan gelung, atau seketika 81 00:03:20,400 --> 00:03:22,608 gelung, atau sesuatu seperti itu, dan menentukan, oh, di sini 82 00:03:22,608 --> 00:03:24,751 adalah akhir tali telefon ini. 83 00:03:24,751 --> 00:03:27,000 Jadi dengan hanya alamat di permulaan rentetan, 84 00:03:27,000 --> 00:03:30,290 kita dapat mengakses keseluruhan daripada , kerana selama ini, 85 00:03:30,290 --> 00:03:32,030 rentetan baru sahaja menjadi bintang char. 86 00:03:32,030 --> 00:03:36,370 >> Jadi ia pasti halus untuk terus menggunakan perpustakaan CS50 dan abstrak ini, 87 00:03:36,370 --> 00:03:38,440 jadi untuk bercakap, tetapi kita akan mula melihat dengan tepat 88 00:03:38,440 --> 00:03:41,230 apa yang telah berlaku di bawah masa ini keseluruhan. 89 00:03:41,230 --> 00:03:45,260 Jadi, anda mungkin ingat contoh ini, juga, dari semasa lepas, 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 Tetapi kita mula untuk menyelesaikan ini. 92 00:03:49,070 --> 00:03:52,020 >> Tetapi sebagai ulang kaji yang mungkin, mungkin saya menarik minat seseorang 93 00:03:52,020 --> 00:03:54,261 dalam gajah merah jambu hari ini, juga dibuat oleh Chang? 94 00:03:54,261 --> 00:03:55,760 Bagaimana pula dengan anda di hadapan? [Didengar]. 95 00:03:55,760 --> 00:03:56,660 Marilah naik. 96 00:03:56,660 --> 00:03:58,740 >> Dan dalam pada itu, kerana anda datang, mari kita 97 00:03:58,740 --> 00:04:01,670 mempertimbangkan untuk seketika apa kod ini sebenarnya lakukan. 98 00:04:01,670 --> 00:04:04,917 Ia mengisytiharkan dua pembolehubah sehingga atas, s dan t, dan memanggil getString. 99 00:04:04,917 --> 00:04:08,250 Ini bukan satu yang mesra pengguna program yang sangat, kerana ia tidak memberitahu anda apa yang perlu dilakukan. 100 00:04:08,250 --> 00:04:10,541 Tetapi mari kita hanya menganggap kami memberi tumpuan kepada bahagian yang berair. 101 00:04:10,541 --> 00:04:14,470 Dan kemudian kita lakukan, jika s sama sama t, ada yang berkata printf, 102 00:04:14,470 --> 00:04:16,170 anda taip perkara yang sama. 103 00:04:16,170 --> 00:04:16,670 Hello. 104 00:04:16,670 --> 00:04:17,050 Apa 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, baik untuk bertemu dengan kamu. 107 00:04:19,529 --> 00:04:21,800 Jadi cabaran anda di tangan untuk gajah ini 108 00:04:21,800 --> 00:04:25,230 ialah dengan menarik kita gambar apa yang diwakili dalam dua yang pertama 109 00:04:25,230 --> 00:04:25,970 baris. 110 00:04:25,970 --> 00:04:28,139 Jadi s dan t mungkin diwakili bagaimana pada skrin? 111 00:04:28,139 --> 00:04:30,680 Dan anda boleh menarik dengan jari anda pada skrin besar. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Jadi ada dua bahagian kepada 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 kita boleh memulakan melukis gambar yang 117 00:04:42,630 --> 00:04:46,340 mewakili apa yang berlaku di sini dalam ingatan, kau kata? 118 00:04:46,340 --> 00:04:49,150 Dan biarlah saya memberitahu anda menjelaskan apa yang anda lakukan seperti yang anda pergi. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Well, pertama, ia akan meminta anda untuk mendapatkan rentetan input. 121 00:04:58,890 --> 00:05:00,439 Dan ia 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 dipanggil apa? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Teruskan usaha. 127 00:05:04,450 --> 00:05:05,575 Saya tidak bermaksud untuk mengganggu. 128 00:05:05,575 --> 00:05:07,060 Janelle: Maaf. 129 00:05:07,060 --> 00:05:14,237 Jadi ia akan menjadi input alamat tersebut tidak daripada-- pasti. 130 00:05:14,237 --> 00:05:17,320 Saya tidak dapat ingat dengan tepat jumlah itu, tetapi saya percaya ia bermula dengan 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. MALAN: Itu betul, kerana saya membuat nombor sehingga, 132 00:05:18,420 --> 00:05:19,650 jadi tidak ada jawapan yang betul. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Bermula dengan 0 arka. 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 Pasti. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: Kemudian jika adalah 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 2 unsur. 139 00:05:33,629 --> 00:05:36,670 DAVID J. MALAN: Dan yang sekeping gambar yang anda melukis sekarang? 140 00:05:36,670 --> 00:05:37,690 Laungan getString? 141 00:05:37,690 --> 00:05:38,830 Atau pengisytiharan s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Perisytiharan itu s, saya percaya. 143 00:05:42,890 --> 00:05:45,980 Oh, yang getString, kerana ia akan akan dimasukkan ke dalam setiap [? kawasan. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. MALAN: Baik. 145 00:05:46,510 --> 00:05:47,051 Tepat sekali. 146 00:05:47,051 --> 00:05:49,300 Walaupun ini berkesan kembali pelbagai, ingat, 147 00:05:49,300 --> 00:05:53,300 apabila kita kembali rentetan, kita boleh indeks ke dalam tali yang menggunakan 01 dan 2. 148 00:05:53,300 --> 00:05:56,180 Secara teknikal, ini mungkin diwakili oleh alamat individu, 149 00:05:56,180 --> 00:05:57,100 tetapi itulah denda. 150 00:05:57,100 --> 00:06:00,170 >> Jadi andaikan, jika saya boleh hanya cepat menghantar kepada mana kita berhenti 151 00:06:00,170 --> 00:06:04,320 Kali terakhir, jika salah satu tali adalah g b e, 152 00:06:04,320 --> 00:06:10,337 0 garis sendeng terbalik, dengan itu mewakili Gabe ini input, bagaimana kita boleh mewakili s sekarang? 153 00:06:10,337 --> 00:06:12,670 Jika ini adalah memori itu telah dikembalikan oleh getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Adakah ia diwakili oleh arka? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. MALAN: Dengan arka? 157 00:06:18,750 --> 00:06:19,130 Nah, tidak. 158 00:06:19,130 --> 00:06:21,171 Mari kita katakan, bergambar, biarlah saya pergi ke hadapan 159 00:06:21,171 --> 00:06:25,710 dan mencadangkan bahawa, jika ini adalah s, ini adalah nilai pulangan getString. 160 00:06:25,710 --> 00:06:29,482 Dan anda telah disediakan ini sebagai 0, 1, 2, yang adalah sempurna yang munasabah, kerana kita 161 00:06:29,482 --> 00:06:30,940 boleh indeks ke dalam tali, seperti itu. 162 00:06:30,940 --> 00:06:33,340 Tetapi untuk menjadi konsisten dengan Kali terakhir, biarlah saya pergi ke hadapan 163 00:06:33,340 --> 00:06:37,310 dan sewenang-wenangnya mencadangkan bahawa 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 Dan sebagainya, hanya untuk menjadi super yang jelas, apa yang berlaku 166 00:06:41,430 --> 00:06:44,580 pergi dalam s akibat yang baris pertama kod, anda akan berkata? 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 sekali. 169 00:06:46,420 --> 00:06:47,190 Jadi menangani 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Dan sementara itu, biarlah saya pergi ke hadapan dan salinan banyak daripada apa yang anda lakukan 172 00:06:51,230 --> 00:06:52,740 dan menambah t saya sendiri di sini. 173 00:06:52,740 --> 00:06:56,340 Jika saya menaip Gabe sekali lagi, kali kedua, 174 00:06:56,340 --> 00:07:01,530 apabila digesa 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: Yeah. 179 00:07:06,850 --> 00:07:08,516 Janelle: Atau ia juga di ruang yang sama? 180 00:07:08,516 --> 00:07:11,940 DAVID J. MALAN: Biar saya mencadangkan, yeah, betul-betul, jadi dalam kotak tambahan. 181 00:07:11,940 --> 00:07:15,230 Tetapi apa yang penting sekarang ialah, walaupun walaupun saya telah disediakan ini cukup dekat 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, ini adalah 0x2-- pada hakikatnya, 183 00:07:18,650 --> 00:07:25,750 ini kini mungkin menjadi alamat 0x10, misalnya, dan 0x11, 0x12 dan, 184 00:07:25,750 --> 00:07:26,870 dan sebagainya. 185 00:07:26,870 --> 00:07:29,955 Dan sebagainya, jika itu berlaku, 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 sekali. 188 00:07:31,830 --> 00:07:33,180 Jadi 0x10. 189 00:07:33,180 --> 00:07:34,570 Dan sekarang, soalan akhir. 190 00:07:34,570 --> 00:07:37,510 Anda telah, setakat ini, terpaksa bekerja yang paling sukar bagi gajah setakat ini. 191 00:07:37,510 --> 00:07:42,650 Sekarang, jika saya tarik kod sekali lagi, apabila saya melakukan, sejajar tiga, 192 00:07:42,650 --> 00:07:47,630 jika s sama sama t, apa yang aku sebenarnya Perbandingan yang kami disediakan 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 sekali. 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 Dalam erti kata lain, adalah sama 1 sama dengan 10? 197 00:07:56,210 --> 00:07:59,710 Dan sudah tentu, Jawapan yang jelas sekarang ialah, tidak. 198 00:07:59,710 --> 00:08:02,920 Dan program ini akhirnya akan mencetak apa, boleh kau kata? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Adakah ia, anda taip perkara yang sama? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. MALAN: Jadi, jika adalah 1 dan t adalah 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Anda menaip perkara yang berbeza. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. MALAN: Tepat sekali. 204 00:08:13,570 --> 00:08:14,480 Anda taip perkara yang berbeza. 205 00:08:14,480 --> 00:08:14,850 Baiklah. 206 00:08:14,850 --> 00:08:16,714 Jadi satu pusingan tepukan, jika kita boleh, di sini. 207 00:08:16,714 --> 00:08:17,214 [Tepuk tangan] 208 00:08:17,214 --> 00:08:17,708 Itu adalah menyakitkan. 209 00:08:17,708 --> 00:08:18,208 Saya tahu. 210 00:08:18,208 --> 00:08:19,684 Baik dilakukan. 211 00:08:19,684 --> 00:08:24,690 Jadi sekarang mari kita lihat jika kita tidak boleh mengusik selain apa yang tetap itu. 212 00:08:24,690 --> 00:08:28,040 Dan sudah tentu, apabila kita tetap this-- yang kini saya akan mewakili dalam green-- 213 00:08:28,040 --> 00:08:29,690 kita melakukan beberapa penambahbaikan di sini. 214 00:08:29,690 --> 00:08:32,409 Pertama, seperti yang kewarasan memeriksa, saya pertama memeriksa 215 00:08:32,409 --> 00:08:35,110 jika s sama batal dan t sama null. 216 00:08:35,110 --> 00:08:39,440 Dan hanya untuk menjadi jelas, apabila mungkin s atau t batal dalam kod seperti ini? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Apabila s atau t mungkin batal. 219 00:08:44,490 --> 00:08:44,990 Yeah? 220 00:08:44,990 --> 00:08:45,990 >> PENONTON: [didengar]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. MALAN: Tepat sekali. 223 00:08:50,510 --> 00:08:52,840 Jika rentetan yang pengguna ditaip adalah terlalu panjang 224 00:08:52,840 --> 00:08:56,140 untuk dimuatkan ke dalam memori, atau kes sudut pelik seperti itu, 225 00:08:56,140 --> 00:08:59,010 getString, seperti yang kita akan melihat, secara literal hari ini, dalam dokumentasi, 226 00:08:59,010 --> 00:09:02,330 berkata ia akan kembali sebagai batal nilai sentinel khas, 227 00:09:02,330 --> 00:09:05,417 atau hanya jenis simbol khas yang bermaksud sesuatu yang salah. 228 00:09:05,417 --> 00:09:07,500 Oleh itu, kita mahu untuk memeriksa itu, kerana ia ternyata 229 00:09:07,500 --> 00:09:09,720 null itu adalah nilai yang sangat berbahaya. 230 00:09:09,720 --> 00:09:14,250 >> Selalunya, jika anda cuba untuk melakukan sesuatu dengan null melibatkan function-- lulus ia 231 00:09:14,250 --> 00:09:17,470 sebagai input, instance-- fungsi yang mungkin sangat akan kemalangan dan, dengan itu, 232 00:09:17,470 --> 00:09:19,090 mengambil program keseluruhan anda. 233 00:09:19,090 --> 00:09:22,570 Jadi garis ketiga ini kini hanya kewarasan yang memeriksa, menyemak kesilapan, jika anda akan. 234 00:09:22,570 --> 00:09:25,450 Itu tabiat yang baik sekarang untuk kami untuk masuk ke dalam bila-bila masa kita 235 00:09:25,450 --> 00:09:28,050 cuba menggunakan nilai yang boleh, berpotensi, adalah batal. 236 00:09:28,050 --> 00:09:32,000 >> Sekarang, dalam baris keempat di sini, "Jika strcmp (s, t)," baik, 237 00:09:32,000 --> 00:09:33,180 apa yang yang merujuk kepada? 238 00:09:33,180 --> 00:09:36,750 Nah, kita berkata ini adalah yang sangat ringkas dinamakan fungsi untuk rentetan perbandingan. 239 00:09:36,750 --> 00:09:40,370 Dan tujuan dalam kehidupan adalah untuk membandingkan Hujah pertama terhadapnya kedua, 240 00:09:40,370 --> 00:09:44,640 tetapi tidak dari segi alamat mereka, seperti yang kita lakukan secara tidak sengaja seketika 241 00:09:44,640 --> 00:09:48,270 lalu dengan kod merah, tetapi bukan untuk membandingkan kedua-dua 242 00:09:48,270 --> 00:09:53,210 tali dalam kemanusiaan intuitif dengan membandingkan cara ini, terhadap ini, 243 00:09:53,210 --> 00:09:56,690 terhadap ini, terhadap ini, dan kemudian berhenti jika dan apabila seseorang 244 00:09:56,690 --> 00:09:59,590 atau kedua-dua jari saya terkena garis sendeng terbalik 0. 245 00:09:59,590 --> 00:10:04,530 Oleh itu, seseorang strcmp tahun lalu dilaksanakan untuk melaksanakan fungsi bagi kita yang 246 00:10:04,530 --> 00:10:08,890 kita berharap kita akan mendapat dengan hanya membandingkan dua nilai yang mudah. 247 00:10:08,890 --> 00:10:14,929 >> Sekarang terus-terang, saya terus melukis semua ini pelbagai nombor. 248 00:10:14,929 --> 00:10:17,470 Tetapi realitinya adalah, saya telah membuat sehingga ini sepanjang masa. 249 00:10:17,470 --> 00:10:19,580 Dan biarlah saya pergi ke hadapan dan tulisan oragn ayam ini keluar 250 00:10:19,580 --> 00:10:23,100 untuk membuat mata itu, pada akhir hari dan bergerak ke hadapan, 251 00:10:23,100 --> 00:10:30,160 kita tidak benar-benar akan mengambil berat tentang apa yang menangani perkara-perkara yang benar-benar 252 00:10:30,160 --> 00:10:30,790 dalam ingatan. 253 00:10:30,790 --> 00:10:34,320 Jadi, saya tidak akan menarik ini jenis nombor banyak lagi, 254 00:10:34,320 --> 00:10:38,970 Saya hanya abstrak ini jauh yang sedikit lebih mesra dengan hanya anak panah. 255 00:10:38,970 --> 00:10:42,060 >> Dalam erti kata lain, jika adalah penunjuk, baik, mari kita menarik ia, secara literal, 256 00:10:42,060 --> 00:10:45,430 sebagai penunjuk, anak panah menunjuk dari dirinya kepada sesuatu yang lain, 257 00:10:45,430 --> 00:10:48,280 dan tidak bimbang terlalu banyak lebih lanjut mengenai yang minutia alamat ini 258 00:10:48,280 --> 00:10:49,910 yang, sekali lagi, saya terdiri juga. 259 00:10:49,910 --> 00:10:52,680 Tetapi kita akan melihat orang-orang alamat, kadang-kadang, apabila debugging kod. 260 00:10:52,680 --> 00:10:56,450 >> Sekarang Sementara itu, program ini di sini perbaikan, sudah tentu, 261 00:10:56,450 --> 00:10:58,720 masalah yang dengan membandingkan kedua-dua tali. 262 00:10:58,720 --> 00:11:00,260 Tetapi kita berlari ke dalam masalah lain. 263 00:11:00,260 --> 00:11:03,180 Ini adalah dari salinan menetapkan masa lalu, 264 00:11:03,180 --> 00:11:06,880 mana, saya cuba untuk mengambil kesempatan hanya watak pertama dalam rentetan. 265 00:11:06,880 --> 00:11:09,620 Tetapi apakah gejala yang kita lihat sebelum ini, jika 266 00:11:09,620 --> 00:11:14,150 pengguna ditaip dalam nilai, seperti Gabe dalam huruf kecil untuk s, 267 00:11:14,150 --> 00:11:19,310 maka kita ditugaskan ke dalam t, seperti dalam baris ketiga di sana, 268 00:11:19,310 --> 00:11:22,900 dan kemudian saya cuba kesempatan t kurungan 0? 269 00:11:22,900 --> 00:11:25,950 Apakah kesan menukar t kurungan 0 di sini? 270 00:11:25,950 --> 00:11:27,150 >> PENONTON: Ia berubah s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. MALAN: Ya, Saya berubah s, juga. 272 00:11:29,360 --> 00:11:31,050 Oleh kerana apa yang sebenarnya berlaku? 273 00:11:31,050 --> 00:11:34,130 Baiklah, biar saya lihat jika saya boleh membersihkan sehingga gambar ini, seperti berikut. 274 00:11:34,130 --> 00:11:41,390 >> Jika adalah, sekali lagi, perkataan g, a, b, e, garis sendeng terbalik, 0, dan s 275 00:11:41,390 --> 00:11:44,084 kami akan terus melukis sebagai kotak di sini, tetapi tidak lebih alamat. 276 00:11:44,084 --> 00:11:45,250 Mari kita berhenti membuat perkara ini. 277 00:11:45,250 --> 00:11:47,510 Mari kita menarik gambar untuk memudahkan dunia. 278 00:11:47,510 --> 00:11:52,640 >> Apabila saya mengaku t dengan tali t, yang mencipta bahawa sebahagian ingatan. 279 00:11:52,640 --> 00:11:55,850 Square berlaku untuk menjadi 32 bit dalam kebanyakan komputer. 280 00:11:55,850 --> 00:11:59,530 Malah, jika anda pernah mendengar tentang komputer yang mempunyai seni bina 32-bit, 281 00:11:59,530 --> 00:12:03,000 benar-benar mewah-bercakap, yang hanya bermakna ia menggunakan alamat 32-bit. 282 00:12:03,000 --> 00:12:05,370 Dan sebagai teknikal diketepikan, jika anda pernah tertanya-tanya 283 00:12:05,370 --> 00:12:09,630 mengapa komputer yang lebih tua, jika anda benar-benar cuba sup mereka dengan banyak RAM, 284 00:12:09,630 --> 00:12:12,360 hanya boleh mempunyai maksimum empat gigabait RAM, 285 00:12:12,360 --> 00:12:14,860 baik itu kerana, secara literal, komputer lama anda hanya boleh 286 00:12:14,860 --> 00:12:17,250 mengira setinggi 4 bilion, 4 bilion bait, 287 00:12:17,250 --> 00:12:20,590 kerana ia menggunakan 32-bit nombor untuk alamat. 288 00:12:20,590 --> 00:12:23,260 >> Tetapi dalam mana-mana, dalam hal ini Sebagai contoh, cerita ini lebih mudah. 289 00:12:23,260 --> 00:12:27,250 t hanya penunjuk yang lain, atau benar-benar bintang char, tali aka. 290 00:12:27,250 --> 00:12:30,860 Dan bagaimana saya mahu untuk mengemaskini gambar ini kini dengan garis kedua kod, 291 00:12:30,860 --> 00:12:31,950 selepas titik, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Apabila saya berbuat tali t sama s koma bertitik, bagaimana gambar ini berubah? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Yeah? 295 00:12:38,000 --> 00:12:38,916 >> PENONTON: [didengar]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. MALAN: Yeah. 298 00:12:42,020 --> 00:12:42,600 Tepat sekali. 299 00:12:42,600 --> 00:12:45,620 Saya hanya meletakkan anak panah dari t kotak ke alamat yang sama, 300 00:12:45,620 --> 00:12:47,570 surat pertama yang sama dalam memberi. 301 00:12:47,570 --> 00:12:50,850 Atau dari segi teknikal, jika ini lelaki masih di 0x1, 302 00:12:50,850 --> 00:12:53,052 ia seolah-olah saya mempunyai 0x1 0x1 di sini dan di sini. 303 00:12:53,052 --> 00:12:54,760 Tetapi sekali lagi, yang mengambil berat tentang alamat? 304 00:12:54,760 --> 00:12:56,345 Ia hanya idea bahawa kini penting. 305 00:12:56,345 --> 00:12:57,720 Jadi ini adalah apa yang berlaku di sini. 306 00:12:57,720 --> 00:13:02,690 Jadi sudah tentu, jika anda melakukan t kurungan 0, yang merupakan notasi array, 307 00:13:02,690 --> 00:13:05,650 daripada course-- dan terus-terang, ia kelihatan seperti ada array di sini, 308 00:13:05,650 --> 00:13:07,340 tetapi kini ada perkara ini pelik. 309 00:13:07,340 --> 00:13:11,160 Ketahuilah bahawa bahasa pengaturcaraan, C, menawarkan ciri ini, 310 00:13:11,160 --> 00:13:14,650 di mana, walaupun t adalah penunjuk, atau adalah penunjuk, 311 00:13:14,650 --> 00:13:18,050 anda masih boleh menggunakan yang biasa, kurungan persegi selesa 312 00:13:18,050 --> 00:13:22,520 notasi untuk pergi ke elemen pertama, atau elemen kedua, atau apa-apa elemen 313 00:13:22,520 --> 00:13:26,130 bahawa pointer yang menunjuk kepada kerana, mungkin, ia 314 00:13:26,130 --> 00:13:29,410 adalah, seperti dalam kes ini, menghala ke arah beberapa array. 315 00:13:29,410 --> 00:13:30,340 >> Jadi bagaimana kita menetapkan ini? 316 00:13:30,340 --> 00:13:33,660 Terus terang, ini adalah di mana ia mendapat sedikit hangat pada pandangan pertama. 317 00:13:33,660 --> 00:13:35,340 Tetapi di sini adalah versi baru dan lebih baik. 318 00:13:35,340 --> 00:13:37,460 >> Oleh itu, saya mendapat menghilangkan perpustakaan CS50 ini, 319 00:13:37,460 --> 00:13:41,170 hanya untuk mendedahkan bahawa s memang bintang char, hanya sinonim. 320 00:13:41,170 --> 00:13:43,540 Dan t juga merupakan bintang char. 321 00:13:43,540 --> 00:13:48,290 Tetapi apa yang sedang berlaku di sebelah kanan garis yang 322 00:13:48,290 --> 00:13:49,970 di mana t diberikan nilai? 323 00:13:49,970 --> 00:13:50,790 >> Apakah malloc? 324 00:13:50,790 --> 00:13:51,630 Apa ia strlen? 325 00:13:51,630 --> 00:13:52,547 Apakah sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Mengapa palang pintu melakukannya garis wajah begitu kompleks? 327 00:13:54,380 --> 00:13:55,713 Apa yang ia lakukan pada tahap yang tinggi? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Apa yang ia menyimpan dalam t? 330 00:13:57,440 --> 00:13:58,646 Yeah? 331 00:13:58,646 --> 00:14:01,104 PENONTON: Ia memperuntukkan jumlah tertentu ruang memori. 332 00:14:01,104 --> 00:14:03,032 Ia untuk menyimpan, saya rasa, surat [didengar]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfect. 335 00:14:04,540 --> 00:14:06,650 Ia memperuntukkan tertentu jumlah ruang ingatan 336 00:14:06,650 --> 00:14:08,940 untuk menyimpan, mungkin, surat akan datang. 337 00:14:08,940 --> 00:14:11,310 Dan khususnya, malloc oleh itu kembali apa? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> PENONTON: taubat yang [didengar]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. MALAN: Tepat sekali. 341 00:14:15,850 --> 00:14:18,850 Kembali alamat memori yang, yang merupakan cara yang mewah untuk mengatakan, 342 00:14:18,850 --> 00:14:21,640 mengembalikan alamat bait pertama memori itu. 343 00:14:21,640 --> 00:14:25,460 Ini terserah kepada aku untuk mengingati berapa banyak memori saya sebenarnya 344 00:14:25,460 --> 00:14:27,140 diperuntukkan atau malloc meminta. 345 00:14:27,140 --> 00:14:28,384 >> Sekarang berapa banyak itu? 346 00:14:28,384 --> 00:14:30,550 Well, walaupun ada banyak kurungan di sini, 347 00:14:30,550 --> 00:14:32,970 malloc mengambil masa hanya hujah tunggal. 348 00:14:32,970 --> 00:14:37,250 Dan saya menyatakan strlen s, jadi memberikan saya sebagai banyak bait kerana ada di s, 349 00:14:37,250 --> 00:14:37,800 tetapi menambah 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 Yeah? 353 00:14:39,530 --> 00:14:40,840 >> PENONTON: The backslash 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. MALAN: Tepat sekali. 355 00:14:41,840 --> 00:14:43,423 Kita mesti melakukan pengemasan sedikit. 356 00:14:43,423 --> 00:14:45,970 Oleh itu, disebabkan ada garis sendeng terbalik yang 0, kita akan lebih baik ingat bahawa. 357 00:14:45,970 --> 00:14:47,310 Jika tidak, kita akan untuk mewujudkan rentetan yang 358 00:14:47,310 --> 00:14:49,170 tidak mempunyai terminator yang istimewa. 359 00:14:49,170 --> 00:14:52,640 >> Sementara itu, hanya untuk menjadi super dubur, saya mempunyai sizeof (char), 360 00:14:52,640 --> 00:14:55,730 hanya dalam kes seseorang berjalan saya kod tidak perkakas CS50 ini, 361 00:14:55,730 --> 00:14:58,220 tetapi mungkin komputer yang berbeza sama sekali di mana aksara 362 00:14:58,220 --> 00:15:01,470 adalah salah satu bait, oleh konvensyen, tetapi dua bait, atau sesuatu yang lebih besar daripada itu. 363 00:15:01,470 --> 00:15:04,490 Ia hanya menjadi super, super suka kepada kesilapan. 364 00:15:04,490 --> 00:15:06,940 Walaupun, pada hakikatnya, ia adalah kemungkinan besar akan menjadi 1. 365 00:15:06,940 --> 00:15:11,490 >> Sekarang, sementara itu, saya pergi ke depan dan menyalin tali, t kurungan i sama t kurungan s. 366 00:15:11,490 --> 00:15:14,962 Dan saya akan menangguhkan untuk minggu lepas kod sumber untuk melihat apa yang sedang berlaku. 367 00:15:14,962 --> 00:15:17,670 Tetapi Takeaway utama, dan sebab saya meletakkan kod kini dalam hijau, 368 00:15:17,670 --> 00:15:22,520 kerana garis terakhir, t kurungan 0 sama toupper, 369 00:15:22,520 --> 00:15:25,230 mempunyai kesan kesempatan yang rentetan? 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 Bahawa garis terakhir kod. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Hanya t, kerana apa yang berlaku kali ini, 375 00:15:35,560 --> 00:15:41,500 jika saya sedikit membatalkan langkah terakhir, apa yang berlaku ialah, apabila saya memanggil malloc, 376 00:15:41,500 --> 00:15:45,380 Saya pada dasarnya mendapat sebahagian memori yang saiz yang sama seperti yang asal, 377 00:15:45,380 --> 00:15:47,020 kerana itulah aritmetik yang saya lakukan. 378 00:15:47,020 --> 00:15:50,920 Saya menyimpan dalam t alamat itu sebahagian daripada ingatan. 379 00:15:50,920 --> 00:15:53,370 Walaupun ini kelihatan bagus dan cantik, baik dan kosong, 380 00:15:53,370 --> 00:15:56,882 realiti itu ada, apa yang kita akan menyimpan memanggil, nilai-nilai sampah di sini. 381 00:15:56,882 --> 00:15:59,340 Itu sebahagian memori mungkin sangat juga mempunyai telah digunakan sebelum ini, 382 00:15:59,340 --> 00:16:00,940 beberapa saat, beberapa minit yang lalu. 383 00:16:00,940 --> 00:16:04,410 Jadi tidak benar-benar boleh menjadi nombor atau surat di sana, hanya dengan kemalangan. 384 00:16:04,410 --> 00:16:08,580 Tetapi mereka tidak sah, sehingga saya diri saya mempopulasikan sebahagian memori ini 385 00:16:08,580 --> 00:16:12,510 dengan aksara sebenar, seperti yang saya lakukan dalam bahawa untuk gelung di sana. 386 00:16:12,510 --> 00:16:13,180 Baiklah? 387 00:16:13,180 --> 00:16:16,180 >> Jadi sekarang, kemuncak tiga contoh 388 00:16:16,180 --> 00:16:20,730 yang seolah-olah pecah masa lalu, contoh Pertukaran ini, fungsi ini 389 00:16:20,730 --> 00:16:23,670 bekerja dalam erti kata yang ia bertukar a dan b. 390 00:16:23,670 --> 00:16:25,620 Tetapi ia tidak berjaya dalam apa deria rasa yang lain? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Yeah? 393 00:16:28,614 --> 00:16:29,612 >> PENONTON: [didengar]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. MALAN: Tepat sekali. 396 00:16:36,700 --> 00:16:39,530 Jika saya untuk memanggil fungsi ini dari another-- misalnya, 397 00:16:39,530 --> 00:16:42,870 dari fungsi seperti utama, di mana Saya mempunyai pembolehubah, x dan y, seperti yang saya 398 00:16:42,870 --> 00:16:46,160 lakukan minggu lepas, kod sama, dan saya lulus dalam x dan y 399 00:16:46,160 --> 00:16:49,860 Tukar ke, dan kemudian memanggil Swap-- ini, sudah tentu, adalah versi yang betul 400 00:16:49,860 --> 00:16:52,220 adalah apa yang kita kira-kira untuk see-- ia tidak berjaya. 401 00:16:52,220 --> 00:16:53,770 Jadi apa yang tetap? 402 00:16:53,770 --> 00:16:56,850 >> Dengan baik, jadi hanya untuk jelas, biarlah saya pergi ke hadapan 403 00:16:56,850 --> 00:17:05,450 dan- memberi saya satu kedua di sini, dan melihat jika saya boleh menunjukkan kepada anda yang terakhir, yang 404 00:17:05,450 --> 00:17:12,464 akan dalam- mari kita lihat jika saya boleh mencari OK ini fast-- sebenar, [didengar]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, ada ia. 407 00:17:19,240 --> 00:17:21,000 Jadi tidak mengendahkan arahan saya hanya menaip. 408 00:17:21,000 --> 00:17:23,780 Saya mahu untuk mendapatkan di saat-saat akhir contoh 409 00:17:23,780 --> 00:17:27,960 dari masa lalu, yang kini dikenali sebagai tidak swap. 410 00:17:27,960 --> 00:17:30,200 >> Jadi tidak Swap adalah di mana kita berhenti kali terakhir, 411 00:17:30,200 --> 00:17:32,930 mana, saya dimulakan x 1 dan y 2. 412 00:17:32,930 --> 00:17:35,840 Saya kemudian memanggil Swap, lulus dalam 1 dan 2. 413 00:17:35,840 --> 00:17:37,930 Kemudian fungsi ini bekerja dalam erti kata lain, 414 00:17:37,930 --> 00:17:40,750 tetapi ia tidak kekal kesan ke atas x dan y. 415 00:17:40,750 --> 00:17:45,430 Jadi persoalannya sekarang ialah, bagaimana kini kita benar-benar menyelesaikan masalah ini? 416 00:17:45,430 --> 00:17:47,820 Apakah penyelesaian di tangan? 417 00:17:47,820 --> 00:17:53,150 >> Nah, dalam swap.c, yang baru hari ini, dapati dua perbezaan. 418 00:17:53,150 --> 00:17:54,700 x dan y adalah sama. 419 00:17:54,700 --> 00:17:57,250 Tetapi apa yang jelas berbeza 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 ia kelihatan seperti kedua yang lalu? 422 00:18:01,715 --> 00:18:02,565 >> PENONTON: [didengar]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. MALAN: Yeah. 424 00:18:03,440 --> 00:18:06,680 Jadi ampersands adalah sejenis baru sintaksis bukan sahaja dalam program ini, 425 00:18:06,680 --> 00:18:08,560 tetapi juga lebih umum dalam CS50. 426 00:18:08,560 --> 00:18:10,680 Setakat ini, saya tidak fikir kita telah melihat apa-apa contoh 427 00:18:10,680 --> 00:18:14,070 atau benar-benar bercakap tentang mereka dalam mana-mana terperinci, selain, mungkin, preemptively 428 00:18:14,070 --> 00:18:16,467 dalam bahagian, satu Ampersand seperti ini. 429 00:18:16,467 --> 00:18:19,300 Nah, ternyata Ampersand adalah satu keping terakhir sintaks baru 430 00:18:19,300 --> 00:18:20,174 kita akan belajar. 431 00:18:20,174 --> 00:18:23,500 Apa yang bermakna adalah alamat beberapa pembolehubah. 432 00:18:23,500 --> 00:18:25,070 Apa alamat tidak x hidup? 433 00:18:25,070 --> 00:18:26,510 Tetapi apa yang alamat tidak y hidup? 434 00:18:26,510 --> 00:18:28,700 Kerana jika masalah asas sebelum 435 00:18:28,700 --> 00:18:32,970 adalah bahawa x dan y sedang berlalu salinan, apa yang kita benar-benar mahu melakukan 436 00:18:32,970 --> 00:18:38,780 adalah menyediakan Swap dengan harta seperti yang peta yang membawa kepada di mana x dan y sebenarnya 437 00:18:38,780 --> 00:18:41,910 berada dalam RAM, supaya Pertukaran boleh mengikut peta yang 438 00:18:41,910 --> 00:18:47,760 dan pergi ke mana sahaja x atau y menandakan tempat dan menukar nilai-nilai sebenar 1 dan 2 439 00:18:47,760 --> 00:18:48,270 di sana. 440 00:18:48,270 --> 00:18:50,710 >> Jadi Swap perlu menukar sedikit juga. 441 00:18:50,710 --> 00:18:53,760 Dan pada pandangan pertama, kekuatan ini seolah-olah yang sama sedikit untuk char bintang. 442 00:18:53,760 --> 00:18:54,850 Dan sesungguhnya ia. 443 00:18:54,850 --> 00:18:59,635 Jadi adalah penunjuk kepada jenis data, berdasarkan bahagian ini diketengahkan? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Jadi ia satu int. 446 00:19:01,620 --> 00:19:04,880 >> Jadi tidak lagi int satu, ia alamat int satu. 447 00:19:04,880 --> 00:19:07,910 Begitu juga, b kini akan menjadi alamat int satu. 448 00:19:07,910 --> 00:19:12,470 Oleh itu, apabila saya kini memanggil Pertukaran daripada Utama, Saya tidak akan memberi Pertukaran 1 dan 2. 449 00:19:12,470 --> 00:19:15,540 Saya akan memberikan seperti Ox-sesuatu dan Ox-sesuatu, 450 00:19:15,540 --> 00:19:19,820 dua alamat yang akan membawa Pertukaran ke lokasi sebenar mereka 451 00:19:19,820 --> 00:19:21,310 dalam ingatan komputer saya. 452 00:19:21,310 --> 00:19:25,580 >> Jadi sekarang, pelaksanaan baki saya perlu berubah anak laki-laki. 453 00:19:25,580 --> 00:19:28,650 Apa yang jelas berbeza sekarang dalam tiga baris kod? 454 00:19:28,650 --> 00:19:31,350 Ada bintang ini sialan semua seluruh tempat, betul? 455 00:19:31,350 --> 00:19:33,014 Jadi apa yang berlaku di sini? 456 00:19:33,014 --> 00:19:33,514 Yeah? 457 00:19:33,514 --> 00:19:35,055 >> PENONTON: Ia jelas [didengar]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. MALAN: Tepat sekali. 460 00:19:37,990 --> 00:19:41,560 Jadi dalam context-- ini dan ini tidak keputusan reka bentuk 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 perlu bintang, 463 00:19:45,110 --> 00:19:48,240 dan anda tidak mempunyai jenis data, seperti int, segera ke kiri, 464 00:19:48,240 --> 00:19:53,146 sebaliknya anda mempunyai tanda yang sama, jelas, dalam konteks ini, apabila anda mengatakan bintang yang, 465 00:19:53,146 --> 00:19:56,980 yang bermaksud pergi ke alamat itu dalam. 466 00:19:56,980 --> 00:19:58,870 Ikut peta harta, jadi untuk bercakap. 467 00:19:58,870 --> 00:20:01,720 >> Dan sementara itu, dalam talian 37, ia bermakna perkara yang sama. 468 00:20:01,720 --> 00:20:05,460 Pergi ke alamat, dan meletakkan apa yang ada? 469 00:20:05,460 --> 00:20:09,520 Segala yang ada di lokasi yang b menentukan. 470 00:20:09,520 --> 00:20:10,980 Dalam erti kata lain, pergi ke b. 471 00:20:10,980 --> 00:20:12,130 Dapatkan nilai itu. 472 00:20:12,130 --> 00:20:15,620 Pergi ke dan, setiap yang sama menandatangani, pengendali penyerahhakan, 473 00:20:15,620 --> 00:20:17,010 meletakkan nilai yang ada. 474 00:20:17,010 --> 00:20:19,272 >> Begitu juga, int temp hanya satu int. 475 00:20:19,272 --> 00:20:20,730 Tiada apa-apa perlu tukar temp. 476 00:20:20,730 --> 00:20:24,810 Ia hanya segelas ganti dari Annenberg bagi sesetengah susu atau jus oren. 477 00:20:24,810 --> 00:20:27,630 Tetapi saya perlu berkata, pergi ke b. 478 00:20:27,630 --> 00:20:31,449 Pergi ke destinasi itu dan meletakkan nilai dalam temp sana. 479 00:20:31,449 --> 00:20:32,490 Jadi apa yang berlaku kemudian? 480 00:20:32,490 --> 00:20:36,540 Apabila saya benar-benar memanggil Tukar masa ini, jika dulang pertama ini di sini mewakili Utama, 481 00:20:36,540 --> 00:20:42,270 dulang kedua ini mewakili Swap, apabila Saya meninggal Ampersand x dan y Ampersand 482 00:20:42,270 --> 00:20:47,150 dari Main ke Swap, hanya untuk menjadi jelas, apa yang ini timbunan rangka menerima? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Yeah? 485 00:20:49,200 --> 00:20:50,180 >> PENONTON: [didengar]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. MALAN: Tepat sekali. 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 boleh berfikir 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 mahu bergerak kedua-dua bangunan yang di-tempat itu. 491 00:21:01,230 --> 00:21:04,680 >> Ia semacam satu idea yang tidak masuk akal, tetapi itu semua yang kita maksudkan dengan alamat. 492 00:21:04,680 --> 00:21:07,000 Di mana di dunia boleh anda mendapati kedua-dua ints? 493 00:21:07,000 --> 00:21:09,470 Di mana di dunia anda boleh mendapati kedua-dua bangunan? 494 00:21:09,470 --> 00:21:15,170 Jadi, jika akhirnya, setelah sekian lama saya pergi ke dalam kod sumber hari ini dan menyusun 495 00:21:15,170 --> 00:21:22,110 Pertukaran dan jangka ./swap, akhirnya, untuk kali pertama kita sebenarnya melihat bahawa 496 00:21:22,110 --> 00:21:25,330 nilai-nilai saya mempunyai sesungguhnya telah ditukar dengan jayanya. 497 00:21:25,330 --> 00:21:30,860 Dan sekarang, kita juga boleh mengambil nota ini dalam, katakan, GDB. 498 00:21:30,860 --> 00:21:32,740 >> Jadi biarlah saya pergi ke dalam fail yang sama. 499 00:21:32,740 --> 00:21:35,010 Biar saya pergi ke hadapan dan menjalankan GDB daripada ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Dan sekarang, dalam Swap, saya akan pergi hadapan dan menetapkan titik rehat di Main. 502 00:21:40,547 --> 00:21:42,630 Dan sekarang saya akan pergi ke hadapan dan menjalankan program. 503 00:21:42,630 --> 00:21:45,810 Dan sekarang kita melihat kod saya berhenti di garisan itu. 504 00:21:45,810 --> 00:21:48,330 >> Jika saya pergi ke depan dan cetak x, apa yang perlu saya lihat di sini? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Ia satu soalan. 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 >> PENONTON: [didengar]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. MALAN: Jadi nombor rawak, mungkin. 511 00:21:53,910 --> 00:21:56,010 Mungkin saya bernasib baik, dan ia bagus dan mudah, seperti 0. 512 00:21:56,010 --> 00:21:57,230 Tetapi mungkin ia beberapa nombor rawak. 513 00:21:57,230 --> 00:21:58,090 Dalam kes ini, saya bernasib baik. 514 00:21:58,090 --> 00:21:59,030 Ia hanya berlaku untuk menjadi 0. 515 00:21:59,030 --> 00:22:00,780 Tetapi ia memang nasib, kerana tidak sehingga saya 516 00:22:00,780 --> 00:22:06,280 menaip depan dan kemudian cetak x mempunyai yang baris kod, line 19, telah dilaksanakan. 517 00:22:06,280 --> 00:22:10,942 >> Sementara itu, jika saya menaip datang lagi, dan kini mencetak y, saya akan melihat 2. 518 00:22:10,942 --> 00:22:13,900 Sekarang, jika saya menaip akan datang, ia akan mendapatkan sedikit mengelirukan, kerana sekarang, 519 00:22:13,900 --> 00:22:17,250 printf yang akan muncul di skrin, seperti yang berlaku. x ialah 1. 520 00:22:17,250 --> 00:22:18,606 >> Mari kita buat ini lagi. 521 00:22:18,606 --> 00:22:20,480 Dan kini, di sini adalah di mana hal-hal yang menarik. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Sebelum saya memanggil Swap atau langkah ke dalamnya, mari kita mengintip sedikit. 524 00:22:26,580 --> 00:22:28,980 x ialah, sekali lagi, 1. 525 00:22:28,980 --> 00:22:33,240 Y adalah, sudah tentu, kewarasan cepat cek, 2, jadi tidak sukar di sana. 526 00:22:33,240 --> 00:22:35,740 Tetapi apa yang Ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Jawab, ia jenis funky mencari. 529 00:22:39,350 --> 00:22:43,500 Tetapi bintang int dalam kurungan hanya cara kdnk ini mengatakan ini adalah alamat. 530 00:22:43,500 --> 00:22:48,290 Ia tidak int, ia adalah penunjuk kepada int, atau dikenali sebagai alamat. 531 00:22:48,290 --> 00:22:49,742 >> Apakah perkara ini gila? 532 00:22:49,742 --> 00:22:51,825 Kami tidak pernah melihat sesuatu yang agak seperti itu sebelum ini. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Jadi ini adalah alamat dalam komputer saya memori di mana x berlaku untuk hidup. 535 00:22:58,120 --> 00:22:59,040 Ia Ox-sesuatu. 536 00:22:59,040 --> 00:23:01,290 Dan ini adalah, terus-terang, mengapa Saya mula melukis anak panah, 537 00:23:01,290 --> 00:23:03,340 bukan nombor, kerana yang benar-benar mengambil berat 538 00:23:03,340 --> 00:23:06,890 yang int anda berada di tertentu alamat itu yang besar. 539 00:23:06,890 --> 00:23:12,160 Tetapi bffff0c4, semua ini adalah sesungguhnya digit perenambelasan, 540 00:23:12,160 --> 00:23:13,720 iaitu 0 hingga f. 541 00:23:13,720 --> 00:23:16,590 >> Jadi, kita tidak akan kekal di terlalu panjang mengenai apa yang semuanya itu adalah. 542 00:23:16,590 --> 00:23:19,400 Tetapi jika saya mencetak y, sudah tentu, saya melihat 2. 543 00:23:19,400 --> 00:23:22,440 Tetapi Ampersand y, saya melihat alamat ini. 544 00:23:22,440 --> 00:23:26,527 Dan notis, untuk ingin tahu, berapa jauh adalah x dan y? 545 00:23:26,527 --> 00:23:27,985 Anda boleh mengabaikan kebanyakan alamat. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Empat bait. 548 00:23:29,920 --> 00:23:33,510 Dan itu konsisten dengan kami sebelum ini mendakwa bahawa berapa besar adalah int satu? 549 00:23:33,510 --> 00:23:34,130 Empat bait. 550 00:23:34,130 --> 00:23:37,420 Jadi ia kelihatan seperti lapisan semua itu sehingga baik, seperti yang anda mungkin berharap, dalam ingatan. 551 00:23:37,420 --> 00:23:40,010 >> Jadi sekarang, mari kita maju pantas hingga akhir cerita ini. 552 00:23:40,010 --> 00:23:43,290 Mari kita pergi ke depan dan menaip langkah, untuk menyelam ke dalam fungsi Swap. 553 00:23:43,290 --> 00:23:46,880 Sekarang perhatikan, jika saya menaip, itu sama dengan alamat x. 554 00:23:46,880 --> 00:23:52,130 Jika saya menaip b, ia sama ke alamat y. 555 00:23:52,130 --> 00:23:57,020 Jadi apa yang perlu saya lihat jika saya mengatakan, pergi ke alamat yang? 556 00:23:57,020 --> 00:23:58,120 Jadi mencetak bintang a. 557 00:23:58,120 --> 00:24:00,130 Jadi bintang bermakna pergi ke sana, dalam konteks ini. 558 00:24:00,130 --> 00:24:02,730 Ampersand bermakna apa yang alamat. 559 00:24:02,730 --> 00:24:05,000 Jadi bintang satu cara 1. 560 00:24:05,000 --> 00:24:09,590 Dan cetak bintang b memberikan saya 2. 561 00:24:09,590 --> 00:24:15,750 >> Dan biarlah saya menganggap, buat masa ini, bahawa sekurang-kurangnya kod yang 562 00:24:15,750 --> 00:24:18,950 meneruskan untuk melaksanakan kini boleh alasan melalui dengan cara itu. 563 00:24:18,950 --> 00:24:21,150 Tetapi kita akan melihat semula idea ini tidak lama lagi. 564 00:24:21,150 --> 00:24:23,850 Jadi versi Pertukaran kini betul dan membolehkan 565 00:24:23,850 --> 00:24:26,650 kami untuk menukar jenis data yang tertentu ini. 566 00:24:26,650 --> 00:24:29,120 >> Jadi mana-mana soalan itu pada 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 lihat, dengan masalah set 4, jenis, 570 00:24:33,270 --> 00:24:37,310 tetapi masalah set 5, pasti, bagaimana perkara-perkara yang berguna dan mendapat lebih 571 00:24:37,310 --> 00:24:39,584 selesa dengan mereka, sebagai akibatnya. 572 00:24:39,584 --> 00:24:40,430 Apa-apa pun? 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 memperuntukkan ingatan, memori 575 00:24:44,350 --> 00:24:45,330 peruntukan. 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 kerja, mungkin, ia 579 00:24:52,230 --> 00:24:56,140 telah meminta seseorang untuk sebahagian daripada ingatan, bila-bila masa jenis pengguna rentetan 580 00:24:56,140 --> 00:24:59,040 dalam, kerana kita pasti tidak tahu, sebagai kakitangan CS50, 581 00:24:59,040 --> 00:25:02,710 berapa besar mereka tali yang manusia akan menaip mungkin. 582 00:25:02,710 --> 00:25:07,910 >> Jadi mari kita, buat kali pertama, mula kulit kembali bagaimana kerja-kerja perpustakaan CS50, 583 00:25:07,910 --> 00:25:10,990 melalui 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 kod berikut. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, yang boleh didapati di laman web bagi hari ini, mempunyai agak beberapa baris kod 588 00:25:23,530 --> 00:25:25,351 di sini, 14 melalui 20. 589 00:25:25,351 --> 00:25:26,600 Dan mari kita lihat apa yang ia lakukan. 590 00:25:26,600 --> 00:25:28,920 Ia mengisytiharkan satu int, yang dipanggil x. 591 00:25:28,920 --> 00:25:30,850 Ia mengatakan sesuatu seperti, nombor sila. 592 00:25:30,850 --> 00:25:33,940 Dan kini ia berkata, scanf% i, & x. 593 00:25:33,940 --> 00:25:35,620 Jadi ada sekumpulan barangan baru di sana. 594 00:25:35,620 --> 00:25:38,420 >> Tetapi scanf, anda jenis boleh berfikir sebagai bertentangan dengan printf. 595 00:25:38,420 --> 00:25:40,090 printf, sudah tentu, untuk cetakan skrin. 596 00:25:40,090 --> 00:25:44,410 semacam scanf imbasan daripada pengguna ini keyboard sesuatu yang dia telah ditaip. 597 00:25:44,410 --> 00:25:46,550 >> % I adalah seperti printf. 598 00:25:46,550 --> 00:25:49,410 Ini bermakna menjangkakan pengguna menaip int satu. 599 00:25:49,410 --> 00:25:52,820 Dan sekarang, mengapa anda rasa saya mungkin lulus 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 daripada pengguna, 602 00:25:57,770 --> 00:26:02,480 apa yang dimaksudkan dengan lulus ia, & x, sekarang? 603 00:26:02,480 --> 00:26:02,980 Yeah? 604 00:26:02,980 --> 00:26:03,896 >> PENONTON: [didengar]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. MALAN: Tepat sekali. 607 00:26:06,540 --> 00:26:12,900 Apa yang saya, manusia, taip, input saya akan disimpan di lokasi itu. 608 00:26:12,900 --> 00:26:17,660 Ia tidak mencukupi, ingat, hanya lulus dalam x, kerana kita lihat sudah, 609 00:26:17,660 --> 00:26:21,630 bila-bila masa anda lulus hanya pembolehubah mentah, seperti int, untuk beberapa fungsi yang lain, 610 00:26:21,630 --> 00:26:25,640 pasti, ia boleh menukar yang berubah-ubah, tetapi tidak selama-lamanya. 611 00:26:25,640 --> 00:26:27,360 Ia tidak boleh mempunyai kesan ke atas Utama. 612 00:26:27,360 --> 00:26:29,420 Ia hanya boleh mengubah salinan tempatan sendiri. 613 00:26:29,420 --> 00:26:32,560 Tetapi jika, sebaliknya, anda tidak memberi saya int sebenar, 614 00:26:32,560 --> 00:26:36,640 tetapi anda memberi saya arahan kepada int itu, saya sekarang, kerana scanf, 615 00:26:36,640 --> 00:26:41,050 sesungguhnya saya dapat mengikuti bahawa menangani dan meletakkan nombor di sana 616 00:26:41,050 --> 00:26:43,280 supaya anda mempunyai akses kepada maklumat itu juga. 617 00:26:43,280 --> 00:26:45,120 >> Oleh itu, apabila saya menjalankan program ini, mari kita lihat. 618 00:26:45,120 --> 00:26:49,660 Buat scanf 0 dot slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Dan jika saya kini menaip nombor seperti 50, terima kasih untuk 50. 620 00:26:54,030 --> 00:26:58,150 Jika saya kini menaip beberapa seperti negatif 1, bagi negatif 1. 621 00:26:58,150 --> 00:27:04,200 Saya kini menaip nombor 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, hanya kerana, saya memberitahu ia mengharapkan int satu sahaja. 625 00:27:09,880 --> 00:27:10,380 Baiklah. 626 00:27:10,380 --> 00:27:11,630 Jadi itulah satu versi ini. 627 00:27:11,630 --> 00:27:16,600 Mari kita perkara sehingga takuk dan mencadangkan bahawa ini tidak baik. 628 00:27:16,600 --> 00:27:20,530 Dan di sini terdapat satu contoh yang mudah bagaimana kita boleh mula menulis kod 629 00:27:20,530 --> 00:27:24,450 bahawa orang lain boleh mengeksploitasi atau berkompromi dengan melakukan perkara-perkara buruk. 630 00:27:24,450 --> 00:27:28,336 Jadi garis 16, jadi sama dalam semangat untuk sebelum, 631 00:27:28,336 --> 00:27:29,960 tetapi saya tidak mengisytiharkan ia int masa ini. 632 00:27:29,960 --> 00:27:32,970 Saya mengisytiharkan ia bintang char, aka tali. 633 00:27:32,970 --> 00:27:35,190 >> Tapi apa yang benar-benar bermakna? 634 00:27:35,190 --> 00:27:38,790 Jadi, jika saya tidak menentukan address-- dan Saya memanggil ia sewenang-wenangnya, penampan, 635 00:27:38,790 --> 00:27:43,370 tetapi saya boleh memanggilnya s, untuk menjadi simple-- dan kemudian saya melakukan ini, terangkan kepada saya, 636 00:27:43,370 --> 00:27:48,630 jika anda boleh, berdasarkan yang lepas logik, apa yang scanf lakukan di talian 18, 637 00:27:48,630 --> 00:27:55,000 jika pas% s dan penampan, yang merupakan alamat? 638 00:27:55,000 --> 00:27:58,210 Apakah scanf, jika anda menggunakan logik sama seperti versi 0, 639 00:27:58,210 --> 00:28:00,640 akan cuba lakukan di sini, apabila yang sesuatu jenis pengguna dalam? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Yeah? 642 00:28:03,409 --> 00:28:04,407 >> PENONTON: [didengar]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. MALAN: Tepat sekali. 645 00:28:08,890 --> 00:28:11,577 Scanf, dengan logik sebelum ini, akan mengambil tali 646 00:28:11,577 --> 00:28:13,410 bahawa bertaip manusia dalam- kini ia rentetan, 647 00:28:13,410 --> 00:28:15,790 ia bukan nombor, mungkin, jika dia cooperates-- 648 00:28:15,790 --> 00:28:19,310 dan ia akan cuba untuk meletakkan bahawa rentetan dalam ingatan pada apa alamat 649 00:28:19,310 --> 00:28:20,340 penampan menentukan. 650 00:28:20,340 --> 00:28:23,870 Dan ini adalah besar, kerana penampan memang bertujuan untuk alamat. 651 00:28:23,870 --> 00:28:30,470 >> Tetapi saya menuntut program ini adalah kereta dalam cara yang sangat serius, kerana apa nilai adalah 652 00:28:30,470 --> 00:28:31,330 penampan secara lalai? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Apa yang telah saya dimulakan ke? 655 00:28:34,790 --> 00:28:35,770 Apa sebahagian daripada memori? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Saya tidak mempunyai, bukan? 658 00:28:38,620 --> 00:28:42,265 >> Jadi walaupun saya telah memperuntukkan char bintang yang yang tidak lagi dipanggil s, 659 00:28:42,265 --> 00:28:48,030 ia bukan dipanggil, buffer-- jadi mari kita menarik nama pembolehubah ini 660 00:28:48,030 --> 00:28:53,380 sekarang kerana buffer-- jika saya tidak mempunyai dipanggil getString atau malloc di sini, 661 00:28:53,380 --> 00:28:56,030 yang berkesan bermakna bahawa penampan hanya beberapa nilai sampah. 662 00:28:56,030 --> 00:28:57,030 >> Sekarang apa maksudnya? 663 00:28:57,030 --> 00:29:00,220 Ini bermakna bahawa saya telah memberitahu scanf untuk menjangkakan rentetan daripada pengguna. 664 00:29:00,220 --> 00:29:01,300 Dan anda tahu apa? 665 00:29:01,300 --> 00:29:03,883 Apa sahaja perkara ini menunjukkan supaya- dan saya menarik tanda tanya, 666 00:29:03,883 --> 00:29:07,060 tetapi dalam realiti, ia akan menjadi sesuatu seperti Ox1, 2, 3, bukan? 667 00:29:07,060 --> 00:29:10,730 Ia beberapa nilai palsu yang hanya berlaku untuk berada di sana dari hadapan. 668 00:29:10,730 --> 00:29:13,440 Jadi meletakkan cara lain, ia seolah-olah penampan hanya 669 00:29:13,440 --> 00:29:16,180 menunjuk kepada sesuatu dalam ingatan. 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 taip Gabe sekarang, ia akan cuba untuk meletakkan g-a-b-e / 0 sana. 672 00:29:24,130 --> 00:29:25,530 Tetapi yang tahu apa yang? 673 00:29:25,530 --> 00:29:27,480 Dan pada masa yang lalu, mana-mana masa kami telah cuba untuk menyentuh 674 00:29:27,480 --> 00:29:29,770 memori yang bukan milik kepada kami, apa yang telah berlaku? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Atau hampir setiap kali. 677 00:29:32,870 --> 00:29:34,310 Segmentasi bersalah, bukan? 678 00:29:34,310 --> 00:29:37,829 >> Anak panah ini, saya tidak tahu di mana ia menunjuk. ia hanya beberapa nilai rawak. 679 00:29:37,829 --> 00:29:40,370 Dan sudah tentu, jika anda mentafsir nilai rawak sebagai alamat, 680 00:29:40,370 --> 00:29:42,610 anda akan pergi ke beberapa destinasi rawak. 681 00:29:42,610 --> 00:29:46,810 Jadi Gabe mungkin sesungguhnya nahas program saya dalam kes ini di sini. 682 00:29:46,810 --> 00:29:50,600 >> Jadi apa yang boleh kita lakukan yang hampir sebagai lapuk? 683 00:29:50,600 --> 00:29:52,660 Pertimbangkan ini ketiga dan contoh terakhir scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Versi ini adalah lebih baik dalam apa yang masuk akal? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Jika anda selesa dengan masalah sebelum ini, ini adalah lebih baik. 688 00:30:01,400 --> 00:30:02,250 Mengapa? 689 00:30:02,250 --> 00:30:03,250 >> PENONTON: [didengar]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. MALAN: Baik. 692 00:30:07,110 --> 00:30:09,970 Jadi kes ini garis 16 adalah lebih baik, dalam erti kata yang 693 00:30:09,970 --> 00:30:12,030 bahawa kita jelas memperuntukkan beberapa ingatan. 694 00:30:12,030 --> 00:30:14,190 Kami tidak menggunakan malloc, kami menggunakan 2 minggu 695 00:30:14,190 --> 00:30:16,060 pendekatan hanya mengisytiharkan array. 696 00:30:16,060 --> 00:30:18,130 Dan kami telah berkata sebelum itu rentetan hanya pelbagai aksara, 697 00:30:18,130 --> 00:30:19,690 jadi ini adalah benar-benar sah. 698 00:30:19,690 --> 00:30:22,910 Tetapi ia, sudah tentu, sebagai anda ambil perhatian, saiz tetap, 16. 699 00:30:22,910 --> 00:30:25,440 >> Jadi program ini adalah benar-benar selamat, saya menaip 700 00:30:25,440 --> 00:30:29,760 dalam tali satu aksara, dua watak tali, 15 rentetan aksara. 701 00:30:29,760 --> 00:30:34,970 Tetapi sebaik sahaja saya mula menaip 16, 17, 18, 1000 rentetan aksara, 702 00:30:34,970 --> 00:30:37,390 di mana adalah rentetan yang akan berakhir? 703 00:30:37,390 --> 00:30:39,570 Ia akan berakhir sebahagiannya di sini. 704 00:30:39,570 --> 00:30:42,820 Tetapi yang tahu apa lagi adalah di luar sempadan 705 00:30:42,820 --> 00:30:44,270 array ini tertentu? 706 00:30:44,270 --> 00:30:48,015 >> Ia seolah-olah saya telah diisytiharkan 16 petak 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 bahawa saya telah disediakan 16. 709 00:30:52,690 --> 00:30:56,540 Tetapi jika saya kemudian cuba untuk membaca rentetan itu lebih lama, seperti 50 aksara, 710 00:30:56,540 --> 00:31:01,270 Saya akan mula meletakkan a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Dan ini adalah mungkin beberapa segmen memori lain 712 00:31:04,916 --> 00:31:06,790 yang, sekali lagi, mungkin menyebabkan program saya untuk berlanggar, 713 00:31:06,790 --> 00:31:10,600 kerana saya tidak meminta apa-apa lebih daripada 16 bait. 714 00:31:10,600 --> 00:31:12,260 >> Jadi yang peduli? 715 00:31:12,260 --> 00:31:13,880 Nah, di sini adalah perpustakaan CS50 ini. 716 00:31:13,880 --> 00:31:17,220 Dan yang paling penting ini hanya seperti arahan sehingga atas. 717 00:31:17,220 --> 00:31:21,670 Perpustakaan CS50, selama ini, mempunyai garis ini selaras 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 dalam Serangga 4, yang hanya mewujudkan sinonim mana char bintang ini boleh menjadi lebih 720 00:31:27,930 --> 00:31:29,290 hanya dirujuk sebagai tali. 721 00:31:29,290 --> 00:31:31,540 Jadi ini adalah salah satu daripada beberapa roda latihan 722 00:31:31,540 --> 00:31:34,120 kami telah menggunakan rahsia bawah hood. 723 00:31:34,120 --> 00:31:36,490 >> Sementara itu, di sini majlis itu, getchar. 724 00:31:36,490 --> 00:31:38,190 Sekarang nampaknya, tidak ada badan kepadanya. 725 00:31:38,190 --> 00:31:40,273 Dan sebenarnya, jika saya terus menatal, saya tidak benar-benar 726 00:31:40,273 --> 00:31:42,080 melihat sebarang pelaksanaan fungsi ini. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Sebagai cek kewarasan, mengapa itu? 729 00:31:45,516 --> 00:31:46,795 >> PENONTON: [didengar]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. MALAN: Yeah. 731 00:31:47,670 --> 00:31:48,950 Jadi ini adalah fail pengepala. 732 00:31:48,950 --> 00:31:52,520 Dan fail header mengandungi prototaip, ditambah beberapa barangan lain, ia seolah-olah, 733 00:31:52,520 --> 00:31:53,780 seperti typedefs. 734 00:31:53,780 --> 00:31:56,910 Tetapi dalam CS50.c, yang kita kena tidak pernah diberikan anda secara terang-terangan, 735 00:31:56,910 --> 00:32:02,100 tetapi telah perkakas CS50 semua kali ini, jauh di dalam folder itu, 736 00:32:02,100 --> 00:32:04,990 melihat bahawa ada keseluruhan sekumpulan fungsi di sini. 737 00:32:04,990 --> 00:32:06,720 >> Malah, mari kita tatal ke bawah. 738 00:32:06,720 --> 00:32:08,810 Mari kita mengabaikan kebanyakan mereka, buat masa sekarang. 739 00:32:08,810 --> 00:32:12,670 Tetapi tatal ke bawah ke getInt dan melihat bagaimana getInt berfungsi. 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 dijaga bagaimana mendapatkan int bekerja, di sini adalah dokumentasi. 742 00:32:17,727 --> 00:32:19,560 Dan di antara perkara-perkara yang ia berkata adalah ia memberitahu anda 743 00:32:19,560 --> 00:32:21,340 apa julat nilai ia boleh kembali. 744 00:32:21,340 --> 00:32:24,400 Ia pada asasnya negatif 2000000000 kepada positif 2 bilion, memberi atau mengambil. 745 00:32:24,400 --> 00:32:26,420 >> Dan ternyata, semua ini masa, walaupun kita tidak pernah 746 00:32:26,420 --> 00:32:28,570 telah anda menyemak untuk itu, jika ada masalah, 747 00:32:28,570 --> 00:32:30,680 ternyata bahawa semua kali ini, getInt mempunyai 748 00:32:30,680 --> 00:32:33,600 telah kembali khas tetap, tidak batal, 749 00:32:33,600 --> 00:32:36,760 tetapi int_max, yang konvensyen hanya programmer ini. 750 00:32:36,760 --> 00:32:38,846 Ini bermakna di sini adalah nilai istimewa. 751 00:32:38,846 --> 00:32:41,470 Pastikan untuk memeriksa ini, hanya dalam kes ada masalah. 752 00:32:41,470 --> 00:32:43,261 Tetapi kita tidak pernah peduli dengan itu setakat ini, 753 00:32:43,261 --> 00:32:45,200 kerana sekali lagi, ini yang dimaksudkan untuk memudahkan. 754 00:32:45,200 --> 00:32:46,950 >> Tetapi bagaimana getInt mendapatkan dilaksanakan? 755 00:32:46,950 --> 00:32:48,450 Nah, satu, ia tidak mengambil hujah-hujah. 756 00:32:48,450 --> 00:32:49,390 Kita tahu bahawa. 757 00:32:49,390 --> 00:32:50,820 Ia kembali int satu. 758 00:32:50,820 --> 00:32:51,950 Kita tahu bahawa. 759 00:32:51,950 --> 00:32:54,460 Jadi bagaimana ia berfungsi di bawah hud? 760 00:32:54,460 --> 00:32:58,290 >> Jadi ada nampaknya tidak terhad gelung, sekurang-kurangnya kemunculan satu. 761 00:32:58,290 --> 00:33:00,290 Perhatikan bahawa kita menggunakan getString. 762 00:33:00,290 --> 00:33:04,000 Jadi, itu yang menarik. getInt panggilan fungsi kita sendiri, getString. 763 00:33:04,000 --> 00:33:05,645 Sekarang mengapa ini mungkin menjadi kes? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Kenapa saya menjadi pertahanan di sini di talian 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Apa yang boleh berlaku dalam talian 164, hanya untuk menjadi jelas? 768 00:33:15,639 --> 00:33:16,930 Ia adalah jawapan yang sama seperti sebelum ini. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Hanya mungkin daripada ingatan. 771 00:33:20,089 --> 00:33:23,130 Ada masalah dengan getString, kami ada untuk dapat mengendalikan itu. 772 00:33:23,130 --> 00:33:27,070 Dan sebab itu saya tidak kembali nol itu, dari segi teknikal, batal adalah penunjuk. 773 00:33:27,070 --> 00:33:29,120 getInt mempunyai untuk kembali int satu. 774 00:33:29,120 --> 00:33:31,060 Jadi saya telah sewenang-wenangnya membuat keputusan, pada dasarnya, 775 00:33:31,060 --> 00:33:34,600 bahawa 2 bilion, memberi atau mengambil, akan menjadi nilai khas yang saya tidak boleh 776 00:33:34,600 --> 00:33:35,970 sebenarnya dapat daripada pengguna. 777 00:33:35,970 --> 00:33:39,930 Ia hanya satu nilai saya akan membazirkan untuk mewakili kod ralat. 778 00:33:39,930 --> 00:33:41,540 >> Jadi sekarang, perkara mendapatkan mewah sedikit. 779 00:33:41,540 --> 00:33:44,670 Dan ia tidak cukup fungsi yang sama seperti sebelum ini, tetapi ia hampir sama. 780 00:33:44,670 --> 00:33:50,120 Jadi notis, saya mengaku di sini, sejajar 172, kedua-dua n int dan char c. 781 00:33:50,120 --> 00:33:53,600 Kemudian saya menggunakan talian funky ini, sscanf, yang ternyata 782 00:33:53,600 --> 00:33:55,990 tidak mengimbas rentetan dari papan kekunci. 783 00:33:55,990 --> 00:33:59,226 Ia berdiri tali yang sedia ada yang pengguna telah ditaip. 784 00:33:59,226 --> 00:34:02,100 Jadi saya telah dipanggil getString, yang bermakna saya mempunyai rentetan dalam ingatan. 785 00:34:02,100 --> 00:34:05,020 sscanf adalah apa yang anda akan memanggil fungsi parsing. 786 00:34:05,020 --> 00:34:07,760 Ia kelihatan di tali saya telah ditaip, watak oleh watak, 787 00:34:07,760 --> 00:34:09,250 dan melakukan sesuatu yang berguna. 788 00:34:09,250 --> 00:34:10,969 Tali yang disimpan dalam talian. 789 00:34:10,969 --> 00:34:13,560 Dan saya tahu bahawa hanya dengan pergi menyandarkan di sini dan berkata, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Saya memanggil ia tidak s masa ini, tetapi talian. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Dan sekarang ini adalah sedikit berbeza. 793 00:34:18,080 --> 00:34:22,480 Tetapi ini berkesan bermakna, atas sebab-sebab kita agak akan melambai tangan kita pada hari ini, 794 00:34:22,480 --> 00:34:26,070 bahawa kita memeriksa untuk melihat jika pengguna menaip di 795 00:34:26,070 --> 00:34:29,909 dan int dan mungkin watak lain. 796 00:34:29,909 --> 00:34:33,610 Jika pengguna menaip di int, ia adalah akan disimpan dalam n, kerana saya 797 00:34:33,610 --> 00:34:36,739 lulus ini dengan alamat, yang silap mata baru yang kita lihat hari ini. 798 00:34:36,739 --> 00:34:41,570 Jika pengguna juga ditaip dalam 123x seperti, bahawa x 799 00:34:41,570 --> 00:34:45,060 akan berakhir sehingga seorang surat dalam watak c. 800 00:34:45,060 --> 00:34:48,739 >> Kini ternyata bahawa sscanf memberitahu saya, bijak, 801 00:34:48,739 --> 00:34:54,750 berapa banyak pembolehubah telah sscanf berjaya dapat mengisi. 802 00:34:54,750 --> 00:34:58,770 Jadi dengan logik ini, jika fungsi Saya melaksanakan adalah getInt, 803 00:34:58,770 --> 00:35:00,900 tetapi saya memeriksa, berpotensi, untuk pengguna 804 00:35:00,900 --> 00:35:04,190 telah ditaip dalam satu int diikuti dengan sesuatu yang lain, 805 00:35:04,190 --> 00:35:08,580 apa yang saya mahu sscanf ini nilai pulangan 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 pulangan 2, apa maksudnya? 809 00:35:19,300 --> 00:35:21,660 Pengguna ini ditaip dalam sesuatu seperti, secara literal, 810 00:35:21,660 --> 00:35:24,770 123x, yang hanya tidak masuk akal. 811 00:35:24,770 --> 00:35:27,490 Ia merupakan satu keadaan kesilapan, dan Saya mahu untuk memeriksa itu. 812 00:35:27,490 --> 00:35:32,960 >> Jadi, jika jenis pengguna ini di dalam, oleh logik ini, apakah sscanf kembali, 813 00:35:32,960 --> 00:35:33,740 kau kata? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Jadi ia akan kembali 2, kerana 123 akan pergi di sini, 816 00:35:39,130 --> 00:35:41,580 dan x akan berakhir di sini. 817 00:35:41,580 --> 00:35:43,970 Tetapi saya tidak mahu x untuk mendapatkan diisi. 818 00:35:43,970 --> 00:35:48,580 Saya mahu sscanf hanya berjaya dalam mengisi pertama pembolehubah. 819 00:35:48,580 --> 00:35:52,490 Dan sebab itu saya mahu sscanf kembali 1. 820 00:35:52,490 --> 00:35:55,750 >> Dan jika ini adalah sedikit di atas kepala buat masa ini, yang benar-benar halus. 821 00:35:55,750 --> 00:36:00,030 Sedarlah walaupun, bahawa salah satu nilai-nilai dan getInt getString 822 00:36:00,030 --> 00:36:03,630 ialah kita lakukan palang pintu daripada banyak kesilapan memeriksa seperti ini supaya 823 00:36:03,630 --> 00:36:07,130 bahawa, sehingga kini, anda boleh cukup banyak menaip apa-apa pun papan kekunci 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 pasti, yang kakitangan, akan pasti tidak 826 00:36:10,592 --> 00:36:13,300 menjadi punca bug dalam anda program, kerana kami pertahanan 827 00:36:13,300 --> 00:36:16,270 memeriksa semua bodoh perkara-perkara yang pengguna boleh lakukan, 828 00:36:16,270 --> 00:36:18,900 seperti menaip rentetan, apabila anda benar-benar mahu int. 829 00:36:18,900 --> 00:36:21,350 Jadi untuk now-- kami akan datang kembali ke ini sebelum long-- 830 00:36:21,350 --> 00:36:23,710 tetapi selama ini, getString dan getInt mempunyai 831 00:36:23,710 --> 00:36:29,950 berada di bawah hud menggunakan ini Idea asas alamat ingatan. 832 00:36:29,950 --> 00:36:32,580 >> Jadi sekarang, mari kita membuat perkara-perkara yang lebih sedikit user-friendly. 833 00:36:32,580 --> 00:36:38,740 Seperti mana yang diketahui, dari Binky lalu time-- jika tetikus saya akan jadi cooperate-- 834 00:36:38,740 --> 00:36:42,560 kami mempunyai kod ini, yang terus-terang, agak tidak masuk akal. 835 00:36:42,560 --> 00:36:45,330 Kod ini mencapai apa-apa berguna, tetapi ia adalah contoh 836 00:36:45,330 --> 00:36:48,330 bahawa profesor Parlante digunakan untuk mewakili 837 00:36:48,330 --> 00:36:51,840 apa yang berlaku dalam program yang melibatkan ingatan. 838 00:36:51,840 --> 00:36:54,850 >> Jadi mari kita menceritakan semula ini cerita secara ringkas super. 839 00:36:54,850 --> 00:36:58,720 Kedua-dua baris pertama, dalam Bahasa Inggeris, adakah apa yang akan anda katakan? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Hanya dalam munasabah manusia, tetapi sedikit istilah teknikal, mengambil menikam. 842 00:37:05,430 --> 00:37:06,346 PENONTON: [didengar]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. MALAN: OK, anda mewujudkan alamat untuk x dan y pembolehubah. 845 00:37:11,080 --> 00:37:15,520 Tidak cukup, kerana x dan y tidak pembolehubah dalam erti kata yang 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 cuba ini sekali lagi. 848 00:37:19,220 --> 00:37:21,010 Tidak satu permulaan yang tidak baik, walaupun. 849 00:37:21,010 --> 00:37:21,510 Yeah? 850 00:37:21,510 --> 00:37:22,426 >> PENONTON: [didengar]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. MALAN: Baik. 853 00:37:24,840 --> 00:37:26,173 Saya rasa itulah yang lebih bersih sedikit. 854 00:37:26,173 --> 00:37:28,630 Mengisytiharkan dua petunjuk, dua integer. 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 untuk menarik ini sebagai gambaran yang, sekali lagi, 857 00:37:32,790 --> 00:37:36,410 ingat cukup hanya bahawa semua yang kami lakukan dengan baris pertama 858 00:37:36,410 --> 00:37:39,690 adalah melukis kotak seperti ini, dengan beberapa nilai sampah di dalamnya, 859 00:37:39,690 --> 00:37:41,920 dan memanggil ia x, dan kemudian kotak lain seperti ini, 860 00:37:41,920 --> 00:37:43,880 dengan beberapa nilai sampah di dalamnya, memanggil y. 861 00:37:43,880 --> 00:37:45,810 Kami telah diisytiharkan dua petunjuk yang akhirnya 862 00:37:45,810 --> 00:37:47,860 akan menyimpan alamat int satu. 863 00:37:47,860 --> 00:37:49,170 Jadi, itu semua ada. 864 00:37:49,170 --> 00:37:53,290 >> Oleh itu, apabila Binky lakukan ini, tanah liat hanya kelihatan seperti ini. 865 00:37:53,290 --> 00:37:55,350 Dan Nick hanya jenis berselimut anak panah, 866 00:37:55,350 --> 00:37:57,590 seolah-olah mereka tidak menunjukkan mana-mana sahaja khususnya, kerana mereka hanya 867 00:37:57,590 --> 00:37:58,250 nilai-nilai sampah. 868 00:37:58,250 --> 00:38:01,670 Mereka tidak jelas dimulakan mana-mana sahaja khususnya. 869 00:38:01,670 --> 00:38:03,980 >> Sekarang barisan seterusnya pada kod, ingat, adalah ini. 870 00:38:03,980 --> 00:38:07,510 Jadi dalam munasabah mesra pengguna, tetapi agak teknikal Bahasa Inggeris, 871 00:38:07,510 --> 00:38:09,790 apa yang baris ini kod lakukan? 872 00:38:09,790 --> 00:38:10,391 Yeah? 873 00:38:10,391 --> 00:38:11,333 >> PENONTON: [didengar]. 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 Ia memperuntukkan sebahagian daripada memori itu saiz int satu. 877 00:38:17,016 --> 00:38:18,140 Dan itu separuh jawapannya. 878 00:38:18,140 --> 00:38:20,056 Anda menjawab hak separuh daripada ungkapan. 879 00:38:20,056 --> 00:38:22,473 Apa yang berlaku ke atas sebelah kiri tanda sama? 880 00:38:22,473 --> 00:38:22,972 Yeah? 881 00:38:22,972 --> 00:38:24,814 PENONTON: Dan penerima serah hak ia x boleh ubah? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. MALAN: Dan penerima serah hak kepada yang x berubah-ubah. 883 00:38:27,690 --> 00:38:31,650 Jadi untuk recap, memperuntukkan bahagian kanan memori yang cukup untuk menyimpan int satu. 884 00:38:31,650 --> 00:38:34,150 Tetapi malloc khusus kembali alamat 885 00:38:34,150 --> 00:38:37,270 itu sebahagian daripada ingatan, yang anda mempunyai hanya dicadangkan akan disimpan dalam x. 886 00:38:37,270 --> 00:38:42,560 >> Jadi apa yang Nick lakukan masa lalu dengan Binky adalah dia mengheret penunjuk yang keluar, tanah liat, 887 00:38:42,560 --> 00:38:46,820 ke titik di sebahagian putih memori yang adalah sama dengan saiz int satu. 888 00:38:46,820 --> 00:38:49,360 Dan sesungguhnya, itu bermakna untuk mewakili empat bait. 889 00:38:49,360 --> 00:38:55,310 >> Sekarang, baris berikutnya kod melakukan ini, bintang x mendapat 42. 890 00:38:55,310 --> 00:38:58,530 Jadi 42 adalah jelas di sebelah kanan, makna kehidupan. 891 00:38:58,530 --> 00:39:00,500 Sebelah kiri tangan, bintang x bermaksud apa? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Itu juga mungkin mempunyai gone-- itu OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> PENONTON: Pada dasarnya, pergi ke [didengar] 896 00:39:06,875 --> 00:39:07,750 DAVID J. MALAN: Baik. 897 00:39:07,750 --> 00:39:08,760 PENONTON: [didengar]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. MALAN: Tepat sekali. 899 00:39:09,760 --> 00:39:11,979 Sebelah kiri bermakna pergi ke x. 900 00:39:11,979 --> 00:39:12,520 x adalah alamat. 901 00:39:12,520 --> 00:39:15,520 Ia seperti 33 Oxford Street, atau Ox1. 902 00:39:15,520 --> 00:39:18,690 Dan bintang x bermakna pergi ke menangani dan meletakkan apa yang ada? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Jadi sesungguhnya, itulah apa yang Nick lakukan. 905 00:39:21,290 --> 00:39:23,740 Beliau memulakan dengan oleh, dasarnya, mental 906 00:39:23,740 --> 00:39:26,270 menunjuk jari di x, berikutan anak panah 907 00:39:26,270 --> 00:39:30,670 ke kotak putih di tangan kanan sampingan, dan meletakkan bilangan 42 di sana. 908 00:39:30,670 --> 00:39:34,120 Tetapi perkara yang mendapat sedikit berbahaya, betul? 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, ertinya apa? 911 00:39:39,465 --> 00:39:43,620 Jadi bintang y cara pergi ke alamat dalam y. 912 00:39:43,620 --> 00:39:45,630 Tetapi apa yang alamat dalam y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Baiklah, itu nilai sampah, bukan? 915 00:39:49,440 --> 00:39:50,800 Saya menarik sebagai tanda tanya. 916 00:39:50,800 --> 00:39:54,850 Nick menarik sebagai anak panah yg beredar. 917 00:39:54,850 --> 00:39:59,600 Dan sebaik sahaja anda cuba untuk lakukan bintang y, berkata ke sana, 918 00:39:59,600 --> 00:40:03,872 tetapi tidak ada yang sah alamat, ia beberapa lokasi palsu, 919 00:40:03,872 --> 00:40:05,080 program yang akan crash. 920 00:40:05,080 --> 00:40:08,580 Dan kepala Binky ini akan untuk terbang di sini, seperti yang berlaku. 921 00:40:08,580 --> 00:40:12,130 >> Jadi pada akhirnya, program ini hanya kecacatan keluar rata. 922 00:40:12,130 --> 00:40:13,540 Ia merupakan satu program kereta. 923 00:40:13,540 --> 00:40:14,760 Dan ia perlu tetap. 924 00:40:14,760 --> 00:40:18,260 Dan satu-satunya cara, benar-benar, untuk menetapkan akan, misalnya, talian ini, 925 00:40:18,260 --> 00:40:21,010 yang kami tidak dapat, kerana program yang terhempas terlalu awal. 926 00:40:21,010 --> 00:40:26,170 Tetapi jika kita menetapkan ini, apa yang kesan tidak melakukan y x sama ada? 927 00:40:26,170 --> 00:40:30,010 Nah, ia pada dasarnya menunjukkan y di apa sahaja nilai x adalah menghala ke arah. 928 00:40:30,010 --> 00:40:32,430 >> Jadi dalam cerita Nick, atau cerita Binky ini, kedua-dua 929 00:40:32,430 --> 00:40:34,640 x dan y telah menghala ke arah sebahagian putih ingatan, 930 00:40:34,640 --> 00:40:38,300 sehingga, akhirnya, apabila anda adakah bintang y sama dengan 13 lagi, 931 00:40:38,300 --> 00:40:43,080 anda berakhir meletakkan 13 dalam lokasi yang sesuai. 932 00:40:43,080 --> 00:40:47,640 Jadi semua ayat-ayat ini adalah sempurna sah, kecuali yang satu ini, 933 00:40:47,640 --> 00:40:51,730 apabila ia berlaku sebelum anda sebenarnya ditugaskan y beberapa nilai. 934 00:40:51,730 --> 00:40:54,290 >> Sekarang bersyukur, anda tidak perlu sebab melalui semua 935 00:40:54,290 --> 00:40:56,560 ini jenis isu-isu sendiri. 936 00:40:56,560 --> 00:40:59,310 Biar saya pergi ke hadapan dan membuka tetingkap terminal di sini 937 00:40:59,310 --> 00:41:03,050 dan membuka, hanya seketika, program super pendek yang 938 00:41:03,050 --> 00:41:04,360 juga semacam sia-sia. 939 00:41:04,360 --> 00:41:05,152 Ia hodoh. 940 00:41:05,152 --> 00:41:06,610 Ia tidak mencapai apa-apa yang berguna. 941 00:41:06,610 --> 00:41:10,180 Tetapi ia menunjukkan isu-isu ingatan, jadi mari kita lihat. 942 00:41:10,180 --> 00:41:11,830 >> Utama, super mudah. 943 00:41:11,830 --> 00:41:14,830 Ia nampaknya panggilan fungsi, f, dan kemudian kembali 0. 944 00:41:14,830 --> 00:41:16,310 Ia adalah jenis sukar untuk keadaan huru-hara ini sehingga. 945 00:41:16,310 --> 00:41:18,540 Jadi utama adalah cukup baik, setakat ini. 946 00:41:18,540 --> 00:41:20,100 >> Jadi f adalah bermasalah. 947 00:41:20,100 --> 00:41:22,120 Dan hanya tidak meletakkan banyak usaha ke dalam menamakan ia 948 00:41:22,120 --> 00:41:23,990 di sini, untuk fokus pada kod. 949 00:41:23,990 --> 00:41:25,740 f mempunyai dua baris. 950 00:41:25,740 --> 00:41:27,610 Dan mari kita lihat apa yang kini berlaku. 951 00:41:27,610 --> 00:41:29,840 Jadi di satu pihak here-- dan izinkan saya membuat 952 00:41:29,840 --> 00:41:32,680 ini selaras dengan sebelumnya example-- dalam satu tangan, 953 00:41:32,680 --> 00:41:35,830 yang sebelah kiri adalah melakukan apa yang, dalam bahasa Inggeris? 954 00:41:35,830 --> 00:41:36,493 Ia is-- 955 00:41:36,493 --> 00:41:37,701 PENONTON: Mewujudkan penunjuk. 956 00:41:37,701 --> 00:41:40,830 DAVID J. MALAN: Mewujudkan penunjuk untuk int dan memanggil x. 957 00:41:40,830 --> 00:41:43,789 Jadi ia mewujudkan salah satu kotak Saya sentiasa melukis pada skrin sentuh. 958 00:41:43,789 --> 00:41:45,913 Dan kini, di tangan kanan sampingan, malloc, sudah tentu, 959 00:41:45,913 --> 00:41:47,420 memperuntukkan sebahagian daripada ingatan. 960 00:41:47,420 --> 00:41:49,989 Dan hanya untuk mengetahui dengan jelas bagaimana memori banyak adalah ia nampaknya 961 00:41:49,989 --> 00:41:52,030 memperuntukkan, jika anda hanya jenis matematik di sini? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Jadi ia 40 bait. 964 00:41:54,040 --> 00:41:57,400 Dan saya tahu bahawa hanya kerana saya tahu satu int, perkakas CS50, sekurang-kurangnya, 965 00:41:57,400 --> 00:41:58,060 adalah empat bait. 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 x, alamat daripada keluar pertama 40 ints yang 968 00:42:04,924 --> 00:42:07,340 telah diperuntukkan ruang belakang, ke belakang, ke belakang, ke belakang. 969 00:42:07,340 --> 00:42:08,470 >> Dan itulah apa yang penting tentang malloc. 970 00:42:08,470 --> 00:42:11,261 Ia tidak mengambil ingatan sedikit di sini, sedikit di sini, sedikit di sini. 971 00:42:11,261 --> 00:42:14,220 Ia memberikan satu sebahagian daripada ingatan, 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 perkara ini, x pendakap 10 sama dengan 0? 974 00:42:18,500 --> 00:42:19,470 Baris kod sewenang-wenangnya. 975 00:42:19,470 --> 00:42:21,100 Ia tidak mencapai apa-apa yang berguna. 976 00:42:21,100 --> 00:42:26,128 Tetapi ia adalah menarik, kerana x kurungan 10--? 977 00:42:26,128 --> 00:42:26,628 Yeah? 978 00:42:26,628 --> 00:42:27,912 >> PENONTON: [didengar]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. MALAN: x kurungan 10 tidak perlu batal. 980 00:42:30,500 --> 00:42:35,070 Yang terperinci null hanya mula bermain dengan tali, pada akhir rentetan. 981 00:42:35,070 --> 00:42:36,700 Tetapi pemikiran yang baik. 982 00:42:36,700 --> 00:42:39,615 >> Bagaimana besar adalah array ini, walaupun walaupun saya telah memperuntukkan 40 bait? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Ia 0 melalui sembilan, bukan? 985 00:42:43,690 --> 00:42:45,120 Ia 10 ints, jumlah. 986 00:42:45,120 --> 00:42:48,790 40 bait, tetapi 10 ints, diindeks melalui 0 0. 987 00:42:48,790 --> 00:42:50,930 >> Jadi apa yang x pendakap 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 Ia memori yang bukan milik saya. 990 00:42:54,780 --> 00:42:59,650 Saya tidak boleh menyentuh bahawa bait bilangan 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Saya akan sedikit terlalu jauh. 992 00:43:01,420 --> 00:43:04,490 >> Dan sesungguhnya, sekiranya saya ini program, dengan baik mungkin crash. 993 00:43:04,490 --> 00:43:05,790 Tetapi kadang-kadang, kita akan mendapat bertuah. 994 00:43:05,790 --> 00:43:07,706 Dan sebagainya hanya untuk menunjukkan this-- dan terus-terang, 995 00:43:07,706 --> 00:43:11,000 anda tidak pernah tahu sebelum anda adakah it-- mari kita berjalan ini. 996 00:43:11,000 --> 00:43:12,480 Ia sebenarnya tidak crash. 997 00:43:12,480 --> 00:43:15,032 >> Tetapi jika saya menukar ini, untuk contoh, untuk menjadi seperti 1,000, 998 00:43:15,032 --> 00:43:16,740 untuk membuat ini benar-benar sengaja, mari kita lihat 999 00:43:16,740 --> 00:43:18,710 jika kita boleh mendapatkannya untuk berlanggar masa ini. 1000 00:43:18,710 --> 00:43:20,070 OK, ia tidak crash. 1001 00:43:20,070 --> 00:43:22,600 Bagaimana kira-kira 100,000? 1002 00:43:22,600 --> 00:43:25,000 Mari kita membentuk semula, dan kini ia jalankan lagi. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Phew. 1005 00:43:25,960 --> 00:43:26,460 Baiklah. 1006 00:43:26,460 --> 00:43:29,090 Jadi nampaknya, sekali lagi, ini segmen memori, jadi untuk bercakap, 1007 00:43:29,090 --> 00:43:32,660 munasabah besar, jadi kita boleh mendapatkan bertuah lagi dan lagi. 1008 00:43:32,660 --> 00:43:36,510 Tetapi akhirnya, apabila anda mendapat masuk akal dan benar-benar pergi jauh pada skrin, 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 >> Tetapi terus-terang, ini jenis pepijat akan 1011 00:43:40,870 --> 00:43:43,020 menjadi sukar untuk memikirkan sendiri. 1012 00:43:43,020 --> 00:43:47,880 Tetapi, Alhamdullillah sebagai pengaturcara, kita mempunyai alat yang membolehkan kita untuk melakukan ini untuk kita. 1013 00:43:47,880 --> 00:43:50,140 Jadi ini adalah, mungkin, satu program paling hodoh, 1014 00:43:50,140 --> 00:43:52,060 walaupun lebih hodoh daripada output GDB ini. 1015 00:43:52,060 --> 00:43:55,670 Tetapi ia sentiasa mempunyai garis atau dua yang super berguna. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind adalah program yang membantu anda tidak debug program, per se, 1017 00:44:00,310 --> 00:44:03,500 tetapi mencari memori yang berkaitan masalah, secara khusus. 1018 00:44:03,500 --> 00:44:07,590 Ia secara automatik akan berjalan kod anda untuk anda dan mencari sekurang-kurangnya dua perkara. 1019 00:44:07,590 --> 00:44:10,680 Satu, adakah anda melakukan sesuatu tidak sengaja seperti memori sentuhan 1020 00:44:10,680 --> 00:44:11,980 yang tidak milik anda? 1021 00:44:11,980 --> 00:44:13,590 Ia akan membantu anda mencari kes-kes. 1022 00:44:13,590 --> 00:44:15,710 >> Dan dua, ia akan membantu anda mencari sesuatu yang dinamakan 1023 00:44:15,710 --> 00:44:19,270 kebocoran memori, yang kita mempunyai benar-benar diabaikan, naif, 1024 00:44:19,270 --> 00:44:21,380 untuk beberapa lama dan bahagia. 1025 00:44:21,380 --> 00:44:23,140 Tetapi ternyata, semua masa ini, bila-bila masa 1026 00:44:23,140 --> 00:44:26,620 anda dipanggil getString dalam begitu banyak program-program kami, 1027 00:44:26,620 --> 00:44:28,930 anda meminta operasi sistem untuk ingatan, 1028 00:44:28,930 --> 00:44:32,070 tetapi anda mempunyai sebarang ingatan yang sentiasa memberikan 1029 00:44:32,070 --> 00:44:36,169 kembali, melakukan unalloc, atau percuma, kerana ia dipanggil. 1030 00:44:36,169 --> 00:44:37,960 Tidak, kerana kita telah tidak meminta anda untuk berbuat demikian. 1031 00:44:37,960 --> 00:44:41,250 >> Tetapi selama ini, program-program anda telah menulis dalam C 1032 00:44:41,250 --> 00:44:43,800 telah bocor ingatan, meminta operasi 1033 00:44:43,800 --> 00:44:46,190 sistem untuk lebih banyak memori untuk tali dan barang kecil, 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 daripada melampaui batas yang, 1036 00:44:50,080 --> 00:44:53,550 tetapi jika anda telah pernah menjalankan Mac anda atau PC anda untuk beberapa waktu, membuka 1037 00:44:53,550 --> 00:44:55,790 banyak program, mungkin menutup program, 1038 00:44:55,790 --> 00:44:57,795 dan walaupun anda komputer tidak terhempas, 1039 00:44:57,795 --> 00:45:01,690 ia semakin banyak lebih perlahan, seolah-olah ia benar-benar 1040 00:45:01,690 --> 00:45:04,290 menggunakan banyak memori atau sumber, walaupun, 1041 00:45:04,290 --> 00:45:06,070 jika anda tidak walaupun menyentuh papan kekunci, 1042 00:45:06,070 --> 00:45:10,430 yang boleh adalah-- tetapi tidak boleh always-- menjadi bahawa program-program yang anda jalankan 1043 00:45:10,430 --> 00:45:11,920 mandapat kebocoran memori. 1044 00:45:11,920 --> 00:45:15,645 Dan mereka terus bertanya OS yang lebih dan memori lebih, tetapi melupakan mengenainya, 1045 00:45:15,645 --> 00:45:18,470 sebenarnya tidak menggunakannya, tetapi Oleh itu, mengambil ingatan jauh 1046 00:45:18,470 --> 00:45:20,500 daripada program-program lain yang mungkin mahu. 1047 00:45:20,500 --> 00:45:23,940 Itulah penjelasan yang sama. 1048 00:45:23,940 --> 00:45:25,940 Sekarang ada di mana ini Valgrind output benar-benar 1049 00:45:25,940 --> 00:45:29,290 kejam kepada mereka yang kurang dan lebih selesa sama. 1050 00:45:29,290 --> 00:45:32,690 Tetapi yang menarik barangan yang tepat di sini. 1051 00:45:32,690 --> 00:45:37,060 Ia memberitahu saya yang menulis tidak sah saiz empat berlaku dalam program ini, 1052 00:45:37,060 --> 00:45:40,640 khususnya, di talian 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Jika saya pergi ke beratur 21, hm, memang adalah tidak sah menulis saiz empat. 1054 00:45:45,450 --> 00:45:46,250 Mengapa saiz empat? 1055 00:45:46,250 --> 00:45:49,500 Nah, number-- ini dan ia boleh anything-- adalah int satu. 1056 00:45:49,500 --> 00:45:50,450 Jadi ia empat bait. 1057 00:45:50,450 --> 00:45:52,550 Jadi saya meletakkan empat bait di mana mereka tidak tergolong. 1058 00:45:52,550 --> 00:45:55,080 Itulah yang Valgrind sebenarnya memberitahu saya. 1059 00:45:55,080 --> 00:45:57,600 Selain itu, ia juga akan beritahu saya, seperti yang kita akan melihat, 1060 00:45:57,600 --> 00:46:01,490 seperti anda menjalankan ini dalam Serangga masa hadapan, jika dan apabila anda telah bocor memori, yang sesungguhnya 1061 00:46:01,490 --> 00:46:05,300 Saya, kerana saya telah dipanggil malloc, tetapi saya tidak mempunyai benar-benar 1062 00:46:05,300 --> 00:46:08,010 dipanggil, dalam kes ini, percuma, yang akhirnya kita akan melihat 1063 00:46:08,010 --> 00:46:09,830 adalah bertentangan dengan malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Jadi sekarang, saya fikir, satu contoh yang akhir. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Jadi yang satu ini lebih sedikit yang sukar difahami, tetapi ia mungkin 1068 00:46:16,690 --> 00:46:19,180 sebab terbesar kepada berhati-hati dengan ingatan, 1069 00:46:19,180 --> 00:46:24,490 dan alasan bahawa banyak program dan / atau pelayan web, sehingga ke hari ini, 1070 00:46:24,490 --> 00:46:28,200 diambil alih oleh orang jahat di suatu tempat di internet yang entah bagaimana 1071 00:46:28,200 --> 00:46:33,390 menghantar paket palsu ke pelayan anda cuba untuk berkompromi akaun 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 mencadangkan, cara 1074 00:46:38,910 --> 00:46:40,740 melimpah bukan int, tetapi penampan. 1075 00:46:40,740 --> 00:46:43,490 Dan penampan hanya cara yang mewah mengatakan ia adalah sekumpulan ingatan. 1076 00:46:43,490 --> 00:46:46,710 >> Dan sesungguhnya, saya dipanggil rentetan sebelum penampan, bukan s. 1077 00:46:46,710 --> 00:46:49,234 Kerana jika ia penampan, seperti dalam erti kata YouTube, 1078 00:46:49,234 --> 00:46:52,400 atau bila-bila masa anda menonton video, anda mungkin telah melihat buffering perkataan, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 Ia amat menjengkelkan. 1081 00:46:54,240 --> 00:46:55,990 Dan itu hanya bermakna bahawa pemain video anda 1082 00:46:55,990 --> 00:46:58,710 cuba untuk memuat turun banyak bait, banyak bait 1083 00:46:58,710 --> 00:47:00,170 dari video dari internet. 1084 00:47:00,170 --> 00:47:02,920 Tetapi ia perlahan, jadi ia cuba turun sekumpulan daripada mereka 1085 00:47:02,920 --> 00:47:06,430 untuk mengisi penampan, bekas, supaya anda mempunyai bait yang cukup bahawa ia boleh kemudian 1086 00:47:06,430 --> 00:47:09,174 menunjukkan video, tanpa berhenti terus-menerus. 1087 00:47:09,174 --> 00:47:11,340 Tetapi ternyata, anda boleh mempunyai penimbal ini besar. 1088 00:47:11,340 --> 00:47:15,710 Tetapi cuba untuk meletakkan ini banyak data dalam , dan sangat perkara-perkara buruk boleh berlaku. 1089 00:47:15,710 --> 00:47:22,780 Jadi sebagai contoh, mari kita lihat teaser ini terakhir 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 berbuat apa-apa super berguna. 1092 00:47:26,540 --> 00:47:29,590 Ia mempunyai fungsi Utama yang menyeru fungsi itu, f. 1093 00:47:29,590 --> 00:47:36,640 Dan fungsi yang, f, di sini, mempunyai pelbagai char, yang dipanggil c, saiz 12. 1094 00:47:36,640 --> 00:47:39,340 Kemudian ia menggunakan ini fungsi baru yang dipanggil strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Ternyata, dengan ini mudah, talian mudah kod, hanya dua baris, 1097 00:47:45,190 --> 00:47:49,130 kami telah membuat keseluruhan program saya, dan oleh itu, seluruh komputer saya, 1098 00:47:49,130 --> 00:47:54,000 dan akaun pengguna saya, dan keras saya memandu berpotensi terdedah kepada sesiapa sahaja 1099 00:47:54,000 --> 00:47:58,170 yang tahu dan cukup baik untuk menjalankan program ini dengan baris arahan tertentu 1100 00:47:58,170 --> 00:47:58,900 hujah. 1101 00:47:58,900 --> 00:48:03,400 Dalam erti kata lain, jika lelaki yang buruk ini meletakkan bahagian dalam argvargv [1] dengan menaip 1102 00:48:03,400 --> 00:48:08,750 di papan kekunci yang sangat khas yang direka tali, tidak abc, 123, tetapi pada dasarnya, 1103 00:48:08,750 --> 00:48:15,180 Simbol binari yang mewakili laku kod, satu program yang dia menulis, 1104 00:48:15,180 --> 00:48:19,190 dengan program ini mudah, iaitu wakil beribu-ribu program 1105 00:48:19,190 --> 00:48:23,610 yang juga terdedah, berani mengatakan, dia akhirnya boleh memadam semua 1106 00:48:23,610 --> 00:48:26,680 fail pada cakera keras saya, mendapatkan berkelip segera supaya dia boleh 1107 00:48:26,680 --> 00:48:30,170 menaip arahan sendiri, e-mel kepada semua fail kepada diri saya sendiri. 1108 00:48:30,170 --> 00:48:34,660 Apa-apa yang boleh saya lakukan, beliau atau dia boleh lakukan dengan kod ini. 1109 00:48:34,660 --> 00:48:36,575 >> Kami tidak akan cukup menyelesaikan ini. 1110 00:48:36,575 --> 00:48:38,700 Dan sebenarnya, ia akan melibatkan gambar kecil 1111 00:48:38,700 --> 00:48:41,470 seperti ini, yang kita tidak lama lagi akan datang untuk memahami semua lebih baik. 1112 00:48:41,470 --> 00:48:44,480 Tetapi hari ini, mari kita berakhir pada apa yang diharapkan yang lebih sedikit 1113 00:48:44,480 --> 00:48:48,360 difahami XKCD jenaka, sehingga kita menyambung semula lain kali. 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 Jumpa anda pada hari Rabu. 1117 00:48:53,446 --> 00:48:54,754 >> [MUZIK bermain] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: Dan sekarang, dalam fikiran, oleh Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Ingatan adalah seperti melompat ke dalam timbunan daun emas pada petang Ahad. 1121 00:49:04,770 --> 00:49:09,000 Angin bertiup, melambung anda hair-- oh, saya terlepas hari-hari when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Ketawa] 1124 00:49:12,650 --> 00:49:13,750