[MUZIK bermain] DAVID J. MALAN: Baiklah. Ini adalah CS50. Dan ini adalah permulaan minggu 5. Dan seperti yang anda mungkin perasan, beberapa bahan semakin sedikit kompleks, lebih padat kecil. 

Dan ia sangat mudah, terutamanya jika anda berada dalam tabiat itu untuk beberapa waktu, yang akan cuba untuk tulisan oragn ayam turun paling apa-apa yang kita lakukan, kita katakan di dalam kelas. Tetapi sedar, yang tidak mungkin pendekatan pedagogi yang sesuai untuk pembelajaran jenis ini bahan, dan bahan amnya. Dan kami gembira mengumumkan bahawa Gheng CS50 sendiri Gong telah mula menyediakan satu set nota berkanun untuk kursus ini, harapan yang ialah, satu, ini bukan sahaja berfungsi sebagai rujukan dan sumber yang mengkaji bahan dan pergi kembali melalui bahan yang mungkin mempunyai melarikan diri anda kali pertama sekitar, tetapi juga supaya kepala anda boleh menjadi lebih sehingga dari bawah, apabila ia tiba masa untuk bersyarah, supaya kamu melibatkan diri lebih teliti, sebagai berbanding dengan lebih scribbly. 

Dengan itu berkata, apa yang anda dapati dari laman web ini adalah apa-apa dokumen seperti ini. Dan notis, di sebelah kiri atas, ada bukan sahaja isi kandungan, tetapi juga kod masa itu dengan serta-merta akan melompat anda kepada bahagian yang berkenaan dalam talian video. Dan apa Chang di sini telah dilakukan adalah, pada dasarnya, didokumenkan apa yang berlaku di ini kuliah tertentu. Dan banyak kuliah adalah sudah dalam talian sekarang dengan URL ini. Dan kami akan terus pos selebihnya dari orang-orang pada akhir minggu ini, jadi jangan mengambil kesempatan daripada sumber itu. 

Jadi tanpa berlengah-lengah lagi, kami mula mengupas kembali lapisan yang telah tali untuk beberapa ketika. Dan apa yang kita katakan tali sebenarnya minggu lepas? Bintang jadi arang. Dan char bintang, baik, apa adakah yang benar-benar bermakna? Nah, selama ini, jika kita telah telah memanggil fungsi, seperti getString, dan penyimpanan pulangan yang dipanggil nilai getString dalam variable-- ia dipanggil s Jenis string-- kita telah menulis garis kod di sana atas. Dan ia hanya apabila saya melihat saya tulisan tangan diperbesarkan di sini saya menyedari betapa kejam ini. 

Walau bagaimanapun, mari kita andaikan bahawa, di sebelah kanan adalah, bagaimanapun, yang munasabah gambaran apa yang telah berlaku semua ini masa dengan getString. getString, sudah tentu, mendapat rentetan. Tapi apa yang benar-benar bermakna? Ini bermakna ia menjadi sebahagian daripada memori dari sistem operasi dengan memanggil fungsi, yang dipanggil malloc. Tetapi lebih kepada yang kemudian. Dan kemudian ia populates bahawa sebahagian daripada memori dengan huruf yang pengguna mempunyai ditaip dalam, diikuti oleh, sudah tentu, watak batal, atau garis sendeng terbalik sifar pada akhirnya. 

Sementara itu, di sebelah kiri cerita ini, selama ini, kita telah mengisytiharkan pembolehubah, seperti s. Dan berubah itulah yang kini akan mula memanggil penunjuk. Ia bukan satu kotak di dalam yang kita meletakkan tali, Daven, per se, tetapi sebaliknya kita masukkan ke dalam persegi yang kotak di sebelah kiri apa sebenarnya? Yeah? 

PENONTON: Alamat di mana ia terletak di ingatan. 

DAVID J. MALAN: Tepat sekali. Alamat di mana Daven terletak dalam ingatan. Dan tidak di mana semua Daven terletak, per se, tetapi khususnya alamat daripada apa? Yeah? 

PENONTON: aksara Pertama. 

DAVID J. MALAN: Watak pertama di Daven, yang, dalam kes ini, Saya dicadangkan adalah sewenang-wenangnya dan unrealistically 1, Ox1, yang hanya bermaksud nombor perenambelasan 1. Tetapi ia mungkin akan menjadi nombor yang lebih besar bahawa kita mungkin menarik dengan 0x sebagai awalan, mewakili watak perenambelasan. Dan kerana kita tidak perlu tahu di mana yang lain daripada watak-watak Daven adalah dengan sebab apa reka bentuk yang mudah keputusan yang telah dibuat bertahun-tahun yang lalu? Yeah? 

PENONTON: backslash 0. DAVID J. MALAN: Ya, betul-betul. Backslash 0 membolehkan anda, walaupun dalam masa linear, untuk merentasi tali, berjalan dari kiri ke kanan, dengan gelung, atau seketika gelung, atau sesuatu seperti itu, dan menentukan, oh, di sini adalah akhir tali telefon ini. Jadi dengan hanya alamat di permulaan rentetan, kita dapat mengakses keseluruhan daripada , kerana selama ini, rentetan baru sahaja menjadi bintang char. 

Jadi ia pasti halus untuk terus menggunakan perpustakaan CS50 dan abstrak ini, jadi untuk bercakap, tetapi kita akan mula melihat dengan tepat apa yang telah berlaku di bawah masa ini keseluruhan. Jadi, anda mungkin ingat contoh ini, juga, dari semasa lepas, bandingkan 0, yang tidak benar-benar membandingkan. Tetapi kita mula untuk menyelesaikan ini. 

Tetapi sebagai ulang kaji yang mungkin, mungkin saya menarik minat seseorang dalam gajah merah jambu hari ini, juga dibuat oleh Chang? Bagaimana pula dengan anda di hadapan? [Didengar]. Marilah naik. 

Dan dalam pada itu, kerana anda datang, mari kita mempertimbangkan untuk seketika apa kod ini sebenarnya lakukan. Ia mengisytiharkan dua pembolehubah sehingga atas, s dan t, dan memanggil getString. Ini bukan satu yang mesra pengguna program yang sangat, kerana ia tidak memberitahu anda apa yang perlu dilakukan. Tetapi mari kita hanya menganggap kami memberi tumpuan kepada bahagian yang berair. Dan kemudian kita lakukan, jika s sama sama t, ada yang berkata printf, anda taip perkara yang sama. Hello. Apa nama anda? 

Janelle: Janelle. DAVID J. MALAN: Janelle, baik untuk bertemu dengan kamu. Jadi cabaran anda di tangan untuk gajah ini ialah dengan menarik kita gambar apa yang diwakili dalam dua yang pertama baris. Jadi s dan t mungkin diwakili bagaimana pada skrin? Dan anda boleh menarik dengan jari anda pada skrin besar. 

Jadi ada dua bahagian kepada setiap sisi persamaan itu. Jadi ada s di sebelah kiri, dan kemudian getString di sebelah kanan. Dan kemudian ada t di sebelah kiri, dan kemudian getString di sebelah kanan. Jadi bagaimana kita boleh memulakan melukis gambar yang mewakili apa yang berlaku di sini dalam ingatan, kau kata? Dan biarlah saya memberitahu anda menjelaskan apa yang anda lakukan seperti yang anda pergi. 

Janelle: OK. Well, pertama, ia akan meminta anda untuk mendapatkan rentetan input. Dan ia akan store-- oh, maaf. DAVID J. MALAN: OK. Baik. Dan ini dipanggil apa? Oh, OK. Teruskan usaha. Saya tidak bermaksud untuk mengganggu. Janelle: Maaf. Jadi ia akan menjadi input alamat tersebut tidak daripada-- pasti. Saya tidak dapat ingat dengan tepat jumlah itu, tetapi saya percaya ia bermula dengan 0. 

DAVID J. MALAN: Itu betul, kerana saya membuat nombor sehingga, jadi tidak ada jawapan yang betul. 

Janelle: Bermula dengan 0 arka. 

DAVID J. MALAN: OK, jadi elemen 0. Pasti. 

Janelle: Kemudian jika adalah seperti hanya dua letter-- 

DAVID J. MALAN: OK, kembali kepada anda. 

Janelle: Jadi elemen 0, dan maka elemen 1 atau 2 unsur. DAVID J. MALAN: Dan yang sekeping gambar yang anda melukis sekarang? Laungan getString? Atau pengisytiharan s? 

Janelle: Perisytiharan itu s, saya percaya. Oh, yang getString, kerana ia akan akan dimasukkan ke dalam setiap [? kawasan. ?] 

