>> [MUSIC PLAYING]
>> DAVID J. Malan: Baiklah.
>> [Tertawa]
>> Selamat datang kembali.
Ini adalah CS50.
Dan ini akhir minggu lima.
Dan sampai sekarang, kami telah cukup banyak telah mengambil begitu saja bahwa ada
ada compiler ini, dentang, bahwa Anda telah telah memohon dengan cara ini
alat lain yang disebut Membuat entah bagaimana ajaib mengkonversi kode sumber Anda
ke dalam kode objek, nol dan satu bahwa CPU komputer Anda, central
processing unit, benar-benar mengerti.
Tapi ternyata ada sejumlah yang terjadi di bawah tenda di
antara input dan output.
>> Dan saya ingin mengusulkan agar kita daging bahwa dalam sedikit lebih detail ke
empat langkah, memiliki sesuatu yang disebut pra-pengolahan, sesuatu
disebut kompilasi, yang telah kita lihat, sesuatu yang disebut perakitan, dan
sesuatu yang disebut menghubungkan.
Jadi sampai sekarang, di beberapa kami program, kami sudah tajam termasuk.
Baru-baru ini kami telah memiliki beberapa tajam mendefinisikan untuk konstanta.
Jadi ternyata bahwa hal-hal yang diawali dengan simbol hash atau
simbol pound adalah pra-prosesor arahan.
Itu hanya cara mewah untuk mengatakan itu baris kode yang sebenarnya
diubah menjadi sesuatu yang lain sebelum komputer bahkan mencoba untuk mengubah Anda
program ke nol dan satu.
>> Misalnya, tajam mencakup standar I / O. H, cukup banyak hanya berarti pergi
depan, ambil isi dari file stdio.h dan paste di sana.
Jadi tidak ada nol dan satu pada saat itu belum.
Ini benar-benar hanya substitusi.
Dan itu dilakukan selama apa yang disebut tahap pra-pengolahan, ketika Anda
benar-benar menjalankan dentang atau khusus Membuat dalam banyak kasus.
Jadi semua ini telah terjadi pertama secara otomatis sejauh ini.
>> Kemudian datang langkah kompilasi.
Tapi kami sudah disederhanakan kompilasi.
Menyusun program benar-benar berarti untuk mengambilnya dari sesuatu seperti C,
kode sumber kami telah menulis, turun sesuatu yang disebut perakitan.
Bahasa assembly adalah tingkat yang lebih rendah bahasa yang, untungnya, kita tidak akan
memiliki banyak kesempatan untuk menulis semester ini.
Tapi itu di tingkat terendah dalam arti bahwa Anda benar-benar mulai menulis
menambah dan mengurangi dan berkembang biak dan beban dari memori dan menyimpan ke memori,
petunjuk yang sangat dasar yang komputer, bawah kap mesin,
benar-benar mengerti.
>> Terakhir, perakitan membutuhkan bahasa yang ke nol dan satu bahwa kita telah
menggambarkan sejauh ini.
Dan benar-benar terakhir, ada yang disebut menghubungkan fase, yang kita akan
melihat hanya sesaat, yang menggabungkan nol dan yang dengan nol dan
yang orang lain sebelum telah Anda buat.
>> Jadi mempertimbangkan program super sederhana.
Itu dari Minggu 1.
Itu hanya mengatakan, Hello World, di layar.
Kami berlari ini melalui dentang.
Atau kita berlari melalui Membuat yang berlari dentang.
Dan dikeluarkan pada saat mana beberapa angka satu dan nol.
Tapi ternyata ada langkah menengah.
Jika saya pergi ke sini - oops, tidak ingin melihat dia belum.
Jika saya pergi ke sini untuk alat saya dan saya membuka hello.c, di sini
adalah bahwa program yang sama.
Dan apa yang akan saya lakukan di terminal saya window sini aku akan
menjalankan dentang daripada Membuat, yang mengotomatiskan keempat
langkah-langkah bagi kita.
Dan aku akan melakukan dentang-S dan kemudian hello.c dan kemudian masukkan.
>> Dan saya mendapatkan prompt berkedip lagi, yang baik.
Dan sekarang di jendela sedikit lebih besar, Aku akan membuka gedit di sini.
Dan aku akan membuka file itu, Ternyata, disebut hello.s ini
berisi bahwa bahasa assembly Saya sebut sebelumnya.
Dan ini adalah apa yang disebut perakitan bahasa, tingkat yang cukup rendah
petunjuk bahwa CPU Intel Anda atau apa pun yang ada di dalam
mengerti.
Dan mov adalah untuk bergerak. panggilan untuk memanggil, fungsi tingkat yang sangat rendah.
sub adalah untuk kurangi.
>> Jadi, ketika Anda memiliki CPU tertentu dalam komputer Anda, apa yang membuatnya
berbeda, dibandingkan lainnya CPU pada pasar, yang mana instruksi itu
mengerti dan sering seberapa efisien adalah, seberapa cepat itu di mengeksekusi beberapa
dari instruksi tersebut.
Sekarang untuk lebih lanjut tentang ini, Anda dapat mengambil selanjutnya CS61 Jatuh di kampus.
Tapi di sini kita miliki, misalnya, beberapa pengidentifikasi yang mungkin tampak akrab.
hello.c adalah nama program.
>> . Teks -
tidak ada banyak yang menarik di sana sekarang, mengingat bahwa teks
segmen, pada Senin, di mana di memori program anda benar-benar berakhir.
Jadi itulah setidaknya samar-samar akrab ada.
Di sini, tentu saja, adalah menyebutkan fungsi utama kami.
Bergulir ke bawah, ini mengacu pada hal-hal disebut register, potongan yang sangat kecil
dalam memori CPU Anda yang sebenarnya.
Dan jika saya gulir ke bawah bahkan lebih lanjut, saya melihat beberapa jenis
menyebutkan tidak langsung ASCII.
Dan, memang, adalah string, halo, koma, dunia.
>> Jadi cerita panjang pendek, ini telah terjadi untuk Anda, secara otomatis,
bawah tenda sepanjang waktu ini.
Dan apa yang terjadi benar-benar sekali Anda menjalankan dentang, atau dengan cara
Membuat, Anda mendapatkan pertama, dari kode sumber,
disebut bahasa assembly.
Kemudian dentang adalah mengkonversi perakitan ini bahasa ke angka satu dan nol.
Dan ini adalah slide yang kami mulai diskusi kita dalam Minggu 0 pada -
dan kemudian pada Minggu 1.
Dan akhirnya, mereka nol dan satu digabungkan dengan nol dan satu
dari orang-orang perpustakaan kami telah mengambil untuk diberikan seperti Standard I / O atau
String Perpustakaan atau bahkan yang CS50 perpustakaan.
>> Jadi untuk melukis gambar ini lebih visual, kita memiliki hello.c.
Dan, tentu saja, menggunakan printf berfungsi untuk mengatakan, hello world.
Kompilasi langkah membawanya ke file kita hanya melihat hello.s, bahkan
meskipun itu biasanya dihapus secara otomatis untuk Anda.
Tapi itu kode assembly pada langkah tengah.
Dan kemudian ketika kita merakit perakitan bahasa, sehingga untuk berbicara, saat itulah Anda
mendapatkan orang-nol dan satu.
Jadi kita sudah diperbesar efektif hari ini apa yang kita telah mengambil untuk diberikan,
berarti akan kode sumber keberatan kode.
>> Tapi akhirnya, sekarang gambar yang sama - mari kita mendorong itu ke
sisi kiri.
Dan perhatikan bahwa di atas ada Saya sebutkan stdio.h.
Itu file yang kami menyertakan di hampir semua
program yang kami telah menulis.
Dan itu file yang isinya mendapatkan copy paste,
efektif atas kode Anda.
Tapi ternyata bahwa, pada komputer sistem di suatu tempat, ada yang mungkin
File stdio.c bahwa seseorang menulis tahun lalu yang menerapkan semua
fungsi yang dinyatakan di stdio.h.
>> Sekarang dalam kenyataannya itu mungkin bukan pada Mac atau PC Anda atau bahkan di
CS50 alat adalah kode C mentah.
Seseorang sudah dikompilasi dan termasuk . O file untuk kode obyek atau. A
File, yang mengacu pada shared library yang telah pra-instal dan
pre-compiled untuk Anda.
Tapi anggaplah bahwa memang ada pada stdio.c komputer kita secara paralel
dengan dentang.
Kode Anda sedang dikompilasi dan dirakit.
kode stdio.c 's sedang disusun dan dirakit, sehingga ini yang terakhir
langkah, di sini, kita harus entah bagaimana link, sehingga untuk berbicara, nol dan yang
dengan nya nol dan satu menjadi satu program sederhana yang pada akhirnya adalah
disebut hanya Hello.
>> Jadi itulah semua keajaiban itu telah terjadi sejauh ini.
Dan akan terus mengambil ini proses untuk diberikan, tetapi menyadari
ada banyak juicy rincian terjadi di bawah sana.
Dan ini adalah apa yang membuat Anda komputer dengan Intel dalam
khususnya yang berbeda.
>> Jadi pada catatan itu, jika Anda ingin bergabung dengan kami untuk makan siang hari Jumat ini, pergi
ke tempat biasa cs50.net/rsvp, 13:15 Jumat ini.
Dan sekarang beberapa pengumuman.
Jadi kita punya kabar baik.
Dan kami memiliki beberapa berita buruk.
Mulailah dengan beberapa kabar baik di sini.
>> [Mengerang]
>> Baik.
Yah, secara teknis liburan, sehingga itu tidak begitu banyak hadiah dari kami.
Tapi kemudian kabar buruk tentu saja.
>> [Mengerang]
>> Aku menghabiskan banyak waktu pada animasi ini.
>> [Tertawa]
>> Akan ada sesi review ini hari Senin mendatang.
Ini akan berada di 5:30 PM.
Kami akan mengingatkan Anda tentang semua rincian ini melalui email di lapangan itu
situs hanya dalam beberapa waktu hari.
Ini akan difilmkan dan tersedia segera sesudahnya.
Jadi, jika Anda tidak dapat membuat hari Senin Slot malam, jangan khawatir.
Bagian ini minggu mendatang juga akan fokus pada ulasan untuk kuis.
Jika bagian Anda pada hari Senin, yang merupakan memang liburan universitas, kita akan
masih bertemu dalam bagian.
Jika Anda tidak bisa membuat Bagian karena Anda akan
pergi, itu bagus.
Menghadiri hari Minggu atau Selasa bagian atau tune-in ke bagian Jason, yang
tersedia secara online.
>> Jadi, berita buruk.
Jadi menurut silabus, kita memiliki kuliah Jumat depan.
Tetapi kabar baiknya -
jelas, aku menghabiskan terlalu banyak waktu untuk hal ini.
>> [Tertawa]
>> Kami akan membatalkan ceramah Jumat berikutnya.
Sehingga akan menjadi hadiah bagi kami, sehingga Anda benar-benar dapat memiliki jeda bagus di
antara minggu ini dan dua minggu kemudian.
Jadi tidak ada kuliah minggu depan, hanya kecil sedikit kuis, yang Anda harus
semakin semakin bersemangat.
>> Sekarang, mari kita mengalihkan perhatian kita untuk sesuatu yang memang lebih visual
dan lebih menarik dan untuk mengatur panggung untuk apa yang akan berada di cakrawala
hanya dalam beberapa minggu waktu.
Setelah kuis pertama, kita akan mengubah fokus set masalah kita yang lain
masalah khusus domain, yaitu forensik atau keamanan yang lebih umum.
>> Bahkan, tradisi dengan masalah ini set bagi saya salah satu
mengajar sesama atau CA untuk berjalan di seberang kampus mengambil beberapa foto
diidentifikasi tetapi non orang yang jelas, tempat, atau hal-hal, maka setiap tahun saya
entah bagaimana berhasil sengaja menghapus atau merusak kartu media digital
yang ada di dalam kamera kami.
Tapi tidak ada masalah besar.
Aku bisa pergi ke depan dan pasang yang ke komputer saya.
Aku bisa membuat gambar forensik, jadi untuk berbicara, dengan menyalin nol dan
yang off dari kartu memori, apakah kartu SD atau kartu compact flash atau
apa pun yang Anda kenal.
Dan kemudian kita bisa menyerahkan itu keluar.
>> Dan sehingga tantangan ke depan, antara lain hal untuk Anda, akan menulis
Kode C yang pulih sejumlah besar JPEG untuk saya dan mengungkapkan akan
orang-orang, tempat, atau hal-hal.
Dan kita juga akan bicara, dalam masalah ini menetapkan dan di masa yang akan datang, sekitar
grafis yang lebih umum.
Kami telah menggunakan mereka, tentu saja, untuk keluar.
Tapi kau semacam diambil untuk diberikan terdapat konsep-konsep tingkat tinggi
persegi panjang dan oval.
Tetapi di bawah tenda ada piksel.
Dan Anda harus memulai berpikir tentang mereka.
Atau Anda akan untuk p-set 4 harus berpikir tentang kesenjangan antara batu bata, bagaimana
cepat Anda bola bergerak di layar untuk keluar.
Jadi ada gagasan dari titik pada layar Anda yang
ikut bermain sudah.
>> Sekarang apa yang Anda lihat, meskipun, adalah apa Anda mendapatkan pada layar komputer.
Jika Anda pernah melihat beberapa baik atau TV yang buruk, kemungkinan besar mereka cukup banyak
memperlakukan penonton seperti technophobes yang tidak benar-benar
tahu banyak tentang komputasi.
Dan sehingga sangat mudah bagi polisi detektif mengatakan, bisa Anda
bersih bahwa untuk saya?
Atau meningkatkan, kan?
Meningkatkan adalah seperti kata buzz di hampir semua kejahatan terkait acara.
Dan kenyataannya adalah jika Anda mengambil sangat foto buram seorang tersangka melakukan
sesuatu yang buruk, Anda tidak bisa hanya meningkatkan itu.
Anda tidak dapat memperbesar jauh.
Anda tidak dapat melihat dalam kilatan seseorang mata yang melakukan itu
kejahatan tertentu, meskipun prevalensi ini di TV.
>> Dan dengan itu mari kita memotivasi bahwa Masalah mendatang set dengan sekilas di
beberapa acara yang Anda mungkin akrab.
>> [VIDEO PEMUTARAN]
>> -OK.
Sekarang, mari kita melihat yang baik pada Anda.
>> -Tunggu.
Jalankan kembali itu.
>> -Tunggu sebentar.
Ke kanan.
>> -Ada.
Bekukan itu.
>> Layar penuh.
>> -OK.
Bekukan itu.
>> Kencangkan-up pada itu, akan ya?
>> Vector-dalam pada pria yang oleh roda belakang.
>> -Zoom di sini di tempat ini.
>> -Dengan peralatan yang tepat, yang dicitrakan dapat diperbesar dan dipertajam.
>> -Apa itu?
>> -Ini adalah program peningkatan.
>> -Dapatkah Anda menjelaskan bahwa apa pun?
>> -Saya tidak tahu.
Mari kita meningkatkan itu.
>> -Meningkatkan bagian A-6.
>> -Saya ditingkatkan detail dan -
>> -Saya pikir ada cukup untuk meningkatkan.
Melepaskannya ke layar saya.
>> -Meningkatkan refleksi di matanya.
>> -Mari kita jalankan ini melalui peningkatan video.
>> -Edgar, dapat menyempurnakan ini?
>> -Tunggu.
>> -Aku telah bekerja pada refleksi ini.
>> -Seseorang refleksi itu.
>> -Refleksi.
>> -Ada refleksi dari wajah pria itu.
>> -Refleksi.
>> -Ada refleksi.
>> -Zoom in pada cermin.
>> -Anda dapat melihat refleksi.
>> -Dapatkah Anda meningkatkan citra dari sini?
>> -Dapatkah Anda meningkatkan dia di sini?
>> -Dapatkah Anda meningkatkan itu?
>> -Bisakah kita meningkatkan ini?
>> -Dapatkah Anda meningkatkan itu?
>> -Tunggu sebentar, aku akan meningkatkan.
>> -Zoom in pada pintu.
>> -X10.
>> -Zoom.
>> [Tertawa]
>> Pindah-masuk
>> -Tunggu, berhenti.
>> -Stop.
>> Jeda-itu.
>> -Memutar 75 derajat sekitar silahkan vertikal.
>> [Tertawa]
>> -Stop, dan kembali ke bagian tentang pintu lagi.
>> -Punya peningkat gambar yang dapat bitmap?
>> -Mungkin kita bisa menggunakan Pradeep Sen metode untuk melihat ke jendela.
>> -Perangkat lunak ini adalah bagian dari seni.
>> -Nilai ikon off.
>> -Dengan kombinasi yang tepat algoritma.
>> -Dia mengambil algoritma pencahayaan untuk tingkat berikutnya dan saya dapat menggunakannya untuk
meningkatkan foto ini.
>> -Lock dan memperbesar sumbu z.
>> -Meningkatkan.
>> -Freeze dan meningkatkan.
>> [END VIDEO PEMUTARAN]
>> DAVID J. Malan: Jadi Masalah Set 5 adalah apa yang ada di depan sana.
Jadi kita akan segera mendapatkan pemahaman yang lebih baik kapan dan mengapa Anda bisa
dan kita tidak bisa meningkatkan dengan cara itu.
Tapi pertama-tama, mari kita kembali perhatian kita dengan beberapa blok bangunan kita akan
harus mampu menceritakan kisah itu.
>> Jadi ingat bahwa kita menggambar gambar ini pada Senin dan sedikit pekan lalu.
Dan ini menjelaskan tata letak hal-hal dalam memori komputer Anda saat
menjalankan beberapa program yang.
The teknologi segmen di bagian atas, ingat, mengacu ke nol aktual dan yang
yang membentuk program anda.
Ada, di bawah itu, beberapa diinisialisasi atau uninitialized data, yang biasanya
mengacu pada hal-hal seperti konstanta atau string atau variabel global yang memiliki
dinyatakan di muka.
Ada tumpukan, tapi kami akan datang kembali ke dalam sedikit.
>> Dan kemudian ada tumpukan.
Sama seperti tumpukan nampan di kantin, ini adalah di mana memori mendapat
berlapis dan berlapis kapanpun Anda melakukan apa dalam sebuah program?
Apa gunanya stack untuk?
>> Ya?
>> Panggil fungsi.
Setiap kali Anda memanggil fungsi, itu diberikan kepada sepotong memori untuk nya
variabel lokal atau parameter.
Dan pictorially, kita melihat bahwa dengan masing-masing Fungsi berturut-turut disebut, bila A
panggilan panggilan B C D panggilan, mereka mendapatkan berlapis ke stack.
Dan dalam masing-masing irisan memori pada dasarnya adalah sebuah lingkup yang unik
untuk fungsi itu, yang, tentu saja, bermasalah jika Anda ingin tangan
dari satu fungsi ke sepotong A data yang Anda inginkan
bermutasi atau berubah.
>> Jadi apa solusi kami untuk memungkinkan Sebuah fungsi diwakili oleh satu tumpukan
bingkai mengubah memori dalam tumpukan bingkai lain?
Bagaimana kedua berbicara satu sama lain?
Jadi dengan cara pointer atau alamat, yang, sekali lagi, hanya menjelaskan di mana di
memori, dengan cara tertentu nomor gigitan, yang khusus
Nilai dapat ditemukan.
Jadi ingat terakhir kali juga kami terus cerita dan memandang
program yang cukup buggy.
Dan program ini adalah kereta untuk beberapa alasan, tetapi yang paling mengkhawatirkan adalah
karena gagal untuk memeriksa apa?
>> Ya, gagal untuk memeriksa input.
Maaf?
>> Jika lebih dari 12 karakter.
Jadi sangat rapi, saat memanggil memcopy, yang, seperti namanya, hanya
salinan memori dari argumen kedua menjadi argumen pertama.
Argumen ketiga, sangat cerdas, adalah diperiksa untuk memastikan bahwa Anda tidak
menyalin lebih dari, dalam hal ini, panjang bar, jumlah karakter,
ke tujuan, yang ini Array C. Tapi masalahnya adalah bahwa apa
jika C itu sendiri tidak cukup besar untuk mengatasinya?
Anda akan menyalin jumlah byte yang Anda telah diberikan.
Tapi apa yang Anda benar-benar memiliki lebih banyak byte dari Anda memiliki ruang untuk?
>> Nah, program ini sangat bodoh hanya membabi buta melanjutkan untuk mengambil apa pun itu
diberikan, halo backslash 0 adalah besar jika string pendek
cukup, seperti lima karakter.
Tapi jika itu benar-benar 12 karakter atau 1.200 karakter, kami melihat terakhir kali
bahwa Anda hanya akan benar-benar menimpa memori yang
bukan milik Anda.
Dan kasus terburuk, jika Anda menimpa bagian merah di sana bahwa kami disebut
kembali alamat -
ini hanya di mana komputer otomatis, untuk Anda, di balik
adegan, melipat jauhnya nilai 32-bit yang mengingatkan untuk apa alamat seharusnya
kembali ketika foo, fungsi ini lain, dilakukan mengeksekusi.
Ini adalah remah roti macam yang ia mengembalikan.
Jika Anda menimpa itu, berpotensi, jika Anda adalah orang jahat, bisa bisa
berpotensi mengambil alih komputer seseorang.
Dan Anda akan pasti kecelakaan itu dalam banyak kasus.
>> Sekarang masalah ini hanya memperburuk seperti yang kita mulai berbicara tentang memori
manajemen yang lebih umum.
Dan malloc, untuk alokasi memori, adalah fungsi yang dapat kita gunakan untuk mengalokasikan
memori ketika kita tidak tahu sebelumnya bahwa kita mungkin perlu beberapa.
Jadi, misalnya, jika aku kembali ke alat sini.
Dan saya membuka dari waktu hello2.c lalu, mengingat program ini di sini, yang tampak
sedikit sesuatu seperti ini, hanya tiga baris -
sebutkan nama, maka nama String, di sebelah kiri, sama GetString.
Dan kemudian kita mencetaknya, nama pengguna.
>> Jadi ini adalah sebuah program super sederhana.
Untuk menjadi jelas, biarkan aku pergi ke depan dan membuat hello-2.
Aku akan melakukan slash dot hello-2.
Sebutkan nama -
David.
Enter.
Hello David.
Ini tampaknya bekerja OK.
Tapi apa yang sebenarnya terjadi bawah tenda di sini?
Pertama mari kita mengupas beberapa lapisan.
String hanya sinonim kita sudah menyadari untuk apa?
Bintang Char.
Jadi, mari kita membuatnya sedikit lebih misterius tetapi lebih teknis benar bahwa ini
adalah bintang char, yang berarti bahwa Nama, ya, adalah variabel.
Tapi toko nama apa alamat char, yang terasa agak aneh
karena aku mendapatkan kembali string.
Saya mendapatkan kembali beberapa chars bukan char.
>> Tapi tentu saja, Anda hanya perlu pertama char alamat untuk mengingat di mana
seluruh string adalah karena mengapa?
Bagaimana Anda mengetahui di mana akhir string adalah mengetahui awal?
Backslash nol.
Jadi, dengan dua petunjuk Anda mengetahui sebelum awal dan akhir
setiap string adalah, asalkan mereka benar dibentuk dengan nol bahwa
terminator, bahwa backslash nol.
>> Tapi ini memanggil GetString.
Dan ternyata bahwa GetString selama ini telah jenis
kecurangan bagi kita.
Sudah melakukan kerja ini, untuk memastikan, mendapatkan string dari pengguna.
Tapi di mana memori yang telah datang dari?
Jika kita kembali ke gambar di sini dan menerapkan definisi dari hanya
saat yang lalu, bahwa tumpukan mana memori terjadi saat fungsi dipanggil,
dengan logika bahwa, ketika Anda menelepon GetString, dan kemudian saya ketik di
D-A-V-I-D Enter, dimana D-A-V-I-D backslash nol disimpan, berdasarkan
cerita kita sudah bilang kita jauh?
>> Tampaknya berada di stack, kan?
Ketika Anda menelepon mendapatkan string yang Anda mendapatkan sedikit sepotong memori pada stack.
Jadi bisa dipastikan bahwa D-A-V-I-D backslash nol disimpan
ada di stack.
Tapi tunggu dulu, getString kembali string itu, sehingga untuk berbicara, yang berarti
itu nampan dari kantin diambil dari tumpukan.
Dan kami katakan terakhir kali bahwa segera sebagai kembali fungsi, dan Anda mengambil
nampan, sehingga untuk berbicara, dari tumpukan, apa Anda dapat mengasumsikan tentang sisa-sisa
memori itu?
Aku semacam menggambar ulang mereka sebagai tanda tanya karena mereka efektif menjadi
nilai yang tidak diketahui.
Mereka dapat digunakan kembali ketika beberapa fungsi berikutnya disebut.
>> Dengan kata lain, jika kita terjadi untuk menyimpan -
Aku akan menggambar cepat di sini dari stack.
Jika kita kebetulan menggambar bagian bawah segmen memori saya, dan kita akan mengatakan
bahwa ini adalah tempat memori diduduki oleh utama dan mungkin arg c dan
arg v dan apa pun dalam program ini, ketika GetString disebut,
mungkin GetString mendapat sepotong memori di sini.
Dan kemudian D-A-V-I-D entah bagaimana berakhir di fungsi ini.
Dan aku akan menggampangkan.
Tapi mari kita asumsikan bahwa D-A-V-I-D backslash nol.
Jadi ini banyak byte yang digunakan dalam frame untuk GetString.
>> Tapi begitu kembali GetString, kami mengatakan terakhir kali bahwa memori ini lebih
di sini semuanya menjadi - woops! -
semuanya menjadi terhapus secara efektif.
Dan kita dapat menganggap ini sebagai pertanyaan sekarang tanda karena siapa tahu
apa yang akan menjadi memori yang.
Memang, saya sangat sering memanggil fungsi-fungsi selain GetString.
Dan segera setelah saya memanggil beberapa lainnya Fungsi dari GetString, mungkin tidak
Program khusus ini kami hanya melihat di tetapi beberapa lainnya, sudah pasti beberapa lainnya
Fungsi mungkin berakhir diberikan tempat ini berikutnya dalam stack.
>> Jadi tidak dapat bahwa toko GetString D-A-V-I-D di stack karena saya akan
segera kehilangan akses ke sana.
Tapi kita tahu mereka getString hanya mengembalikan apa?
Ini tidak kembali ke saya enam karakter.
Apa itu benar-benar kembali tidak kami menyimpulkan terakhir kali?
Alamat yang pertama.
Jadi entah bagaimana, ketika Anda menelepon GetString, itu mengalokasikan sepotong memori untuk
string bahwa jenis pengguna dan alamat, maka kembali itu.
Dan ternyata bahwa bila Anda ingin berfungsi untuk mengalokasikan memori dalam
cara dan kembali kepada orang yang disebut fungsi itu, alamat
bahwa sepotong memori, Anda benar-benar tidak bisa memasukkannya ke dalam tumpukan di
bawah, karena secara fungsional itu hanya akan tidak menjadi milikmu sangat
cepat, sehingga Anda mungkin bisa menebak mana kita mungkin akan melemparkannya
sebagai gantinya, yang disebut tumpukan.
>> Jadi antara bagian bawah memori Anda tata letak dan bagian atas memori Anda
tata letak adalah sekelompok seluruh segmen.
Salah satunya adalah stack, dan kanan di atas itu adalah tumpukan.
Dan tumpukan hanya sepotong berbeda memori yang tidak digunakan untuk fungsi
ketika mereka disebut.
Ini digunakan untuk memori jangka panjang, ketika Anda ingin satu fungsi untuk ambil beberapa
memori dan dapat menggantungkan itu tanpa kehilangan kontrol atas hal itu.
>> Sekarang Anda bisa segera mungkin melihat bahwa ini bukan
tentu desain yang sempurna.
Sebagai program dialokasikan memori pada stack, atau Anda menelepon lebih dan
fungsi lebih, atau saat Anda mengalokasikan memori pada heap dengan malloc off
GetString lakukan, apa yang jelas tampaknya menjadi masalah yang tak terelakkan?
>> Benar.
Seperti fakta bahwa anak panah tersebut yang saling berhadapan
bukan pertanda baik.
Dan memang, kita bisa sangat cepat kecelakaan program dalam berbagai cara.
Bahkan, saya pikir kita mungkin memiliki melakukan ini sengaja sekali.
Atau jika tidak, mari kita lakukan sengaja sekarang.
Biarkan aku pergi ke depan dan menulis Super cepat sebuah program yang disebut dontdothis.c.
Dan sekarang aku akan pergi di sini dan jangan tajam termasuk stdio.h.
Mari kita mendeklarasikan fungsi foo mengambil tanpa argumen, yaitu
dinotasikan serta melalui void.
>> Dan satu-satunya hal foo yang akan dilakukan adalah panggilan foo, yang mungkin bukan
ide cerdas, tapi biarlah.
Ent void main.
Sekarang satu-satunya hal utama yang akan lakukan adalah memanggil foo juga.
Dan hanya untuk iseng, aku akan pergi depan di sini dan mengatakan printf "Halo dari
foo. "
>> OK.
Jadi jika saya tidak melakukan kesalahan, Membuat dontdothis dot slash.
Dan mari kita lakukan di jendela yang lebih besar -
dot slash, dontdothis.
Ayolah.
Uh oh.
Rupanya, Anda dapat melakukan ini.
Sialan.
OK.
Tunggu.
Stand by.
Apakah kita -
Kami menggunakannya dengan Make.
>> [Mendesah]
>> Saya tahu, tapi saya pikir kita hanya yang dihapus.
Uh, yeah.
Sialan.
Memecahkan Rob ini.
Apa?
Ini sangat sederhana.
Ya, kami berbelok optimasi off.
OK, berdiri bye.
Sekarang saya merasa lebih baik.
OK.
Baik.
>> Jadi mari kita ulang ini -
Membuat Anda dontdothis.
Anda mungkin harus mengubah nama ini untuk dothis.c hanya dalam beberapa saat.
Di sana kami pergi.
Terima kasih.
OK.
Jadi fakta bahwa saya mencetak sesuatu yang sebenarnya hanya
memperlambat proses dimana kita akan mencapai titik itu.
OK.
Fiuh!
>> Jadi apa yang sebenarnya terjadi?
Alasan di sana, hanya sebagai samping, adalah melakukan apa-apa dalam hal input dan
Output cenderung lebih lambat karena Anda harus menulis karakter ke
layar, itu harus gulir.
Jadi cerita panjang pendek, aku benar-benar telah terjadi begitu sabar, kita akan memiliki
melihat ini hasil akhir juga.
Sekarang saya mendapat tumpangan dari cetak-up, kita lihat segera.
Jadi mengapa hal ini terjadi.
Nah, penjelasan sederhana, tentu saja, adalah bahwa foo mungkin tidak seharusnya
memanggil dirinya.
>> Sekarang secara umum, ini rekursi.
Dan kami pikir beberapa minggu lalu rekursif baik.
Rekursi ini cara magis mengekspresikan diri Super ringkas.
Dan itu hanya bekerja.
Tapi ada fitur kunci dari semua program rekursif kami sudah bicara
tentang dan melihat sejauh ini, yang adalah bahwa mereka memiliki apa?
Sebuah kasus dasar, yang beberapa dikodekan Kasus yang mengatakan dalam beberapa situasi
jangan panggil foo, yang jelas tidak terjadi di sini.
>> Jadi apa yang sebenarnya terjadi dalam hal gambar ini?
Nah, ketika utama panggilan foo, itu mendapat sepotong memori.
Ketika foo foo panggilan, itu akan sepotong memori.
Ketika foo foo panggilan, mendapat sepotong.
Ia mendapat sepotong.
Karena foo tidak pernah kembali.
Kami tidak pernah menghapus salah satu dari mereka frame dari stack.
Jadi kita bertiup melalui tumpukan, tidak untuk menyebutkan siapa tahu apa lagi, dan
kita melangkahi batas-batas kami disebut segmen memori.
Kesalahan pergi segmentasi palsu.
>> Jadi solusi ada jelas tidak melakukan hal ini.
Namun implikasi yang lebih besar adalah bahwa, ya, ada benar-benar beberapa batas,
bahkan jika itu tidak didefinisikan dengan baik, seperti bagaimana banyak fungsi dapat Anda hubungi dalam
Program, berapa kali fungsi dapat memanggil dirinya sendiri.
Jadi meskipun kita melakukan memberitakan rekursi sebagai hal ini berpotensi ajaib yang
beberapa minggu yang lalu untuk sigma fungsi, dan ketika kita mendapatkan data
struktur dan CS50, Anda akan melihat lain aplikasi untuk itu, itu tidak
tentu hal terbaik.
Karena jika fungsi menyebut dirinya, menyebut dirinya, bahkan jika ada dasar
kasus, jika Anda tidak memukul kasus dasar untuk 1.000 panggilan atau 10.000 panggilan, oleh
saat itu Anda mungkin telah kehabisan ruang pada Anda disebut stack dan hit
beberapa segmen lain dari memori.
Jadi itu juga merupakan desain trade-off antara keanggunan dan antara
ketahanan khusus Anda implementasi.
>> Jadi ada downside lain atau Gotcha lain untuk apa yang kita punya
telah melakukan sejauh ini.
Ketika saya menelepon GetString -
biarkan aku kembali ke hello-2.
Perhatikan bahwa aku menelepon GetString, yang kembali alamat.
Dan kita mengklaim hari ini bahwa alamat adalah dari tumpukan.
Dan sekarang saya mencetak keluar string pada alamat tersebut.
Tapi kita tidak pernah disebut kebalikan dari GetString.
Kami tidak pernah harus calll fungsi seperti ungetstring, di mana Anda menyerahkan kembali
memori itu.
Tapi terus terang kita mungkin seharusnya.
Karena jika kita terus bertanya komputer untuk memori, dengan cara seseorang seperti
GetString tetapi tidak pernah mengembalikannya, pasti yang juga adalah terikat untuk menyebabkan
masalah dimana kita kehabisan memori.
>> Dan pada kenyataannya, kita bisa mencari ini masalah dengan alat baru yang penggunaan
adalah samar sedikit untuk mengetik.
Tapi biarkan aku pergi ke depan dan percikan itu pada layar hanya dalam beberapa saat.
Aku akan pergi ke depan dan menjalankan Valgrind dengan parameter yang perintah pertama
argumen baris adalah nama program yang hello-2.
Dan sayangnya itu output atrociously
kompleks tanpa alasan.
Jadi kita melihat semua yang berantakan.
David menyatakan nama saya.
Jadi itulah program benar-benar berjalan.
Dan sekarang kita mendapatkan output ini.
>> Jadi Valgrind mirip semangat yang GDB.
Ini bukan debugger per se.
Tapi itu pemeriksa memori.
Ini adalah program yang akan dijalankan Anda memprogram dan memberitahu Anda jika Anda bertanya
komputer untuk memori dan tidak pernah menyerahkannya kembali, dengan demikian berarti bahwa Anda harus
kebocoran memori.
Dan kebocoran memori cenderung buruk.
Dan Anda adalah pengguna komputer memiliki mungkin merasa ini, apakah Anda memiliki
Mac atau PC.
Apakah Anda pernah menggunakan komputer Anda untuk sementara dan tidak reboot dalam beberapa
hari, atau Anda baru saja punya banyak program yang berjalan, dan sialan
memperlambat berhenti grinding, atau setidaknya itu super menjengkelkan untuk digunakan, karena
semuanya hanya mendapat super lambat.
>> Sekarang yang dapat sejumlah alasan.
Ini bisa menjadi infinite loop, bug dalam Kode seseorang, atau, lebih sederhana,
bisa berarti bahwa Anda menggunakan lebih memori, atau mencoba untuk, daripada Anda
komputer sebenarnya memiliki.
Dan mungkin ada bug pada beberapa program yang terus meminta untuk memori.
Browser selama bertahun-tahun yang terkenal untuk ini, meminta lebih banyak memori
tetapi tidak pernah menyerahkan kembali.
Tentunya, jika Anda hanya memiliki terbatas jumlah memori, Anda tidak dapat meminta
jauh berkali-kali untuk beberapa memori yang.
>> Dan jadi apa yang Anda lihat di sini, meskipun kembali outputnya Valgrind adalah
tidak perlu kompleks untuk melirik pertama, ini adalah bagian yang menarik.
Heap -
digunakan pada keluar.
Jadi, inilah berapa banyak memori itu digunakan di tumpukan di
waktu program saya keluar -
ternyata enam byte dalam satu blok.
Jadi aku akan melambaikan tangan saya apa sebuah blok.
Pikirkan itu hanya sepotong, yang lebih kata teknis untuk potongan.
Tapi enam byte -
apa saja enam byte yang yang masih digunakan?
>> Tepat.
D-A-V-I-D backslash nol, lima surat Nama ditambah null terminator.
Jadi program ini valgrind menyadari bahwa saya meminta enam byte, tampaknya, oleh
cara GetString, tetapi tidak pernah memberi mereka kembali.
Dan pada kenyataannya, ini mungkin tidak begitu jelas jika program saya tidak tiga
garis, tapi itu 300 baris.
Jadi kita benar-benar bisa memberikan perintah lain argumen baris untuk Valgrind ke
membuatnya lebih verbose.
Ini sedikit mengganggu untuk diingat.
Tetapi jika saya lakukan -
mari kita lihat.
Leak -
Apakah itu bocor -
bahkan aku tidak ingat apa itu dari tangan.
>> - Kebocoran-cek sama penuh.
Yap, terima kasih.
- Kebocoran-cek sama penuh.
Enter.
Program yang sama berjalan.
Ketik David lagi.
Sekarang saya melihat sedikit lebih detail.
Tetapi di bawah ringkasan tumpukan, yang identik dengan empat - ah,
ini adalah jenis yang baik.
Sekarang Valgrind sebenarnya mencari lebih sulit dalam kode kecilku.
Dan itu mengatakan bahwa, tampaknya, malloc pada baris -
kita zoom out.
Pada baris -
kita tidak melihat apa garis itu.
Tapi malloc adalah penyebab pertama.
Ada sebuah blog dalam malloc.
>> Baiklah?
OK, tidak ada.
Benar?
Aku menelepon getString.
GetString rupanya panggilan malloc.
Jadi apa baris kode ini rupanya bersalah karena telah
dialokasikan memori ini?
Mari kita berasumsi bahwa siapapun yang menulis malloc telah ada cukup lama bahwa itu
bukan kesalahan mereka.
Jadi itu mungkin saya.
getString di cs50.c - jadi itu mengajukan suatu tempat di komputer -
sejalan 286 tampaknya menjadi pelakunya.
Sekarang mari kita asumsikan bahwa CS50 telah sekitar untuk jumlah waktu yang layak, sehingga
kita juga tidak bisa salah.
Dan jadi mungkin tidak getString bug tersebut terletak, melainkan dalam
baris halo-2c 18.
>> Jadi mari kita lihat apa baris yang 18 itu.
Oh.
Entah bagaimana baris ini tidak selalu buggy, per se, tetapi itu adalah alasan
belakang kebocoran memori.
Jadi super sederhana, apa yang akan intuitif menjadi solusi di sini?
Jika kita meminta memori, tidak pernah memberikan kembali, dan yang tampaknya menjadi
masalah karena dari waktu ke waktu komputer saya mungkin kehabisan memori, bisa memperlambat
bawah, hal-hal buruk yang mungkin terjadi, baik, apa solusi sederhana intuitif?
Hanya mengembalikannya.
>> Bagaimana Anda membebaskan memori itu?
Yah, untungnya itu cukup sederhana hanya mengatakan nama gratis.
Dan kami tidak pernah melakukan hal ini sebelumnya.
Tapi Anda pada dasarnya bisa memikirkan gratis sebagai kebalikan dari malloc.
bebas adalah kebalikan dari mengalokasikan memori.
Jadi sekarang biarkan aku mengkompilasi ulang ini.
Membuat hello-2.
Mari saya jalankan lagi. hello-2 David.
Jadi sepertinya untuk bekerja di cara yang persis sama.
Tapi jika saya kembali ke Valgrind dan kembali menjalankan bahwa perintah yang sama pada saya baru
program yang dikompilasi, mengetik dalam nama-Ku seperti sebelumnya -
bagus.
Heap ringkasan -
digunakan pada keluar -
nol byte dalam blok nol.
Dan ini adalah super bagus, semua blok tumpukan dibebaskan.
Tidak ada kebocoran yang mungkin.
>> Jadi datang, bukan dengan Soal Set 4, tapi dengan Masalah Set 5, forensik
dan seterusnya, ini juga akan menjadi ukuran kebenaran Anda
Program, apakah Anda memiliki atau tidak memiliki kebocoran memori.
Tapi untungnya, Anda tidak hanya dapat alasan melalui mereka intuitif, yang
adalah, bisa dibilang, mudah untuk program kecil tapi lebih sulit untuk program yang lebih besar,
Valgrind, untuk program-program yang lebih besar, dapat membantu Anda mengidentifikasi
masalah tertentu.
>> Tapi ada satu masalah lain yang mungkin timbul.
Mari saya membuka file ini di sini, yang adalah, lagi, contoh yang agak sederhana.
Tapi mari kita fokus pada apa yang program ini tidak.
Ini disebut memory.c.
Kami akan posting kemudian hari ini di zip kode sumber saat ini.
Dan melihat bahwa saya memiliki fungsi yang disebut f yang tidak mengambil argumen dan
mengembalikan apa-apa.
Sejalan 20, aku ternyata mendeklarasikan pointer ke int dan menyebutnya x.
Aku menugaskan adalah kembalinya nilai malloc.
Dan hanya harus jelas, berapa banyak byte am Aku mungkin kembali dari malloc
dalam situasi ini?
>> Mungkin 40.
Di mana Anda mendapatkan bahwa dari?
Nah, jika Anda ingat bahwa int sering 4 byte, setidaknya itu dalam
alat, 10 kali 4 jelas 40.
Jadi malloc kembali sebuah alamat sepotong memori dan penyimpanan yang
alamat akhirnya dalam x.
Jadi harus jelas, apa yang kemudian yang terjadi?
Nah, biarkan aku beralih kembali ke gambar kami di sini.
Biarkan aku hanya menggambar bagian bawah saya memori komputer, biarkan aku pergi ke depan dan
menarik seluruh persegi panjang yang mewakili semua RAM saya.
>> Kami akan mengatakan bahwa tumpukan adalah di bagian bawah.
Dan ada segmen teks dalam data diinisiasi.
Tapi aku hanya akan abstrak mereka hal-hal lain yang jauh seperti titik, titik dot.
Aku hanya akan lihat ini sebagai tumpukan di bagian atas.
Dan kemudian di bagian bawah gambar ini, untuk mewakili utama, aku akan
untuk memberikan memori irisan di stack.
Untuk f, aku akan memberikan sepotong memori di stack.
Sekarang, saya harus berkonsultasi saya source code lagi.
Apa variabel lokal untuk utama?
Ternyata tidak ada, sehingga slice yang efektif kosong atau tidak bahkan sebesar
seperti yang telah saya ditarik itu.
Tapi dalam f, saya memiliki variabel lokal, yang disebut x.
Jadi aku akan pergi ke depan dan memberikan f sepotong memori, menyebutnya x.
>> Dan sekarang malloc dari 10 kali 4, Jadi malloc 40, di mana itu
memori berasal?
Kami sudah tidak ditarik gambar seperti ini sebelumnya.
Tapi anggap bahwa itu efektif datang dari sini, jadi satu,
dua, tiga, empat, lima.
Dan sekarang aku perlu 40 ini.
Jadi saya hanya akan melakukan titik, titik, titik untuk menyarankan bahwa ada lebih banyak memori
datang kembali dari tumpukan.
Sekarang apa alamatnya?
Mari kita memilih sewenang-wenang kami alamat seperti biasa -
Ox123, meskipun itu mungkin akan menjadi sesuatu yang sama sekali berbeda.
Itulah alamat byte pertama dalam memori yang saya minta untuk malloc.
>> Jadi singkatnya, setelah baris 20 dijalankan, apa yang benar-benar
disimpan dalam x sini?
Ox123.
Dan Kerbau tidak menarik.
Ini hanya berarti di sini adalah angka heksadesimal.
Tapi apa yang utama adalah bahwa apa yang telah saya toko dalam x, yang merupakan variabel lokal.
Tapi tipe datanya, sekali lagi, adalah alamat dari sebuah int.
Yah, aku akan menyimpan Ox123.
Tapi sekali lagi, kalau itu agak terlalu rumit tidak perlu, jika saya gulir
kembali, kita bisa abstrak ini pergi cukup cukup dan hanya mengatakan bahwa x adalah
pointer dengan sepotong memori.
>> OK.
Sekarang pertanyaan di tangan adalah sebagai berikut -
line 21, ternyata, adalah kereta.
Kenapa?
>> Maaf?
Itu tidak memiliki -
mengatakan bahwa sekali lagi.
Yah, itu tidak gratis.
Jadi itulah kedua tetapi.
Jadi ada yang lain namun secara khusus pada baris 21.
>> Tepat.
Ini baris kode sederhana hanya buffer overflow, buffer overrun.
Buffer hanya berarti sepotong memori.
Tapi itu sepotong memori adalah ukuran 10, 10 bilangan bulat, yang berarti jika kita
indeks ke dalamnya menggunakan sintaksis gula notasi array, alun-alun
kurung, Anda memiliki akses ke x braket 0 x 1 x braket,
braket titik, titik, titik.
x braket 9 adalah yang terbesar.
Jadi jika saya melakukan x braket 10, di mana Aku benar-benar akan di memori?
>> Nah, jika saya memiliki 10 int -
mari kita benar-benar menarik semua ini keluar di sini.
Jadi itu lima pertama.
Berikut lima ints lainnya.
Jadi x braket 0 di sini. x braket 1 adalah di sini. x braket 9 di sini. x braket
10 di sini, yang berarti saya mengatakan, di line 21, komputer untuk menempatkan
nomor di mana?
Angka 0 di mana?
Yah, itu 0, ya.
Tapi fakta bahwa 0 nya adalah jenis kebetulan.
Ini bisa menjadi nomor 50, untuk semua kita peduli.
Tapi kami berusaha untuk memasukkannya pada x braket 10, yang mana ini
tanda tanya ditarik, yang bukanlah hal yang baik.
Program ini mungkin sangat baik kecelakaan sebagai hasilnya.
>> Sekarang, mari kita pergi ke depan dan melihat apakah ini adalah, memang, apa yang terjadi.
Membuat memori, karena file disebut memory.c.
Mari kita pergi ke depan dan menjalankan memori program.
Jadi kita beruntung, sebenarnya, tampaknya.
Kami beruntung.
Tapi mari kita lihat apakah kita sekarang menjalankan Valgrind.
Pada pandangan pertama, program saya mungkin tampaknya sempurna benar.
Tapi biarkan aku menjalankan Valgrind dengan - Kebocoran-cek sama penuh pada memori.
>> Dan sekarang ketika saya menjalankan ini -
menarik.
Valid menulis ukuran 4 di baris 21 memory.c.
Baris 21 memory.c adalah yang mana?
Oh, menarik.
Tapi tunggu.
Ukuran 4, apa itu maksud?
Saya hanya melakukan satu menulis, tapi itu ukuran 4.
Mengapa 4?
Itu karena itu adalah int, yang , sekali lagi, empat byte.
Jadi Valgrind menemukan bug yang saya, melirik kode saya, tidak.
Dan mungkin Anda akan TF atau tidak.
Apa Tapi Valgrind pasti menemukan bahwa kami telah membuat kesalahan di sana, bahkan
meskipun kami beruntung, dan komputer memutuskan, eh, aku tidak akan crash
hanya karena Anda menyentuh satu byte, satu senilai int tentang memori yang tidak
benar-benar sendiri.
>> Nah, apa lagi yang kereta di sini.
Alamat -
ini adalah mencari alamat gila dalam heksadesimal.
Itu hanya berarti suatu tempat di tumpukan merupakan nol byte setelah blok ukuran 40
dialokasikan.
Mari saya zoom out di sini dan melihat apakah ini sedikit lebih bermanfaat.
Menarik.
40 byte pasti hilang dalam catatan kehilangan 1 dari 1.
Sekali lagi, kata-kata lebih dari yang berguna di sini.
Tapi berdasarkan garis disorot, mana yang harus saya mungkin fokus saya
perhatian untuk bug lain?
Sepertinya garis 20 dari memory.c.
>> Jadi, jika kita kembali ke jalur 20, itulah salah satu yang Anda identifikasi sebelumnya.
Dan itu belum tentu kereta.
Tapi kita ini terbalik dampaknya.
Jadi bagaimana cara memperbaiki setidaknya salah satu kesalahan?
Apa yang bisa saya lakukan setelah line 21?
Aku bisa melakukan bebas dari x, begitu juga untuk memberikan kembali memori itu.
Dan bagaimana cara memperbaiki bug ini?
Saya pasti harus pergi tidak lebih jauh dari 0.
Jadi biarkan saya mencoba dan kembali menjalankan ini.
Maaf, pasti pergi tidak lebih jauh dari 9.
Membuat memori.
Biarkan aku memutarkan Valgrind di jendela yang lebih besar.
Dan sekarang lihat.
Nice.
Semua blok tumpukan dibebaskan.
Tidak ada kebocoran yang mungkin.
Dan sampai di atas sini, tidak ada lagi lagi hak valid.
>> Hanya untuk serakah, dan mari kita melihat apakah demonstrasi lain
tidak pergi sebagaimana dimaksud -
Aku beruntung beberapa saat yang lalu.
Dan fakta bahwa ini adalah 0 mungkin tidak perlu menyesatkan.
Mari kita lakukan 50, agak sewenang-wenang nomor, membuat memori memori dot slash -
masih beruntung.
Tidak ada yang menerjang.
Misalkan saya hanya melakukan sesuatu yang benar-benar bodoh, dan saya melakukan 100.
Biarkan aku remake memori, dot slash memori -
beruntung lagi.
Bagaimana sekitar 1.000?
ints luar, kasar, di mana saya seharusnya?
Membuat memori -
sialan.
>> [Tertawa]
>> OK.
Jangan main-main lagi.
Jalankan kembali memori.
Di sana kami pergi.
Baik.
Jadi tampaknya Anda indeks 100.000 ints di luar di mana Anda seharusnya berada di
memori, hal buruk terjadi.
Jadi ini jelas tidak keras, aturan cepat.
Aku agak menggunakan trial and error untuk sampai ke sana.
Tapi ini karena, singkat cerita, memori komputer Anda juga dibagi
dalam hal ini disebut segmen.
Dan kadang-kadang, komputer benar-benar telah memberi Anda sedikit lebih banyak memori
dari yang Anda minta.
Tapi untuk efisiensi, itu hanya lebih mudah untuk mendapatkan lebih banyak memori, tetapi hanya memberitahu Anda
bahwa Anda mendapatkan sebagian darinya.
>> Dan jika Anda beruntung kadang-kadang, Oleh karena itu, Anda mungkin bisa menyentuh
memori yang bukan milik Anda.
Anda tidak memiliki jaminan bahwa apa yang nilai Anda diletakkan di sana akan tinggal di sana, karena
komputer masih berpikir itu tidak Anda, tapi itu belum tentu akan
untuk memukul segmen memori yang lain dalam komputer dan menyebabkan kesalahan seperti
ini satu di sini.
Baik.
Setiap pertanyaan kemudian pada memori?
>> Baik.
Mari kita lihat di sini, kemudian, pada sesuatu yang kita telah mengambil untuk
diberikan untuk beberapa waktu, yang dalam file ini disebut cs50.h.
Jadi ini adalah file.
Ini hanya keseluruhan sekelompok komentar atas.
Dan Anda mungkin telah melihat ini jika Anda menjulurkan sekitar pada alat.
Tapi ternyata itu sepanjang waktu, ketika kita digunakan untuk menggunakan string sebagai
sinonim, cara-cara yang kami nyatakan yang sinonim adalah dengan
kata kunci typedef, untuk jenis definisi.
Dan kita pada dasarnya mengatakan, membuat merangkai sinonim untuk bintang arang.
Itu cara-cara yang stack menciptakan roda pelatihan ini dikenal sebagai
string.
>> Sekarang inilah hanya prototipe untuk getchar.
Kita mungkin telah melihat itu sebelumnya, tapi itu memang apa yang dilakukannya. getchar
tidak membutuhkan argumen, mengembalikan char.
getdouble tidak membutuhkan argumen, mengembalikan ganda.
getFloat tidak membutuhkan argumen, pengembalian pelampung, dan sebagainya.
getInt berada di sini. getlonglong ada di sini.
Dan GetString berada di sini.
Dan itu saja.
Ini garis ungu adalah preprocessor lain direktif karena
hashtag di awal itu.
>> Baik.
Jadi sekarang biarkan aku pergi ke cs50.c.
Dan kita tidak akan berbicara terlalu lama ini.
Tetapi untuk memberikan sekilas tentang apa yang terjadi pada semua ini
waktu, biarkan aku pergi ke -
mari kita lakukan getchar.
Jadi getchar sebagian besar komentar.
Tapi sepertinya ini.
Jadi ini adalah fungsi yang sebenarnya getchar bahwa kita telah
mengambil untuk diberikan ada.
Dan meskipun kita belum menggunakan yang satu ini yang sering, jika pernah, itu setidaknya
relatif sederhana.
Sehingga layak mengambil cepat melihat di sini.
>> Jadi getchar memiliki loop tak terbatas, sengaja begitu rupanya.
Ini kemudian memanggil - dan ini adalah jenis reuse baik kode kita sendiri aja.
Ini panggilan GetString.
Karena apa fungsinya berarti untuk mendapatkan char?
Nah, Anda mungkin juga mencoba untuk mendapatkan seluruh baris teks dari pengguna dan
kemudian hanya melihat salah satu dari karakter-karakter.
Sejalan 60, inilah sedikit sedikit cek kewarasan.
Jika GetString kembali null, jangan lanjutkan.
Sesuatu yang tidak beres.
>> Sekarang ini agak menjengkelkan tapi konvensional dalam C. arang mungkin max
mewakili apa yang baru saja berdasarkan namanya?
Ini adalah konstan.
Ini seperti nilai numerik dari terbesar Char Anda dapat mewakili dengan
satu gigitan, yang mungkin nomor 255, yang merupakan jumlah terbesar Anda
mewakili delapan bit, mulai dari nol.
Jadi saya sudah menggunakan ini, dalam fungsi ini, ketika menulis kode ini, hanya karena
jika sesuatu yang tidak beres di getchar tetapi tujuan dalam hidup adalah untuk mengembalikan
char, Anda perlu entah bagaimana dapat untuk sinyal kepada pengguna bahwa
sesuatu yang tidak beres.
Kita tidak bisa mengembalikan null.
Ternyata null pointer.
Dan lagi, getchar memiliki untuk kembali char.
>> Jadi konvensi, jika terjadi salah, adalah Anda, programmer, atau
kasus ini, saya dengan perpustakaan, aku hanya memutuskan sewenang-wenang, jika
sesuatu yang tidak beres, aku akan kembali jumlah 255, yang benar-benar
berarti kita tidak bisa, pengguna tidak dapat mengetik karakter diwakili oleh
nomor 255 karena kami memiliki mencurinya sebagai yang disebut nilai sentinel untuk
merupakan masalah.
Sekarang ternyata bahwa karakter 255 bukanlah sesuatu yang Anda dapat mengetik pada
keyboard Anda, jadi itu bukan masalah besar.
Pengguna tidak melihat bahwa Aku telah mencuri karakter ini.
Tapi jika Anda pernah melihat di halaman manual pada sistem komputer beberapa referensi ke
semua topi konstan seperti ini yang mengatakan, dalam kasus kesalahan kekuatan konstan ini
dikembalikan, itu saja beberapa manusia melakukan tahun yang lalu sewenang-wenang memutuskan untuk
mengembalikan nilai ini khusus dan menyebutnya konstan dalam kasus
sesuatu yang tidak beres.
>> Sekarang keajaiban terjadi di sini.
Pertama, saya menyatakan sejalan 67 dua karakter, C1 dan C2.
Dan kemudian di baris 68, sebenarnya ada baris kode yang mengingatkan
teman kita printf, mengingat bahwa itu memang memiliki persen Cs dalam tanda kutip.
Tapi perhatikan apa yang terjadi di sini. sscanf berarti string scan -
berarti memindai diformat String, ergo sscanf.
Apa artinya?
Ini berarti Anda lolos ke sscanf string.
Dan garis apapun jenis pengguna masuk
Anda lulus untuk sscanf format string seperti ini yang memberitahu scanf apa
Anda berharap pengguna telah diketik masuk
Anda kemudian lulus-in alamat dua potongan memori, dalam hal ini,
karena saya memiliki dua penampung.
Jadi aku akan memberikan alamat C1 dan alamat C2.
>> Dan ingat bahwa Anda memberikan fungsi yang alamat beberapa variabel, apa
implikasinya?
Apa yang bisa fungsi yang dilakukan sebagai hasil memberikannya alamat dari
variabel, sebagai lawan variabel itu sendiri?
Hal ini dapat mengubahnya, kan?
Jika Anda memiliki seseorang peta ke fisik alamat, mereka bisa pergi ke sana dan melakukan
apapun yang mereka inginkan di alamat itu.
Ide yang sama di sini.
Jika kita lolos ke sscanf, alamat dua potongan memori, bahkan ini kecil
potongan kecil memori, C1 dan C2, tapi kita kirim alamat mereka,
sscanf dapat mengubahnya.
>> Jadi tujuan sscanf dalam hidup, jika kita membaca halaman manual, adalah dengan membaca apa yang
pengguna mengetik, berharap pengguna harus mengetik karakter dan mungkin
karakter lain, dan apa pun pengguna diketik, karakter pertama berjalan
di sini, karakter kedua goes here.
Sekarang, sebagai samping, ini, dan Anda akan hanya tahu ini dari dokumentasi,
fakta bahwa saya menempatkan ruang kosong di sana hanya berarti bahwa saya tidak peduli jika
pengguna hits Space bar beberapa kali sebelum ia mengambil
karakter, aku akan mengabaikan setiap ruang putih.
Sehingga, saya tahu dari dokumentasi.
>> Fakta bahwa ada% c kedua diikuti dengan spasi sebenarnya
disengaja.
Saya ingin bisa mendeteksi jika pengguna mengacaukan atau tidak bekerja sama.
Jadi saya berharap bahwa pengguna hanya mengetik dalam satu karakter, karena itu saya berharap
yang sscanf hanya akan mengembalikan nilai 1 karena, sekali lagi, jika saya membaca
dokumentasi, tujuan sscanf di hidup adalah untuk kembali ke jumlah
variabel yang diisi dengan input pengguna.
>> Aku melewati dua variabel alamat, C1 dan C2.
Aku berharap, meskipun, bahwa hanya satu dari mereka terbunuh karena jika sscanf
kembali 2, apa mungkin implikasi logis?
Bahwa pengguna tidak hanya memberi saya satu Karakter seperti saya katakan dia.
Mereka mungkin diketik di sedikitnya dua karakter.
Jadi jika saya bukannya tidak memiliki kedua % C, saya hanya punya satu, yang
terus terang akan lebih intuitif Pendekatan, saya pikir pandangan pertama,
Anda tidak akan dapat mendeteksi jika pengguna telah memberikan Anda lebih banyak
masukan dari Anda benar-benar ingin.
Jadi ini adalah bentuk implisit dari pengecekan error.
>> Tapi perhatikan apa yang saya lakukan di sini.
Setelah saya yakin bahwa pengguna memberiku satu karakter, saya membebaskan garis, melakukan
kebalikan dari GetString, yang pada gilirannya menggunakan malloc, dan kemudian aku kembali
C1, karakter bahwa saya berharap pengguna disediakan dan hanya disediakan.
Jadi cepat melihat sekilas saja, tetapi pertanyaan pada getchar?
Kami akan kembali ke beberapa yang lain.
>> Nah, biarkan aku pergi ke depan dan melakukan hal ini - misalkan sekarang, hanya untuk memotivasi kami
diskusi dalam seminggu ditambah waktu, ini adalah file yang bernama structs.h.
Dan sekali lagi, ini hanya rasa sesuatu yang ada di depan.
Tetapi perhatikan bahwa banyak ini adalah komentar.
Jadi biarkan saya menyoroti hanya Bagian yang menarik untuk saat ini.
typedef -
ada kata kunci yang sama lagi.
typedef kita gunakan untuk menyatakan string yang sebagai tipe data khusus.
Anda dapat menggunakan typedef untuk menciptakan merek baru jenis data yang tidak ada ketika
C diciptakan.
Misalnya, int dilengkapi dengan arang C. dilengkapi dengan C. ganda dilengkapi dengan C. Tetapi
tidak ada gagasan mahasiswa.
Namun itu akan sangat berguna untuk mampu menulis sebuah program yang menyimpan
dalam variabel, nomor ID siswa, nama mereka, dan rumah mereka.
Dengan kata lain, tiga potong data, seperti int dan
String dan string lainnya.
>> Dengan typedef, apa cukup kuat tentang hal ini dan sturct kata kunci untuk
struktur, Anda, programmer tahun 2013, benar-benar dapat menentukan Anda sendiri
tipe data yang tidak ada tahun lalu tapi itu sesuai dengan tujuan Anda.
Dan jadi di sini, di baris 13 sampai 19, kita mendeklarasikan sebuah tipe data baru, seperti
int, tetapi menyebutnya siswa.
Dan dalam variabel ini akan ada tiga hal - int, string,
dan string.
Sehingga Anda dapat memikirkan apa yang benar-benar terjadi di sini, meskipun ini adalah
sedikit penyederhanaan untuk hari ini, seorang siswa pada dasarnya akan
terlihat seperti ini.
Yang akan menjadi sepotong memori dengan ID, nama
lapangan, dan bidang rumah.
Dan kita akan dapat menggunakan potongan tersebut dari memori dan mengaksesnya sebagai berikut.
>> Jika saya pergi ke struct0.c, di sini adalah relatif lama, namun setelah
pola, kode yang menggunakan ini trik baru.
Jadi pertama, biarkan aku menarik perhatian Anda ke bagian yang menarik di bagian atas.
Tajam mendefinisikan siswa 3, mendeklarasikan disebut siswa dan penerima konstan
itu sewenang-wenang nomor 3, hanya jadi saya memiliki tiga siswa menggunakan
program ini untuk saat ini.
Di sinilah Utama.
Dan perhatikan, bagaimana cara mendeklarasikan array siswa?
Yah, saya hanya menggunakan sintaks yang sama.
Mahasiswa kata adalah jelas baru.
Tapi siswa, kelas, siswa braket.
>> Jadi sayangnya ada banyak dari penggunaan kembali istilah di sini.
Ini hanya nomor.
Jadi ini seperti mengatakan tiga.
Class adalah hanya apa yang saya inginkan untuk memanggil variabel.
Saya bisa menyebutnya siswa.
Tapi kelas, ini bukan kelas dalam berorientasi objek Java macam cara.
Ini hanya kelas siswa.
Dan tipe data setiap elemen dalam array yang adalah siswa.
Jadi ini adalah sedikit berbeda dan dari mengatakan sesuatu
seperti ini, hanya saja -
Saya mengatakan memberi saya tiga mahasiswa dan memanggil array kelas.
>> Baik.
Sekarang inilah empat lingkaran.
Orang ini akrab - iterate dari nol pada hingga tiga.
Dan inilah bagian baru dari sintaks.
Program ini akan meminta saya, manusia, untuk memberikan mahasiswa
ID, yang merupakan int.
Dan inilah sintaks yang dapat anda menyimpan sesuatu di bidang ID di
lokasi kelas I. Jadi braket sintaks ini bukanlah hal baru.
Ini hanya berarti memberikan kedelapan siswa di kelas.
Tapi simbol ini adalah baru.
Sampai sekarang, kita sudah tidak bisa digunakan dot, setidaknya dalam kode seperti ini.
Ini berarti pergi ke struct dikenal sebagai seorang mahasiswa dan menempatkan sesuatu di sana.
Demikian pula, di baris ini berikutnya, 31, pergi depan dan menempatkan apa pun jenis pengguna
untuk nama di sini dan apa yang mereka lakukan untuk rumah, hal yang sama, maju dan
memasukkannya ke dalam rumah..
>> Jadi, apa program ini akhirnya lakukan?
Anda dapat melihat teaser kecil di sana.
Biarkan aku pergi ke depan dan jangan membuat structs 0 dot slash struct 0, ID mahasiswa 1,
David mengatakan Mather, mahasiswa ID 2.
Rob Kirkland, mahasiswa ID 3.
Lauren Leverit -
dan satu-satunya program ini lakukan, yang hanya benar-benar sewenang-wenang, yang
Saya ingin melakukan sesuatu dengan data ini, sekarang aku sudah mengajarkan kita bagaimana untuk
menggunakan struct, adalah aku hanya punya tambahan ini lingkaran di sini.
Aku iterate atas array siswa.
Aku digunakan, teman mungkin sekarang kita kenal, String membandingkan, stircomp ke
check adalah rumah 8th siswa sama dengan Mather?
Dan jika demikian, hanya mencetak sesuatu sewenang-wenang seperti, ya, itu.
Tapi sekali lagi, hanya memberi saya kesempatan untuk menggunakan dan menggunakan kembali dan
menggunakan kembali ini notasi titik baru.
>> Jadi siapa yang peduli, kan?
Datang dengan program siswa adalah agak sewenang-wenang, tapi ternyata
bahwa kita dapat melakukan hal-hal yang berguna dengan ini, misalnya sebagai berikut.
Ini adalah struct jauh lebih rumit di C. Itu punya selusin atau lebih banyak bidang,
agak samar bernama.
Namun jika Anda sudah pernah mendengar tentang grafis format file yang disebut bitmap, BMP, itu
ternyata bahwa format file bitmap cukup banyak terlihat seperti ini.
Ini wajah Smiley kecil bodoh.
Ini adalah gambar kecil yang aku sudah diperbesar pada cukup besar sehingga saya bisa melihat setiap
dari titik-titik individu atau piksel.
Sekarang, ternyata kita dapat mewakili titik hitam dengan, katakanlah, angka 0.
Dan titik putih dengan nomor 1.
>> Jadi dengan kata lain, jika Anda ingin menggambar Wajah tersenyum dan menyimpan bahwa gambar dalam
komputer, itu sudah cukup untuk menyimpan nol dan orang yang terlihat seperti ini, di mana,
lagi, yang berwarna putih dan nol berwarna hitam.
Dan bersama-sama, jika Anda secara efektif memiliki a sandang dari satu dan nol, Anda memiliki
grid pixel, dan jika Anda berbaring mereka keluar, Anda memiliki lucu
sedikit Smiley wajah.
Sekarang, format file bitmap, BMP, adalah efektif bahwa di balik kap mesin,
tapi dengan piksel lebih sot bahwa Anda benar-benar dapat mewakili warna.
>> Tetapi bila Anda memiliki lebih canggih format file seperti BMP dan JPEG dan GIF
dengan yang Anda mungkin akrab, mereka file pada disk biasanya tidak hanya
memiliki angka satu dan nol untuk pixel, tetapi mereka memiliki beberapa metadata juga -
meta dalam arti bahwa tidak benar-benar Data tapi itu berguna untuk memiliki.
Jadi bidang ini di sini menyiratkan, dan kita akan melihat ini secara lebih rinci dalam P-set
5, bahwa sebelum angka satu dan nol yang mewakili piksel dalam gambar,
ada sekelompok metadata seperti ukuran gambar dan
lebar gambar.
Dan perhatikan aku memetik dari beberapa hal sewenang-wenang di sini -
lebar dan tinggi.
Jumlah bit dan beberapa hal lain.
Jadi ada beberapa metadata dalam file.
>> Tapi dengan memahami bagaimana file diletakkan keluar dengan cara ini, Anda dapat benar-benar
kemudian memanipulasi gambar, memulihkan gambar dari disk, mengubah ukuran gambar.
Tapi Anda tidak bisa selalu meningkatkan mereka.
Aku butuh sebuah foto.
Jadi aku kembali ke RJ sini, siapa Anda melihat pada layar beberapa waktu lalu.
Dan jika saya membuka Keynote di sini, ini adalah apa yang terjadi jika Anda mencoba untuk memperbesar dan
meningkatkan RJ.
Dia tidak mendapatkan apapun lebih baik benar-benar.
Sekarang Keynote adalah jenis kabur itu sedikit, hanya untuk menutup-nutupi yang
Fakta bahwa RJ tidak mendapatkan khususnya ditingkatkan ketika Anda zoom in
Dan jika melakukannya dengan cara ini, melihat kotak?
Ya, Anda pasti dapat melihat kotak pada proyektor.
>> Itulah apa yang Anda dapatkan ketika Anda meningkatkan.
Namun dalam memahami bagaimana RJ kita atau Wajah tersenyum diimplementasikan akan membiarkan kita
benar-benar menulis kode yang memanipulasi hal-hal ini.
Dan saya pikir saya akan berakhir pada catatan ini, dengan 55 detik dari meningkatkan itu,
Saya berani, katakan agak menyesatkan.
>> [VIDEO PEMUTARAN]
>> -Dia berbohong.
Tentang apa, saya tidak tahu.
>> -Jadi apa yang kita tahu?
>> -Bahwa at 9:15 Ray Santoya berada di ATM.
>> -Jadi pertanyaannya adalah apa yang yang dia lakukan at 9:16?
>> Shooting-sembilan milimeter pada sesuatu.
Mungkin ia melihat penembak jitu.
>> -Atau bekerja dengan dia.
>> -Tunggu.
Kembali satu.
>> -Apa yang Anda lihat?
>> -Membawa wajahnya, layar penuh.
>> -Nya kacamata.
>> -Ada refleksi.
>> -Itulah tim bisbol Neuvitas.
Itulah logo mereka.
>> -Dan dia berbicara dengan siapa pun yang mengenakan jaket itu.
>> [END VIDEO PEMUTARAN]
>> DAVID J. Malan: Ini akan menjadi masalah Set 5.
Kita akan melihat Anda minggu depan.
>> MALE SPEAKER: Pada CS50 berikutnya.
>> [Jangkrik]
>> [MUSIC PLAYING]