>> [Bermain muzik]
>> [VIDEO MAIN SEMULA]
>> -Dia Berbohong.
>> -Tentang apa?
>> -Saya tidak tahu.
>> -Jadi Apa yang kita tahu?
>> -Itu Pada 09:15, Ray Santoya berada di ATM.
-Yeah.
Jadi persoalannya ialah, apa yang yang dia buat di 9:16?
>> -Shooting Milimeter 9 sesuatu.
Mungkin dia melihat sniper.
>> -atau Telah bekerjasama dengan beliau.
>> -Wait.
Kembali satu.
>> -Apa yang awak nampak?
>> -Bring Mukanya skrin penuh.
>> Cermin mata -His.
>> -Ada Pantulan.
>> -Ia Pasukan besbol Nuevitas.
Itulah logo mereka.
>> -dan Dia bercakap dengan sesiapa yang memakai jaket itu.
>> [AKHIR MAIN SEMULA]
>> DAVID MALAN: Baiklah.
Ini adalah CS50 dan ini adalah sedikit lebih [didengar] yang anda berada
berkecimpung dengan masalah set empat.
Hari ini kita mula kelihatan sedikit lebih mendalam perkara-perkara ini dipanggil petunjuk,
yang walaupun ia topik yang agak sukar difahami,
ternyata bahawa ia akan sebagai cara dengan mana kita
boleh mula membina dan memasang program-program yang lebih canggih.
Tetapi kita lakukan pada Rabu lalu melalui beberapa claymation pertama.
Jadi ini, ingat, adalah Binky dan kami selalu dia
untuk mengambil lihat pada program yang tidak benar-benar melakukan apa-apa yang menarik,
tetapi ia tidak mendedahkan beberapa masalah.
Jadi bermula hari ini, mengapa tidak kita berjalan cepat melalui beberapa langkah-langkah ini,
cuba untuk menyuling ke dalam istilah manusia apa yang berlaku di sini
dan mengapa ini tidak baik, dan kemudian beralih dan benar-benar mula membina sesuatu
dengan teknik ini?
Jadi ini adalah yang pertama dua baris dalam program ini
dan dari segi orang biasa itu, apa sedang kedua-dua baris buat?
Seseorang yang munasabah yang selesa dengan apa yang diisytiharkan pada skrin?
Apakah kedua-dua baris buat?
Ia bukan semua yang berbeza dari minggu satu,
tetapi terdapat beberapa simbol khas.
Ya?
Kembali ke sana.
>> PENONTON: Mengisytiharkan petunjuk?
DAVID MALAN: Katakanlah lagi?
PENONTON: Mengisytiharkan petunjuk?
DAVID MALAN: Mengisytiharkan petunjuk dan mari kita menghalusi lebih sedikit.
PENONTON: [didengar] alamat x dan kemudian y.
DAVID MALAN: Dan kemudian alamat.
Jadi secara khusus apa yang kami lakukan adalah kita mengisytiharkan dua pembolehubah.
Pembolehubah ini, walaupun, akan sebagai jenis int bintang, yang
lebih khusus bermakna mereka akan menyimpan
alamat int, masing-masing, x dan y.
Maka adakah nilai?
Adakah terdapat mana-mana alamat sebenar dalam ini dua pembolehubah pada masa ini?
No.
Ia hanya apa yang dipanggil nilai sampah.
Jika anda tidak benar-benar menetapkan berubah-ubah, apa sahaja yang di dalam RAM
sebelum ini akan isi dengan sifar dan orang yang kedua-dua mereka pembolehubah.
Tetapi kita masih belum tahu apa yang mereka dan itulah
akan menjadi kunci mengapa Binky kehilangan kepalanya pada minggu lalu.
>> Jadi ini adalah claymation yang penjelmaan ini
di mana anda mempunyai hanya dua pembolehubah, keping bulat sedikit tanah liat,
yang boleh menyimpan pembolehubah, tetapi sebagai anak panah berselimut mencadangkan,
mereka tidak sebenarnya menunjuk ke mana-mana dikenali semata-mata.
Sebab itu kita mempunyai garis ini, dan ini adalah baru minggu lepas, malloc untuk ingatan
peruntukan, yang hanya cara yang mewah memberitahu sistem operasi, Linux
atau Mac OS atau Windows, hey, memberi aku ingatan,
dan semua yang anda perlu memberitahu sistem operasi
adalah apa apabila meminta ia untuk ingatan.
Ia tidak akan peduli apa anda akan lakukan dengan ia,
tetapi anda perlu memberitahu operasi sistem apa dengan cara malloc.
Ya?
>> PENONTON: Berapa banyak?
DAVID MALAN: Berapa banyak?
Berapa banyak dalam bait, dan sebagainya, ini, sekali lagi, contoh yang dibuat-buat, hanya mengatakan,
memberi saya saiz int.
Sekarang, saiz int adalah empat bait atau 32 bit.
Jadi ini adalah hanya satu cara untuk berkata, hey, sistem operasi,
memberi saya empat bait memori yang boleh saya gunakan ada pada saya,
dan khususnya, apa yang tidak pulangan malloc berkenaan
itu sebahagian daripada empat bait?
PENONTON: Alamat?
DAVID MALAN: Alamat.
Alamat bahawa sebahagian daripada empat bait.
Tepat sekali.
Dan supaya apa yang disimpan akhirnya dalam x dan sebab itu kita tidak benar-benar
peduli apa jumlah yang alamat, sama ada ia OX1 atau OX2
atau beberapa alamat perenambelasan samar.
Kami hanya mengambil berat bergambar yang bahawa pemboleh ubah x kini
menunjuk kepada yang sebahagian memori.
Jadi anak panah mewakili penunjuk, atau lebih khusus, alamat ingatan.
Tetapi sekali lagi, kita tidak biasanya mengambil berat apa yang orang-orang alamat sebenar adalah.
Sekarang, talian ini mengatakan apa dari segi orang biasa itu?
Bintang x mendapat 42 koma bertitik.
Apakah ini bermakna?
Anda mahu pergi?
Jangan menggaru leher anda.
>> PENONTON: Alamat x adalah pada 42.
>> DAVID MALAN: Alamat x adalah pada 42.
Tidak cukup.
Begitu dekat, tetapi tidak cukup, kerana ada bintang yang yang x awalan ini.
Oleh itu, kita perlu tweak sedikit.
Ya?
>> PENONTON: Nilai bahawa penunjuk x menunjuk ke 42.
DAVID MALAN: OK.
Nilai yang penunjuk x ialah menunjuk ke, katakan, hendaklah menjadi 42,
atau meletakkan cara lain, bintang x kata, pergi kepada apa sahaja alamat
adalah dalam x, sama ada 1 Oxford Jalan atau 33 Oxford Street
atau OX1 atau ox33, apa sahaja bahawa alamat angka adalah,
bintang x adalah penyahrujukan x.
Jadi pergi ke alamat itu dan kemudian meletakkan nombor 42 di sana.
Supaya akan menjadi cara sama dengan mengatakan bahawa.
Jadi itu sahaja halus dan kemudian kita akan mewakili gambar
seperti berikut di mana kami telah menambah 42 itu sebahagian daripada empat
bait di sebelah kanan, tetapi garis ini adalah di mana perkara yang pergi jauh menyimpang
dan kepala Binky ini muncul off pada ketika ini,
kerana perkara-perkara buruk berlaku apabila anda dereference nilai sampah
atau anda dereference tidak sah petunjuk, dan aku berkata tidak sah
kerana pada ketika ini dalam cerita, maksud yang terkandung dalam y?
Apakah nilai y berdasarkan mengenai langkah-langkah kebelakangan ini?
Ya?
Apa itu?
>> PENONTON: Satu alamat.
DAVID MALAN: Satu alamat.
Ia harus menjadi satu alamat tetapi saya dimulakan ia?
Jadi saya tidak perlu lagi.
Jadi apa yang dikenali sebagai di sana?
Ia hanya beberapa nilai sampah.
Ia boleh menjadi mana-mana alamat dari sifar hingga 2000000000 jika anda mempunyai dua gig RAM,
atau sifar ke 4000000000 jika anda telah mendapat empat gigabait RAM.
Ia adalah beberapa nilai sampah, tetapi masalahnya ialah
bahawa sistem operasi, jika ia tidak memberikan anda
yang sebahagian memori khusus yang anda cuba untuk pergi ke,
ia biasanya akan menyebabkan apa kami telah dilihat sebagai satu kesalahan segmentasi.
Jadi sebenarnya, mana-mana orang yang mempunyai bergelut pada masalah pada waktu pejabat
atau dalam masalah yang lebih secara amnya dengan cuba untuk memikirkan
kesalahan segmentasi, yang biasanya bermakna
anda menyentuh segmen memori yang anda tidak perlu.
Anda menyentuh memori yang sistem operasi tidak mempunyai
membolehkan anda untuk menyentuh, sama ada dengan pergi terlalu jauh dalam pelbagai anda
atau memulakan sekarang, sama ada ia adalah kerana anda menyentuh
memori yang hanya beberapa nilai sampah.
>> Berbuat demikian bintang x di sini jenis tingkah laku ditentukan.
Anda tidak boleh melakukannya kerana kemungkinan sedang, program ini hanya akan kemalangan,
kerana anda katakan, pergi ke alamat ini
dan anda tidak tahu di mana alamat yang sebenarnya.
Jadi sistem operasi itu mungkin akan crash program anda
akibat dan sesungguhnya, itulah apa yang berlaku di sana untuk Binky.
Jadi akhirnya, Binky tetap masalah ini dengan ini.
Jadi program itu sendiri adalah cacat.
Tetapi jika anda jenis mara ke hadapan dan melaksanakan garis ini sebaliknya,
y sama x hanya bermakna apa sahaja alamat adalah x, juga memasukkannya ke dalam y.
>> Dan sebagainya bergambar, kami telah diwakili ini dengan dua anak panah
dari x dan dari y menunjuk ke tempat yang sama.
Jadi semantik, x sama kepada y kerana kedua-dua mereka
menimbun yang sama alamat, ergo menunjuk pada 42,
dan kini, dengan berkata bintang y, pergi ke alamat dalam y,
ini mempunyai kesan sampingan yang menarik.
Jadi alamat dalam y adalah Perkara yang sama seperti alamat yang dalam x.
Jadi, jika anda mengatakan pergi ke alamat dalam y dan menukar nilai kepada 13,
siapa lagi ia berlaku?
X, titik D, boleh dikatakan, harus terjejas juga.
>> Dan sesungguhnya, bagaimana Nick menarik gambar ini dalam claymation betul-betul itu.
Walaupun kita mengikuti penunjuk y, kita berakhir di tempat yang sama,
dan sebagainya jika kita mencetak keluar x atau pointee y,
maka kita akan melihat nilai 13.
Sekarang, saya katakan pointee menjadi konsisten dengan video.
Pengaturcara, untuk saya pengetahuan, tidak pernah benar-benar
mengatakan pointee perkataan, apa yang ada tajam
di, tetapi untuk konsisten dengan video, menyedari
itu sahaja yang telah bermakna dalam keadaan itu.
Jadi apa-apa soalan mengenai claymation atau petunjuk atau malloc sahaja lagi?
Tidak?
Baiklah.
>> Jadi tanpa lanjut ado, mari kita lihat
di mana ini sebenarnya mempunyai telah digunakan untuk beberapa ketika.
Oleh itu, kita mempunyai perpustakaan CS50 ini yang mempunyai semua fungsi-fungsi ini.
Kami telah menggunakan GetInt banyak, GetString, mungkin GetLongLong awal
dalam Serangga saya satu atau lebih, tetapi apa yang sebenarnya telah berlaku?
Nah, mari kita melihat cepat di bawah hood di program yang
memberi inspirasi mengapa kami memberi anda CS50 perpustakaan, dan sesungguhnya pada minggu lepas,
kita mula mengambil orang-orang roda latihan di luar.
Jadi ini kini disusun daripada bedah siasat apa
telah berlaku dalam perpustakaan CS50,
walaupun kita kini akan mula bergerak jauh dari itu bagi kebanyakan program.
>> Jadi ini adalah satu program yang dipanggil scanf 0.
Ia sangat pendek.
Ia hanya mempunyai ayat-ayat ini, tetapi ia memperkenalkan scanf fungsi dipanggil
bahawa kita sebenarnya akan melihat dalam seketika di dalam perpustakaan CS50,
walaupun dalam bentuk yang sedikit berbeza.
Jadi program ini di talian 16 yang mengisytiharkan x berubah-ubah.
Maka berikanlah kepadaku empat bait untuk int.
Ia telah memberitahu pengguna, nombor kehendaki, dan kemudian
ini adalah barisan yang menarik yang sebenarnya mengikat bersama-sama pada minggu lepas
dan ini.
Scanf, dan kemudian melihat ia mengambil rentetan format, seperti printf,
% i bermakna int, dan kemudian ia mengambil Hujah kedua yang kelihatan sedikit
funky.
Ia Ampersand x, dan untuk menarik balik, kita hanya lihat minggu sekali terakhir ini.
Apakah Ampersand x mewakili?
Apakah Ampersand dilakukan di C?
Ya?
>> PENONTON: Alamat.
DAVID MALAN: Alamat.
Jadi ia adalah sebaliknya pengendali bintang,
manakala pengendali bintang itu berkata, pergi ke alamat ini, pengendali Ampersand
berkata, memikirkan alamat pembolehubah ini,
dan sebagainya ini adalah kunci, kerana tujuan scanf dalam kehidupan
adalah untuk mengimbas pengguna ini input daripada papan kekunci,
bergantung kepada apa sahaja yang dia jenis, dan kemudian membaca input pengguna tersebut
ke dalam pembolehubah, tetapi kita lihat dalam dua minggu yang lalu
bahawa fungsi swap yang kita cuba dengan mudah untuk melaksanakan
hanya patah.
Ingat bahawa dengan fungsi swap, jika kita hanya mengisytiharkan A dan B seperti ints,
kami tidak berjaya menukar dua pemboleh ubah di dalam pertukaran
hanya suka dengan susu dan OJ, tetapi sebaik sahaja pertukaran kembali,
apakah keputusan berkenaan dengan x dan y, nilai asal?
Apa-apa.
Yeah.
Tiada apa yang berlaku waktu itu, sebab swap berubah hanya salinan tempatan,
yang mengatakan, semua kali ini, setiap kali kita ada
telah lulus dalam hujah-hujah dengan fungsi, kami
hanya lulus salinan mereka hujah.
Anda boleh lakukan dengan yang apa sahaja yang anda mahu dengan mereka,
tetapi mereka akan tidak mempunyai kesan ke atas nilai asal.
Jadi ini adalah bermasalah jika anda mahu mempunyai fungsi seperti scanf
dalam kehidupan, yang tujuan adalah untuk mengimbas input pengguna dari keyboard
dan kemudian isikan tempat kosong, jadi untuk berkata-kata, iaitu, memberi pembolehubah seperti x
nilai, kerana jika saya untuk melepaskan sahaja x untuk scanf,
jika anda mengambil kira logik lalu minggu, scanf boleh melakukan apa sahaja yang ia mahu
dengan salinan x, tetapi ia tidak boleh secara kekal menukar x melainkan kita memberi
scanf peta harta, boleh dikatakan, mana x menandakan tempat, di mana
kita lulus dalam alamat x supaya scanf boleh pergi ke sana dan sebenarnya perubahan
nilai x.
Dan sebagainya memang, semua bahawa program ini tidak
jika saya membuat scanf 0, dalam sumber saya Direktori 5m, membuat scanf 0,
dot mengurangkan scanf, nombor sila 50, terima kasih untuk 50.
>> Jadi ia tidak semua yang menarik, tetapi apa yang sebenarnya berlaku
adalah bahawa sebaik sahaja saya memanggil scanf sini, nilai x
sedang selama-lamanya berubah.
Sekarang, ini seolah-olah baik dan baik, dan sebenarnya, ia
seolah-olah seperti kita tidak benar-benar memerlukan perpustakaan CS50 sama sekali lagi.
Sebagai contoh, mari kita berjalan ini sekali lagi di sini.
Biar saya membukanya semula untuk kali kedua.
Mari kita cuba sebilangan sila dan daripada berkata 50 seperti sebelum ini,
mari kita hanya mengatakan tidak.
OK, itu sedikit pelik.
OKAY.
Dan hanya beberapa karut di sini.
Oleh itu, ia seolah-olah tidak menangani situasi yang salah.
Oleh itu, kita perlu secara minimum permulaan menambah beberapa ralat semakan
memastikan bahawa pengguna mempunyai ditaip dalam jumlah yang sebenar seperti 50,
kerana nampaknya menaip perkataan tidak dikesan sebagai bermasalah,
tetapi ia mungkin boleh.
>> Mari kita lihat versi ini kini itulah percubaan saya untuk mengimplemen semula GetString.
Jika scanf mempunyai semua ini fungsi terbina dalam,
mengapa kita telah berkecimpung dengan ini roda latihan seperti GetString?
Nah, di sini mungkin saya sendiri Versi mudah GetString
mana seminggu yang lalu, saya mungkin berkata, memberi saya rentetan dan memanggilnya penampan.
Hari ini, saya akan mula hanya berkata bintang char, yang, ingat,
ia hanya sinonim.
Ia kelihatan menakutkan tetapi ia perkara sama.
Itu, kurniakanlah daku penampan pembolehubah dipanggil yang akan menyimpan rentetan,
memberitahu rentetan pengguna sila, dan kemudian, sama seperti sebelum ini,
mari kita cuba untuk meminjam pelajaran ini scanf % s masa ini dan kemudian lulus dalam buffer.
Kini, cek kewarasan cepat.
Kenapa saya tidak mengatakan Ampersand penampan kali ini?
Membuat kesimpulan daripada contoh sebelumnya.
PENONTON: Char bintang ini penunjuk.
DAVID MALAN: Tepat sekali, kerana kali ini, char
bintang sudah menjadi penunjuk, alamat, dengan takrif bahawa bintang berada di sana.
Dan jika scanf menjangka alamat, ia mencukupi hanya untuk lulus dalam penampan.
Saya tidak perlu berkata penampan Ampersand.
Bagi yang ingin tahu, anda boleh melakukan sesuatu seperti ini.
Ia akan mempunyai maksud yang berbeza.
Ini akan memberikan anda penunjuk kepada penunjuk, yang sebenarnya
satu perkara yang sah di C, tetapi untuk sekarang, mari kita memastikan ia mudah
dan cerita yang konsisten.
Saya hanya akan lulus dalam penampan dan itu betul.
Masalahnya walaupun adalah ini.
Biar saya pergi ke hadapan dan menjalankan ini program selepas menyusun ia.
Membuat scanf 1.
Sialan, pengkompil saya menangkap kesilapan saya.
Berikan saya satu saat.
Dilafaz.
Katakan scanf-1.c.
OKAY.
Di sana kami pergi.
Saya perlukannya.
ID CS50 mempunyai pelbagai tetapan tatarajah
yang melindungi anda terhadap diri anda.
Saya perlu untuk melumpuhkan mereka dengan berjalan dilafaz secara manual masa ini.
Jadi rentetan sila.
Saya akan pergi ke hadapan dan taip di dunia hello kegemaran saya.
OK, null.
Itu bukan apa yang saya taip.
Jadi ia menunjukkan sesuatu yang salah.
Biar saya pergi ke hadapan dan taip dalam rentetan benar-benar panjang.
Terima kasih kerana batal dan saya tidak tahu jika saya akan dapat kemalangan itu.
Mari kita cuba satu salinan kecil paste dan lihat jika ini dapat membantu.
Hanya tampal banyak ini.
Ia pasti yang lebih besar rentetan daripada biasa.
Mari kita benar-benar menulisnya.
No.
Tak guna.
Perintahkanlah tidak dijumpai.
Jadi, itu tidak berkaitan.
Ini kerana saya ditampal beberapa watak yang tidak baik,
tetapi ini ternyata tidak akan berfungsi.
>> Mari kita cuba ini sekali lagi, kerana ia lebih menyeronokkan jika kita benar-benar kemalangan itu.
Mari kita menaip ini dan sekarang, saya akan menyalin rentetan benar-benar panjang
dan sekarang mari kita lihat jika kita boleh kemalangan perkara ini.
Notis saya ditinggalkan ruang dan barisan baru dan koma bertitik
dan semua watak funky.
Enter.
Dan kini rangkaian cuma lambat.
Saya ditekan Command-V terlalu lama, dengan jelas.
Tak guna!
Perintahkanlah tidak dijumpai.
>> OKAY.
Nah, persoalannya adalah namun berikut.
Jadi apa yang sebenarnya akan pada dengan pengakuan ini
penimbal bintang char pada baris 16?
Jadi apa yang saya mendapat apabila saya mengisytiharkan penunjuk?
Semua Saya mendapat adalah nilai empat bait dipanggil penampan, tetapi apa yang di dalamnya
pada masa ini?
Ia hanya beberapa nilai sampah.
Kerana bila-bila masa anda mengisytiharkan pembolehubah dalam C, ia hanya beberapa nilai sampah,
dan kami mula perjalanan lebih realiti ini.
Sekarang, apabila saya memberitahu scanf, pergi ke alamat ini
dan meletakkan apa sahaja jenis pengguna dalam.
Jika jenis pengguna dalam hello dunia, baik, di mana saya meletakkan ia?
Buffer adalah nilai sampah.
>> Jadi itulah jenis seperti anak panah yang menunjuk siapa tahu di mana.
Mungkin ia menunjuk di sini di ingatan saya.
Dan supaya apabila pengguna jenis di dunia hello,
program ini cuba untuk meletakkan rentetan hello dunia backslash 0
kerana sebahagian memori.
Tetapi dengan kebarangkalian yang tinggi, tetapi jelas tidak 100% kebarangkalian,
komputer akan kemudian berlanggar program ini kerana ini bukan
ingatan saya harus dibenarkan untuk menyentuh.
Jadi ringkasnya, program ini adalah boleh dipercayai sama sekali untuk betul-betul sebab itu.
Saya pada dasarnya tidak melakukan apa?
Apakah langkah-langkah yang telah saya ditinggalkan, seperti kita ditinggalkan dengan contoh pertama Binky ini?
Ya?
>> PENONTON: Peruntukan memori?
>> DAVID MALAN: peruntukan Memori.
Saya tidak benar-benar diperuntukkan apa-apa memori untuk tali itu.
Oleh itu, kita boleh menetapkan ini dalam beberapa cara.
Satu, kita boleh memastikan ia mudah dan sebenarnya, kini anda
akan mula melihat kabur yang garis antara apa
array, apa tali adalah, apa yang char bintang ini, apa yang pelbagai aksara
adalah.
Berikut adalah contoh yang kedua yang melibatkan tali dan notis
semua yang saya lakukan di talian 16 adalah, daripada berkata
penampan yang akan menjadi char bintang, penunjuk kepada sebahagian memori,
Saya akan memberikan yang proaktif diri saya penampan bagi 16 aksara,
dan sebenarnya, jika anda sudah biasa dengan buffering istilah,
mungkin dari dunia video, mana video adalah buffering, buffering,
buffering.
Nah, apa yang berkaitan di sini?
Nah, Di dalam YouTube dan di dalam pemain video
secara amnya adalah array yang lebih besar daripada 16.
Ia mungkin pelbagai saiz satu megabait, mungkin 10 megabait,
dan ke dalam pelbagai yang tidak penyemak imbas anda turun sejumlah bait,
sejumlah besar megabait video, dan pemain video,
YouTube atau sesiapa yang, bermula membaca bait dari pelbagai itu,
dan bila-bila masa anda melihat perkataan buffering, buffering,
ini bermakna pemain mempunyai mendapat ke akhir array itu.
Rangkaian ini sangat pelan dan ia tidak mempunyai diisi semula array dengan lebih bytes
dan supaya anda berada di luar bit untuk dipaparkan kepada pengguna.
>> Jadi penampan adalah istilah apt di sini kerana ia hanya pelbagai, sebahagian memori.
Dan ini akan memperbaikinya kerana ia ternyata
bahawa anda boleh merawat tatasusunan seolah-olah mereka alamat, walaupun penampan
hanya simbol, ia adalah satu jujukan aksara, penampan,
yang berguna untuk saya, pengaturcara, anda boleh lulus namanya sekitar
seolah-olah ia adalah suatu penunjuk, seolah-olah ia
adalah alamat sebahagian yang memori untuk 16 aksara.
Jadi, itu untuk mengatakan, saya boleh lulus scanf betul-betul perkataan yang
dan demikian sekarang, jika saya membuat program ini, membuat scanf 2, dot slash scanf 2,
dan taip hello dunia, Enter, time-- yang
>> Hmm, apa yang berlaku?
String sila.
Apa yang saya buat salah?
Hello dunia, penampan.
Hai dunia.
Ah, saya tahu apa yang ia lakukan.
OKAY.
Jadi ia membaca sehingga sehingga ruang yang pertama.
Jadi mari kita menipu untuk hanya seketika dan mengatakan saya hanya mahu menaip sesuatu
benar-benar panjang seperti ini adalah ayat yang panjang itulah salah satu, dua, tiga, empat, lima,
enam, tujuh, lapan, sembilan, 10, 11, 12, 13, 14, 15, 16.
OKAY.
Sesungguhnya ia adalah hukuman yang panjang.
Jadi ayat ini adalah lebih lama daripada 16 aksara
Dan setelah saya tekan Enter, apa yang akan berlaku?
Nah, dalam kes ini daripada penampan cerita, saya telah mengisytiharkan
untuk benar-benar menjadi array dengan 16 aksara bersedia untuk pergi.
Jadi, satu, dua, tiga, empat, lima, enam, tujuh, lapan, sembilan, 10, 11, 12, 13, 14,
15, 16.
Jadi 16 aksara, dan kini, apabila saya membaca dalam sesuatu seperti ini adalah yang panjang
ayat, apa yang akan berlaku adalah bahawa saya akan membaca yang demikian mengandungi satu lama
S-E-N-T-E-N-C-E, hukuman.
>> Jadi ini adalah sengaja perkara yang tidak baik yang saya
terus menulis di luar sempadan pelbagai saya,
luar sempadan penampan saya.
Saya boleh mendapatkan bertuah dan program akan terus berjalan dan tidak peduli,
tetapi secara umumnya bercakap, ini sesungguhnya akan kemalangan program saya,
dan ia adalah pepijat dalam saya kod masa ini saya melangkah
di luar sempadan array itu, kerana saya
tidak tahu jika ia semestinya akan crash
atau jika saya hanya akan mendapat bertuah.
Jadi ini adalah bermasalah kerana dalam kes ini, ia seolah-olah untuk bekerja
dan mari kita menggoda nasib di sini, walaupun IDE seolah-olah bertolak ansur dengan agak sedikit
daripada-
>> Di sana kami pergi.
Akhirnya.
Jadi saya satu-satunya yang boleh melihat ini.
Jadi saya hanya mempunyai banyak menaip menyeronokkan daripada frasa yang sebenar benar-benar panjang
bahawa ia pasti melebihi 16 bait, kerana saya
ditaip dalam berbilang talian ini lama gila frasa, dan kemudian melihat apa yang berlaku.
Program ini cuba mencetaknya dan ketika ia kesalahan segmentasi
dan kesalahan segmentasi adalah apabila sesuatu seperti ini berlaku
dan sistem operasi itu berkata tidak, tidak boleh menyentuh memori itu.
Kita akan membunuh program ini sama sekali.
>> Jadi ini kelihatan bermasalah.
Saya telah menyempurnakan program di mana sekurang-kurangnya mempunyai beberapa memori,
tetapi ini akan kelihatan untuk menghadkan fungsi GetString untuk mendapat
tali panjang lebar terhingga 16.
Jadi, jika anda mahu menyokong lagi ayat daripada 16 aksara,
apa yang awak buat?
Dengan baik, anda boleh meningkatkan saiz penimbal ini kepada 32
atau bahawa seolah-olah jenis pendek.
Apa kata kita hanya membuat ia 1000 tetapi menolak kembali.
Apakah sambutan yang intuitif daripada hanya mengelakkan masalah ini dengan membuat
penampan saya lebih besar, seperti 1000 aksara?
Dengan melaksanakan GetString cara ini.
Apa yang baik atau buruk di sini?
Ya?
PENONTON: Jika anda mengikat banyak ruang dan anda tidak menggunakannya,
maka anda tidak boleh mengagihkan semula ruang itu.
DAVID MALAN: Sudah tentu.
Ia membazir setakat yang jika tidak benar-benar memerlukan 900 orang bytes
tetapi anda meminta 1000 dalam jumlah anyway,
anda hanya memakan lebih banyak memori pada komputer pengguna daripada apa yang anda perlu,
dan selepas semua, sebahagian daripada anda telah dihadapi
dalam kehidupan apabila anda berada menjalankan banyak program
dan mereka makan sehingga banyak memori, ini sebenarnya boleh memberi kesan kepada prestasi
dan pengalaman pengguna pada komputer.
Jadi itulah jenis penyelesaian malas, yang pasti, dan sebaliknya,
ia bukan sahaja membazir, apa masalah masih kekal, walaupun saya membuat penampan saya
1000?
Ya?
>> PENONTON: Rentetan adalah panjang 1,001.
DAVID MALAN: Tepat sekali.
Jika tali anda adalah panjang 1001, anda mempunyai masalah yang sama,
dan dengan hujah saya, saya akan hanya kemudian menjadikan tahun 2000,
tetapi anda tidak tahu dalam memajukan berapa besar yang sepatutnya,
dan lagi, saya perlu menyusun program saya sebelum membiarkan orang menggunakan dan memuat turun
ia.
Jadi ini adalah betul-betul jenis barangan bahawa CS50 perpustakaan try
untuk membantu kami dengan dan kami akan hanya pandang di beberapa pelaksanaan asas
di sini, tetapi ini adalah CS50 dot C. Ini adalah fail yang sudah di CS50 IDE
semua minggu ini yang anda telah gunakan.
Ia pra-disusun dan anda telah telah menggunakan ia secara automatik
dengan sifat yang mempunyai melontarkan L CS50 bendera dengan dilafaz,
tetapi jika saya tatal ke bawah melalui semua fungsi-fungsi ini, di sini adalah GetString,
dan hanya untuk memberikan anda satu rasa apa yang berlaku,
mari kita lihat cepat pada kerumitan relatif.
Ia bukan yang lama hilang fungsi, tetapi kita tidak
perlu berfikir keras tentang semua bagaimana untuk pergi tentang mendapatkan tali.
>> Jadi di sini adalah penampan saya dan saya nampaknya memulakan ia ke nol.
Ini, sudah tentu, adalah perkara yang sama seperti char bintang,
tetapi saya mengambil keputusan dalam melaksanakan perpustakaan CS50
bahawa jika kita akan benar-benar dinamik,
Saya tidak tahu terlebih dahulu berapa besar daripada pengguna rentetan akan mahu untuk mendapatkan.
Jadi, saya akan memulakan dengan hanya rentetan kosong
dan saya akan membina sebanyak memori yang saya perlukan untuk muat rentetan pengguna
dan jika saya tidak mempunyai cukup, saya akan bertanya
sistem operasi untuk lebih banyak memori.
Saya akan bergerak rentetan mereka menjadi sebahagian yang lebih besar memori
dan saya akan melepaskan atau membebaskan sebahagian tidak cukup memori yang besar
dan kami hanya akan untuk melakukan ini secara berulang.
>> Jadi pandangan yang cepat, di sini hanya pembolehubah
yang aku nak untuk mengesan kapasiti penimbal saya.
Berapa banyak bait yang boleh saya patut?
Berikut adalah n ubah dengan yang saya akan menjaga
mengesan berapa banyak bait sebenarnya dalam penampan atau pengguna itu telah ditaip.
Jika anda tidak melihat ini sebelum ini, anda boleh menentukan bahawa pembolehubah seperti int
adalah tidak ditandatangani, yang seperti namanya, bermakna ia bukan negatif, dan mengapa akan
Yang pernah saya mahu mengganggu dengan menjelaskan jika yang int bukan sahaja int,
tetapi ia int tidak ditandatangani?
Ia adalah satu int bukan negatif.
Apakah yang dikatakan [didengar] bermakna?
>> PENONTON: Ia menggambarkan jumlah yang memori yang boleh [didengar].
>> DAVID MALAN: Ya.
Jadi, jika saya mengatakan tidak ditandatangani, ini sebenarnya memberikan anda satu bit memori tambahan
dan ia seolah-olah jenis bodoh, tetapi jika anda mempunyai satu sedikit memori tambahan, yang
bermakna anda mempunyai dua kali ganda nilai yang anda boleh mewakili,
kerana ia boleh menjadi 0 atau 1.
Jadi secara lalai, int boleh kira-kira negatif 2000000000 sepanjang jalan
sehingga positif 2 bilion.
Mereka adalah julat yang besar, tetapi ia masih sejenis membazir
jika anda hanya mengambil berat tentang saiz, yang hanya mengikut gerak hati
harus bukan negatif atau positif atau 0, dan kemudian,
mengapa engkau membuang 2000000000 nilai yang mungkin bagi nombor negatif
jika anda tidak akan menggunakannya?
Jadi dengan mengatakan tidak ditandatangani, kini saya boleh int antara 0 dan kira-kira 4 bilion.
>> Jadi di sini adalah hanya int C atas sebab-sebab kami tidak akan masuk ke dalam tadi sebagai
mengapa ia adalah satu int sebaliknya char, tetapi di sini adalah
intipati apa yang berlaku pada, dan sebahagian dari kamu
mungkin menggunakan, sebagai contoh, fungsi fgetc walaupun dalam pset empat
atau selepas itu, kita akan melihat ia lagi dalam masalah menetapkan lima,
fgetc adalah baik kerana sebagai nama jenis, jenis arcanely mencadangkan,
ia adalah fungsi yang mendapat watak dan sebagainya,
apa yang pada asasnya berbeza tentang apa yang kita lakukan dalam GetString
adalah kita tidak menggunakan scanf dengan cara yang sama.
Kami hanya menjalar di sepanjang langkah demi langkah atas apa sahaja yang pengguna itu telah ditaip dalam,
kerana kita sentiasa boleh memperuntukkan satu char, dan dengan itu kita boleh sentiasa selamat
melihat satu char pada satu masa, dan sihir mula berlaku di sini.
Saya akan tatal ke bawah ke pertengahan fungsi ini
hanya untuk memperkenalkan secara ringkas fungsi ini.
Sama seperti ada Fungsi malloc, ada
fungsi realloc mana realloc membolehkan anda mengagihkan semula sebahagian memori
dan menjadikannya lebih besar atau lebih kecil.
Cerita jadi pendek dan panjang dengan menggerakkan tangan saya untuk hari ini,
tahu bahawa apa yang GetString yang dilakukannya adalah ia semacam
daripada ajaib tumbuh atau mengecut penampan sebagai pengguna
jenis yang masing-masing tali.
>> Jadi, jika jenis pengguna yang tali pendek, kod ini
hanya memperuntukkan cukup memori untuk muat tali.
Jika pengguna terus menaip seperti yang saya lakukan lagi dan lagi
dan sekali lagi, baik, jika ini penampan mulanya ini besar
dan program menyedari, untuk tunggu sebentar, saya keluar dari ruang,
ia akan menggandakan saiz penimbal
dan kemudian dua kali ganda saiz penimbal dan kod yang melakukan dua kali ganda itu,
jika kita lihat di sini, ia hanya ini pandai satu liner.
Anda tidak mungkin telah melihat sintaks ini sebelum ini, tetapi jika anda mengatakan bintang sama,
ini adalah perkara yang sama seperti berkata kali kapasiti 2.
Oleh itu, ia hanya menyimpan dua kali ganda kapasiti penimbal
dan kemudian memberitahu realloc untuk memberi sendiri bahawa memori banyak lagi.
>> Sekarang, sebagai diketepikan, terdapat adalah fungsi lain di sini
bahawa kita tidak akan melihat ke dalam apa-apa butiran selain daripada untuk menunjukkan dalam GetInt,
kita menggunakan GetString dalam GetInt.
Kami pastikan bahawa ia tidak batal, yang, ingat,
adalah nilai yang khas yang bermaksud sesuatu yang tidak kena.
Kami keluar dari ingatan.
Lebih baik periksa untuk itu.
Dan kita mengembalikan nilai sentinel.
Tetapi saya akan menangguhkan kepada komen-komen untuk mengapa dan maka kita menggunakan sepupu ini scanf
dipanggil sscanf dan ternyata yang scanf sscanf, atau tali,
membolehkan anda mengambil lihat pada baris yang pengguna itu telah ditaip dan membiarkan anda
menganalisis ia pada dasarnya dan apa yang saya lakukan di sini saya memberitahu sscanf,
menganalisis apa sahaja pengguna mempunyai ditaip dan memastikan% i,
terdapat integer di dalamnya, dan kita tidak akan masuk ke dalam hari ini dengan tepat mengapa ada juga
c% di sini, tetapi itu secara ringkas membolehkan kami mengesan jika pengguna telah ditaip
dalam sesuatu yang palsu selepas nombor.
Jadi sebab yang GetInt dan GetString memberitahu anda untuk mencuba semula, cuba semula, cuba semula
adalah kerana semua bahawa kod kami telah menulis,
ia adalah jenis melihat input pengguna dalam memastikan ia sepenuhnya angka
atau ia adalah satu terapung sebenar nilai mata atau sebagainya,
bergantung kepada apa nilai berfungsi yang anda gunakan.
>> Huh.
OKAY.
Mereka itu adalah satu hal yg tetapi penting di sini adalah
bahawa sebab kami terpaksa mereka roda latihan
adalah kerana pada tahap yang paling rendah, terdapat hanya begitu banyak perkara yang
boleh salah yang kita mahu untuk preemptively mengendalikan
perkara-perkara yang pasti di minggu terawal kelas,
tetapi kini dengan Serangga empat dan lima dan Serangga di luar anda akan melihat bahawa ia lebih kepada
anda tetapi juga anda akan lebih mampu menyelesaikan orang-orang jenis masalah
diri sendiri.
Sebarang pertanyaan mengenai GetString atau GetInt?
Ya?
>> PENONTON: Bagaimana kamu akan menggandakan kapasiti penimbal
bukan hanya meningkatkan oleh jumlah sebenar?
>> DAVID MALAN: Soalan yang baik.
Mengapa kita akan menggandakan kapasiti penimbal yang bertentangan
hanya meningkatkannya oleh beberapa nilai malar?
Ia merupakan satu keputusan reka bentuk.
Kami hanya membuat keputusan itu kerana ia cenderung untuk menjadi sedikit mahal masa-bijak untuk bertanya
sistem operasi untuk ingatan, kita tidak
mahu berakhir masuk ke kerja kerana tali besar
bahawa kita telah meminta OS lagi dan lagi
dan sekali lagi dan sekali lagi pada masa yang singkat untuk ingatan.
Oleh itu, kita hanya membuat keputusan, agak sewenang-wenangnya tetapi kami berharap munasabah,
itu, anda tahu apa, mari kita cuba untuk mendapatkan lebih awal daripada diri kita sendiri
dan hanya menyimpan dua kali ganda ia supaya kita mengurangkan jumlah kali
kita perlu memanggil malloc atau realloc, tetapi jumlah penghakiman
panggilan jika tiada mengetahui apa yang pengguna mungkin mahu menaip.
Kedua-dua cara boleh dipertikaikan.
Boleh dikatakan baik.
>> Oleh itu, mari kita lihat pada pasangan kesan sampingan lain ingatan,
perkara-perkara yang boleh pergi salah dan alat-alat yang anda boleh
gunakan untuk menangkap jenis-jenis kesilapan.
Ia ternyata anda semua, walaupun check50 tidak memberitahu anda sebanyak,
telah menulis kereta Kod sejak minggu satu,
walaupun semua ujian check50 adalah berlalu, dan walaupun anda dan TF anda
super yakin kod anda berfungsi seperti yang sepatutnya.
Kod anda telah kereta atau boleh dipercayai sama sekali kerana anda semua,
dalam menggunakan perpustakaan CS50, telah bocor ingatan.
Anda telah meminta sistem operasi untuk ingatan dalam kebanyakan program
anda tulis, tetapi anda telah sebenarnya tidak pernah diberikan kembali.
Anda dipanggil GetString dan GetInt dan GetFloat,
tetapi dengan GetString, anda telah pernah dipanggil unGetString atau Berikan
String Belakang atau sebagainya, tetapi kami telah lihat yang GetString tidak memperuntukkan memori
dengan cara malloc atau ini fungsi realloc, yang hanya
hampir sama di hadapan Allah, dan lagi, kita telah
meminta sistem operasi untuk memori dan memori lagi dan lagi
tetapi tidak pernah memberikan kembali.
>> Sekarang, sebagai diketepikan, ternyata bahawa apabila suatu program berhenti, kesemua memori yang
secara automatik dibebaskan.
Jadi ia tidak perjanjian yang besar.
Ia tidak akan memecahkan IDE atau benda perlahan ke bawah,
tetapi apabila program melakukan umumnya kebocoran memori
dan mereka berjalan untuk masa yang lama.
Jika anda pernah melihat sedikit bodoh bola pantai dalam Mac OS atau hourglass
pada Windows di mana ia adalah jenis memperlahankan atau berfikir atau pemikiran
atau hanya benar-benar mula perlahan merangkak,
sangat mungkin boleh menjadi hasil daripada kebocoran memori.
Pengaturcara yang menulis perisian yang anda gunakan
meminta sistem operasi untuk ingatan setiap beberapa minit, setiap jam.
Tetapi jika anda menjalankan perisian, walaupun ia
dikurangkan dalam komputer anda berjam-jam atau hari pada akhir,
anda mungkin akan meminta lebih dan lebih memori dan tidak pernah benar-benar menggunakannya
dan sebagainya kod anda mungkin, atau program mungkin bocor memori,
dan jika anda mula bocor memori, ada ingatan kurang untuk program lain,
dan kesan ini adalah untuk memperlahankan semua turun.
>> Sekarang, ini adalah setakat ini salah satu program yang paling kejam
anda akan mempunyai peluang berjalan di CS50 setakat
sebagai output adalah lebih esoterik daripada yang dilafaz atau membuat atau mana-mana arahan
program talian kami telah berjalan sebelum ini tetapi bersyukur, tertanam dalam output
adalah beberapa tips yang berguna yang super akan berguna sama ada untuk pset empat
atau pasti Serangga lima.
Jadi valgrind adalah alat yang yang boleh digunakan untuk melihat
kebocoran memori dalam program anda.
Ia agak mudah untuk menjalankan.
Anda menjalankan valgrind dan kemudian, walaupun walaupun ia adalah satu lantung sedikit,
dash dash kebocoran daftar sama penuh, dan kemudian dot
mengurangkan dan nama program anda.
Jadi valgrind akan menjalankan program anda dan bagi mereka yang terkemudian program anda
berjalan sebelum ia berhenti dan memberikan anda satu lagi segera,
ia akan menganalisis anda program semasa ia telah berjalan
dan memberitahu anda adakah anda bocor apa-apa memori dan lebih baik lagi,
adakah anda menyentuh memori yang bukan milik anda?
Ia tidak boleh menangkap segala-galanya, tetapi ia cukup baik menangkap perkara yang paling.
>> Jadi di sini adalah satu contoh yang mempunyai jangka saya program ini, mempunyai jangka valgrind,
pada program yang dikenali sebagai ingatan, dan saya akan
untuk menyerlahkan garisan yang akhirnya menarik kepada kami.
Jadi ada lebih gangguan bahawa saya telah dipadamkan dari slaid.
Tetapi mari kita lihat apa ini program mampu memberitahu kita.
Ia mampu memberitahu kita perkara-perkara seperti menulis tidak sah saiz 4.
Dalam erti kata lain, jika anda menyentuh memori, khusus 4 bait memori
bahawa anda tidak perlu mempunyai, valgrind boleh memberitahu anda bahawa.
Menulis tak sah saiz 4.
Anda menyentuh empat bait bahawa anda tidak perlu mempunyai.
Dari mana kamu berbuat demikian?
Ini adalah keindahan.
Memori dot c line 21 adalah di mana anda kacau dan itulah mengapa ia membantu.
Sama seperti GDB, ia boleh membantu menunjukkan anda di ralat sebenar.
>> Sekarang, yang satu ini adalah lebih sedikit banyak cakap, jika tidak mengelirukan.
40 bait dalam 1 blok pasti hilang dalam kehilangan rekod 1 daripada 1.
Apa maksudnya?
Nah, itu hanya bermakna anda meminta 40 bait dan pernah bapa memberikan kembali.
Anda dipanggil malloc atau anda dipanggil GetString dan sistem operasi
memberikan anda 40 bait, tetapi anda tidak pernah dibebaskan atau dilepaskan memori,
dan untuk berlaku adil, kita tidak pernah menunjukkan anda bagaimana untuk mengembalikan ingatan.
Rupa-rupanya ada yang super fungsi mudah dipanggil percuma.
Mengambil satu hujah, perkara yang anda mahu untuk membebaskan atau memberikan kembali,
tetapi 40 bait, nampaknya, dalam program ini
telah hilang di garisan 20 memori dot c.
>> Jadi mari kita lihat program ini.
Ia sangat berguna.
Ia hanya menunjukkan ini ralat tertentu.
Jadi mari kita lihat.
Berikut adalah utama dan utama, notis, panggilan fungsi yang dipanggil f dan kemudian pulangan.
Jadi tidak semua yang menarik.
Apakah f lakukan?
Notis saya tidak mengganggu dengan prototaip.
Saya mahu menyimpan kod di seperti yang minimum yang mungkin.
Jadi saya meletakkan f di atas utama dan itu baik, sudah tentu,
bagi program-program pendek seperti ini.
Jadi f tidak kembali apa-apa dan tidak tidak mengambil apa-apa, tetapi ia melakukan ini.
Ia menyatakan, sama seperti dalam contoh Binky ini,
penunjuk dipanggil x yang akan untuk menyimpan alamat int.
Jadi itulah yang sebelah kiri.
Dalam bahasa Inggeris, apakah sebelah kanan buat?
Sesiapa sahaja?
Apakah ini lakukan untuk kita?
Ya?
>> PENONTON: [didengar] kali saiz int
iaitu 10 kali ganda [didengar]
DAVID MALAN: Baik dan biarlah saya ringkaskan.
Jadi memperuntukkan ruang yang mencukupi untuk 10 integer atau 10, apa yang saiz int,
ia empat bait, jadi 10 kali 4 adalah 40, supaya sebelah kanan bahawa saya telah
diserlahkan adalah memberi saya 40 bait dan menyimpan alamat bait pertama
ke x.
Dan kini akhir sekali, dan di sini di mana program ini adalah kereta, apa yang
salah dengan line 21 berdasarkan logik itu?
Apa salahnya dengan line 21?
Ya?
PENONTON: Anda tidak boleh indeks ke x [didengar].
DAVID MALAN: Ya.
Saya tidak perlu indeks ke x seperti itu.
Jadi sintaksis, itu OK.
Apa yang baik adalah, sama seperti anda boleh merawat nama array
seolah-olah ia adalah penunjuk, begitu juga anda boleh merawat penunjuk seolah-olah ia
pelbagai, dan saya boleh sintaksis kata x kurungan sesuatu, x kurungan i,
tetapi 10 adalah bermasalah.
Mengapa?
>> PENONTON: Kerana ia bukan di dalam.
>> DAVID MALAN: Ia bukan dalam bahawa sebahagian memori.
Apakah nilai terbesar yang perlu saya dapat meletakkan dalam orang-orang kurungan persegi?
9, 0 hingga 9.
Kerana pengindeksan sifar.
Jadi 0 hingga 9 akan menjadi baik.
Kurungan 10 tidak baik dan tetapi, ingat walaupun, setiap kali
Saya seolah-olah cuba untuk membuat CS50 IDE kemalangan dengan menaip dalam nilai-nilai palsu,
ia tidak sentiasa bekerjasama, dan sesungguhnya, anda sering
mendapatkan bertuah hanya kerana sistem operasi tidak
melihat bahawa anda pernah jadi sedikit lulus beberapa sebahagian memori,
kerana anda menginap di dalam teknikal segmen anda, tetapi lebih kepada yang
dalam kelas sistem operasi, dan sebagainya seperti ini
dengan mudah dapat tanpa dikesan.
Program anda tidak pernah akan kemalangan konsisten tetapi mungkin sekali dalam seketika.
>> Dan jadi mari kita cuba valgrind mengenai perkara ini, dan di sini
di mana kita akan mendapat terharu oleh output seketika.
Oleh itu, ingatan valgrind kebocoran daftar sama dengan penuh memori dot mengurangkan.
Dan di sini sebabnya saya berjanji ini akan meliputi.
Berikut adalah apa yang valgrind, inilah yang seorang programmer, beberapa tahun ago-
memutuskan ia akan menjadi satu idea yang baik untuk output kelihatan seperti.
Jadi mari kita memahami ini.
Jadi semua cara di tangan meninggalkan sampingan tanpa sebab yang baik
adalah ID proses program kita hanya berjalan, pengecam unik
untuk program ini kita hanya berlari.
Kami dipadam bahawa dari slaid, tetapi ada
adalah beberapa maklumat yang berguna di sini.
>> Mari kita tatal ke atas ke bahagian paling atas.
Berikut adalah di mana kita bermula.
Jadi bukan semua output yang banyak.
Berikut adalah yang menulis tidak sah saiz 4 di talian 21.
Nah, apa yang line 21?
Line 21 adalah betul-betul ini dan ia masuk akal
bahawa saya dalam sah menulis 4 bait kerana saya
cuba untuk meletakkan integer ini, yang boleh menjadi apa-apa,
ia hanya berlaku untuk menjadi sifar, tetapi saya cuba
untuk meletakkan ia di lokasi yang yang bukan milik kepada saya.
Selain itu, turun di sini, 40 bait dalam salah satu blok pasti hilang dalam rekod 1.
Ini kerana apabila saya memanggil malloc di sini, saya sebenarnya tidak pernah membebaskan memori.
>> Jadi bagaimana kita boleh menetapkan ini?
Biar saya pergi ke hadapan dan menjadi sedikit lebih selamat dan tidak terdapat 9 dan biarlah saya di sini percuma x.
Ini adalah fungsi baru untuk hari ini.
Jika saya kini memutarkan membuat memori dot slash, mari kita berjalan valgrind atas sekali lagi,
memaksimumkan tingkap saya dan tekan Enter.
Sekarang, ia adalah baik.
Mereka mengebumikan berita baik dalam semua output ini.
Semua blok timbunan bebas.
Kita akan kembali kepada apa timbunan itu , tetapi tiada kebocoran yang mungkin.
Jadi ini adalah hanya satu lagi alat untuk kit alat anda
yang anda boleh mula mencari sekarang kesilapan seperti itu.
>> Tetapi mari kita lihat apa banyak lagi yang boleh berlaku di sini.
Mari kita peralihan sekarang untuk sebenarnya menyelesaikan masalah.
Sebagai mengetepikan, jika ini akan melegakan sedikit sedikit kekeliruan atau ketegangan,
ini kini lucu.
Yeah.
Yang cukup baik.
Kerana petunjuk adalah alamat dan alamat
secara umumnya oleh konvensyen ditulis dengan perenambelasan.
Ha, ha, ini adalah lucu sekarang.
Walau bagaimanapun, jadi mari kita kini sebenarnya menyelesaikan masalah.
Ini telah menjadi super, super tahap rendah setakat ini,
dan kita sebenarnya boleh lakukan berguna perkara dengan butir-butir peringkat rendah.
>> Oleh itu, kita memperkenalkan beberapa minggu lalu tanggapan array.
Pelbagai Bagus kerana ia sukar untuk membersihkan kod kami
kerana jika kita mahu menulis program dengan pelbagai pelajar
atau pelbagai nama-nama dan rumah-rumah dan asrama dan kolej dan semua itu,
kita boleh menyimpan segala-galanya lebih bersih di dalam array.
Tetapi mencadangkan satu halangan array setakat ini.
Walaupun anda tidak mengalami sendiri dalam program, hanya naluri,
apa yang perkara yang tidak baik tentang pelbagai, mungkin?
Saya mendengar beberapa murmurs.
PENONTON: Sukar untuk menukar saiz.
DAVID MALAN: Sukar untuk menukar saiz.
Anda tidak boleh mengubah saiz array, sebenarnya, per se
dalam C. Anda boleh memperuntukkan pelbagai lain, bergerak segala-galanya daripada yang lama
ke dalam baru, dan kini mempunyai sedikit ruang tambahan,
tetapi ia tidak seperti yang bahasa seperti Java atau Python
atau mana-mana nombor lain bahasa dengan yang ada di antara kamu
mungkin biasa di mana anda hanya boleh menyimpan menambah perkara-perkara
sampai membosankan ke akhir array.
Apabila anda mempunyai pelbagai saiz 6, iaitu saiz,
dan begitu banyak seperti idea yang lebih awal mempunyai penampan saiz yang tertentu,
anda perlu meneka keluar dari pintu apa saiz yang anda mahu ia menjadi?
Jika anda rasa terlalu besar, anda membuang ruang.
Jika anda rasa terlalu kecil, anda tidak boleh menyimpan data itu, sekurang-kurangnya
tanpa banyak kerja lagi.
>> Jadi hari ini, terima kasih kepada petunjuk, kita boleh mula menjahit bersama-sama adat kita sendiri
struktur data, dan dalam Malah, di sini adalah sesuatu yang
yang kelihatan lebih sedikit samar pada pandangan pertama,
tetapi ini adalah apa yang kita akan memanggil dikaitkan senarai, dan jenis namanya daripada meringkaskan
ia.
Ia adalah satu senarai nombor, atau dalam kes ini, senarai nombor,
tetapi ia boleh menjadi satu senarai apa-apa, tetapi ia dikaitkan bersama-sama dengan cara anak panah,
dan hanya mengambil tekaan dengan apa teknik
kita akan dapat untuk menjahit bersama-sama,
jenis seperti popcorn dengan benang, berpaut senarai segi empat tepat di sini?
Jumlahnya?
Apakah ciri-ciri bahasa yang mendasari?
>> PENONTON: penunjuk A.
>> DAVID MALAN: penunjuk A.
Jadi setiap anak panah ini di sini mewakili penunjuk atau hanya alamat.
Jadi dalam erti kata lain, jika saya mahu untuk menyimpan senarai nombor,
Saya tidak boleh hanya menyimpannya jika saya mahu keupayaan untuk berkembang dan mengecut
struktur data saya dalam array.
Jadi saya perlu mempunyai sedikit kecanggihan lanjut,
tetapi notis bahawa ini gambar jenis mencadangkan
bahawa jika anda baru sahaja mendapat benang kecil menghubungkan semua bersama-sama,
mungkin tidak begitu sukar untuk membuat ruang di antara dua daripada segi empat tepat
atau dua daripada nod, seperti yang kita akan mula memanggil mereka, dimasukkan ke dalam nod baru,
dan kemudian dengan beberapa thread baru, hanya parit tiga nod bersama-sama,
yang pertama, yang terakhir, dan yang bahawa anda hanya dimasukkan ke dalam tengah-tengah.
>> Dan sesungguhnya senarai berkaitan, tidak seperti pelbagai, adalah dinamik.
Ia boleh membesar dan ia boleh mengecut dan anda tidak
perlu tahu atau mengambil berat terlebih dahulu bagaimana data banyak yang anda akan dapat menyimpan,
tetapi ternyata kita perlu menjadi sedikit berhati-hati tentang bagaimana untuk melaksanakan ini.
Jadi pertama mari kita fikirkan bagaimana kita melaksanakan salah satu segi empat tepat sedikit.
Ia mudah untuk melaksanakan int.
Anda hanya berkata int n dan kemudian anda mendapat 4 bait untuk int,
tetapi bagaimana saya boleh mendapatkan int, memanggilnya n, dan kemudian penunjuk, mari kita memanggilnya datang.
Kita boleh memanggil ini apa-apa perkara yang kita mahu
tetapi saya memerlukan struktur data adat.
Ya?
>> PENONTON: Ampersand [didengar].
>> DAVID MALAN: Jadi Ampersand kita akan gunakan untuk mendapatkan alamat nod yang berpotensi.
Tetapi kita perlu satu lagi ciri C untuk
untuk memberikan saya keupayaan untuk mewujudkan ini rectangle adat, adat ini
berubah-ubah jika anda akan, dalam ingatan.
PENONTON: struct A.
DAVID MALAN: struct A.
Ingat dari minggu lepas, kami telah memperkenalkan struct, kata kunci ini agak mudah
yang membolehkan kita membuat perkara seperti ini.
C tidak datang dengan data yang struktur yang dikenali sebagai pelajar.
Ia datang dengan int dan terapung dan char dan itu, tetapi ia tidak datang dengan pelajar,
tetapi kita boleh mewujudkan satu jenis data pelajar, struktur pelajar, dengan sintaks ini
di sini.
Dan anda akan melihat ini lagi dan lagi.
Jadi jangan bimbang tentang menghafal kata kunci,
tetapi kata kunci yang penting adalah hanya hakikat bahawa kita berkata struct
dan kemudian kita memanggilnya pelajar dan di dalam pelajar adalah nama dan rumah
atau asrama atau sebagainya.
>> Dan sehingga kini hari ini, mari kita mencadangkan ini.
Saya telah menambah beberapa perkataan, tetapi jika saya mahu untuk melaksanakan ini segi empat tepat itu
mendapat kedua-dua int dan penunjuk, anda tahu apa, saya
akan mengisytiharkan struct yang dikenali sebagai nod.
Saya juga, di dalam itu, akan berkata bahawa nod, segi empat tepat ini, mempunyai int
dan kami akan memanggilnya n dan ia mempunyai penunjuk yang akan datang.
Dan ini adalah sedikit berjela-jela, tetapi jika anda berfikir tentang hal itu,
anak panah yang ada di gambar sebentar tadi adalah daripada jenis data?
Di mana setiap orang-orang anak panah menunjuk jenis struktur data apa?
Ia tidak menunjuk hanya untuk int per se.
Ia menunjuk kepada Perkara yang segi empat tepat keseluruhan
dan bahawa benda segi empat tepat, kita kata, dipanggil nod.
Dan supaya kita jenis perlu rekursif mentakrifkan ini seperti
bahawa nod, kita akan berkata, akan mengandungi int dipanggil n
dan penunjuk yang dipanggil depan dan jenis struktur data kepada yang
titik penunjuk nampaknya akan menjadi struct nod.
>> Jadi ini adalah annoyingly lantung dan hanya untuk bengah,
sebab mengapa kita tidak boleh hanya mengatakan ini, yang terus-terang
kelihatan banyak yang lebih mudah dibaca, kerana ingat bahawa C membaca
perkara yang atas ke bawah, kiri ke kanan.
Ia bukan sehingga kita sampai koma bertitik nod kata kunci benar-benar wujud.
Jadi, jika kita ingin mempunyai seperti ini rujukan kitaran dalam data
struktur, yang perlu kita lakukan ini, di mana kita katakan struct nod di bahagian atas, yang
memberikan kita cara yang lebih lama untuk menggambarkan ini perkara, maka di dalam kita katakan struct nod,
dan kemudian pada garis yang terakhir kita katakan, semua hak, C, dengan cara itu,
hanya memanggil sialan ini keseluruhan Perkara nod dan berhenti
menggunakan kata kunci struct sama sekali.
Jadi ini adalah hanya jenis yang sintaktik silap mata yang akhirnya membolehkan kami mereka
sesuatu yang kelihatan betul-betul seperti ini.
>> Jadi, jika kita menganggap sekarang kita boleh melaksanakan perkara ini dalam C,
bagaimana kita benar-benar mula menyeberangi ini?
Well, sebenarnya, apa yang harus kita lakukan adalah melelar dari kiri ke kanan dan hanya
sejenis memasukkan nod atau memadam nod atau mencari untuk perkara-perkara di mana sahaja yang kita mahu,
tetapi untuk melakukan ini, mari kita pergi ke depan dan membuat perkara yang sedikit lebih nyata kerana ini
telah sangat rendah peringkat setakat ini.
Adakah sesiapa yang benar-benar suka untuk menjadi yang pertama?
OKAY.
Naiklah.
Siapa nama anda?
>> DAVID: David.
DAVID MALAN: Daud.
Gembira Mengenali Anda.
Saya juga.
Baiklah.
Dan kita perlu beberapa 9.
Tidak sebaik pertama, mungkin.
OK, nombor 9.
Sebilangan 17, sila.
Biar saya pergi ke belakang sedikit lebih jauh.
Number 22, sila, dan bagaimana pula lebih jauh ke belakang
jika saya boleh melihat apa-apa tangan dengan semua cahaya atau tidak.
Seseorang yang sedang menawarkan diri di sana.
Adakah anda ingin datang?
Lengan anda secara paksa naik.
OK, 17.
22.
26 akan datang ke bawah.
Adakah orang lain suka forcefully-- Naiklah.
Seorang sukarelawan yang sebenar.
>> Jadi dengan cepat, jika anda semua boleh menguruskan
kamu hanya suka nod pada skrin.
Terima kasih.
Dan anda akan menjadi 26.
Semua pengenalan tepat dan cepat.
Jadi saya Daud dan anda juga?
DAVID: David.
DAVID MALAN: Dan anda?
JAKE: Jake.
SUE: Sue.
ALEX: Alex.
RAPHAEL: Raphael.
TAYLOR: Taylor.
DAVID MALAN: Taylor.
Sangat baik.
Jadi ini adalah sukarelawan kami untuk hari ini dan pergi ke depan
dan beralih cara yang sedikit, dan hanya pergi ke depan dan
memegang nombor anda kerana anda atau anda Tanda pertama dan menggunakan tangan kiri anda,
pergi ke depan dan hanya melaksanakan anak panah ini, hanya
supaya tangan kiri anda adalah benar-benar menunjuk pada apa sahaja yang anda perlu menunjukkan
di, dan memberi diri anda sedikit ruang supaya kita visual boleh melihat senjata anda sebenarnya
menunjuk, dan anda hanya boleh menunjukkan semacam di tanah adalah baik.
>> Jadi di sini kita mempunyai senarai yang dikaitkan satu, dua, tiga, empat, lima nod pada mulanya,
dan perhatikan kita mempunyai khas penunjuk pada awal siapa yang
utama kerana kita perlu menjejaki senarai panjang keseluruhan entah bagaimana.
Lelaki-lelaki ini, walaupun mereka ditinggalkan ke kanan, kembali ke belakang dalam ingatan,
mereka sebenarnya boleh berada di mana sahaja dalam ingatan komputer.
Jadi lelaki ini boleh menjadi berdiri di mana-mana peringkat
dan itulah denda, selagi mereka sebenarnya menghala ke arah satu sama lain,
tetapi untuk menjaga perkara-perkara bersih dan mudah, kita akan
hanya menarik mereka kiri ke kanan seperti ini, tetapi mungkin ada jurang besar-besaran
di antara mereka nod.
>> Sekarang, jika saya mahu sebenarnya memasukkan beberapa nilai baru, mari kita pergi ke depan dan melakukan ini.
Ada kesempatan bagi kita sekarang untuk memilih nod yang lain.
Katakanlah mari kita mulakan dengan mallocing 55.
Adakah seseorang keberatan malloc?
OK, datang ke atas.
Siapa nama anda?
RAINBOW: Rainbow.
DAVID MALAN: Rainbow?
Baiklah.
Malloc Rainbow.
Naiklah.
Jadi sekarang kita perlu bertanya kepada diri kita sendiri algorithmically mana kita boleh meletakkan 55.
Jadi kita semua tahu, jelas, di mana dia mungkin
tergolong jika kita cuba untuk menjaga ini disusun
dan jika anda semua boleh mengambil satu langkah ke belakang supaya kita tidak jatuh
peringkat, yang akan menjadi besar.
Jadi sebenarnya, Rainbow, mula di sini dengan saya,
kerana kita sebagai komputer kini boleh hanya melihat satu pembolehubah pada satu masa.
Jadi, jika ini adalah nod pertama.
Perhatikan dia tidak nod, dia hanya penunjuk,
dan sebab itu dia tertarik untuk menjadi hanya saiz penunjuk, tidak
salah satu segi empat tepat sepenuhnya.
Jadi, kita akan untuk memeriksa pada setiap lelaran adalah 55 kurang daripada 9?
No.
55 kurang daripada 17?
No.
Kurang daripada 22?
Kurang daripada 26?
Kurang daripada 34?
Dan sehingga kini, jelas Rainbow tergolong pada akhir.
Jadi untuk menjadi jelas, dan apa yang adalah nama, Taylor?
>> TAYLOR: Taylor.
DAVID MALAN: Jadi antara Taylor tangan kiri dan tangan Rainbow di sini,
tangan yang perlu tunjuk pada apa yang dalam memerintahkan untuk memasukkan 55 ke dalam senarai ini?
Apa yang perlu kita lakukan?
Ya?
>> PENONTON: tangan Taylor perlu menunjukkan kiri.
>> DAVID MALAN: Tepat sekali.
Jadi memasukkan nod ke akhir senarai
ini agak mudah kerana Taylor hanya mempunyai ke titik, bukan di tanah
atau kita akan memanggilnya null, null adalah jenis ketiadaan
daripada penunjuk atau khas penunjuk sifar, anda berada
akan menunjukkan dengan kiri anda tangan di Rainbow dan kemudian Rainbow,
di mana sepatutnya kiri anda tangan mungkin menunjukkan?
Down.
Ia tidak baik jika tangannya adalah jenis menunjuk off sini atau jenis apa-apa
yang cara.
Yang akan dianggap nilai sampah,
tetapi jika dia menunjuk ke beberapa nilai yang diketahui, kita akan
memanggilnya sifar atau batal, itu OK kerana kita mempunyai istilah dalam ini
dan kita tahu senarai sekarang selesai.
>> Jadi apa lagi kes yang agak mudah?
Bolehkah kita malloc 5?
Naiklah.
Siapa nama anda?
TIFFANY: Tiffany.
DAVID MALAN: Saya minta maaf?
TIFFANY: Tiffany.
DAVID MALAN: Tiffany.
Baiklah.
Tiffany telah malloced dengan nilai 5.
Naiklah.
Yang ini agak mudah juga, tetapi mari kita mempertimbangkan perintah operasi sekarang.
Ia agak mudah dengan Taylor pada akhir.
Nombor 5 adalah kursus kurang daripada 9, dan dengan itu kita mempunyai David, kami mempunyai Tiffany,
dan apa yang Engkau?
>> JAKE: Jake.
>> DAVID MALAN: Jake.
Tiffany, Jake, dan Daud.
Yang tangan perlu dikemaskini pertama?
Apa yang anda mahu lakukan di sini?
Ada beberapa kemungkinan cara, tetapi ada juga satu atau cara yang lebih salah.
>> PENONTON: Mulakan dengan paling kiri.
>> DAVID MALAN: Mulakan dengan paling kiri itu.
Siapa paling kiri di sini ketika itu?
PENONTON: Pertama.
>> DAVID MALAN: OK.
Jadi bermula dengan pertama dan di manakah anda mahu untuk mengemaskini tangan Daud untuk menjadi?
PENONTON: Menjelang 5.
DAVID MALAN: OK.
Maka Daud dan titik pada lima atau Tiffany di sini, dan sekarang?
>> PENONTON: Tiffany mata kepada 9?
DAVID MALAN: Perfect, kecuali yang Binky kepala hanya jenis jatuh, bukan?
Oleh kerana apa yang salah dengan gambar ini betul-betul?
PENONTON: Tiada apa-apa menunjuk.
DAVID MALAN: Tidak ada yang menunjuk kepada Jake sekarang.
Kami benar-benar yatim 9 dan 17, dan kami telah benar-benar
bocor kesemua memori ini, kerana dengan mengemaskini tangan Daud pertama, itu
denda sejauh mana ia betul menghala ke arah Tiffany sekarang,
tetapi jika tiada siapa yang mempunyai pandangan jauh untuk menunjukkan pada Jake,
maka kita telah kehilangan keseluruhan daripada senarai itu.
Jadi mari kita batal.
Jadi itu adalah satu perkara yang baik untuk tersandung tetapi mari kita betulkan sekarang.
Apa yang patut kita lakukan dahulu bukan?
Ya?
>> PENONTON: Tiffany perlu menunjukkan di 9?
DAVID MALAN: saya tidak boleh mendapatkan yang rapat dengan anda.
Siapa yang patut tunjuk pada 9?
>> PENONTON: Tiffany.
>> DAVID MALAN: Baiklah.
Jadi Tiffany sepatutnya mata pertama pada 9.
Jadi Tiffany perlu mengambil pada nilai yang sama
kepada Daud, yang seolah-olah berlebihan untuk seketika,
tetapi itulah denda kerana sekarang, kedua langkah, kita boleh mengemas kini tangan Daud
untuk menunjukkan pada Tiffany, dan kemudian jika kita hanya jenis perkara sehingga bersih
seolah-olah ini adalah jenis seperti musim bunga, kini itulah sisipan yang betul.
Jadi sangat baik.
Jadi sekarang kita sudah hampir.
Mari kita memasukkan satu akhir nilai seperti nilai 20.
Jika kita boleh malloc satu sukarelawan akhir?
Naiklah.
Jadi yang satu ini sedikit lebih rumit.
Tetapi benar-benar, kod kami menulis, walaupun secara lisan,
hanya seperti mempunyai sekumpulan daripada jika keadaan sekarang, bukan?
Kami mempunyai keadaan memeriksa jika ia tergolong
pada akhirnya, mungkin permulaan.
Kita perlu beberapa jenis gelung untuk mencari tempat di bahagian tengah.
Jadi mari kita buat itu dengan apa nama anda?
>> ERIC: Eric.
>> DAVID MALAN: Eric?
Eric.
Gembira Mengenali Anda.
Oleh itu, kita mempunyai 20.
Kurang daripada lima?
No.
Kurang daripada sembilan?
No.
Kurang daripada 17?
No.
OKAY.
Dia tergolong di sini dan nama anda lagi berada?
SUE: Sue.
DAVID MALAN: Sue.
ALEX: Alex.
DAVID MALAN: Sue, Alex, dan?
ERIC: Eric.
DAVID MALAN: Eric.
Yang tangan perlu mendapatkan dikemaskini pertama?
>> PENONTON: Eric.
OKAY.
Jadi Eric perlu menunjukkan di mana?
Pada 22.
Yang baik.
Dan sekarang apa yang akan datang?
Sue kemudiannya boleh tunjuk pada Eric dan kini, jika anda semua hanya
membuat beberapa bilik, yang adalah baik visual, sekarang kita telah melakukan pemasukan.
Jadi mari kita kini mempertimbangkan soalan tetapi terima kasih banyak untuk sukarelawan kami.
Sangat baik dilakukan.
Anda boleh menyimpan mereka, jika anda suka.
Dan kita mempunyai hadiah perpisahan indah jika anda akan setiap ingin mengambil bola tekanan.
Biar saya lulus ini ke bawah.
Jadi apakah Fleet ini?
Ini seolah-olah yang menakjubkan setakat yang kita ada sekarang
diperkenalkan alternatif kepada array yang tidak terhad jadi
kepada pelbagai beberapa saiz tetap.
Mereka boleh berkembang secara dinamik.
>> Tetapi banyak seperti yang kita lihat dalam beberapa minggu masa lalu, kita tidak mendapat apa-apa secara percuma,
seperti pasti ada-off perdagangan di sini.
Jadi dengan peningkatan sebanyak berpaut senarai, adalah dinamik ini?
Keupayaan ini berkembang dan terus-terang, yang kita boleh lakukan padam
dan kita boleh mengecut seperti yang diperlukan.
Apa harga kita membayar?
Dua kali ganda ruang yang banyak, pertama sekali.
Jika anda melihat gambar, tidak lagi aku menyimpan senarai integer.
Saya menyimpan senarai integer serta petunjuk.
Jadi, saya dua kali ganda jumlah ruang.
Sekarang, mungkin itu bukan seperti masalah besar 4 bait, 8 bait,
tetapi ia sudah tentu boleh menambah untuk set data yang besar.
Apakah keburukan yang lain?
Ya?
>> PENONTON: Kita perlu merentasi mereka satu demi satu.
DAVID MALAN: Ya.
Kami perlu merentasi mereka satu demi satu.
Anda tahu apa, kita berputus asa super ini ciri mudah untuk kurungan persegi
notasi, lebih tepat dikenali sebagai capaian rawak,
di mana kita hanya boleh melompat kepada elemen individu
tetapi kini jika saya masih mempunyai sukarelawan saya di sini,
jika saya mahu mencari nombor 22, saya tidak boleh hanya
melompat ke kurungan sesuatu sesuatu.
Saya perlu melihat ke atas senarai, banyak seperti contoh pencarian kami linear,
untuk mencari bilangan 22.
Oleh itu, kita seolah-olah telah membayar harga yang di sana.
Tetapi kita boleh tetap menyelesaikan masalah-masalah lain.
>> Malah, izinkan saya memperkenalkan hanya beberapa visual.
Jadi, jika anda telah turun ke Dewan Makan Mather baru-baru ini,
anda akan ingat bahawa mereka susunan dulang seperti ini,
kita meminjam ini dari Annenberg sebelum kelas.
Jadi timbunan ini dulang, walaupun, adalah wakil sebenarnya
struktur data sains komputer.
Terdapat struktur data dalam bidang sains komputer
dikenali sebagai timbunan yang sangat baik ruang untuk betul-betul ini dengar.
Jadi, jika setiap dulang ini bukan dulang tetapi seperti nombor dan saya mahu
untuk menyimpan nombor, saya boleh meletakkan satu turun di sini,
dan saya boleh meletakkan satu lagi turun di sini, dan terus menyusun nombor
di atas satu sama lain, dan apa yang berpotensi berguna mengenai ini
adalah bahawa apa yang implikasi struktur data ini?
Yang nombor boleh saya tarik keluar pertama yang paling mudah?
Yang paling baru-baru ini meletakkan di sana.
>> Jadi ini adalah apa yang kita akan memanggil komputer sains struktur data LIFO.
Bertahan dalam, dahulu.
Dan kita akan melihat tidak lama mengapa yang mungkin berguna tetapi untuk sekarang,
hanya menganggap tetamu.
Dan ia jenis bodoh jika anda berfikir tentang bagaimana dewan makan melakukannya.
Setiap kali mereka dulang bersih dan meletakkan orang-orang yang paling segar di atas,
anda boleh mempunyai yang dahulu bersih tetapi akhirnya sangat kotor dan berdebu
dulang di bahagian paling bawah jika anda tidak pernah benar-benar
sampai ke bahagian bawah itu timbunan, kerana anda hanya
terus meletakkan yang baru dan orang-orang yang bersih di atasnya.
Perkara yang sama mungkin berlaku di pasar raya juga.
Jika anda mempunyai kes paparan susu dan setiap kali CVS
atau sesiapa yang mendapat lebih banyak susu, anda hanya mendorong yang susu
anda sudah mempunyai ke belakang dan anda meletakkan yang baru di depan,
anda akan mempunyai beberapa cukup jahat susu pada akhir struktur data,
kerana ia sentiasa di bahagian bawah atau setara ia sentiasa di belakang.
>> Tetapi ada cara lain untuk berfikir tentang beratur data dan sebagai contoh, ini.
Jika anda salah seorang dari orang-orang yang suka untuk beratur di luar kedai Apple
apabila produk baru datang keluar, anda mungkin
tidak menggunakan data timbunan struktur kerana anda
akan merenggangkan orang lain yang beratur untuk membeli beberapa mainan baru.
Sebaliknya, anda mungkin menggunakan apa jenis struktur data
atau apa jenis sistem dalam dunia sebenar?
Mudah-mudahan ia garis, atau lebih betul atau lebih British-suka, barisan.
Dan ternyata barisan juga struktur data dalam bidang sains komputer,
tetapi barisan yang mempunyai sangat harta yang berlainan.
Ia bukan LIFO.
Bertahan dalam, dahulu.
Tuhan melarang.
Ia bukannya FIFO.
Masuk dahulu, keluar dahulu.
Dan itu adalah satu perkara yang baik demi keadilan '
pasti apabila anda beratur sehingga hilang pada awal pagi.
Jika anda sampai ke sana pertama, anda mahu keluar pertama juga.
>> Dan supaya semua data ini struktur, barisan dan susunan
dan tandan orang lain, ternyata anda boleh berfikir ini hanya sebagai array.
Ini adalah pelbagai, mungkin saiz yang menetapkan 4, tetapi ia akan
menjadi jenis baik jika kita hanya boleh terkumpul dulang hampir tak terhingga tinggi jika kita
mempunyai bahawa dulang nombor atau banyak.
Jadi mungkin kita mahu menggunakan senarai dikaitkan di sini,
tetapi keseimbangan akan menjadi berpotensi bahawa kita perlu lebih banyak memori,
mengambil masa yang lebih sedikit, tetapi kita tidak mengehadkan ketinggian timbunan,
sama seperti paparan kes Mather mungkin membataskan saiz timbunan,
dan sebagainya ini adalah keputusan reka bentuk atau pilihan ada pada kita akhirnya.
Jadi dengan data ini struktur, kami telah mula
melihat batas atas baru berpotensi kepada apa yang sebelum ini adalah super cepat
dan di mana kita akan meninggalkan off hari ini dan di mana
kami akan berharap untuk sampai ke adalah pada hari Rabu, kami akan
mula melihat data yang struktur yang membolehkan kita mencari
melalui data dalam masa akhir log lagi.
Dan kita melihat bahawa, masih ingat, pada minggu sifar dan satu dengan carian binari atau membahagi
dan menakluk.
Ia datang kembali dan lebih baik lagi, kaedah berpotensi suci untuk Rabu ini
adalah untuk datang dengan struktur data yang berjalan benar-benar
atau secara teori dalam masa yang berterusan, di mana
ia tidak kira berapa banyak berjuta-juta atau berbilion-bilion perkara
kita ada dalam struktur data, ia akan membawa kita masa yang berterusan, mungkin satu langkah
atau dua langkah atau 10 langkah, tetapi nombor yang berterusan daripada langkah-langkah
untuk mencari melalui struktur data.
Yang demikian itu ialah kaedah berpotensi suci tetapi lebih kepada yang pada hari Rabu.
Lihat ya itu.
>> [Bermain muzik]