DAVID J. MALAN: Baik. Tepat sekali. Walaupun ini berkesan kembali pelbagai, ingat, apabila kita kembali rentetan, kita boleh indeks ke dalam tali yang menggunakan 01 dan 2. Secara teknikal, ini mungkin diwakili oleh alamat individu, tetapi itulah denda. 

Jadi andaikan, jika saya boleh hanya cepat menghantar kepada mana kita berhenti Kali terakhir, jika salah satu tali adalah g b e, 0 garis sendeng terbalik, dengan itu mewakili Gabe ini input, bagaimana kita boleh mewakili s sekarang? Jika ini adalah memori itu telah dikembalikan oleh getString? 

Janelle: Adakah ia diwakili oleh arka? 

DAVID J. MALAN: Dengan arka? Nah, tidak. Mari kita katakan, bergambar, biarlah saya pergi ke hadapan dan mencadangkan bahawa, jika ini adalah s, ini adalah nilai pulangan getString. Dan anda telah disediakan ini sebagai 0, 1, 2, yang adalah sempurna yang munasabah, kerana kita boleh indeks ke dalam tali, seperti itu. Tetapi untuk menjadi konsisten dengan Kali terakhir, biarlah saya pergi ke hadapan dan sewenang-wenangnya mencadangkan bahawa ini adalah alamat 1, ini adalah alamat 2, ini adalah alamat 3, dan sebagainya. Dan sebagainya, hanya untuk menjadi super yang jelas, apa yang berlaku pergi dalam s akibat yang baris pertama kod, anda akan berkata? 

Janelle: Alamat 1? 

DAVID J. MALAN: Tepat sekali. Jadi menangani 0x1. Dan sementara itu, biarlah saya pergi ke hadapan dan salinan banyak daripada apa yang anda lakukan dan menambah t saya sendiri di sini. Jika saya menaip Gabe sekali lagi, kali kedua, apabila digesa dengan getString, di mana, tentu saja, Gabe akan pergi? Nah, presumably-- 

Janelle: Seperti di sini? DAVID J. MALAN: Yeah. Janelle: Atau ia juga di ruang yang sama? DAVID J. MALAN: Biar saya mencadangkan, yeah, betul-betul, jadi dalam kotak tambahan. Tetapi apa yang penting sekarang ialah, walaupun walaupun saya telah disediakan ini cukup dekat together-- 0x1, ini adalah 0x2-- pada hakikatnya, ini kini mungkin menjadi alamat 0x10, misalnya, dan 0x11, 0x12 dan, dan sebagainya. Dan sebagainya, jika itu berlaku, apa yang akan berakhir di sini di t? 

Janelle: 0x10? DAVID J. MALAN: Tepat sekali. Jadi 0x10. Dan sekarang, soalan akhir. Anda telah, setakat ini, terpaksa bekerja yang paling sukar bagi gajah setakat ini. Sekarang, jika saya tarik kod sekali lagi, apabila saya melakukan, sejajar tiga, jika s sama sama t, apa yang aku sebenarnya Perbandingan yang kami disediakan di sini? 

Janelle: Dua alamat? DAVID J. MALAN: Tepat sekali. Jadi saya katakan adalah s sama sama dengan t? Dalam erti kata lain, adalah sama 1 sama dengan 10? Dan sudah tentu, Jawapan yang jelas sekarang ialah, tidak. Dan program ini akhirnya akan mencetak apa, boleh kau kata? 

Janelle: Adakah ia, anda taip perkara yang sama? 

DAVID J. MALAN: Jadi, jika adalah 1 dan t adalah 10? 

Janelle: Anda menaip perkara yang berbeza. 

DAVID J. MALAN: Tepat sekali. Anda taip perkara yang berbeza. Baiklah. Jadi satu pusingan tepukan, jika kita boleh, di sini. [Tepuk tangan] Itu adalah menyakitkan. Saya tahu. Baik dilakukan. Jadi sekarang mari kita lihat jika kita tidak boleh mengusik selain apa yang tetap itu. Dan sudah tentu, apabila kita tetap this-- yang kini saya akan mewakili dalam green-- kita melakukan beberapa penambahbaikan di sini. Pertama, seperti yang kewarasan memeriksa, saya pertama memeriksa jika s sama batal dan t sama null. Dan hanya untuk menjadi jelas, apabila mungkin s atau t batal dalam kod seperti ini? Apabila s atau t mungkin batal. Yeah? 

PENONTON: [didengar]. 

DAVID J. MALAN: Tepat sekali. Jika rentetan yang pengguna ditaip adalah terlalu panjang untuk dimuatkan ke dalam memori, atau kes sudut pelik seperti itu, getString, seperti yang kita akan melihat, secara literal hari ini, dalam dokumentasi, berkata ia akan kembali sebagai batal nilai sentinel khas, atau hanya jenis simbol khas yang bermaksud sesuatu yang salah. Oleh itu, kita mahu untuk memeriksa itu, kerana ia ternyata null itu adalah nilai yang sangat berbahaya. 

Selalunya, jika anda cuba untuk melakukan sesuatu dengan null melibatkan function-- lulus ia sebagai input, instance-- fungsi yang mungkin sangat akan kemalangan dan, dengan itu, mengambil program keseluruhan anda. Jadi garis ketiga ini kini hanya kewarasan yang memeriksa, menyemak kesilapan, jika anda akan. Itu tabiat yang baik sekarang untuk kami untuk masuk ke dalam bila-bila masa kita cuba menggunakan nilai yang boleh, berpotensi, adalah batal. 

Sekarang, dalam baris keempat di sini, "Jika strcmp (s, t)," baik, apa yang yang merujuk kepada? Nah, kita berkata ini adalah yang sangat ringkas dinamakan fungsi untuk rentetan perbandingan. Dan tujuan dalam kehidupan adalah untuk membandingkan Hujah pertama terhadapnya kedua, tetapi tidak dari segi alamat mereka, seperti yang kita lakukan secara tidak sengaja seketika lalu dengan kod merah, tetapi bukan untuk membandingkan kedua-dua tali dalam kemanusiaan intuitif dengan membandingkan cara ini, terhadap ini, terhadap ini, terhadap ini, dan kemudian berhenti jika dan apabila seseorang atau kedua-dua jari saya terkena garis sendeng terbalik 0. Oleh itu, seseorang strcmp tahun lalu dilaksanakan untuk melaksanakan fungsi bagi kita yang kita berharap kita akan mendapat dengan hanya membandingkan dua nilai yang mudah. 

Sekarang terus-terang, saya terus melukis semua ini pelbagai nombor. Tetapi realitinya adalah, saya telah membuat sehingga ini sepanjang masa. Dan biarlah saya pergi ke hadapan dan tulisan oragn ayam ini keluar untuk membuat mata itu, pada akhir hari dan bergerak ke hadapan, kita tidak benar-benar akan mengambil berat tentang apa yang menangani perkara-perkara yang benar-benar dalam ingatan. Jadi, saya tidak akan menarik ini jenis nombor banyak lagi, Saya hanya abstrak ini jauh yang sedikit lebih mesra dengan hanya anak panah. 

Dalam erti kata lain, jika adalah penunjuk, baik, mari kita menarik ia, secara literal, sebagai penunjuk, anak panah menunjuk dari dirinya kepada sesuatu yang lain, dan tidak bimbang terlalu banyak lebih lanjut mengenai yang minutia alamat ini yang, sekali lagi, saya terdiri juga. Tetapi kita akan melihat orang-orang alamat, kadang-kadang, apabila debugging kod. 

Sekarang Sementara itu, program ini di sini perbaikan, sudah tentu, masalah yang dengan membandingkan kedua-dua tali. Tetapi kita berlari ke dalam masalah lain. Ini adalah dari salinan menetapkan masa lalu, mana, saya cuba untuk mengambil kesempatan hanya watak pertama dalam rentetan. Tetapi apakah gejala yang kita lihat sebelum ini, jika pengguna ditaip dalam nilai, seperti Gabe dalam huruf kecil untuk s, maka kita ditugaskan ke dalam t, seperti dalam baris ketiga di sana, dan kemudian saya cuba kesempatan t kurungan 0? Apakah kesan menukar t kurungan 0 di sini? 

PENONTON: Ia berubah s. 

DAVID J. MALAN: Ya, Saya berubah s, juga. Oleh kerana apa yang sebenarnya berlaku? Baiklah, biar saya lihat jika saya boleh membersihkan sehingga gambar ini, seperti berikut. 

Jika adalah, sekali lagi, perkataan g, a, b, e, garis sendeng terbalik, 0, dan s kami akan terus melukis sebagai kotak di sini, tetapi tidak lebih alamat. Mari kita berhenti membuat perkara ini. Mari kita menarik gambar untuk memudahkan dunia. 

