>> [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 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.
>> -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.
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.
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]