[Bermain muzik] DAVID J. MALAN: Baiklah. [Ketawa] Selamat kembali. Ini adalah CS50. Dan ini hujung minggu lima. Dan sehingga kini, kita telah cukup banyak telah mengambil untuk diberikan bahawa terdapat wujud pengkompil ini, dilafaz, bahawa anda telah telah memohon dengan cara ini alat lain yang dipanggil Buat yang entah bagaimana ajaib menukarkan kod sumber anda kepada kod objek, sifar dan orang-orang bahawa CPU komputer anda, pusat Unit pemprosesan, sebenarnya memahami. Tetapi ternyata ada satu nombor yang berlaku di bawah hood dalam antara input dan output. Dan saya ingin mencadangkan supaya kita daging yang keluar dalam terperinci sedikit lebih ke keempat-empat langkah, mempunyai sesuatu yang dinamakan pra-pemprosesan, sesuatu dipanggil penyusunan, yang telah kita lihat, sesuatu yang dinamakan memasang, dan sesuatu yang dinamakan menghubungkan. Jadi sehingga sekarang, di sesetengah program, kami telah tajam termasuk. Baru-baru ini kita telah mempunyai beberapa tajam mentakrifkan untuk pemalar. Jadi ia ternyata bahawa perkara-perkara yang dimulakan dengan awalan simbol hash atau simbol pound adalah pra-pemproses arahan. Itu hanya satu cara yang mewah untuk mengatakan ia baris kod yang sebenarnya ditukar menjadi sesuatu yang lain sebelum komputer walaupun cuba untuk menukar anda program ke sifar dan orang-orang. Sebagai contoh, tajam termasuk standard I / O. H, cukup banyak hanya bermakna pergi hadapan, merebut kandungan fail stdio.h dan tampal di sana. Jadi tidak sifar dan orang-orang pada ketika itu lagi. Ia benar-benar hanya penggantian a. Dan itu dilakukan semasa yang dipanggil peringkat pra-pemprosesan, apabila anda sebenarnya dikendalikan dilafaz atau khusus Buat dalam kebanyakan kes. Jadi semua ini telah berlaku pertama secara automatik setakat ini. Kemudian datang langkah penyusunan. Tetapi kita telah terlalu dipermudahkan kompilasi. Menyusun program yang benar-benar bermaksud untuk mengambil dari sesuatu seperti C, kod sumber kita telah menulis, turun untuk sesuatu yang dinamakan perhimpunan. Bahasa himpunan adalah tahap yang lebih rendah bahasa itu, bersyukur, kita tidak akan mempunyai banyak kesempatan untuk menulis semester ini. Tetapi ia adalah pada tahap yang paling rendah dalam akal bahawa anda benar-benar mula menulis menambah dan tolak dan membiak dan beban dari memori dan simpan ke ingatan, arahan asas yang komputer, di bawah hud, sebenarnya memahami. Akhir sekali, pemasangan mengambil bahasa yang kepada sifar dan orang-orang yang kita telah menerangkan setakat ini. Dan benar-benar akhir sekali, ada yang dipanggil menghubungkan fasa, yang kita akan lihat dalam hanya seketika, yang menggabungkan sifar dan orang-orang dengan sifar dan anda orang-orang yang orang lain sebelum anda buat. Jadi mempertimbangkan program ini mudah super. Ia adalah dari Minggu 1. Ia hanya berkata, Hello World, pada skrin. Kami berlari ini melalui dilafaz. Atau kita berlari melalui Buat yang berlari dilafaz. Dan outputted pada masa di mana beberapa sifar dan orang-orang. Tetapi ternyata ada satu langkah yang pertengahan. Jika saya pergi ke sini - oops, tidak mahu melihat dia lagi. Jika saya pergi ke sini untuk perkakas saya dan saya membuka hello.c, di sini adalah program yang sama. Dan apa yang saya akan lakukan dalam terminal saya tingkap di sini saya akan menjalankan dilafaz bukannya Buat, yang mengautomasikan kesemua empat langkah-langkah untuk kita. Dan saya akan lakukan dilafaz-S dan maka hello.c dan kemudian masukkan. Dan saya mendapat segera berkelip sekali lagi, yang baik. Dan kini di tingkap yang sedikit lebih besar, Saya akan membuka gedit di sini. Dan saya akan membuka fail itu, ternyata, dipanggil hello.s ini yang mengandungi bahasa himpunan Saya disebut lebih awal. Dan ini adalah apa yang dipanggil perhimpunan bahasa, tahap yang agak rendah arahan yang CPU Intel anda atau apa sahaja yang ada di dalam memahami. Dan mov adalah untuk bergerak. panggilan adalah untuk memanggil, fungsi tahap yang sangat rendah. sub adalah untuk tolak. Oleh itu, apabila anda mempunyai CPU tertentu di dalam komputer anda, apa yang menjadikan ia berbeza, berbanding lain CPU pada pasaran, yang mana arahan yang memahami dan sering bagaimana cekap ia , bagaimana pantas ia adalah pada melaksanakan beberapa mereka arahan. Sekarang untuk lebih lanjut tentang ini, anda boleh mengambil CS61 Kejatuhan depan di kolej. Tetapi di sini kita ada, misalnya, beberapa pengenalan yang mungkin kelihatan biasa. hello.c adalah nama program. . Teks - tidak banyak faedah yang terdapat tadi, ingat bahawa teks segmen, pada hari Isnin, di mana dalam memori program anda benar-benar berakhir. Supaya sekurang-kurangnya samar-samar biasa di sana. Di sini, sudah tentu, adalah menyebut fungsi utama kami. Menatal ke bawah, ini merujuk kepada perkara-perkara daftar dipanggil, ketulan kecil dalam ingatan CPU sebenar anda. Dan jika saya tatal ke bawah walaupun lagi, saya melihat beberapa jenis sebutan tidak langsung ASCII. Dan di sana, sesungguhnya, adalah rentetan itu, hello, koma, dunia. Jadi cerita panjang pendek, ini telah berlaku untuk anda, secara automatik, di bawah hood semua masa ini. Dan apa yang telah berlaku benar-benar sekali anda menjalankan dilafaz, atau dengan cara Buat, anda mendapat pertama, dari kod sumber itu, yang dipanggil bahasa himpunan. Kemudian dilafaz adalah menukar perhimpunan ini bahasa ke sifar dan orang-orang. Dan ini adalah slaid yang kami mula perbincangan kami dalam Minggu 0 on - dan kemudian pada Minggu 1. Dan akhirnya, orang-orang sifar dan orang-orang digabungkan dengan sifar dan orang-orang dari orang-orang perpustakaan kita telah mengambil untuk diberikan seperti Standard I / O atau Perpustakaan tali atau perpustakaan CS50. Jadi untuk gambaran yang lebih visual, kita mempunyai hello.c. Dan, sudah tentu, menggunakan printf berfungsi untuk mengatakan, hello dunia. Langkah penyusunan mengambil ia ke fail kita hanya melihat hello.s, walaupun walaupun itu biasanya dipadam automatik untuk anda. Tetapi itulah kod pemasangan dalam langkah pertengahan. Dan kemudian apabila kita memasang pemasangan bahasa, jadi untuk bercakap, itu apabila anda mendapatkan orang-orang sifar dan orang-orang. Jadi kita telah dizum dalam berkesan pada hari ini apa yang kita telah mengambil untuk diberikan, bermakna akan kod sumber untuk membantah kod. Tetapi akhirnya, sekarang gambar yang sama - mari kita mendorong ia ke sebelah kiri. Dan ambil perhatian bahawa di atas sana Saya nyatakan stdio.h. Itulah fail yang kita telah dimasukkan dalam hampir semua program-program yang kita tulis. Dan itulah fail yang kandungannya mendapatkan salinan ditampal, berkesan di atas kod anda. Tetapi ternyata bahawa, pada komputer sistem di tempat, ada yang mungkin file stdio.c bahawa seseorang menulis tahun lalu yang melaksanakan semua fungsi-fungsi yang telah diisytiharkan dalam stdio.h. Sekarang dalam realiti, ia mungkin tidak pada Mac atau PC anda atau di CS50 perkakas adalah kod C mentah. Seseorang yang telah disusun dan dimasukkan . O fail kod objek atau a. fail, yang merujuk kepada perpustakaan yang dikongsi yang telah pra-dipasang dan pra-disusun untuk anda. Tetapi menganggap bahawa memang wujud pada stdio.c komputer kita selari dengan dilafaz. Kod anda yang sedang disusun dan dipasang. kod stdio.c 's sedang disusun dan dipasang, supaya ini yang terakhir langkah, turun di sini, kita perlu entah bagaimana link, jadi untuk bercakap, sifar dan orang dengan beliau sifar dan orang-orang ke dalam satu program mudah yang akhirnya adalah dipanggil hanya Hello. Jadi, itu semua sihir itu telah berlaku setakat ini. Dan akan terus mengambil langkah- proses untuk diberikan, tetapi menyedari terdapat banyak butir-butir berair berlaku di bawah sana. Dan ini adalah apa yang membuat anda komputer dengan Intel dalam terutamanya yang berbeza. Maka pada perhatian bahawa, jika anda ingin menyertai kami untuk makan tengah hari Jumaat ini, jangan pergi ke tempat cs50.net/rsvp biasa, 13:15 Jumaat ini. Dan kini pengumuman ini. Oleh itu, kita mempunyai beberapa berita baik. Dan kita mempunyai beberapa berita buruk. Mula dengan beberapa berita baik di sini. [Rintihan] Baiklah. Nah, itu teknikal bercuti, jadi ia tidak begitu banyak hadiah daripada kami. Tetapi berita buruk sudah tentu. [Rintihan] Saya menghabiskan banyak masa mengenai animasi. [Ketawa] Akan ada sesi kajian akan datang hari ini. Ia akan menjadi pada 5:30 PM. Kami akan mengingatkan anda semua perincian ini melalui e-mel pada kursus ini laman web dalam hanya beberapa hari lagi. Ia akan difilemkan dan disediakan sejurus selepas itu. Jadi, jika anda tidak boleh membuat bahawa Isnin slot malam, jangan bimbang. Seksyen minggu ini yang akan datang juga akan memberi tumpuan kepada ulasan kuiz. Jika bahagian anda adalah pada hari Isnin, yang merupakan sesungguhnya universiti bercuti, kita akan masih bertemu di bahagian. Jika anda tidak boleh membuat seksyen kerana anda akan jauh, itulah denda. Menghadiri hari Ahad atau Selasa atau seksyen lagu dalam seksyen Jason, yang merupakan didapati dalam talian. Jadi, lebih banyak berita buruk. Jadi, mengikut sukatan pelajaran, kita mempunyai kuliah Jumaat depan. Tetapi berita baik - jelas, saya menghabiskan masa yang terlalu banyak mengenai perkara ini. [Ketawa] Kami akan membatalkan seterusnya kuliah Jumaat. Jadi yang akan menjadi hadiah untuk kita, jadi anda benar-benar boleh mempunyai tempoh baik di antara minggu ini dan dua minggu itu. Jadi tidak ada kuliah minggu depan, hanya kecil kuiz sedikit, yang mana anda perlu mendapat semakin teruja. Jadi mari kita beralih pula perhatian kita kepada sesuatu yang memang lebih visual dan lebih menarik dan untuk menetapkan peringkat untuk apa yang akan menjadi di kaki langit dalam hanya beberapa minggu. Selepas kuiz yang pertama, kami akan menjadikan tumpuan set masalah kita yang lain masalah khusus domain, iaitu forensik atau keselamatan amnya. Malah, tradisi dengan masalah ini yang ditetapkan adalah bagi saya salah satu daripada rakan-rakan atau CA mengajar untuk berjalan di kampus mengambil gambar-gambar pasti tetapi bukan orang yang jelas, tempat, atau benda, maka setiap tahun saya entah bagaimana menguruskan untuk sengaja memadam atau merosakkan kad media digital yang ada di dalam kamera kami. Tetapi tidak ada masalah besar. Saya boleh pergi ke hadapan dan palam itu ke dalam komputer saya. Saya boleh membuat imej forensik, jadi untuk bercakap, dengan meniru sifar dan orang-orang yang kira bahawa kad memori, sama ada kad SD atau kad kilat padat atau apa sahaja yang anda sudah biasa dengan. Dan kemudian kita boleh tangan yang keluar. Dan sebagainya cabaran akan datang, antara lain perkara-perkara untuk anda, adalah untuk menulis Kod C yang pulih sejumlah besar JPEG untuk saya dan mendedahkan akan orang-orang, tempat, atau benda itu. Dan kita juga akan bercakap, dalam masalah ini ditetapkan dan pada hari-hari akan datang, kira-kira grafik amnya. Kami telah menggunakan mereka, kursus, untuk keluar. Tetapi anda jenis diambil untuk diberikan wujud ini tanggapan yang tinggi dari segi empat tepat dan bujur. Tetapi di bawah hood terdapat piksel. Dan anda terpaksa memulakan memikirkan tentang mereka. Atau anda akan untuk p-set 4 perlu berfikir kira-kira jurang antara bata anda, bagaimana cepat anda bola bergerak di seluruh skrin untuk keluar. Jadi ada idea ini daripada titik pada skrin anda itu mula bermain sudah. Sekarang apa yang anda lihat, walaupun, adalah apa yang anda pada skrin komputer. Jika anda pernah melihat beberapa baik atau TV buruk, kemungkinan mereka cukup banyak merawat penonton seperti technophobes yang tidak benar-benar tahu banyak tentang komputer. Dan supaya ia sangat mudah bagi polis detektif untuk mengatakan, anda juga boleh membersihkan bahawa untuk saya? Atau meningkatkan, bukan? Meningkatkan adalah seperti perkataan buzz dalam yang paling mana-mana rancangan yang berkaitan jenayah. Dan realitinya adalah jika anda mengambil yang sangat gambar kabur daripada suspek melakukan sesuatu yang buruk, anda tidak boleh hanya meningkatkan ia. Anda tidak boleh mengezum masuk terhingga. Anda tidak boleh melihat di bersinar daripada seseorang mata yang melakukan jenayah tertentu, walaupun kelaziman ini di TV. Dan supaya dengan itu mari kita motivasi yang masalah yang akan datang ditetapkan dengan melihat pada beberapa rancangan yang anda mungkin biasa. [MAIN SEMULA VIDEO] -OK. Sekarang, mari kita lihat baik pada anda. -Pegang. Main balik. -Tunggu satu minit. Pergi ke kanan. -Terdapat. Pembekuan itu. Skrin penuh. -OK. Pembekuan itu. Ketatkan-up pada itu, akan ya? -Baling di atas lelaki itu oleh roda belakang. -Zoom di sini di tempat ini. -Dengan peralatan yang betul, imaged boleh membesar dan tajam. -Apa itu? -Ia merupakan satu program peningkatan. -Bolehkah anda jelas bahawa mana-mana? -Saya tidak tahu. Mari kita meningkatkan ia. -Meningkatkan seksyen A-6. -I dipertingkatkan terperinci dan - -Saya fikir ada cukup untuk meningkatkan. Melepaskannya ke skrin saya. -Meningkatkan pantulan di mata beliau. -Mari kita berjalan ini melalui peningkatan video. -Edgar, anda boleh meningkatkan ini? -Hang pada. -Aku telah bekerja pada refleksi ini. -Seseorang mencerminkan itu. -Reflection. -Ada pantulan muka manusia. Para renungan. -Ada satu pantulan. -Zum masuk pada cermin. -Anda boleh melihat pantulan. -Bolehkah anda meningkatkan imej dari sini? -Bolehkah anda meningkatkan dia di sini? -Bolehkah anda meningkatkan ia? -Bolehkah anda meningkatkan ia? -Bolehkah kita meningkatkan ini? -Bolehkah anda meningkatkan ia? -Pegang pada kali kedua, saya akan meningkatkan. -Zum masuk di pintu. -X10. -Zoom. [Ketawa] -Pindah masuk -Tunggu, berhenti. -Stop. -Jeda itu. -Putar 75 darjah di sekitar sila menegak. [Ketawa] -Stop, dan kembali ke bahagian kira-kira pintu lagi. -Got imej penambah yang boleh bitmap? -Mungkin kita boleh menggunakan Pradeep Sen kaedah untuk melihat ke tingkap. -Ini perisian adalah keadaan seni. Nilai-icon dimatikan. -Dengan kombinasi yang betul algoritma. -Dia diambil algoritma pencahayaan untuk tahap yang seterusnya dan saya boleh menggunakan mereka untuk meningkatkan gambar ini. Kunci-pada dan membesarkan paksi z. -Meningkatkan. -Meningkatkan. -Meningkatkan. -Pembekuan dan meningkatkan. [AKHIR VIDEO MAIN SEMULA] DAVID J. MALAN: Set Masalah Jadi 5 adalah apa yang akan berlaku di sana. Oleh itu, kita tidak lama lagi akan mendapat pemahaman yang lebih baik bila dan mengapa anda boleh dan kita tidak boleh meningkatkan dengan cara itu. Tetapi pertama, mari kita kembali perhatian kita kepada beberapa blok bangunan kita akan perlu berupaya untuk memberitahu cerita itu. Jadi ingat bahawa kita menarik gambar ini pada Isnin dan sedikit minggu lepas. Dan ini menerangkan kedudukan perkara-perkara di dalam memori komputer anda apabila menjalankan beberapa program. Segmen teknologi top up, ingat, merujuk kepada sifar sebenar dan orang-orang yang yang mengarang program anda. Ada, di bawah itu, beberapa dimulakan atau data tidak diisytiharkan, yang biasanya merujuk kepada perkara-perkara seperti pemalar atau tali atau pembolehubah global yang mempunyai diisytiharkan terlebih dahulu. Terdapat timbunan itu, tetapi kita akan datang kembali kepada yang dalam sedikit. Dan kemudian ada timbunan. Sama seperti timbunan dulang di kafeteria, ini adalah di mana memori mendapat berlapis dan berlapis apabila anda melakukan apa dalam program? Apakah penggunaan timbunan untuk? Ya? Memanggil fungsi. Bila-bila masa anda memanggil fungsi, ia diberikan kepada sekerat memori untuk yang pembolehubah tempatan atau parameternya. Dan bergambar, kita lihat bahawa dengan setiap fungsi berturut-turut dipanggil, apabila A panggilan panggilan B C panggilan D, mereka mendapatkan berlapis ke dalam tindanan. Dan dalam setiap daripada mereka keping memori asasnya skop yang unik untuk fungsi itu, yang, sememangnya, bermasalah jika anda mahu menyerahkan dari satu fungsi yang lain sekeping A data yang anda mahu bermutasi atau berubah. Jadi apa penyelesaian kami untuk membolehkan Satu fungsi diwakili oleh satu timbunan bingkai menukar memori di dalam kerangka susunan yang lain? Bagaimana kedua-dua bercakap dengan satu sama lain? Jadi dengan cara petunjuk atau alamat, yang, sekali lagi, hanya menggambarkan di mana dalam ingatan, dengan cara tertentu beberapa menggigit, tertentu nilai boleh didapati. Jadi ingat masa lalu juga kita terus kisah dan memandang pada agak program kereta. Dan program ini adalah kereta untuk beberapa sebab, tetapi yang paling membimbangkan ialah kerana ia gagal untuk memeriksa apa? Ya, ia gagal untuk memeriksa input. Maaf? Jika ia adalah lebih daripada 12 aksara. Jadi sangat bijak, apabila memanggil memcopy, yang, seperti namanya, hanya salinan ingatan dari hujah kedua ke dalam hujah pertama. Hujah ketiga, sangat bijak, adalah diperiksa untuk memastikan bahawa anda tidak tulis lebih daripada, dalam kes ini, panjang bar, beberapa watak-watak, ke destinasi, yang ini pelbagai C. Tetapi masalahnya ialah bahawa apa yang jika C itu sendiri tidak cukup besar untuk mengendalikan itu? Anda akan tulis bilangan bait yang anda telah diberikan. Tetapi apa yang anda benar-benar mempunyai lebih bait daripada anda mempunyai ruang untuk? Well, program ini sangat bodoh hanya membuta tuli hasil untuk mengambil apa-apa ia diberikan, hello backslash 0 adalah besar jika rentetan pendek cukup, seperti lima aksara. Tetapi jika ia sebenarnya 12 aksara atau 1,200 aksara, kita melihat masa lalu bahawa anda hanya akan benar-benar menulis semula memori yang bukan milik anda. Dan kes paling teruk, jika anda menulis bahawa bahagian merah sana yang kita dipanggil kembali alamat - ini adalah tempat di mana komputer secara automatik, untuk anda, di belakang tabir, tucks jauh nilai 32-bit yang mengingatkan kepada apa alamat yang sepatutnya kembali apabila foo, fungsi ini lain, dilakukan melaksanakan. Ia adalah satu roti meremahkan pelbagai yang mana ianya kembali. Jika anda menulis bahawa, berpotensi, jika anda seorang lelaki yang buruk, boleh boleh berpotensi mengambil alih komputer seseorang. Dan anda akan pasti kemalangan di dalam kebanyakan kes. Sekarang masalah ini hanya diburukkan lagi seperti yang kita mula bercakap tentang ingatan pengurusan yang lebih umum. Dan malloc, peruntukan memori, adalah fungsi yang boleh kita gunakan untuk memperuntukkan memori apabila kita tidak tahu terlebih dahulu bahawa kita mungkin memerlukan. Jadi, sebagai contoh, jika saya kembali kepada perkakas di sini. Dan saya membuka hello2.c dari masa lalu, ingat program ini di sini, yang kelihatan sesuatu yang kecil seperti ini, hanya tiga baris - menyatakan nama, maka nama tali, di sebelah kiri, sama getstring. Dan kemudian kita mencetak ia keluar, Nama pengguna. Jadi ini adalah satu program yang sangat mudah. Untuk menjadi jelas, izinkan saya pergi ke hadapan dan membuat hello-2. Saya akan melakukan dot slash hello-2. Nyatakan nama anda - Daud. Enter. Hello Daud. Ia seolah-olah bekerja OK. Tetapi apa yang benar-benar berlaku di bawah hud di sini? Pertama mari kita mengupas kembali beberapa lapisan. Rentetan hanya sinonim kita telah sedar untuk apa? Bintang Char. Jadi mari kita membuat ia sedikit lebih batin tetapi yang lebih teknikal yang betul yang ini adalah bintang char, yang bermaksud bahawa nama, ya, adalah pembolehubah. Tetapi apa yang kedai-kedai nama alamat a char, yang berasa sedikit pelik kerana saya mendapat kembali rentetan. Saya mendapat kembali pelbagai aksara bukan char. Tetapi tentu saja, anda hanya perlu pertama alamat char untuk mengingati di mana rentetan keseluruhannya adalah kerana mengapa? Bagaimana anda mengetahui di mana akhir tali itu mengetahui awal? Sifar garis sendeng terbalik. Jadi dengan kedua-dua petunjuk yang anda memikirkan sebelum permulaan dan akhir mana-mana tali adalah, selagi mereka betul ditubuhkan dengan nol bahawa terminator, yang sifar garis sendeng terbalik. Tetapi ini memanggil getstring. Dan ternyata bahawa getstring sepanjang masa ini telah menjadi jenis menipu untuk kita. Ia telah melakukan kerja ini, untuk memastikan, mendapatkan rentetan daripada pengguna. Tetapi di mana adalah memori yang telah datang dari? Jika kita kembali kepada gambar di sini dan memohon definisi daripada hanya masa lalu, bahawa timbunan adalah di mana memori berlaku apabila fungsi dipanggil, oleh logik itu, apabila anda memanggil getstring, dan kemudian saya menaip D-A-V-I-D Masukkan, di mana D-A-V-I-D backslash sifar disimpan, berdasarkan cerita kami telah memberitahu kami ini? Ia seolah-olah berada di dalam timbunan, kan? Apabila anda memanggil mendapatkan tali anda mendapat keping sedikit memori pada timbunan. Maka dengan sebab bahawa D-A-V-I-D backslash sifar disimpan terdapat dalam timbunan. Tetapi tunggu satu minit, getstring pulangan tali itu, jadi untuk bercakap, yang bermaksud ia dulang dari kafeteria diambil dari timbunan. Dan kita berkata Kali terakhir sebaik sahaja mengembalikan, dan anda mengambil dulang, jadi untuk bercakap, dari timbunan, apa anda boleh menganggap mengenai sisa-sisa memori yang? Saya jenis redrew mereka sebagai tanda tanya kerana mereka berkesan menjadi nilai-nilai yang tidak diketahui. Mereka boleh digunakan semula apabila beberapa fungsi seterusnya dipanggil. Dalam erti kata lain, jika kita berlaku untuk menyimpan - Saya akan menarik gambar cepat sini timbunan. Jika kita berada melukis bawah segmen ingatan saya, dan kami akan mengatakan bahawa ini adalah tempat memori diduduki oleh Arg utama dan mungkin c dan Arg v dan apa-apa lagi dalam program ini, apabila getstring dipanggil, mungkin getstring mendapat sebahagian memori di sini. Dan kemudian D-A-V-I-D entah bagaimana berakhir dalam fungsi ini. Dan saya akan menggampangkan. Tetapi mari kita andaikan bahawa D-A-V-I-D backslash sifar. Jadi ini banyak bait yang digunakan dalam rangka bagi getstring. Tetapi sebaik sahaja pulangan getstring, kita berkata kali terakhir bahawa memori ini lebih di sini semua menjadi - Woops! - semua menjadi terpadam berkesan. Dan kita boleh berfikir ini kini sebagai soalan markah kerana yang tahu apa yang akan menjadi memori yang. Malah, saya sangat sering memanggil fungsi selain daripada getstring. Dan sebaik sahaja saya panggil yang lain fungsi daripada getstring, mungkin tidak program ini kita hanya melihat di tetapi beberapa yang lain, pasti yang lain fungsi mungkin berakhir diberikan tempat ini akan datang dalam timbunan. Jadi ia tidak boleh bahawa kedai-kedai getstring D-A-V-I-D pada timbunan kerana saya akan segera kehilangan akses kepadanya. Tetapi kita tahu mereka getstring hanya mengembalikan apa? Ia tidak kembali ke saya enam aksara. Apakah ia benar-benar kembali tidak kita membuat kesimpulan masa lalu? Alamat pertama. Jadi entah bagaimana, apabila anda dipanggil getstring, ia memperuntukkan sebahagian daripada memori untuk rentetan yang jenis pengguna dan alamat kemudian kembali itu. Dan ternyata bahawa apabila anda mahu berfungsi untuk memperuntukkan ingatan dalam cara dan kembali kepada orang yang dipanggil fungsi itu, alamat bahawa sebahagian memori, anda benar-benar tidak boleh meletakkan ia dalam timbunan di bawah, kerana fungsi ia hanya akan anda tidak menjadi sangat dengan cepat, jadi anda mungkin boleh meneka di mana kita mungkin akan melemparkannya sebaliknya, timbunan kononnya. Jadi antara bahagian bawah memori yang anda susun atur dan atas memori yang anda susun atur adalah sekumpulan keseluruhan segmen. Satu adalah timbunan, dan kanan atas adalah timbunan itu. Dan timbunan hanya sebahagian yang berbeza memori yang tidak digunakan untuk fungsi-fungsi apabila mereka dipanggil. Ia digunakan untuk ingatan jangka panjang, apabila anda mahu satu fungsi untuk merebut beberapa memori dan mampu untuk menggantung pada kepadanya tanpa kehilangan kawalan ke atasnya. Sekarang anda boleh mungkin serta-merta melihat bahawa ini tidak semestinya reka bentuk yang sempurna. Sebagai program anda memperuntukkan memori pada timbunan itu, atau anda memanggil lebih lebih banyak fungsi, atau seperti yang anda memperuntukkan memori pada timbunan dengan malloc kira sebagai getstring lakukan, apa yang jelas seolah-olah menjadi masalah yang tidak dapat dielakkan? Betul. Seperti hakikat bahawa anak panah yang menghala ke arah satu sama lain tidak memberikan petanda yang baik. Dan sesungguhnya, kita sangat cepat boleh kemalangan satu program di mana-mana nombor cara. Malah, saya fikir kita mungkin mempunyai melakukan ini sengaja sekali. Atau jika tidak, mari kita melakukannya sengaja sekarang. Biar saya pergi ke hadapan dan menulis super cepat program yang dikenali sebagai dontdothis.c. Dan sekarang saya akan pergi di sini dan jangan tajam termasuk stdio.h. Mari kita mengisytiharkan fungsi foo mengambil ada hujah, yang merupakan ditandakan serta dengan tidak sah. Dan satu-satunya foo akan lakukan ialah panggilan foo, yang mungkin bukan idea bijak, tetapi begitu ia. Tidak sah utama Ent. Kini satu-satunya perkara utama yang akan lakukan ialah memanggil foo juga. Dan hanya untuk tendangan, saya akan pergi hadapan di sini dan mengatakan printf "Hello dari foo. " OK. Jadi, jika saya tidak membuat apa-apa kesilapan, Buat dontdothis dot slash. Dan mari kita melakukannya dalam tingkap yang lebih besar - dot slash, dontdothis. Datang. Uh oh. Rupa-rupanya, anda boleh melakukan ini. Celaka. OK. Tunggu. Berdiri. Adakah kita - Kami menggunakannya dengan Buat. [Mengeluh] Saya tahu tetapi saya fikir kita hanya dihapuskan itu. Uh, yeah. Celaka. Menyelesaikan Rob ini. Apa? Ia amat mudah. Ya, kita beralih pengoptimuman off. OK, berdiri tinggal. Sekarang saya berasa lebih baik. OK. Baiklah. Jadi mari kita susun semula ini - Membuat anda dontdothis. Anda mungkin perlu menukar nama ini kepada dothis.c dalam hanya seketika. Ada kita pergi. Terima kasih. OK. Jadi hakikat bahawa saya telah mencetak sesuatu yang keluar adalah sebenarnya hanya melambatkan proses yang kita akan mencapai titik. OK. Phew! Jadi apa yang sebenarnya berlaku? Sebab di sana, hanya sebagai diketepikan, adalah melakukan apa-apa dari segi input dan output cenderung untuk menjadi lebih perlahan kerana anda perlu menulis watak-watak kepada skrin, Ia mempunyai untuk menatal. Jadi cerita panjang pendek, saya sebenarnya mempunyai berlaku begitu tidak sabar, kita akan mempunyai melihat hasil akhir ini juga. Sekarang saya mendapat menaiki cetak-up, kita lihat dengan segera. Lalu mengapa ini berlaku. Nah, penjelasan yang mudah, sudah tentu, ialah foo mungkin tidak perlu memanggil sendiri. Sekarang secara umum, ini adalah rekursi. Dan kita berfikir dua minggu lalu rekursi adalah baik. Rekursi ialah cara ajaib menyatakan diri super ringkas. Dan ia hanya berfungsi. Tetapi ada satu ciri utama semua program rekursi kita telah berbincang kira-kira dan melihat setakat ini, yang adalah bahawa mereka mempunyai apa? Satu kes asas, yang sedikit keras berkod kes yang berkata dalam sesetengah keadaan tidak memanggil foo, yang jelas tidak berlaku di sini. Jadi apa sebenarnya yang berlaku dari segi gambar ini? Nah, apabila utama panggilan foo, ia mendapat keping ingatan. Apabila panggilan foo foo, ia mendapat sepotong ingatan. Apabila panggilan foo foo, ia menjadi sepotong. Ia mendapat keping. Ia mendapat keping. Kerana foo tidak pernah kembali. Kami tidak pernah memadamkan salah seorang daripada mereka bingkai dari timbunan. Jadi kita sedang bertiup melalui timbunan itu, tidak lagi yang tahu apa yang lain, dan kami overstepping batas-batas kami yang dipanggil segmen ingatan. Ralat pergi segmentasi palsu. Jadi penyelesaian yang ada jelas tidak melakukan ini. Tetapi implikasi yang lebih besar ialah, ya, ada benar-benar adalah had tertentu, walaupun ia tidak ditakrifkan dengan baik, tentang bagaimana banyak fungsi yang anda boleh memanggil satu program, berapa kali fungsi boleh memanggil sendiri. Jadi, walaupun kita tidak berdakwah rekursi sebagai perkara ini berpotensi yang ajaib beberapa minggu lalu untuk sigma fungsi, dan apabila kita mendapatkan data struktur dan CS50, anda akan melihat yang lain aplikasi untuk itu, ia tidak semestinya perkara yang terbaik. Kerana jika fungsi panggilan sendiri, panggilan sendiri, walaupun ada asas kes ini, jika anda tidak melanda kes asas untuk 1,000 panggilan atau 10,000 panggilan, oleh bahawa masa anda mungkin telah berjalan keluar dari bilik pada timbunan yang dipanggil dan hit beberapa segmen lain ingatan. Jadi ia juga merupakan reka bentuk keseimbangan antara keanggunan dan antara keteguhan tertentu anda pelaksanaan. Jadi ada keburukan yang lain atau gotcha lain dengan apa yang kita telah telah lakukan setakat ini. Apabila saya dipanggil getstring - biarlah saya kembali ke hello-2. Perhatikan bahawa saya menyeru getstring, yang kembali alamat. Dan kita mendakwa hari ini bahawa alamat adalah dari timbunan itu. Dan kini saya mencetak keluar tali di alamat itu. Tetapi kita tidak pernah dipanggil bertentangan dengan getstring. Kami tidak pernah calll fungsi seperti ungetstring, di mana anda kembali tangan memori itu. Tetapi terus terang kita mungkin sepatutnya. Kerana jika kita terus bertanya komputer untuk ingatan, dengan cara seseorang seperti getstring tetapi tidak pernah memberikan kembali, pasti itu juga adalah terikat untuk membawa kepada masalah di mana kita kehabisan memori. Dan sebenarnya, kita boleh melihat bagi masalah dengan alat baru yang penggunaan adalah samar sedikit untuk menaip. Tetapi biarlah saya pergi ke hadapan dan percikan ia pada skrin dalam seketika. Saya akan pergi ke hadapan dan menjalankan Valgrind dengan parameter yang perintah pertama hujah baris adalah nama program yang hello-2. Dan malangnya ia output atrociously kompleks tanpa sebab yang baik. Jadi kita lihat semua keadaan kucar-kacir itu. David menyatakan nama saya. Jadi itulah program sebenarnya berjalan. Dan sekarang kita mendapatkan output ini. Jadi Valgrind adalah sama dalam semangat untuk GDB. Ia bukan satu penyahpepijat per se. Tetapi ia adalah satu pemeriksa ingatan. Ia adalah satu program yang akan berjalan anda program dan memberitahu anda jika anda bertanya komputer untuk memori dan tidak menyerahkannya belakang, dengan itu bererti bahawa anda mempunyai kebocoran memori. Dan kebocoran memori cenderung untuk menjadi buruk. Dan anda adalah pengguna komputer mempunyai mungkin merasakan ini, sama ada anda mempunyai Mac atau PC. Pernahkah anda menggunakan komputer anda untuk sementara dan tidak reboot dalam beberapa hari, atau anda baru sahaja mendapat banyak program berjalan, dan perkara yang bodoh melambatkan terhenti, atau sekurang-kurangnya ia adalah super menjengkelkan untuk digunakan, kerana segala-galanya hanya mendapat super perlahan. Sekarang boleh mana-mana beberapa sebab. Ia boleh menjadi gelung tak terhingga, bug dalam kod seseorang, atau, lebih mudah, ia boleh bermakna bahawa anda menggunakan lebih memori, atau cuba, daripada anda komputer sebenarnya mempunyai. Dan mungkin ada bug dalam program beberapa yang terus bertanya untuk ingatan. Pelayar selama bertahun-tahun telah terkenal ini, meminta memori yang lebih dan lebih tetapi tidak pernah menyerahkan kembali. Sesungguhnya, jika anda hanya mempunyai terhingga jumlah memori, anda tidak boleh meminta terhingga banyak kali untuk beberapa memori yang. Dan jadi apa yang anda lihat di sini, walaupun lagi output Valgrind adalah tidak perlu rumit untuk renungan pertama, ini adalah bahagian yang menarik. Heap - digunakan pada keluar. Jadi di sini adalah berapa banyak memori adalah digunakan dalam timbunan itu pada masa program saya keluar - nampaknya enam bait dalam satu blok. Jadi saya akan melambai tangan saya apa blok adalah. Fikirkan ia hanya sebahagian satu, yang lebih perkataan teknikal bagi sebahagian. Tetapi enam bait - apakah enam bait yang masih digunakan? Tepat sekali. D-A-V-I-D backslash sifar, lima surat Nama campur null. Jadi program ini Valgrind menyedari bahawa saya meminta enam bait, nampaknya, oleh cara getstring, tetapi tidak pernah memberikan mereka kembali. Dan sebenarnya, ini mungkin tidak begitu jelas jika program saya bukan tiga baris, tetapi ia 300 baris. Oleh itu, kita sebenarnya boleh memberi arahan lain hujah garis Valgrind untuk menjadikannya lebih lantung. Ia sedikit menjengkelkan untuk ingat. Tetapi jika saya lakukan - mari kita lihat. Bocor - Adakah ia bocor - walaupun saya tidak ingat apa yang ia adalah kira tangan. - Bocor cek sama penuh. Ya, terima kasih. - Bocor cek sama penuh. Enter. Program yang sama sedang berjalan. Menaip David lagi. Sekarang saya melihat sedikit lebih terperinci. Tetapi di bawah ringkasan timbunan itu, yang adalah sama dengan empat - ah, ini adalah jenis baik. Sekarang Valgrind sebenarnya mencari agak sukar dalam kod saya. Dan ia mengatakan bahawa, nampaknya, malloc di talian - kita zum keluar. Pada line - kita tidak melihat apa garis itu. Tetapi malloc adalah punca pertama. Ada satu blog di malloc. Semua betul? OK, tidak. Betul? Saya dipanggil getstring. getstring nampaknya panggilan malloc. Jadi apa baris kod nampaknya bersalah kerana diperuntukkan memori ini? Mari kita andaikan bahawa sesiapa yang menulis malloc telah wujud cukup lama bahawa ia adalah bukan kesalahan mereka. Jadi ia mungkin saya. getstring dalam cs50.c - supaya satu memfailkan suatu tempat di komputer - sejajar 286 seolah-olah menjadi pelakunya. Sekarang mari kita andaikan bahawa cs50 telah sekitar untuk jumlah yang baik masa, jadi kita juga adalah sempurna. Dan jadi ia mungkin tidak dalam getstring bug yang terletak, tetapi dalam talian hello-2.c 18. Jadi mari kita lihat apa garis bahawa 18 adalah. Oh. Entah bagaimana baris ini tidak semestinya kereta, per se, tetapi ia adalah sebab di sebalik itu kebocoran memori. Jadi super semata-mata, apa yang akan gerak hati menjadi penyelesaian di sini? Jika kita meminta ingatan, tidak pernah memberi kembali, dan yang seolah-olah menjadi masalah kerana dari masa ke masa komputer saya mungkin kehabisan ingatan, mungkin lambat turun, perkara-perkara buruk yang mungkin berlaku, baik, apa penyelesaian yang mudah intuitif? Hanya memberi kembali. Bagaimana anda membebaskan memori yang? Nah, bersyukur kerana ia agak mudah hanya menyebut nama percuma. Dan kita tidak pernah dilakukan sebelum ini. Tetapi anda pada asasnya boleh berfikir percuma sebagai bertentangan dengan malloc. bebas adalah bertentangan dengan memperuntukkan ingatan. Jadi sekarang biarlah saya susun semula ini. Buat hello-2. Biar saya berjalan lagi. hello-2 David. Jadi, ia seolah-olah untuk bekerja di cara yang sama. Tetapi jika saya kembali ke Valgrind dan jalankan semula bahawa perintah yang sama pada yang baru saya program disusun, menaip nama saya seperti sebelum ini - bagus. Ringkasan Heap - digunakan pada keluar - sifar bait dalam blok sifar. Dan ini adalah super nice, semua blok timbunan telah dibebaskan. Tiada kebocoran yang mungkin. Jadi datang, bukan dengan Set Masalah 4, tetapi dengan Set Masalah 5, forensik dan seterusnya, ini juga akan menjadi ukuran kebenaran anda program, sama ada atau tidak anda mempunyai atau tidak mempunyai kebocoran memori. Tetapi bersyukur, bukan sahaja anda boleh sebab melalui mereka intuitif, yang adalah, boleh dikatakan, mudah bagi program kecil tetapi sukar untuk program-program yang lebih besar, Valgrind, bagi program-program yang lebih besar, boleh membantu anda mengenal pasti masalah tertentu. Tetapi ada satu masalah lain yang mungkin timbul. Izinkan saya membuka fail ini di sini, yang adalah, lagi, satu contoh yang agak mudah. Tetapi mari memberi tumpuan kepada apa program ini tidak. Ini dipanggil memory.c. Kami akan hantar ini hari ini kemudian di zip kod sumber hari ini. Dan notis bahawa saya mempunyai fungsi yang dipanggil f yang tidak mengambil hujah-hujah dan mengembalikan apa-apa. Selaras 20, saya nampaknya mengisytiharkan penunjuk kepada int dan memanggilnya x. Saya memberikan tempat kembali nilai malloc. Dan hanya untuk menjadi jelas, berapa banyak bait am Saya mungkin mendapat kembali dari malloc dalam situasi ini? Mungkin 40. Di manakah anda mendapatkan dari? Nah, jika anda masih ingat bahawa int adalah sering 4 bait, sekurang-kurangnya ia adalah dalam perkakas, 10 kali 4 adalah jelas 40. Jadi malloc adalah kembali alamat sesuatu sebahagian memori dan menyimpan bahawa menangani akhirnya di x. Jadi jelas, apa yang kemudian berlaku? Baiklah, biar saya menukar kembali untuk gambar kami di sini. Biar saya tidak hanya menarik bahagian bawah saya memori komputer, izinkan saya pergi ke hadapan dan menarik seluruh segiempat tepat yang mewakili semua RAM saya. Kami akan mengatakan bahawa timbunan adalah di bahagian bawah. Dan ada satu segmen teks dalam data yang tidak diisytiharkan. Tetapi saya hanya akan abstrak mereka perkara-perkara lain yang jauh sebagai dot, dot dot. Saya hanya akan merujuk kepada ini sebagai timbunan itu di atas. Dan kemudian di bahagian bawah gambar ini, untuk mewakili utama, saya akan untuk memberikan memori keping dalam timbunan. Untuk f, saya akan memberikan sepotong memori dalam timbunan. Sekarang, saya mendapat untuk berunding dengan saya kod sumber lagi. Apakah pembolehubah tempatan utama? Rupa-rupanya apa-apa, jadi keping yang berkesan kosong atau tidak sebesar kerana saya telah disediakan itu. Tetapi dalam f, saya mempunyai pembolehubah tempatan, yang dipanggil x. Jadi, saya akan pergi ke hadapan dan memberikan f sebahagian memori, ia memanggil x. Dan kini malloc sebanyak 10 kali 4, Jadi malloc 40, mana yang memori yang datang dari? Kami tidak dilukis gambar seperti ini sebelum ini. Tetapi mari kita andaikan bahawa ia berkesan datang dari sini, jadi satu, dua, tiga, empat, lima. Dan sekarang saya perlu 40 ini. Jadi saya hanya akan melakukan dot, dot, dot mencadangkan bahawa terdapat memori yang lebih kembali dari timbunan itu. Sekarang apa yang alamat? Mari kita sewenang-wenangnya memilih kami menangani seperti biasa - Ox123, walaupun ia mungkin akan untuk menjadi sesuatu yang berbeza. Itulah alamat bait yang pertama di memori yang saya meminta malloc untuk. Jadi dalam jangka pendek, garis sekali 20 melaksanakan, apa yang benar-benar disimpan di dalam x di sini? Ox123. Ox123. Dan Ox itu tidak menarik. Ia hanya bermakna di sini adalah nombor perenambelasan. Tetapi apa yang penting ialah apa yang saya telah menyimpan x, yang adalah pembolehubah tempatan. Tetapi jenis data, sekali lagi, adalah alamat int an. Well, saya akan menyimpan Ox123. Tetapi sekali lagi, jika itu terlalu tidak perlu rumit, jika saya menatal belakang, kita boleh abstrak ini jauh agak munasabah dan hanya mengatakan bahawa x ialah penunjuk kepada yang sebahagian memori. OK. Sekarang soalan di tangan adalah seperti berikut - line 21, ternyata, adalah kereta. Mengapa? Maaf? Ia tidak mempunyai - mengatakan bahawa sekali lagi. Well, ia tidak percuma. Jadi itulah kedua tetapi. Jadi ada satu sama lain tetapi khusus di talian 21. Tepat sekali. Ini sejajar mudah kod hanya buffer overflow, yang ditakluki buffer. Penampan A hanya bermakna sebahagian memori. Tetapi itu sebahagian memori adalah saiz 10, 10 integer, yang bermakna jika kita indeks ke dalamnya menggunakan gula sintaktik notasi pelbagai, dataran kurungan, anda mempunyai akses kepada x kurungan 0 x kurungan 1 x, kurungan dot, dot, dot. x kurungan 9 adalah yang terbesar. Jadi, jika saya x kurungan 10, di mana Saya sebenarnya akan dalam ingatan? Nah, jika saya mempunyai 10 int - mari kita benar-benar menarik semua daripada keluar ini di sini. Jadi itu adalah lima pertama. Berikut adalah lima yang lain Ints. Jadi x kurungan 0 di sini. x kurungan 1 adalah di sini. x kurungan 9 di sini. x kurungan 10 adalah di sini, yang bermakna saya memberitahu, di line 21, komputer untuk meletakkan beberapa di mana? Nombor 0 di mana? Nah, ia adalah 0, ya. Tetapi hakikat bahawa 0 yang adalah jenis kebetulan. Ia boleh menjadi nombor 50, untuk semua yang kita peduli. Tetapi kita cuba untuk meletakkan ia di x kurungan 10, yang mana ini tanda tanya diambil, yang bukan satu perkara yang baik. Program ini mungkin sangat baik kemalangan akibat. Sekarang, mari kita pergi ke hadapan dan lihat jika ini adalah, sesungguhnya, apa yang berlaku. Buat ingatan, kerana fail dipanggil memory.c. Mari kita pergi ke hadapan dan menjalankan memori program. Oleh itu, kita bernasib baik, sebenarnya, ia seolah-olah. Kami bernasib baik. Tetapi mari kita lihat jika kita kini dikendalikan Valgrind. Pada pandangan pertama, program saya mungkin seolah-olah menjadi sempurna betul. Tetapi biarlah saya berjalan Valgrind dengan - Bocor cek sama penuh pada ingatan. Dan sekarang apabila saya berjalan ini - menarik. Tidak sah menulis saiz 4 pada line 21 memory.c. Line 21 memory.c yang mana satu? Oh, menarik. Tetapi tunggu. Saiz 4, apakah yang merujuk kepada? Saya hanya tidak salah menulis, tetapi ia adalah saiz 4. Mengapa 4? Ini kerana ia merupakan int, yang , sekali lagi, empat bait. Jadi Valgrind terdapat bug yang saya, sambil mengerling ke arah kod saya, tidak. Dan mungkin TF anda akan atau tidak. Tetapi apa yang Valgrind pasti mendapati bahawa kita telah membuat kesilapan di sana, walaupun walaupun kita bernasib baik, dan komputer memutuskan, eh, saya tidak akan kemalangan hanya kerana anda menyentuh satu bait, satu bernilai int ini memori yang anda tidak sebenarnya sendiri. Nah, apa lagi yang kereta di sini. Alamat - ini adalah alamat yang gila cari dalam perenambelasan. Itu hanya bermakna suatu tempat di timbunan itu sifar bait selepas blok saiz 40 diperuntukkan. Biar saya zum di sini dan lihat jika ini adalah sedikit lebih membantu. Menarik. 40 bytes pasti hilang kehilangan rekod 1 daripada 1. Sekali lagi, banyak kata-kata daripada yang berguna di sini. Tetapi berdasarkan garis diserlahkan, di mana perlu saya mungkin memberi tumpuan saya perhatian untuk bug yang lain? Kelihatan seperti line 20 daripada memory.c. Jadi, jika kita kembali ke garisan 20, itulah salah satu yang anda pasti lebih awal. Dan ia tidak semestinya kereta. Tetapi kita ini berubah kesannya. Jadi bagaimana saya boleh membetulkan sekurang-kurangnya salah satu kesilapan? Apa yang saya boleh lakukan selepas line 21? Saya boleh lakukan bebas daripada x, begitu juga untuk memberi kembali memori itu. Dan bagaimana saya boleh membaiki bug ini? Saya pasti akan pergi tidak jauh daripada 0. Jadi biarlah saya cuba lari semula ini. Maaf, pasti pergi tidak jauh daripada 9. Buat ingatan. Izinkan saya jalankan Valgrind dalam tetingkap yang lebih besar. Dan kini melihat. Nice. Semua blok timbunan telah dibebaskan. Tiada kebocoran yang mungkin. Dan sehingga di atas di sini, tidak ada menyebut apa-apa lagi hak yang sah. Hanya untuk mendapatkan tamak, dan mari melihat jika demonstrasi lain tidak pergi seperti yang dirancang - Saya bernasib baik masa lalu. Dan hakikat bahawa ini adalah 0 mungkin tidak perlu mengelirukan. Mari kita hanya melakukan 50, yang agak sewenang-wenangnya nombor, membuat dot slash memori memori - masih mendapat bertuah. Tiada apa-apa yang terhempas. Katakan saya hanya melakukan sesuatu yang benar-benar bodoh, dan saya 100. Biar saya membentuk semula ingatan, dot slash memori - bernasib baik lagi. Bagaimana kira-kira 1,000? Ints luar, kira-kira, di mana saya perlu? Buat ingatan - sialan. [Ketawa] OK. Mari kita tidak kucar-kacir di sekeliling lagi. Memutarkan ingatan. Ada kita pergi. Baiklah. Jadi nampaknya anda indeks 100,000 Ints di luar di mana anda perlu telah ingatan, perkara-perkara buruk berlaku. Jadi ini adalah jelas tidak a, kaedah cepat keras. Saya adalah jenis menggunakan percubaan dan kesilapan untuk sampai ke sana. Tetapi ini adalah kerana, cerita panjang pendek, memori komputer anda juga dibahagikan ke dalam perkara-perkara yang dipanggil segmen. Dan kadang-kadang, komputer sebenarnya telah memberikan anda memori yang lebih sedikit daripada apa yang anda meminta. Tetapi bagi kecekapan, ia hanya lebih mudah untuk mendapatkan memori yang lebih tetapi hanya memberitahu anda bahawa anda mendapat sebahagian daripada itu. Dan jika anda bernasib baik kadang-kadang, oleh itu, anda mungkin boleh menyentuh memori yang bukan milik anda. Anda tidak mempunyai jaminan bahawa apa nilai anda diletakkan di sana akan tinggal di sana, kerana komputer masih berpendapat ia bukan anda, tetapi ia tidak semestinya akan untuk mencapai satu lagi segmen memori dalam komputer dan menyebabkan kesilapan seperti yang satu ini di sini. Baiklah. Mana-mana soalan-soalan maka pada ingatan? Baiklah. Mari kita lihat di sini, maka, pada sesuatu yang kita telah mengambil untuk diberikan untuk tempoh yang agak lama, yang adalah dalam fail ini dipanggil cs50.h. Jadi ini adalah fail. Ini hanya sejumlah komen ke atas. Dan anda mungkin telah melihat ini jika anda mencucuk seluruh perkakas. Tetapi ternyata bahawa sepanjang masa, apabila kita digunakan untuk menggunakan tali sebagai sinonim, cara-cara yang kita diisytiharkan yang sinonim adalah dengan ini kata kunci typedef, untuk definisi jenis. Dan kami pada dasarnya berkata, membuat rentetan sinonim untuk bintang char. Itulah cara dengan mana timbunan dicipta ini roda latihan yang dikenali sebagai tali. Sekarang di sini hanya prototaip untuk getchar. Kita mungkin telah melihat sebelum ini, tetapi itu sesungguhnya apa yang ia. getchar tidak mengambil hujah-hujah, mengembalikan char. getdouble tidak mengambil hujah-hujah, mengembalikan dua kali. getfloat tidak mengambil hujah-hujah, pulangan yang terapung, dan sebagainya. getint adalah di sini. getlonglong adalah di sini. Dan getstring adalah di sini. Dan itu sahaja. Ini sejajar ungu adalah prapemproses lain arahan kerana hashtag pada awal itu. Baiklah. Jadi sekarang biarlah saya pergi ke cs50.c. Dan kita tidak akan bercakap terlalu lama mengenai perkara ini. Tetapi untuk memberi anda gambaran tentang apa yang telah berlaku semua ini masa, izinkan saya pergi ke - mari kita buat getchar. Jadi getchar kebanyakannya komen. Tetapi ia kelihatan seperti ini. Jadi ini adalah fungsi sebenar getchar yang kita telah mengambil untuk diberikan wujud. Dan walaupun kita tidak menggunakan satu ini yang sering, jika pernah, ia sekurang-kurangnya agak mudah. Jadi ia adalah bernilai mengambil melihat cepat di sini. Jadi getchar mempunyai gelung tak terhingga, sengaja jadi nampaknya. Ia kemudian memanggil - dan ini adalah jenis semula nice kod kita sendiri menulis. Ia memerlukan getstring. Kerana apa yang ia bermakna untuk mendapatkan char? Nah, anda mungkin juga cuba untuk mendapatkan garis keseluruhan teks daripada pengguna dan kemudian hanya melihat satu mereka watak-watak. Selaras 60, di sini adalah sedikit sedikit cek kewarasan. Jika getstring kembali batal, jangan teruskan. Sesuatu telah berlaku. Sekarang ini adalah agak menjengkelkan tetapi konvensional C. char max mungkin mewakili apa sahaja berdasarkan namanya? Ia adalah satu yang berterusan. Ia seperti nilai angka yang terbesar char anda boleh mewakili dengan satu gigitan, yang mungkin bilangan 255, yang merupakan bilangan terbesar anda mewakili lapan bit, bermula dari sifar. Jadi saya telah menggunakan ini, dalam fungsi ini, apabila menulis kod ini, hanya kerana jika ada masalah dalam getchar tetapi tujuan dalam hidup adalah untuk mengembalikan char, anda perlu entah bagaimana dapat untuk memberi isyarat kepada pengguna yang sesuatu yang tidak kena. Kita tidak boleh kembali null. Ia ternyata bahawa batal adalah penunjuk. Dan sekali lagi, getchar mempunyai untuk mengembalikan char. Jadi konvensyen itu, jika ada salah, adalah anda, programmer, atau dalam kes ini, saya dengan perpustakaan, saya terpaksa yang hanya membuat keputusan sewenang-wenangnya, jika ada masalah, saya akan kembali nombor 255, yang benar-benar bermakna kita boleh tidak, pengguna tidak boleh menaip watak yang diwakili oleh nombor 255 kerana kita mempunyai mencuri sebagai nilai pengawal yang dipanggil untuk mewakili satu masalah. Kini ia ternyata bahawa watak 255 bukan sesuatu yang anda boleh menaip pada keyboard anda, jadi ia tiada masalah besar. Pengguna tidak menyedari bahawa Saya telah dicuri watak ini. Tetapi jika anda pernah melihat di muka surat lelaki pada sistem komputer beberapa rujukan kepada semua topi yang berterusan seperti ini yang berkata, dalam kes-kes kesilapan kekuatan ini berterusan dikembalikan, itu beberapa manusia tidak tahun lalu telah sewenang-wenangnya membuat keputusan untuk kembali nilai ini khas dan memanggilnya yang berterusan dalam kes sesuatu berlaku. Sekarang keajaiban berlaku di sini. Pertama, saya mengisytiharkan di talian 67 dua watak, C1 dan C2. Dan kemudian dalam talian 68, ada sebenarnya garis kod itu mengingatkan kawan kita printf, memandangkan ia tidak mempunyai peratus Cs dalam petikan. Tetapi melihat apa yang berlaku di sini. sscanf bermakna imbasan rentetan - bermakna mengimbas format tali, sscanf ergo. Apa maksudnya? Ia bermakna anda lulus untuk sscanf rentetan. Dan garis adalah apa sahaja jenis pengguna masuk Anda berpindah kepada sscanf rentetan format seperti ini yang memberitahu scanf apakah anda berharap pengguna telah ditaip masuk Anda kemudian lulus dalam alamat dua ketulan ingatan, dalam kes ini, kerana saya mempunyai dua ruang letak. Jadi, saya akan memberikan alamat C1 dan alamat C2. Dan ingat bahawa anda memberi fungsi yang alamat beberapa berubah-ubah, apa yang implikasi? Apa yang boleh melakukan fungsi yang hasilnya daripada memberikan alamat yang berubah-ubah, yang bertentangan dengan berubah-ubah itu sendiri? Ia boleh mengubahnya, betul? Jika anda mempunyai seseorang peta untuk fizikal alamat, mereka boleh pergi ke sana dan melakukan apa sahaja yang mereka mahu di alamat itu. Idea yang sama di sini. Jika kita lulus untuk sscanf, alamat dua ketulan ingatan, walaupun ini kecil ketulan sedikit memori, C1 dan C2, tetapi kita beritahu alamat mereka, sscanf boleh mengubahnya. Jadi tujuan sscanf dalam kehidupan, jika kita membaca halaman lelaki itu, adalah untuk membaca apa yang pengguna ditaip dalam, berharap untuk pengguna yang mempunyai ditaip dalam watak dan mungkin watak lain, dan apa yang turun ditaip, watak pertama pergi di sini, watak kedua pergi di sini. Kini, sebagai diketepikan, ini, dan anda akan hanya tahu ini daripada dokumentasi, hakikat bahawa saya meletakkan ruang kosong terdapat hanya bermaksud bahawa saya tidak peduli jika pengguna hits bar Space beberapa kali sebelum dia mengambil watak, saya akan mengabaikan mana-mana ruang putih. Jadi, saya tahu dari dokumentasi. Hakikat bahawa terdapat% c kedua diikuti dengan ruang putih sebenarnya sengaja. Saya mahu dapat mengesan jika pengguna diskru atau tidak bekerjasama. Jadi saya berharap bahawa pengguna hanya ditaip dalam satu watak, oleh itu saya berharap sscanf yang hanya akan kembali nilai 1 kerana, sekali lagi, jika saya membaca dokumentasi, tujuan sscanf dalam hidup adalah untuk kembali kepada bilangan pembolehubah yang telah diisi dengan input pengguna. Saya lulus dalam dua pembolehubah alamat, C1 dan C2. Saya berharap, walaupun, bahawa hanya satu daripada mereka mendapat dibunuh kerana jika sscanf pulangan 2, apa yang mungkin implikasi logik? Bahawa pengguna tidak hanya memberi saya satu watak seperti saya memberitahu dia atau dia. Mereka mungkin ditaip pada kurangnya dua watak-watak. Jadi jika saya bukannya tidak mempunyai kedua % C, saya hanya mempunyai satu, yang terus terang akan lebih intuitif pendekatan, saya fikir pandangan pertama, anda tidak akan dapat mengesan jika pengguna telah memberikan anda lebih input daripada anda benar-benar mahu. Jadi ini adalah satu bentuk tersirat daripada pemeriksaan kesilapan. Tetapi melihat apa yang saya lakukan di sini. Setelah saya yakin bahawa pengguna memberikan aku satu watak, saya membebaskan baris, melakukan bertentangan dengan getstring, yang seterusnya menggunakan malloc, dan kemudian saya kembali C1, watak yang saya berharap pengguna yang disediakan dan hanya disediakan. Jadi cepat celah sahaja, tetapi sebarang pertanyaan mengenai getchar? Kita akan kembali kepada beberapa orang lain. Baiklah, biar saya pergi ke hadapan dan melakukan ini - rasa sekarang, hanya untuk memberi motivasi kepada kami perbincangan dalam seminggu dengan masa, ini adalah fail yang dipanggil structs.h. Dan sekali lagi, ini adalah hanya rasa sesuatu yang menanti. Tetapi notis bahawa banyak ini adalah komen. Jadi biarlah saya hanya menyerlahkan bahagian yang menarik buat masa sekarang. typedef - ada kata kunci yang sama sekali lagi. typedef kita gunakan untuk mengisytiharkan tali sebagai jenis data khas. Anda boleh menggunakan typedef untuk mewujudkan jenama baru jenis data yang tidak wujud apabila C dicipta. Sebagai contoh, int datang dengan C. char datang dengan C. dua datang dengan C. Tetapi tidak ada tanggapan pelajar. Dan lagi ia akan menjadi agak berguna untuk dapat menulis satu program yang menyimpan dalam pembolehubah, nombor ID pelajar, nama mereka, dan rumah mereka. Dalam erti kata lain, tiga keping data, seperti yang int dan tali dan tali yang lain. Dengan typedef, apa yang cukup kuat tentang perkara ini dan sturct kata kunci untuk struktur, anda, pengaturcara pada tahun 2013, sebenarnya boleh menentukan sendiri anda jenis data yang tidak wujud tahun lalu tetapi yang sesuai dengan tujuan anda. Dan sebagainya di sini, dalam barisan 13 hingga 19, kami mengisytiharkan jenis data baru, seperti an int, tetapi ia memanggil pelajar. Dan dalam pembolehubah ini akan ada tiga perkara - an int, tali, dan rentetan. Jadi, anda boleh berfikir tentang apa yang benar-benar berlaku di sini, walaupun ini adalah satu sedikit memudahkan untuk hari ini, pelajar pada asasnya akan untuk kelihatan seperti ini. Yang akan menjadi sebahagian daripada memori dengan ID, nama bidang dan bidang rumah. Dan kita akan dapat menggunakan mereka ketulan memori dan akses mereka seperti berikut. Jika saya pergi ke struct0.c, di sini adalah agak lama, tetapi selepas corak, kod yang menggunakan helah baru ini. Jadi pertama, izinkan saya menarik perhatian anda ke bahagian-bahagian yang menarik sehingga atas. Sharp mentakrifkan pelajar 3, mengisytiharkan berterusan dipanggil pelajar dan penerima serah hak ia sewenang-wenangnya nombor 3, hanya jadi saya mempunyai tiga pelajar yang menggunakan program ini buat masa ini. Di sini datang Utama. Dan notis, bagaimana saya mengaku pelbagai pelajar? Well, saya hanya menggunakan sintaks yang sama. Pelajar perkataan jelas baru. Tetapi pelajar, kelas, pelajar kurungan. Lebih malang lagi ada banyak penggunaan semula syarat-syarat di sini. Ini hanya nombor. Jadi ini adalah seperti mengatakan tiga. Kelas hanya apa yang saya mahu untuk memanggil pembolehubah. Saya boleh memanggilnya pelajar. Tetapi kelas, ini bukan kelas dalam berorientasikan objek jenis Java cara. Ia hanya satu kelas pelajar. Dan jenis data bagi setiap elemen dalam barisan yang pelajar. Jadi, ini adalah sedikit berbeza dan dari berkata sesuatu seperti ini, ia hanya - Saya katakan memberi saya tiga pelajar dan memanggil kelas array. Baiklah. Sekarang di sini adalah empat gelung. Biasa ini lelaki ini - Itekadar dari sifar pada sehingga tiga. Dan di sini adalah sekeping baru sintaksis. Program ini akan mendorong saya, manusia, untuk memberikan pelajar ID, yang int an. Dan di sini adalah sintaks yang anda boleh menyimpan sesuatu dalam bidang ID di lokasi kelas kurungan I. Jadi sintaks ini bukanlah sesuatu yang baru. Ini hanya bermaksud memberi saya kelapan pelajar di dalam kelas. Tetapi simbol ini adalah baru. Sehingga kini, kita masih tidak boleh digunakan dot, sekurang-kurangnya dalam kod seperti ini. Ini bermakna pergi ke struct yang dikenali sebagai seorang pelajar dan meletakkan sesuatu di sana. Begitu juga, di dalam bidang ini akan datang, 31, pergi hadapan dan meletakkan apa sahaja jenis pengguna nama di sini dan apa yang mereka lakukan untuk rumah, perkara yang sama, pergi ke hadapan dan memasukkannya ke dalam. rumah. Jadi apakah program ini akhirnya lakukan? Anda boleh melihat penggoda sedikit di sana. Biar saya pergi ke hadapan dan jangan membuat structs 0 dot slash struct 0, ID pelajar 1, mengatakan David Mather, pelajar ID 2. Rob Kirkland, pelajar ID 3. Lauren Leverit - dan satu-satunya program ini lakukan, yang hanya benar-benar sewenang-wenangnya, adalah Saya mahu melakukan sesuatu dengan data ini, sekarang bahawa saya telah mengajar kita bagaimana untuk menggunakan structs, adalah Saya hanya mempunyai gelung tambahan ini di sini. Saya melelar atas pelbagai pelajar. Saya pernah, kawan mungkin kini biasa kita, rentetan membandingkan, stircomp untuk cek rumah pelajar ke-8 ini sama dengan Mather? Dan jika demikian, hanya mencetak sesuatu sewenang-wenangnya suka, ya, ia adalah. Tetapi sekali lagi, hanya memberi saya peluang untuk digunakan dan mengguna semula dan semula notasi titik baru ini. Jadi siapa yang peduli, betul? Datang dengan program pelajar agak sewenang-wenangnya, tetapi ternyata bahawa kita boleh melakukan perkara-perkara yang berguna dengan ini, sebagai contoh seperti berikut. Ini adalah struct yang lebih rumit di C. Ia mempunyai sedozen atau lebih bidang, agak cryptically dinamakan. Tetapi jika anda pernah mendengar tentang grafik format fail dipanggil bitmap, BMP, ia ternyata bahawa format fail bitmap cukup banyak kelihatan seperti ini. Ia adalah satu Smiley sedikit muka bodoh. Ia adalah satu imej kecil yang saya telah dizum dalam pada yang agak besar supaya saya dapat melihat setiap daripada titik individu atau piksel. Kini, ternyata kita boleh mewakili titik hitam dengan, katakan, nombor 0. Dan titik putih dengan nombor 1. Jadi, dalam erti kata lain, jika anda mahu untuk menarik Muka senyum dan menyelamatkan bahawa imej dalam komputer, ia mencukupi untuk menyimpan sifar dan orang-orang yang kelihatan seperti ini, di mana, sekali lagi, orang-orang yang putih dan sifar adalah hitam. Dan bersama-sama, jika anda berkesan mempunyai yang menyandang orang yang dan sifar, anda mempunyai grid piksel, dan jika anda meletakkan mereka keluar, anda mempunyai yang comel sedikit Smiley muka. Sekarang, format fail bitmap, BMP, adalah berkesan bahawa di bawah hud, tetapi dengan lebih banyak piksel pemabuk yang anda sebenarnya boleh mewakili warna. Tetapi apabila anda mempunyai yang lebih canggih format fail seperti BMP dan JPEG dan GIF yang anda mungkin biasa, orang-orang fail pada cakera biasanya tidak hanya mempunyai sifar dan orang-orang untuk piksel, tetapi mereka mempunyai beberapa metadata juga - meta dalam erti kata bahawa tidak benar-benar data tetapi ia berguna untuk mempunyai. Jadi bidang ini di sini membayangkan, dan kita akan melihat perkara ini dengan lebih terperinci dalam P-set 5, yang sebelum sifar dan orang-orang yang mewakili piksel dalam imej, ada sekumpulan metadata seperti saiz imej dan lebar imej. Dan notis Saya memetik daripada beberapa perkara sewenang-wenangnya di sini - lebar dan tinggi. Kiraan sedikit dan beberapa perkara lain. Jadi ada beberapa metadata dalam fail. Tetapi dengan memahami bagaimana fail dibentangkan keluar dengan cara ini, anda boleh sebenarnya kemudian memanipulasi imej, pulih imej dari cakera, mengubah saiz imej. Tetapi anda tidak boleh semestinya meningkatkan mereka. Saya memerlukan gambar. Jadi saya kembali ke RJ sini, yang anda lihat pada skrin yang agak sedikit masa lalu. Dan jika saya membuka Ucapan di sini, ini adalah apa yang berlaku jika anda cuba untuk mengezum masuk dan meningkatkan RJ. Dia tidak mendapat apa-apa lebih baik benar-benar. Sekarang Ucapan adalah jenis kabur ia sedikit, hanya untuk menyembunyikan yang Hakikat bahawa RJ tidak mendapat terutamanya dipertingkatkan apabila anda zum masuk Dan jika melakukannya dengan cara ini, melihat dataran? Ya, anda pasti dapat melihat dataran di projektor. Itulah apa yang anda dapat apabila anda meningkatkan. Tetapi dalam memahami bagaimana RJ kami atau Muka senyum dilaksanakan membenarkan kami sebenarnya menulis kod yang memanipulasi perkara-perkara ini. Dan saya fikir saya akan berakhir pada nota ini, dengan 55 saat yang meningkatkan itu, Saya berani, berkata agak mengelirukan. [MAIN SEMULA VIDEO] -Dia berbohong. Mengenai apa, saya tidak tahu. -Jadi apa yang kita tahu? -Itu pada 9:15 Ray Santoya berada di ATM. -Jadi persoalannya ialah apa telah dia lakukan pada 9:16? Menembak-sembilan milimeter pada sesuatu. Mungkin dia melihat sniper. -Atau telah bekerjasama dengan beliau. -Tunggu. Kembali satu. -Apa yang anda nampak? -Bawa mukanya ke atas, skrin penuh. -Nya kaca mata. -Ada satu pantulan. -Itulah pasukan besbol Neuvitas. Itulah logo mereka. -Dan dia bercakap kepada sesiapa yang memakai jaket itu. [AKHIR VIDEO MAIN SEMULA] DAVID J. MALAN: Ini akan menjadi Set Masalah 5. Kami akan melihat anda minggu depan. SPEAKER LELAKI: Pada CS50 seterusnya. [Cengkerik kicauan] [Bermain muzik]