Apabila saya mengaku t dengan tali t, yang mencipta bahawa sebahagian ingatan. Square berlaku untuk menjadi 32 bit dalam kebanyakan komputer. Malah, jika anda pernah mendengar tentang komputer yang mempunyai seni bina 32-bit, benar-benar mewah-bercakap, yang hanya bermakna ia menggunakan alamat 32-bit. Dan sebagai teknikal diketepikan, jika anda pernah tertanya-tanya mengapa komputer yang lebih tua, jika anda benar-benar cuba sup mereka dengan banyak RAM, hanya boleh mempunyai maksimum empat gigabait RAM, baik itu kerana, secara literal, komputer lama anda hanya boleh mengira setinggi 4 bilion, 4 bilion bait, kerana ia menggunakan 32-bit nombor untuk alamat. 

Tetapi dalam mana-mana, dalam hal ini Sebagai contoh, cerita ini lebih mudah. t hanya penunjuk yang lain, atau benar-benar bintang char, tali aka. Dan bagaimana saya mahu untuk mengemaskini gambar ini kini dengan garis kedua kod, selepas titik, dot, dot? Apabila saya berbuat tali t sama s koma bertitik, bagaimana gambar ini berubah? Yeah? 

PENONTON: [didengar]. 

DAVID J. MALAN: Yeah. Tepat sekali. Saya hanya meletakkan anak panah dari t kotak ke alamat yang sama, surat pertama yang sama dalam memberi. Atau dari segi teknikal, jika ini lelaki masih di 0x1, ia seolah-olah saya mempunyai 0x1 0x1 di sini dan di sini. Tetapi sekali lagi, yang mengambil berat tentang alamat? Ia hanya idea bahawa kini penting. Jadi ini adalah apa yang berlaku di sini. Jadi sudah tentu, jika anda melakukan t kurungan 0, yang merupakan notasi array, daripada course-- dan terus-terang, ia kelihatan seperti ada array di sini, tetapi kini ada perkara ini pelik. Ketahuilah bahawa bahasa pengaturcaraan, C, menawarkan ciri ini, di mana, walaupun t adalah penunjuk, atau adalah penunjuk, anda masih boleh menggunakan yang biasa, kurungan persegi selesa notasi untuk pergi ke elemen pertama, atau elemen kedua, atau apa-apa elemen bahawa pointer yang menunjuk kepada kerana, mungkin, ia adalah, seperti dalam kes ini, menghala ke arah beberapa array. 

Jadi bagaimana kita menetapkan ini? Terus terang, ini adalah di mana ia mendapat sedikit hangat pada pandangan pertama. Tetapi di sini adalah versi baru dan lebih baik. 

Oleh itu, saya mendapat menghilangkan perpustakaan CS50 ini, hanya untuk mendedahkan bahawa s memang bintang char, hanya sinonim. Dan t juga merupakan bintang char. Tetapi apa yang sedang berlaku di sebelah kanan garis yang di mana t diberikan nilai? 

Apakah malloc? Apa ia strlen? Apakah sizeof (char)? Mengapa palang pintu melakukannya garis wajah begitu kompleks? Apa yang ia lakukan pada tahap yang tinggi? Apa yang ia menyimpan dalam t? Yeah? PENONTON: Ia memperuntukkan jumlah tertentu ruang memori. Ia untuk menyimpan, saya rasa, surat [didengar]. 

DAVID J. MALAN: Perfect. Perfect. Ia memperuntukkan tertentu jumlah ruang ingatan untuk menyimpan, mungkin, surat akan datang. Dan khususnya, malloc oleh itu kembali apa? 

PENONTON: taubat yang [didengar]? DAVID J. MALAN: Tepat sekali. Kembali alamat memori yang, yang merupakan cara yang mewah untuk mengatakan, mengembalikan alamat bait pertama memori itu. Ini terserah kepada aku untuk mengingati berapa banyak memori saya sebenarnya diperuntukkan atau malloc meminta. 

Sekarang berapa banyak itu? Well, walaupun ada banyak kurungan di sini, malloc mengambil masa hanya hujah tunggal. Dan saya menyatakan strlen s, jadi memberikan saya sebagai banyak bait kerana ada di s, tetapi menambah satu. Mengapa? Yeah? 

PENONTON: The backslash 0. DAVID J. MALAN: Tepat sekali. Kita mesti melakukan pengemasan sedikit. Oleh itu, disebabkan ada garis sendeng terbalik yang 0, kita akan lebih baik ingat bahawa. Jika tidak, kita akan untuk mewujudkan rentetan yang tidak mempunyai terminator yang istimewa. 

Sementara itu, hanya untuk menjadi super dubur, saya mempunyai sizeof (char), hanya dalam kes seseorang berjalan saya kod tidak perkakas CS50 ini, tetapi mungkin komputer yang berbeza sama sekali di mana aksara adalah salah satu bait, oleh konvensyen, tetapi dua bait, atau sesuatu yang lebih besar daripada itu. Ia hanya menjadi super, super suka kepada kesilapan. Walaupun, pada hakikatnya, ia adalah kemungkinan besar akan menjadi 1. 

Sekarang, sementara itu, saya pergi ke depan dan menyalin tali, t kurungan i sama t kurungan s. Dan saya akan menangguhkan untuk minggu lepas kod sumber untuk melihat apa yang sedang berlaku. Tetapi Takeaway utama, dan sebab saya meletakkan kod kini dalam hijau, kerana garis terakhir, t kurungan 0 sama toupper, mempunyai kesan kesempatan yang rentetan? t dan / atau s? Bahawa garis terakhir kod. 

Hanya t, kerana apa yang berlaku kali ini, jika saya sedikit membatalkan langkah terakhir, apa yang berlaku ialah, apabila saya memanggil malloc, Saya pada dasarnya mendapat sebahagian memori yang saiz yang sama seperti yang asal, kerana itulah aritmetik yang saya lakukan. Saya menyimpan dalam t alamat itu sebahagian daripada ingatan. Walaupun ini kelihatan bagus dan cantik, baik dan kosong, realiti itu ada, apa yang kita akan menyimpan memanggil, nilai-nilai sampah di sini. Itu sebahagian memori mungkin sangat juga mempunyai telah digunakan sebelum ini, beberapa saat, beberapa minit yang lalu. Jadi tidak benar-benar boleh menjadi nombor atau surat di sana, hanya dengan kemalangan. Tetapi mereka tidak sah, sehingga saya diri saya mempopulasikan sebahagian memori ini dengan aksara sebenar, seperti yang saya lakukan dalam bahawa untuk gelung di sana. Baiklah? 

Jadi sekarang, kemuncak tiga contoh yang seolah-olah pecah masa lalu, contoh Pertukaran ini, fungsi ini bekerja dalam erti kata yang ia bertukar a dan b. Tetapi ia tidak berjaya dalam apa deria rasa yang lain? Yeah? 

PENONTON: [didengar]. 

DAVID J. MALAN: Tepat sekali. Jika saya untuk memanggil fungsi ini dari another-- misalnya, dari fungsi seperti utama, di mana Saya mempunyai pembolehubah, x dan y, seperti yang saya lakukan minggu lepas, kod sama, dan saya lulus dalam x dan y Tukar ke, dan kemudian memanggil Swap-- ini, sudah tentu, adalah versi yang betul adalah apa yang kita kira-kira untuk see-- ia tidak berjaya. Jadi apa yang tetap? 

Dengan baik, jadi hanya untuk jelas, biarlah saya pergi ke hadapan dan- memberi saya satu kedua di sini, dan melihat jika saya boleh menunjukkan kepada anda yang terakhir, yang akan dalam- mari kita lihat jika saya boleh mencari OK ini fast-- sebenar, [didengar]. OK, ada ia. Jadi tidak mengendahkan arahan saya hanya menaip. Saya mahu untuk mendapatkan di saat-saat akhir contoh dari masa lalu, yang kini dikenali sebagai tidak swap. 

Jadi tidak Swap adalah di mana kita berhenti kali terakhir, mana, saya dimulakan x 1 dan y 2. Saya kemudian memanggil Swap, lulus dalam 1 dan 2. Kemudian fungsi ini bekerja dalam erti kata lain, tetapi ia tidak kekal kesan ke atas x dan y. Jadi persoalannya sekarang ialah, bagaimana kini kita benar-benar menyelesaikan masalah ini? Apakah penyelesaian di tangan? 

Nah, dalam swap.c, yang baru hari ini, dapati dua perbezaan. x dan y adalah sama. Tetapi apa yang jelas berbeza garis 25? Apa yang baru di sana, jika anda ingat apa yang ia kelihatan seperti kedua yang lalu? 

PENONTON: [didengar]. 

DAVID J. MALAN: Yeah. Jadi ampersands adalah sejenis baru sintaksis bukan sahaja dalam program ini, tetapi juga lebih umum dalam CS50. Setakat ini, saya tidak fikir kita telah melihat apa-apa contoh atau benar-benar bercakap tentang mereka dalam mana-mana terperinci, selain, mungkin, preemptively dalam bahagian, satu Ampersand seperti ini. Nah, ternyata Ampersand adalah satu keping terakhir sintaks baru kita akan belajar. Apa yang bermakna adalah alamat beberapa pembolehubah. Apa alamat tidak x hidup? Tetapi apa yang alamat tidak y hidup? Kerana jika masalah asas sebelum adalah bahawa x dan y sedang berlalu salinan, apa yang kita benar-benar mahu melakukan adalah menyediakan Swap dengan harta seperti yang peta yang membawa kepada di mana x dan y sebenarnya berada dalam RAM, supaya Pertukaran boleh mengikut peta yang dan pergi ke mana sahaja x atau y menandakan tempat dan menukar nilai-nilai sebenar 1 dan 2 di sana. 

Jadi Swap perlu menukar sedikit juga. Dan pada pandangan pertama, kekuatan ini seolah-olah yang sama sedikit untuk char bintang. Dan sesungguhnya ia. Jadi adalah penunjuk kepada jenis data, berdasarkan bahagian ini diketengahkan? Jadi ia satu int. 

Jadi tidak lagi int satu, ia alamat int satu. Begitu juga, b kini akan menjadi alamat int satu. Oleh itu, apabila saya kini memanggil Pertukaran daripada Utama, Saya tidak akan memberi Pertukaran 1 dan 2. Saya akan memberikan seperti Ox-sesuatu dan Ox-sesuatu, dua alamat yang akan membawa Pertukaran ke lokasi sebenar mereka dalam ingatan komputer saya. 

Jadi sekarang, pelaksanaan baki saya perlu berubah anak laki-laki. Apa yang jelas berbeza sekarang dalam tiga baris kod? Ada bintang ini sialan semua seluruh tempat, betul? Jadi apa yang berlaku di sini? Yeah? 

PENONTON: Ia jelas [didengar]. 

DAVID J. MALAN: Tepat sekali. Jadi dalam context-- ini dan ini tidak keputusan reka bentuk yang terbaik, diakui, tahun yang lalu. Dalam konteks ini, di mana anda hanya perlu bintang, dan anda tidak mempunyai jenis data, seperti int, segera ke kiri, sebaliknya anda mempunyai tanda yang sama, jelas, dalam konteks ini, apabila anda mengatakan bintang yang, yang bermaksud pergi ke alamat itu dalam. Ikut peta harta, jadi untuk bercakap. 

Dan sementara itu, dalam talian 37, ia bermakna perkara yang sama. Pergi ke alamat, dan meletakkan apa yang ada? Segala yang ada di lokasi yang b menentukan. Dalam erti kata lain, pergi ke b. Dapatkan nilai itu. Pergi ke dan, setiap yang sama menandatangani, pengendali penyerahhakan, meletakkan nilai yang ada. 

Begitu juga, int temp hanya satu int. Tiada apa-apa perlu tukar temp. Ia hanya segelas ganti dari Annenberg bagi sesetengah susu atau jus oren. Tetapi saya perlu berkata, pergi ke b. Pergi ke destinasi itu dan meletakkan nilai dalam temp sana. Jadi apa yang berlaku kemudian? Apabila saya benar-benar memanggil Tukar masa ini, jika dulang pertama ini di sini mewakili Utama, dulang kedua ini mewakili Swap, apabila Saya meninggal Ampersand x dan y Ampersand dari Main ke Swap, hanya untuk menjadi jelas, apa yang ini timbunan rangka menerima? Yeah? 

PENONTON: [didengar]. DAVID J. MALAN: Tepat sekali. Alamat x dan alamat y. Dan anda boleh berfikir ini seperti alamat pos. 33 Oxford Street dan 35 Oxford Street, dan anda mahu bergerak kedua-dua bangunan yang di-tempat itu. 

Ia semacam satu idea yang tidak masuk akal, tetapi itu semua yang kita maksudkan dengan alamat. Di mana di dunia boleh anda mendapati kedua-dua ints? Di mana di dunia anda boleh mendapati kedua-dua bangunan? Jadi, jika akhirnya, setelah sekian lama saya pergi ke dalam kod sumber hari ini dan menyusun Pertukaran dan jangka ./swap, akhirnya, untuk kali pertama kita sebenarnya melihat bahawa nilai-nilai saya mempunyai sesungguhnya telah ditukar dengan jayanya. Dan sekarang, kita juga boleh mengambil nota ini dalam, katakan, GDB. 

Jadi biarlah saya pergi ke dalam fail yang sama. Biar saya pergi ke hadapan dan menjalankan GDB daripada ./swap. Dan sekarang, dalam Swap, saya akan pergi hadapan dan menetapkan titik rehat di Main. Dan sekarang saya akan pergi ke hadapan dan menjalankan program. Dan sekarang kita melihat kod saya berhenti di garisan itu. 

Jika saya pergi ke depan dan cetak x, apa yang perlu saya lihat di sini? Ia satu soalan. Katakanlah lagi? 

PENONTON: [didengar]. 

DAVID J. MALAN: Jadi nombor rawak, mungkin. Mungkin saya bernasib baik, dan ia bagus dan mudah, seperti 0. Tetapi mungkin ia beberapa nombor rawak. Dalam kes ini, saya bernasib baik. Ia hanya berlaku untuk menjadi 0. Tetapi ia memang nasib, kerana tidak sehingga saya menaip depan dan kemudian cetak x mempunyai yang baris kod, line 19, telah dilaksanakan. 

Sementara itu, jika saya menaip datang lagi, dan kini mencetak y, saya akan melihat 2. Sekarang, jika saya menaip akan datang, ia akan mendapatkan sedikit mengelirukan, kerana sekarang, printf yang akan muncul di skrin, seperti yang berlaku. x ialah 1. 

Mari kita buat ini lagi. Dan kini, di sini adalah di mana hal-hal yang menarik. Sebelum saya memanggil Swap atau langkah ke dalamnya, mari kita mengintip sedikit. x ialah, sekali lagi, 1. Y adalah, sudah tentu, kewarasan cepat cek, 2, jadi tidak sukar di sana. Tetapi apa yang Ampersand x? Jawab, ia jenis funky mencari. Tetapi bintang int dalam kurungan hanya cara kdnk ini mengatakan ini adalah alamat. Ia tidak int, ia adalah penunjuk kepada int, atau dikenali sebagai alamat. 

Apakah perkara ini gila? Kami tidak pernah melihat sesuatu yang agak seperti itu sebelum ini. Jadi ini adalah alamat dalam komputer saya memori di mana x berlaku untuk hidup. Ia Ox-sesuatu. Dan ini adalah, terus-terang, mengapa Saya mula melukis anak panah, bukan nombor, kerana yang benar-benar mengambil berat yang int anda berada di tertentu alamat itu yang besar. Tetapi bffff0c4, semua ini adalah sesungguhnya digit perenambelasan, iaitu 0 hingga f. 

Jadi, kita tidak akan kekal di terlalu panjang mengenai apa yang semuanya itu adalah. Tetapi jika saya mencetak y, sudah tentu, saya melihat 2. Tetapi Ampersand y, saya melihat alamat ini. Dan notis, untuk ingin tahu, berapa jauh adalah x dan y? Anda boleh mengabaikan kebanyakan alamat. Empat bait. Dan itu konsisten dengan kami sebelum ini mendakwa bahawa berapa besar adalah int satu? Empat bait. Jadi ia kelihatan seperti lapisan semua itu sehingga baik, seperti yang anda mungkin berharap, dalam ingatan. 

Jadi sekarang, mari kita maju pantas hingga akhir cerita ini. Mari kita pergi ke depan dan menaip langkah, untuk menyelam ke dalam fungsi Swap. Sekarang perhatikan, jika saya menaip, itu sama dengan alamat x. Jika saya menaip b, ia sama ke alamat y. Jadi apa yang perlu saya lihat jika saya mengatakan, pergi ke alamat yang? Jadi mencetak bintang a. Jadi bintang bermakna pergi ke sana, dalam konteks ini. Ampersand bermakna apa yang alamat. Jadi bintang satu cara 1. Dan cetak bintang b memberikan saya 2. 

Dan biarlah saya menganggap, buat masa ini, bahawa sekurang-kurangnya kod yang meneruskan untuk melaksanakan kini boleh alasan melalui dengan cara itu. Tetapi kita akan melihat semula idea ini tidak lama lagi. Jadi versi Pertukaran kini betul dan membolehkan kami untuk menukar jenis data yang tertentu ini. 

Jadi mana-mana soalan itu pada Swap? Pada bintang? Pada alamat? Dan anda akan lihat, dengan masalah set 4, jenis, tetapi masalah set 5, pasti, bagaimana perkara-perkara yang berguna dan mendapat lebih selesa dengan mereka, sebagai akibatnya. Apa-apa pun? Baiklah. Jadi malloc adalah, sekali lagi, fungsi ini yang hanya memperuntukkan ingatan, memori peruntukan. Dan mengapa ini berguna? Nah, selama ini, anda telah menggunakan malloc. Jika anda menganggap sekarang bagaimana getString kerja, mungkin, ia telah meminta seseorang untuk sebahagian daripada ingatan, bila-bila masa jenis pengguna rentetan dalam, kerana kita pasti tidak tahu, sebagai kakitangan CS50, berapa besar mereka tali yang manusia akan menaip mungkin. 

Jadi mari kita, buat kali pertama, mula kulit kembali bagaimana kerja-kerja perpustakaan CS50, melalui beberapa contoh yang akan membawa kita ke sana. Jadi jika saya membuka gedit dan membuka scanf 0, kita akan melihat kod berikut. Scanf 0, yang boleh didapati di laman web bagi hari ini, mempunyai agak beberapa baris kod di sini, 14 melalui 20. Dan mari kita lihat apa yang ia lakukan. Ia mengisytiharkan satu int, yang dipanggil x. Ia mengatakan sesuatu seperti, nombor sila. Dan kini ia berkata, scanf% i, & x. Jadi ada sekumpulan barangan baru di sana. 

Tetapi scanf, anda jenis boleh berfikir sebagai bertentangan dengan printf. printf, sudah tentu, untuk cetakan skrin. semacam scanf imbasan daripada pengguna ini keyboard sesuatu yang dia telah ditaip. 

% I adalah seperti printf. Ini bermakna menjangkakan pengguna menaip int satu. Dan sekarang, mengapa anda rasa saya mungkin lulus scanf & x? Jika tujuan dalam kehidupan scanf adalah untuk mendapatkan sesuatu daripada pengguna, apa yang dimaksudkan dengan lulus ia, & x, sekarang? Yeah? 

PENONTON: [didengar]. DAVID J. MALAN: Tepat sekali. Apa yang saya, manusia, taip, input saya akan disimpan di lokasi itu. Ia tidak mencukupi, ingat, hanya lulus dalam x, kerana kita lihat sudah, bila-bila masa anda lulus hanya pembolehubah mentah, seperti int, untuk beberapa fungsi yang lain, pasti, ia boleh menukar yang berubah-ubah, tetapi tidak selama-lamanya. Ia tidak boleh mempunyai kesan ke atas Utama. Ia hanya boleh mengubah salinan tempatan sendiri. Tetapi jika, sebaliknya, anda tidak memberi saya int sebenar, tetapi anda memberi saya arahan kepada int itu, saya sekarang, kerana scanf, sesungguhnya saya dapat mengikuti bahawa menangani dan meletakkan nombor di sana supaya anda mempunyai akses kepada maklumat itu juga. 

Oleh itu, apabila saya menjalankan program ini, mari kita lihat. Buat scanf 0 dot slash, scanf 0. Dan jika saya kini menaip nombor seperti 50, terima kasih untuk 50. Jika saya kini menaip beberapa seperti negatif 1, bagi negatif 1. Saya kini menaip nombor seperti 1.5, hm. Mengapa program saya mengabaikan saya? Nah, hanya kerana, saya memberitahu ia mengharapkan int satu sahaja. Baiklah. Jadi itulah satu versi ini. Mari kita perkara sehingga takuk dan mencadangkan bahawa ini tidak baik. Dan di sini terdapat satu contoh yang mudah bagaimana kita boleh mula menulis kod bahawa orang lain boleh mengeksploitasi atau berkompromi dengan melakukan perkara-perkara buruk. Jadi garis 16, jadi sama dalam semangat untuk sebelum, tetapi saya tidak mengisytiharkan ia int masa ini. Saya mengisytiharkan ia bintang char, aka tali. 

Tapi apa yang benar-benar bermakna? Jadi, jika saya tidak menentukan address-- dan Saya memanggil ia sewenang-wenangnya, penampan, tetapi saya boleh memanggilnya s, untuk menjadi simple-- dan kemudian saya melakukan ini, terangkan kepada saya, jika anda boleh, berdasarkan yang lepas logik, apa yang scanf lakukan di talian 18, jika pas% s dan penampan, yang merupakan alamat? Apakah scanf, jika anda menggunakan logik sama seperti versi 0, akan cuba lakukan di sini, apabila yang sesuatu jenis pengguna dalam? Yeah? 

PENONTON: [didengar]. 

DAVID J. MALAN: Tepat sekali. Scanf, dengan logik sebelum ini, akan mengambil tali bahawa bertaip manusia dalam- kini ia rentetan, ia bukan nombor, mungkin, jika dia cooperates-- dan ia akan cuba untuk meletakkan bahawa rentetan dalam ingatan pada apa alamat penampan menentukan. Dan ini adalah besar, kerana penampan memang bertujuan untuk alamat. 

Tetapi saya menuntut program ini adalah kereta dalam cara yang sangat serius, kerana apa nilai adalah penampan secara lalai? Apa yang telah saya dimulakan ke? Apa sebahagian daripada memori? Saya tidak mempunyai, bukan? 

Jadi walaupun saya telah memperuntukkan char bintang yang yang tidak lagi dipanggil s, ia bukan dipanggil, buffer-- jadi mari kita menarik nama pembolehubah ini sekarang kerana buffer-- jika saya tidak mempunyai dipanggil getString atau malloc di sini, yang berkesan bermakna bahawa penampan hanya beberapa nilai sampah. 

Sekarang apa maksudnya? Ini bermakna bahawa saya telah memberitahu scanf untuk menjangkakan rentetan daripada pengguna. Dan anda tahu apa? Apa sahaja perkara ini menunjukkan supaya- dan saya menarik tanda tanya, tetapi dalam realiti, ia akan menjadi sesuatu seperti Ox1, 2, 3, bukan? Ia beberapa nilai palsu yang hanya berlaku untuk berada di sana dari hadapan. Jadi meletakkan cara lain, ia seolah-olah penampan hanya menunjuk kepada sesuatu dalam ingatan. Saya tidak tahu apa. 

Jadi jika saya taip Gabe sekarang, ia akan cuba untuk meletakkan g-a-b-e / 0 sana. Tetapi yang tahu apa yang? Dan pada masa yang lalu, mana-mana masa kami telah cuba untuk menyentuh memori yang bukan milik kepada kami, apa yang telah berlaku? Atau hampir setiap kali. Segmentasi bersalah, bukan? 

Anak panah ini, saya tidak tahu di mana ia menunjuk. ia hanya beberapa nilai rawak. Dan sudah tentu, jika anda mentafsir nilai rawak sebagai alamat, anda akan pergi ke beberapa destinasi rawak. Jadi Gabe mungkin sesungguhnya nahas program saya dalam kes ini di sini. 

Jadi apa yang boleh kita lakukan yang hampir sebagai lapuk? Pertimbangkan ini ketiga dan contoh terakhir scanf. Versi ini adalah lebih baik dalam apa yang masuk akal? Jika anda selesa dengan masalah sebelum ini, ini adalah lebih baik. Mengapa? 

PENONTON: [didengar]. DAVID J. MALAN: Baik. Jadi kes ini garis 16 adalah lebih baik, dalam erti kata yang bahawa kita jelas memperuntukkan beberapa ingatan. Kami tidak menggunakan malloc, kami menggunakan 2 minggu pendekatan hanya mengisytiharkan array. Dan kami telah berkata sebelum itu rentetan hanya pelbagai aksara, jadi ini adalah benar-benar sah. Tetapi ia, sudah tentu, sebagai anda ambil perhatian, saiz tetap, 16. 

Jadi program ini adalah benar-benar selamat, saya menaip dalam tali satu aksara, dua watak tali, 15 rentetan aksara. Tetapi sebaik sahaja saya mula menaip 16, 17, 18, 1000 rentetan aksara, di mana adalah rentetan yang akan berakhir? Ia akan berakhir sebahagiannya di sini. Tetapi yang tahu apa lagi adalah di luar sempadan array ini tertentu? 

Ia seolah-olah saya telah diisytiharkan 16 petak di sini. Jadi, daripada menarik keluar semua 16, kita akan hanya berpura-pura bahawa saya telah disediakan 16. Tetapi jika saya kemudian cuba untuk membaca rentetan itu lebih lama, seperti 50 aksara, Saya akan mula meletakkan a, b, c, d, x, y, z. Dan ini adalah mungkin beberapa segmen memori lain yang, sekali lagi, mungkin menyebabkan program saya untuk berlanggar, kerana saya tidak meminta apa-apa lebih daripada 16 bait. 

Jadi yang peduli? Nah, di sini adalah perpustakaan CS50 ini. Dan yang paling penting ini hanya seperti arahan sehingga atas. Perpustakaan CS50, selama ini, mempunyai garis ini selaras 52. Kami telah melihat typedef, atau anda akan melihat typedef dalam Serangga 4, yang hanya mewujudkan sinonim mana char bintang ini boleh menjadi lebih hanya dirujuk sebagai tali. Jadi ini adalah salah satu daripada beberapa roda latihan kami telah menggunakan rahsia bawah hood. 

Sementara itu, di sini majlis itu, getchar. Sekarang nampaknya, tidak ada badan kepadanya. Dan sebenarnya, jika saya terus menatal, saya tidak benar-benar melihat sebarang pelaksanaan fungsi ini. Sebagai cek kewarasan, mengapa itu? 

PENONTON: [didengar]. DAVID J. MALAN: Yeah. Jadi ini adalah fail pengepala. Dan fail header mengandungi prototaip, ditambah beberapa barangan lain, ia seolah-olah, seperti typedefs. Tetapi dalam CS50.c, yang kita kena tidak pernah diberikan anda secara terang-terangan, tetapi telah perkakas CS50 semua kali ini, jauh di dalam folder itu, melihat bahawa ada keseluruhan sekumpulan fungsi di sini. 

Malah, mari kita tatal ke bawah. Mari kita mengabaikan kebanyakan mereka, buat masa sekarang. Tetapi tatal ke bawah ke getInt dan melihat bagaimana getInt berfungsi. Jadi di sini adalah getInt. Dan jika anda pernah benar-benar dijaga bagaimana mendapatkan int bekerja, di sini adalah dokumentasi. Dan di antara perkara-perkara yang ia berkata adalah ia memberitahu anda apa julat nilai ia boleh kembali. Ia pada asasnya negatif 2000000000 kepada positif 2 bilion, memberi atau mengambil. 

Dan ternyata, semua ini masa, walaupun kita tidak pernah telah anda menyemak untuk itu, jika ada masalah, ternyata bahawa semua kali ini, getInt mempunyai telah kembali khas tetap, tidak batal, tetapi int_max, yang konvensyen hanya programmer ini. Ini bermakna di sini adalah nilai istimewa. Pastikan untuk memeriksa ini, hanya dalam kes ada masalah. Tetapi kita tidak pernah peduli dengan itu setakat ini, kerana sekali lagi, ini yang dimaksudkan untuk memudahkan. 

Tetapi bagaimana getInt mendapatkan dilaksanakan? Nah, satu, ia tidak mengambil hujah-hujah. Kita tahu bahawa. Ia kembali int satu. Kita tahu bahawa. Jadi bagaimana ia berfungsi di bawah hud? 

Jadi ada nampaknya tidak terhad gelung, sekurang-kurangnya kemunculan satu. Perhatikan bahawa kita menggunakan getString. Jadi, itu yang menarik. getInt panggilan fungsi kita sendiri, getString. Sekarang mengapa ini mungkin menjadi kes? Kenapa saya menjadi pertahanan di sini di talian 165? Apa yang boleh berlaku dalam talian 164, hanya untuk menjadi jelas? Ia adalah jawapan yang sama seperti sebelum ini. Hanya mungkin daripada ingatan. Ada masalah dengan getString, kami ada untuk dapat mengendalikan itu. Dan sebab itu saya tidak kembali nol itu, dari segi teknikal, batal adalah penunjuk. getInt mempunyai untuk kembali int satu. Jadi saya telah sewenang-wenangnya membuat keputusan, pada dasarnya, bahawa 2 bilion, memberi atau mengambil, akan menjadi nilai khas yang saya tidak boleh sebenarnya dapat daripada pengguna. Ia hanya satu nilai saya akan membazirkan untuk mewakili kod ralat. 

Jadi sekarang, perkara mendapatkan mewah sedikit. Dan ia tidak cukup fungsi yang sama seperti sebelum ini, tetapi ia hampir sama. Jadi notis, saya mengaku di sini, sejajar 172, kedua-dua n int dan char c. Kemudian saya menggunakan talian funky ini, sscanf, yang ternyata tidak mengimbas rentetan dari papan kekunci. Ia berdiri tali yang sedia ada yang pengguna telah ditaip. Jadi saya telah dipanggil getString, yang bermakna saya mempunyai rentetan dalam ingatan. sscanf adalah apa yang anda akan memanggil fungsi parsing. Ia kelihatan di tali saya telah ditaip, watak oleh watak, dan melakukan sesuatu yang berguna. Tali yang disimpan dalam talian. Dan saya tahu bahawa hanya dengan pergi menyandarkan di sini dan berkata, oh, OK, Saya memanggil ia tidak s masa ini, tetapi talian. 

Dan sekarang ini adalah sedikit berbeza. Tetapi ini berkesan bermakna, atas sebab-sebab kita agak akan melambai tangan kita pada hari ini, bahawa kita memeriksa untuk melihat jika pengguna menaip di dan int dan mungkin watak lain. Jika pengguna menaip di int, ia adalah akan disimpan dalam n, kerana saya lulus ini dengan alamat, yang silap mata baru yang kita lihat hari ini. Jika pengguna juga ditaip dalam 123x seperti, bahawa x akan berakhir sehingga seorang surat dalam watak c. 

Kini ternyata bahawa sscanf memberitahu saya, bijak, berapa banyak pembolehubah telah sscanf berjaya dapat mengisi. Jadi dengan logik ini, jika fungsi Saya melaksanakan adalah getInt, tetapi saya memeriksa, berpotensi, untuk pengguna telah ditaip dalam satu int diikuti dengan sesuatu yang lain, apa yang saya mahu sscanf ini nilai pulangan benar-benar menjadi? Jika tujuannya adalah untuk mendapatkan hanya int dari pengguna? 

Jadi jika sscanf pulangan 2, apa maksudnya? Pengguna ini ditaip dalam sesuatu seperti, secara literal, 123x, yang hanya tidak masuk akal. Ia merupakan satu keadaan kesilapan, dan Saya mahu untuk memeriksa itu. 

Jadi, jika jenis pengguna ini di dalam, oleh logik ini, apakah sscanf kembali, kau kata? Jadi ia akan kembali 2, kerana 123 akan pergi di sini, dan x akan berakhir di sini. Tetapi saya tidak mahu x untuk mendapatkan diisi. Saya mahu sscanf hanya berjaya dalam mengisi pertama pembolehubah. Dan sebab itu saya mahu sscanf kembali 1. 

Dan jika ini adalah sedikit di atas kepala buat masa ini, yang benar-benar halus. Sedarlah walaupun, bahawa salah satu nilai-nilai dan getInt getString ialah kita lakukan palang pintu daripada banyak kesilapan memeriksa seperti ini supaya bahawa, sehingga kini, anda boleh cukup banyak menaip apa-apa pun papan kekunci anda, dan kami akan menangkapnya. Dan kita pasti, yang kakitangan, akan pasti tidak menjadi punca bug dalam anda program, kerana kami pertahanan memeriksa semua bodoh perkara-perkara yang pengguna boleh lakukan, seperti menaip rentetan, apabila anda benar-benar mahu int. Jadi untuk now-- kami akan datang kembali ke ini sebelum long-- tetapi selama ini, getString dan getInt mempunyai berada di bawah hud menggunakan ini Idea asas alamat ingatan. 

Jadi sekarang, mari kita membuat perkara-perkara yang lebih sedikit user-friendly. Seperti mana yang diketahui, dari Binky lalu time-- jika tetikus saya akan jadi cooperate-- kami mempunyai kod ini, yang terus-terang, agak tidak masuk akal. Kod ini mencapai apa-apa berguna, tetapi ia adalah contoh bahawa profesor Parlante digunakan untuk mewakili apa yang berlaku dalam program yang melibatkan ingatan. 

Jadi mari kita menceritakan semula ini cerita secara ringkas super. Kedua-dua baris pertama, dalam Bahasa Inggeris, adakah apa yang akan anda katakan? Hanya dalam munasabah manusia, tetapi sedikit istilah teknikal, mengambil menikam. PENONTON: [didengar]. 

DAVID J. MALAN: OK, anda mewujudkan alamat untuk x dan y pembolehubah. Tidak cukup, kerana x dan y tidak pembolehubah dalam erti kata yang tradisional. x dan y adalah alamat atau akan menyimpan alamat. Jadi mari kita cuba ini sekali lagi. Tidak satu permulaan yang tidak baik, walaupun. Yeah? 

PENONTON: [didengar]. DAVID J. MALAN: Baik. Saya rasa itulah yang lebih bersih sedikit. Mengisytiharkan dua petunjuk, dua integer. Dan kami memanggil mereka x dan y. Atau jika kita untuk menarik ini sebagai gambaran yang, sekali lagi, ingat cukup hanya bahawa semua yang kami lakukan dengan baris pertama adalah melukis kotak seperti ini, dengan beberapa nilai sampah di dalamnya, dan memanggil ia x, dan kemudian kotak lain seperti ini, dengan beberapa nilai sampah di dalamnya, memanggil y. Kami telah diisytiharkan dua petunjuk yang akhirnya akan menyimpan alamat int satu. Jadi, itu semua ada. 

Oleh itu, apabila Binky lakukan ini, tanah liat hanya kelihatan seperti ini. Dan Nick hanya jenis berselimut anak panah, seolah-olah mereka tidak menunjukkan mana-mana sahaja khususnya, kerana mereka hanya nilai-nilai sampah. Mereka tidak jelas dimulakan mana-mana sahaja khususnya. 

Sekarang barisan seterusnya pada kod, ingat, adalah ini. Jadi dalam munasabah mesra pengguna, tetapi agak teknikal Bahasa Inggeris, apa yang baris ini kod lakukan? Yeah? 

PENONTON: [didengar]. 

DAVID J. MALAN: Perfect. Ia memperuntukkan sebahagian daripada memori itu saiz int satu. Dan itu separuh jawapannya. Anda menjawab hak separuh daripada ungkapan. Apa yang berlaku ke atas sebelah kiri tanda sama? Yeah? PENONTON: Dan penerima serah hak ia x boleh ubah? 

DAVID J. MALAN: Dan penerima serah hak kepada yang x berubah-ubah. Jadi untuk recap, memperuntukkan bahagian kanan memori yang cukup untuk menyimpan int satu. Tetapi malloc khusus kembali alamat itu sebahagian daripada ingatan, yang anda mempunyai hanya dicadangkan akan disimpan dalam x. 

Jadi apa yang Nick lakukan masa lalu dengan Binky adalah dia mengheret penunjuk yang keluar, tanah liat, ke titik di sebahagian putih memori yang adalah sama dengan saiz int satu. Dan sesungguhnya, itu bermakna untuk mewakili empat bait. 

Sekarang, baris berikutnya kod melakukan ini, bintang x mendapat 42. Jadi 42 adalah jelas di sebelah kanan, makna kehidupan. Sebelah kiri tangan, bintang x bermaksud apa? Itu juga mungkin mempunyai gone-- itu OK. OK. 

PENONTON: Pada dasarnya, pergi ke [didengar] DAVID J. MALAN: Baik. PENONTON: [didengar]. DAVID J. MALAN: Tepat sekali. Sebelah kiri bermakna pergi ke x. x adalah alamat. Ia seperti 33 Oxford Street, atau Ox1. Dan bintang x bermakna pergi ke menangani dan meletakkan apa yang ada? 42. 

Jadi sesungguhnya, itulah apa yang Nick lakukan. Beliau memulakan dengan oleh, dasarnya, mental menunjuk jari di x, berikutan anak panah ke kotak putih di tangan kanan sampingan, dan meletakkan bilangan 42 di sana. Tetapi perkara yang mendapat sedikit berbahaya, betul? Binky tentang kehilangan kepalanya. 

Bintang y sama dengan 13, nasib buruk, ertinya apa? Jadi bintang y cara pergi ke alamat dalam y. Tetapi apa yang alamat dalam y? Baiklah, itu nilai sampah, bukan? Saya menarik sebagai tanda tanya. Nick menarik sebagai anak panah yg beredar. Dan sebaik sahaja anda cuba untuk lakukan bintang y, berkata ke sana, tetapi tidak ada yang sah alamat, ia beberapa lokasi palsu, program yang akan crash. Dan kepala Binky ini akan untuk terbang di sini, seperti yang berlaku. 

Jadi pada akhirnya, program ini hanya kecacatan keluar rata. Ia merupakan satu program kereta. Dan ia perlu tetap. Dan satu-satunya cara, benar-benar, untuk menetapkan akan, misalnya, talian ini, yang kami tidak dapat, kerana program yang terhempas terlalu awal. Tetapi jika kita menetapkan ini, apa yang kesan tidak melakukan y x sama ada? Nah, ia pada dasarnya menunjukkan y di apa sahaja nilai x adalah menghala ke arah. 

Jadi dalam cerita Nick, atau cerita Binky ini, kedua-dua x dan y telah menghala ke arah sebahagian putih ingatan, sehingga, akhirnya, apabila anda adakah bintang y sama dengan 13 lagi, anda berakhir meletakkan 13 dalam lokasi yang sesuai. Jadi semua ayat-ayat ini adalah sempurna sah, kecuali yang satu ini, apabila ia berlaku sebelum anda sebenarnya ditugaskan y beberapa nilai. 

Sekarang bersyukur, anda tidak perlu sebab melalui semua ini jenis isu-isu sendiri. Biar saya pergi ke hadapan dan membuka tetingkap terminal di sini dan membuka, hanya seketika, program super pendek yang juga semacam sia-sia. Ia hodoh. Ia tidak mencapai apa-apa yang berguna. Tetapi ia menunjukkan isu-isu ingatan, jadi mari kita lihat. 

Utama, super mudah. Ia nampaknya panggilan fungsi, f, dan kemudian kembali 0. Ia adalah jenis sukar untuk keadaan huru-hara ini sehingga. Jadi utama adalah cukup baik, setakat ini. 

Jadi f adalah bermasalah. Dan hanya tidak meletakkan banyak usaha ke dalam menamakan ia di sini, untuk fokus pada kod. f mempunyai dua baris. Dan mari kita lihat apa yang kini berlaku. Jadi di satu pihak here-- dan izinkan saya membuat ini selaras dengan sebelumnya example-- dalam satu tangan, yang sebelah kiri adalah melakukan apa yang, dalam bahasa Inggeris? Ia is-- PENONTON: Mewujudkan penunjuk. DAVID J. MALAN: Mewujudkan penunjuk untuk int dan memanggil x. Jadi ia mewujudkan salah satu kotak Saya sentiasa melukis pada skrin sentuh. Dan kini, di tangan kanan sampingan, malloc, sudah tentu, memperuntukkan sebahagian daripada ingatan. Dan hanya untuk mengetahui dengan jelas bagaimana memori banyak adalah ia nampaknya memperuntukkan, jika anda hanya jenis matematik di sini? 

Jadi ia 40 bait. Dan saya tahu bahawa hanya kerana saya tahu satu int, perkakas CS50, sekurang-kurangnya, adalah empat bait. Jadi 10 kali 4 adalah 40. Jadi ini adalah menyimpan x, alamat daripada keluar pertama 40 ints yang telah diperuntukkan ruang belakang, ke belakang, ke belakang, ke belakang. 

Dan itulah apa yang penting tentang malloc. Ia tidak mengambil ingatan sedikit di sini, sedikit di sini, sedikit di sini. Ia memberikan satu sebahagian daripada ingatan, contiguously, dari operasi sistem. 

Sekarang apa tentang perkara ini, x pendakap 10 sama dengan 0? Baris kod sewenang-wenangnya. Ia tidak mencapai apa-apa yang berguna. Tetapi ia adalah menarik, kerana x kurungan 10--? Yeah? 

PENONTON: [didengar]? 

DAVID J. MALAN: x kurungan 10 tidak perlu batal. Yang terperinci null hanya mula bermain dengan tali, pada akhir rentetan. Tetapi pemikiran yang baik. 

Bagaimana besar adalah array ini, walaupun walaupun saya telah memperuntukkan 40 bait? Ia 0 melalui sembilan, bukan? Ia 10 ints, jumlah. 40 bait, tetapi 10 ints, diindeks melalui 0 0. 

Jadi apa yang x pendakap 10? Ini sebenarnya beberapa nilai sampah yang tidak diketahui. Ia memori yang bukan milik saya. Saya tidak boleh menyentuh bahawa bait bilangan 41, 42, 43, 44. Saya akan sedikit terlalu jauh. 

Dan sesungguhnya, sekiranya saya ini program, dengan baik mungkin crash. Tetapi kadang-kadang, kita akan mendapat bertuah. Dan sebagainya hanya untuk menunjukkan this-- dan terus-terang, anda tidak pernah tahu sebelum anda adakah it-- mari kita berjalan ini. Ia sebenarnya tidak crash. 

Tetapi jika saya menukar ini, untuk contoh, untuk menjadi seperti 1,000, untuk membuat ini benar-benar sengaja, mari kita lihat jika kita boleh mendapatkannya untuk berlanggar masa ini. OK, ia tidak crash. Bagaimana kira-kira 100,000? Mari kita membentuk semula, dan kini ia jalankan lagi. OK. Phew. Baiklah. Jadi nampaknya, sekali lagi, ini segmen memori, jadi untuk bercakap, munasabah besar, jadi kita boleh mendapatkan bertuah lagi dan lagi. Tetapi akhirnya, apabila anda mendapat masuk akal dan benar-benar pergi jauh pada skrin, anda menyentuh memori yang benar-benar, benar-benar bukan milik anda. 

Tetapi terus-terang, ini jenis pepijat akan menjadi sukar untuk memikirkan sendiri. Tetapi, Alhamdullillah sebagai pengaturcara, kita mempunyai alat yang membolehkan kita untuk melakukan ini untuk kita. Jadi ini adalah, mungkin, satu program paling hodoh, walaupun lebih hodoh daripada output GDB ini. Tetapi ia sentiasa mempunyai garis atau dua yang super berguna. 

Valgrind adalah program yang membantu anda tidak debug program, per se, tetapi mencari memori yang berkaitan masalah, secara khusus. Ia secara automatik akan berjalan kod anda untuk anda dan mencari sekurang-kurangnya dua perkara. Satu, adakah anda melakukan sesuatu tidak sengaja seperti memori sentuhan yang tidak milik anda? Ia akan membantu anda mencari kes-kes. 

Dan dua, ia akan membantu anda mencari sesuatu yang dinamakan kebocoran memori, yang kita mempunyai benar-benar diabaikan, naif, untuk beberapa lama dan bahagia. Tetapi ternyata, semua masa ini, bila-bila masa anda dipanggil getString dalam begitu banyak program-program kami, anda meminta operasi sistem untuk ingatan, tetapi anda mempunyai sebarang ingatan yang sentiasa memberikan kembali, melakukan unalloc, atau percuma, kerana ia dipanggil. Tidak, kerana kita telah tidak meminta anda untuk berbuat demikian. 

Tetapi selama ini, program-program anda telah menulis dalam C telah bocor ingatan, meminta operasi sistem untuk lebih banyak memori untuk tali dan barang kecil, tetapi tidak pernah menyerahkan kembali. Dan sekarang ini agak daripada melampaui batas yang, tetapi jika anda telah pernah menjalankan Mac anda atau PC anda untuk beberapa waktu, membuka banyak program, mungkin menutup program, dan walaupun anda komputer tidak terhempas, ia semakin banyak lebih perlahan, seolah-olah ia benar-benar menggunakan banyak memori atau sumber, walaupun, jika anda tidak walaupun menyentuh papan kekunci, yang boleh adalah-- tetapi tidak boleh always-- menjadi bahawa program-program yang anda jalankan mandapat kebocoran memori. Dan mereka terus bertanya OS yang lebih dan memori lebih, tetapi melupakan mengenainya, sebenarnya tidak menggunakannya, tetapi Oleh itu, mengambil ingatan jauh daripada program-program lain yang mungkin mahu. Itulah penjelasan yang sama. Sekarang ada di mana ini Valgrind output benar-benar kejam kepada mereka yang kurang dan lebih selesa sama. Tetapi yang menarik barangan yang tepat di sini. Ia memberitahu saya yang menulis tidak sah saiz empat berlaku dalam program ini, khususnya, di talian 21 memory.c. 

Jika saya pergi ke beratur 21, hm, memang adalah tidak sah menulis saiz empat. Mengapa saiz empat? Nah, number-- ini dan ia boleh anything-- adalah int satu. Jadi ia empat bait. Jadi saya meletakkan empat bait di mana mereka tidak tergolong. Itulah yang Valgrind sebenarnya memberitahu saya. Selain itu, ia juga akan beritahu saya, seperti yang kita akan melihat, seperti anda menjalankan ini dalam Serangga masa hadapan, jika dan apabila anda telah bocor memori, yang sesungguhnya Saya, kerana saya telah dipanggil malloc, tetapi saya tidak mempunyai benar-benar dipanggil, dalam kes ini, percuma, yang akhirnya kita akan melihat adalah bertentangan dengan malloc. 

Jadi sekarang, saya fikir, satu contoh yang akhir. Jadi yang satu ini lebih sedikit yang sukar difahami, tetapi ia mungkin sebab terbesar kepada berhati-hati dengan ingatan, dan alasan bahawa banyak program dan / atau pelayan web, sehingga ke hari ini, diambil alih oleh orang jahat di suatu tempat di internet yang entah bagaimana menghantar paket palsu ke pelayan anda cuba untuk berkompromi akaun anda, atau mengambil data anda, atau hanya umumnya mengambil alih mesin. Buffer overflow, sebagai nama mencadangkan, cara melimpah bukan int, tetapi penampan. Dan penampan hanya cara yang mewah mengatakan ia adalah sekumpulan ingatan. 

Dan sesungguhnya, saya dipanggil rentetan sebelum penampan, bukan s. Kerana jika ia penampan, seperti dalam erti kata YouTube, atau bila-bila masa anda menonton video, anda mungkin telah melihat buffering perkataan, dot, dot, dot. Ia amat menjengkelkan. Dan itu hanya bermakna bahawa pemain video anda cuba untuk memuat turun banyak bait, banyak bait dari video dari internet. Tetapi ia perlahan, jadi ia cuba turun sekumpulan daripada mereka untuk mengisi penampan, bekas, supaya anda mempunyai bait yang cukup bahawa ia boleh kemudian menunjukkan video, tanpa berhenti terus-menerus. Tetapi ternyata, anda boleh mempunyai penimbal ini besar. Tetapi cuba untuk meletakkan ini banyak data dalam , dan sangat perkara-perkara buruk boleh berlaku. Jadi sebagai contoh, mari kita lihat teaser ini terakhir contoh. Ini adalah program lain itu, pada pandangan pertama, tidak berbuat apa-apa super berguna. Ia mempunyai fungsi Utama yang menyeru fungsi itu, f. Dan fungsi yang, f, di sini, mempunyai pelbagai char, yang dipanggil c, saiz 12. Kemudian ia menggunakan ini fungsi baru yang dipanggil strncpy. 

Ternyata, dengan ini mudah, talian mudah kod, hanya dua baris, kami telah membuat keseluruhan program saya, dan oleh itu, seluruh komputer saya, dan akaun pengguna saya, dan keras saya memandu berpotensi terdedah kepada sesiapa sahaja yang tahu dan cukup baik untuk menjalankan program ini dengan baris arahan tertentu hujah. Dalam erti kata lain, jika lelaki yang buruk ini meletakkan bahagian dalam argvargv [1] dengan menaip di papan kekunci yang sangat khas yang direka tali, tidak abc, 123, tetapi pada dasarnya, Simbol binari yang mewakili laku kod, satu program yang dia menulis, dengan program ini mudah, iaitu wakil beribu-ribu program yang juga terdedah, berani mengatakan, dia akhirnya boleh memadam semua fail pada cakera keras saya, mendapatkan berkelip segera supaya dia boleh menaip arahan sendiri, e-mel kepada semua fail kepada diri saya sendiri. Apa-apa yang boleh saya lakukan, beliau atau dia boleh lakukan dengan kod ini. 

Kami tidak akan cukup menyelesaikan ini. Dan sebenarnya, ia akan melibatkan gambar kecil seperti ini, yang kita tidak lama lagi akan datang untuk memahami semua lebih baik. Tetapi hari ini, mari kita berakhir pada apa yang diharapkan yang lebih sedikit difahami XKCD jenaka, sehingga kita menyambung semula lain kali. Baiklah. Jumpa anda pada hari Rabu. 

[MUZIK bermain] 

SPEAKER: Dan sekarang, dalam fikiran, oleh Daven Farnham. Ingatan adalah seperti melompat ke dalam timbunan daun emas pada petang Ahad. Angin bertiup, melambung anda hair-- oh, saya terlepas hari-hari when-- 

[Ketawa]