DAVID MALAN: Baiklah, selamat datang kembali. Ini adalah CS50. Ini adalah permulaan minggu tujuh. Jadi ia telah seketika, jadi saya fikir kita akan mengambil lawatan badai di mana kita berhenti dan di mana kita sedang kini berterusan. Jadi perkara ini di sini mungkin mempunyai menyebabkan beberapa angst pada mulanya. Tetapi diharapkan, anda mula acclimate kepada apa ini menandakan di sini - bintang yang mewakili penunjuk, yang merupakan apa, dari segi orang biasa lebih ini? Jadi ia adalah alamat. Jadi ia adalah alamat sesuatu dalam ingatan. Dan kita mula mengupas kembali lapisan a Beberapa minggu yang lalu, perkara-perkara seperti GetString dan lain-lain apa-apa fungsi sepanjang masa ini telah kembali alamat perkara dalam ingatan, seperti alamat watak pertama dalam urutan tertentu. Oleh itu, kita juga telah memperkenalkan valgrind, yang anda akan mula digunakan untuk masalah ini ditetapkan, terutamanya bagi yang akan datang masalah yang ditetapkan juga. Dan valgrind melakukan apa untuk kita? Ia memeriksa kebocoran memori, dan ia juga memeriksa penyalahgunaan ingatan. Ia boleh, dengan beberapa kebarangkalian, mengesan jika kod anda akan menyentuh memori bahawa ia hanya tidak sepatutnya. Jadi tidak semestinya kebocoran, tetapi jika anda melampaui sempadan beberapa pelbagai, dan anda sebenarnya menjalankan valgrind dan mendorong tingkah laku yang sementara valgrind sedang berjalan dalam program anda adalah berjalan di dalam itu, anda akan mendapat mesej seperti ini - "tidak sah menulis saiz 4, "yang, ingat beberapa minggu lalu bermakna bahawa saya telah tidak sengaja suka pada satu int terlalu jauh melangkaui sempadan array. Dan sebagainya saiz 4 bermakna di sini saiz daripada int yang tertentu. Jadi mengambil jaminan dalam fakta bahawa output valgrind itu, format itu, hanya kejam. Ia benar-benar sukar untuk melihat melalui keadaan huru-hara maklumat yang menarik. Jadi apa yang kita lakukan di sini adalah hanya petikan beberapa pasangan yang lebih garis yang menarik. Tetapi sedar bahawa 80% daripada valgrind output akan menjadi sedikit gangguan. Hanya melihat untuk corak seperti ini - sah betul, tidak sah membaca, 40 bytes dan ada beberapa blok pasti hilang, kata kunci seperti itu. Dan apa yang anda diharapkan akan melihat beberapa jenis kesan apa yang berfungsi kesilapan sebenarnya masuk Dalam kes ini di sini, dalam apa garis kod saya ralat nampaknya? 26 dalam fail yang dipanggil memory.c, yang merupakan contoh kita telah bermain dengan pada masa itu. Jadi, ia mungkin tidak dalam malloc. Ia mungkin dalam kod saya sebaliknya. Oleh itu, kita akan melihat ini lagi dan sekali lagi tidak lama lagi. Jadi scanf, ini datang dalam beberapa bentuk setakat ini. Kami melihat sscanf ringkas. Ia adalah sesuatu yang beberapa anda menyelam ke dalam anda persediaan untuk kuiz. Dan scanf sebenarnya apa yang CS50 perpustakaan telah menggunakan di bawah hud sekian lama dalam usaha untuk mendapatkan input daripada pengguna. Sebagai contoh, jika saya bergerak ke atas ke CS50 perkakas sini, izinkan saya membuka satu contoh hari ini yang dinamakan scanf-0.c Dan ia mudah super. Ia hanya beberapa baris kod. Tetapi ia benar-benar menunjukkan bagaimana getInt telah bekerja sepanjang masa ini. Dalam program ini di sini, di talian 16 , Notis bahawa saya mengaku int an. Jadi tiada petunjuk, tiada apa yang ajaib di sana, hanya int. Kemudian pada line 17, saya mendorong pengguna untuk nombor, sila. Kemudian pada lewat 18, saya menggunakan scanf sini. Dan saya dinyatakan, jenis seperti printf, bahawa saya menjangkakan quote unquote peratus i. Jadi peratus i, sudah tentu, menandakan int an. Tetapi notis apa yang kedua hujah untuk scanf adalah. Bagaimana anda menggambarkan kedua Hujah selepas koma? Apakah itu? Ia adalah alamat x. Jadi ini adalah berguna kerana dengan menyediakan scanf dengan alamat x, apakah yang memberi kuasa kepada fungsi yang perlu dilakukan? Bukan hanya pergi ke sana, tetapi juga buat apa? Membuat perubahan kepadanya. Kerana anda boleh pergi ke sana, ia adalah jenis seperti peta ke lokasi dalam ingatan. Dan selagi anda berikan scanf, atau apa-apa fungsi dengan apa-apa peta, yang fungsi boleh pergi ke sana, dan bukan sahaja melihat nilai, tetapi ia juga boleh menukar nilai itu, yang berguna jika tujuan dalam kehidupan scanf adalah untuk mengimbas input dari pengguna, khususnya dari papan kekunci. Dan f menandakan diformat, seperti printf, f yang menandakan diformat rentetan yang anda ingin cetak. Jadi dalam jangka pendek, 18 baris ini hanya berkata, cuba untuk membaca int dari pengguna ini keyboard dan menyimpan ia di dalam x, pada apa alamat x berlaku untuk hidup di. Dan kemudian akhirnya, barisan 19 hanya berkata, terima kasih kerana int, dalam kes ini. Jadi biarlah saya pergi ke hadapan dan membuat ini. Oleh itu, scanf 0. Biar saya pergi ke hadapan dan zum masuk Saya akan pergi dan menjalankan ini dengan titik mengurangkan scanf 0. Nombor, please? 50. Terima kasih untuk 50. Jadi ia agak mudah. Sekarang apa yang ia tidak lakukan? Ia tidak melakukan sejumlah daripada memeriksa kesilapan. Sebagai contoh, jika saya tidak bekerjasama, dan saya tidak menaip nombor, tetapi sebaliknya saya menulis sesuatu seperti "Hello," itu hanya jenis yang pelik. Dan sebagainya salah satu perkara yang CS50 perpustakaan telah lakukan untuk kita untuk beberapa masa adalah reprompting bahawa dan reprompting. The cuba lagi ingat frasa berada di cs50.c, dan itulah sebab yang getInt dalam perpustakaan CS50 sebenarnya keseluruhan sekumpulan garis-garis panjang, kerana kami memeriksa barangan bodoh seperti ini. Adakah pengguna tidak memberi kita, pada hakikatnya, int an? Adakah dia memberi kita sesuatu seperti surat mengikut abjad? Jika ya, kami mahu mengesan itu dan menjerit pada mereka. Tetapi perkara yang mendapat lebih menarik dalam contoh ini akan datang. Jika saya pergi ke scanf-1.c, apakah satu perkara yang pada asasnya berubah dalam Contoh seterusnya ini? Saya menggunakan char *, sudah tentu, bukannya int. Jadi ini adalah menarik, kerana char *, ingat, adalah benar-benar hanya perkara yang sama seperti tali. Jadi rasanya mungkin ini adalah super pelaksanaan mudah GetString. Tetapi saya telah dikupas kembali lapisan perpustakaan CS50, jadi saya memanggil char ini * sekarang. Jadi mari kita melihat di mana, jika mana-mana, kita pergi salah. Line 17 - Saya sekali lagi mengatakan, sila berikan saya sesuatu, dalam kes ini, rentetan. Dan kemudian dalam baris seterusnya, saya menyeru scanf, sekali lagi, memberikan kod format, tetapi ini peratus masa s. Dan kemudian masa ini, saya memberikan penampan. Sekarang notis, saya tidak menggunakan Ampersand itu. Tetapi mengapa yang mungkin OK di sini? Kerana apa yang penampan sudah? Ia sudah penunjuk. Ia sudah alamat. Dan mari adalah perkataan ini "mengelirukan," biarlah saya hanya memanggilnya s, misalnya, untuk kesederhanaan. Tetapi saya telah dipanggil ia penampan kerana dalam umum, dalam pengaturcaraan, jika anda mempunyai sebahagian memori, yang tali yang benar-benar hanya ini, anda mungkin memanggil ia penampan. Ia adalah tempat untuk menyimpan maklumat. Similar kepada perkara-perkara seperti YouTube, apabila mereka buffering, jadi untuk bercakap, bahawa hanya bermakna ia turun bit dari internet dan menyimpan mereka dalam pelbagai tempatan, sebahagian tempatan memori supaya bahawa anda boleh menonton kemudian tanpa ia ponteng atau tergantung di anda semasa bermain kembali. Jadi ada masalah di sini walaupun, kerana saya memberitahu scanf, menjangkakan rentetan daripada pengguna. Berikut adalah alamat sebahagian memori. Meletakkan tali yang di sana. Mengapa yang terikat memberi masalah kita, walaupun? Apa itu? Adakah saya dibenarkan untuk mengakses bahawa sebahagian daripada memori? Anda tahu, saya tidak tahu. Kerana telah penampan telah dimulakan untuk apa-apa? Tidak benar-benar. Dan sebagainya ia adalah apa yang kita telah memanggil nilai sampah, yang bukanlah satu perkataan yang formal. Ia hanya bermakna kita tidak tahu apa yang bit berada di dalam satu daripada empat bait yang Saya telah memperuntukkan sebagai penampan. Saya tidak dipanggil malloc. Saya pasti tidak dipanggil GetString. Jadi siapa yang tahu apa yang sebenarnya dalam buffer? Dan lagi memberitahu scanf membuta tuli, pergi ke sana dan meletakkan apa sahaja pengguna ditaip. Jadi apa yang mungkin menyebabkan dalam kod kita jika kita berjalan? Mungkin segfault. Mungkin tidak, tetapi mungkin segfault. Dan saya katakan mungkin tidak kerana kadang-kadang anda lakukan, kadang-kadang anda tidak mendapat segfault. Kadang-kadang anda hanya mendapat bernasib baik, tetapi ia tetap akan menjadi bug dalam program kami. Jadi biarlah saya pergi ke hadapan dan menyusun ini. Saya akan melakukannya dengan cara sekolah lama. Jadi dilafaz melontarkan 0, scanf-1, scanf-1.c, Enter. Oops, sekolah terlalu lama. Mari kita lihat. Di mana saya pergi? Oh, char * penampan. Oh, terima kasih - Simpan, OK - sekolah yang sangat lama. Baiklah, ia telah seketika. Jadi saya hanya menyimpan fail selepas membuat yang sementara mengubah masa yang lalu. Dan sekarang saya telah kumpulkan ia manual dengan dilafaz. Dan sekarang saya akan pergi ke hadapan dan menjalankan scanf-1, Enter. Rentetan sila. Saya akan menaip "hello." Dan kini, di sini adalah di mana, terus-terang, printf boleh sedikit menjengkelkan. Ia tidak benar-benar akan segfault dalam kes ini. Printf adalah sedikit istimewa kerana ia begitu super yang biasa digunakan printf dasarnya melakukan kita nikmat dan menyedari, itu bukan penunjuk yang sah. Izinkan saya mengambil ia atas diri saya untuk hanya mencetak dalam kurungan batal, walaupun walaupun ia tidak semestinya apa kita sendiri yang diharapkan. Jadi kita tidak boleh benar-benar mudah mendorong segfault dengan ini, tetapi jelas ini bukan tingkah laku yang saya mahu. Jadi apa penyelesaian yang mudah? Nah, dalam scanf-2, izinkan saya mencadangkan supaya bukan sebenarnya hanya memperuntukkan char *, biarlah saya menjadi sedikit lebih bijak mengenai ini, dan biarlah saya menyediakan peruntukan penampan sebagai urutan 16 aksara. Jadi saya boleh melakukan ini dalam beberapa cara. Saya benar-benar boleh menggunakan malloc. Tetapi saya boleh kembali ke dua minggu apabila Saya hanya memerlukan sejumlah besar watak-watak. Itu hanya array. Jadi biarlah saya sebaliknya mentakrifkan semula penampan menjadi pelbagai 16 aksara. Dan sekarang, apabila saya meninggal penampan di - dan ini adalah sesuatu yang kita tidak bercakap mengenai dalam dua minggu - tetapi anda boleh merawat pelbagai seperti walaupun ia alamat. Secara teknikal, seperti yang kita telah melihat, mereka sedikit berbeza. Tetapi scanf tidak akan fikiran jika anda lulus nama array, kerana apa yang Dilafaz akan lakukan untuk kita adalah asasnya merawat nama array yang sebagai alamat sebahagian daripada 16 bait. Jadi ini adalah lebih baik. Ini bermakna kini bahawa saya boleh diharapkan melakukan yang berikut. Biar saya zum keluar seketika dan tidak membuat scanf-2, yang disusun OK. Sekarang saya tidak mendapat palang scanf-2. Rentetan sila. "Hello." Dan ia seolah-olah untuk bekerja masa ini. Tetapi boleh seseorang mencadangkan senario di mana ia tidak mungkin masih berfungsi? Ya? Sesuatu yang lebih panjang daripada 16 aksara. Dan sebenarnya, kita boleh sedikit lebih tepat. Sesuatu yang lebih panjang daripada 15 aksara, kerana benar-benar kita perlu ingat bahawa kita perlu bahawa backslash sifar tersirat di hujung tali, yang mengetepikan scanf akan biasanya menjaga untuk kita. Jadi biarlah saya melakukan sesuatu seperti - kadang-kadang kita boleh hanya meninggalkan ia seperti itu. OK, jadi kami kini disebabkan kesalahan segmentasi kami. Mengapa? Kerana saya ditaip kepada lebih daripada 15 watak-watak, dan dengan itu kita telah benar-benar memori menyentuh bahawa saya sebenarnya tidak sepatutnya. Jadi apa yang benar-benar penyelesaian di sini? Nah, bagaimana jika kita perlu rentetan yang lebih panjang? Nah, kita mungkin membuat ia 32 bait. Nah, bagaimana jika itu tidak cukup panjang? Bagaimana kira-kira 64 bait? Bagaimana jika itu tidak cukup panjang? Bagaimana kira-kira 128 atau 200 bait? Apa yang benar-benar adalah satu penyelesaian di sini di kes umum, jika kita tidak tahu memajukan apa yang pengguna akan menaip? Ia hanya jenis sakit besar dalam keldai, menjadi jujur, yang adalah mengapa CS50 perpustakaan mempunyai garis sedozen beberapa kod yang secara kolektif melaksanakan GetString tali dengan cara yang kita tidak perlu mengetahui terlebih dahulu apa yang pengguna akan menaip. Khususnya, jika anda melihat kembali cs50.c daripada dua minggu yang lalu, anda akan melihat GetString yang sebenarnya tidak tidak menggunakan scanf dengan cara ini. Sebaliknya, ia membaca satu watak pada satu masa. Oleh kerana satu perkara yang baik tentang membaca salah satu watak adalah kita boleh menjamin diri kita untuk sentiasa mempunyai sekurang-kurangnya satu char. Saya hanya boleh mengisytiharkan char, dan kemudian mengambil langkah-langkah yang benar-benar hanya bayi membaca satu watak dalam pada masa dari papan kekunci. Dan kemudian, apa yang anda akan melihat GetString tidak adalah setiap kali ia kehabisan, berkata, 16 bait ingatan, ia menggunakan malloc, atau sepupu itu, untuk memperuntukkan memori yang lebih, menyalin lama ingatan ke dalam yang baru, dan kemudian merangkak bersama-sama, mendapat satu watak pada satu masa, dan ketika ia berjalan keluar dari yang sebahagian memori, melemparkan ia jauh, dimenangi sebahagian yang besar ingatan, salinan lama ke baru, dan mengulangi. Dan ia benar-benar sakit untuk benar-benar melaksanakan sesuatu yang mudah seperti mendapatkan input daripada pengguna. Jadi, anda boleh menggunakan scanf. Anda boleh menggunakan fungsi-fungsi lain yang serupa. Dan banyak buku-buku teks dan dalam talian contoh lakukan, tetapi mereka semua terdedah kepada masalah seperti ini. Dan akhirnya, mendapat satu segfault adalah jenis menjengkelkan. Ia tidak baik untuk pengguna. Tetapi dalam kes paling teruk, apakah ia asasnya meletakkan anda kod berisiko? Beberapa jenis serangan, berpotensi. Kita bercakap tentang satu serangan itu - melimpah timbunan. Tetapi secara umum, jika anda dibenarkan untuk buffer overflow, seperti kita melakukan Beberapa minggu lalu, dengan hanya menulis lebih daripada "hello" pada timbunan, anda sememangnya boleh mengambil alih, berpotensi, yang komputer, atau sekurang-kurangnya mendapat sekurang-data yang bukan milik anda. Jadi dalam jangka pendek, ini adalah mengapa kita mempunyai mereka roda latihan. Tetapi sekarang, kita mula mengambil mereka di luar, program-program kita tidak perlu lagi, semestinya, input daripada pengguna. Tetapi dalam kes masalah yang ditetapkan enam, input anda akan datang dari yang besar fail kamus dengan 150 beberapa ganjil seribu perkataan. Jadi anda tidak perlu bimbang tentang sewenang-wenangnya input pengguna. Kita akan memberikan anda beberapa andaian mengenai fail itu. Sebarang pertanyaan mengenai petunjuk atau scanf atau input pengguna secara umum? Baiklah, jadi melihat cepat kemudian pada satu-satu ketinggalan topik daripada dua minggu lalu. Dan itu adalah tanggapan ini struct a. Tidak bahawa - ini tanggapan struct, iaitu apa? Apa struct lakukan untuk kami? Menentukan - maaf? Menentukan jenis berubah-ubah. Jadi semacam. Kami sebenarnya menggabungkan dua topik. Jadi dengan typedef, ingat bahawa kita boleh mengisytiharkan jenis kita sendiri, seperti sinonim, seperti tali untuk char *. Tetapi menggunakan typedef dan struct, kita boleh benar-benar mewujudkan struktur data kita sendiri. Sebagai contoh, jika saya pergi ke dalam gedit di sini untuk seketika, dan saya pergi ke hadapan dan melakukan sesuatu seperti, biarlah saya simpan ini kerana, katakan, structs.c buat sementara waktu, saya hanya akan untuk pergi ke hadapan dan termasuk standardio.h, int sah utama. Dan kemudian di sini, rasa yang saya mahu untuk menulis program yang menyimpan berbilang pelajar dari pelbagai rumah, misalnya. Jadi ia seperti registrarial pangkalan data sejenis. Jadi jika saya memerlukan pelajar nama satu, saya mungkin melakukan sesuatu seperti nama * char, dan saya akan melakukan sesuatu seperti - sebenarnya, mari kita menggunakan perpustakaan CS50 hanya masa untuk membuat ini mudah sedikit, jadi kita boleh meminjam mereka berpuluh-puluh baris kod. Dan mari kita hanya menyimpan ia mudah. Kami akan memastikan ia tali, dan kini GetString. Jadi saya menuntut sekarang bahawa saya telah disimpan nama beberapa pelajar, dan rumah beberapa pelajar, hanya menggunakan pembolehubah seperti yang kami lakukan dan dalam satu minggu. Tetapi rasa saya kini mahu menyokong beberapa pelajar. Baiklah, jadi naluri saya untuk melakukan rentetan NAME2 mendapat GetString, tali house2 mendapat GetString. Dan maka pelajar kita yang ketiga, mari kita buat NAME3 GetString. Baiklah, jadi ini adalah diharapkan menarik anda sebagai jenis bodoh, kerana proses ini adalah benar-benar tidak pernah akan berakhir, dan ia hanya akan membuat kod saya kelihatan buruk dan teruk dan teruk. Tetapi kita menyelesaikan ini juga dalam seminggu dua. Apakah penyelesaian yang agak bersih kami apabila kita mempunyai beberapa pembolehubah yang jenis data yang sama yang semua berkaitan, tetapi kita tidak mahu keadaan kucar-kacir ini kejam pembolehubah nama yang sama? Apa yang kita lakukan bukan? Jadi saya fikir saya mendengar tempat sahaja. Kami mempunyai array. Jika anda ingin beberapa contoh sesuatu, mengapa tidak kita membersihkan ini semua dan hanya berkata, memberi saya pelbagai dipanggil nama? Dan sekarang, mari kita kod 3 keras. Dan kemudian memberikan saya pelbagai lagi dipanggil rumah, dan izinkan saya untuk kini kod keras 3. Dan saya telah secara besar-besaran dibersihkan sehingga kucar-kacir yang saya buat. Kini, saya masih lagi keras berkod 3, tetapi juga 3 yang dinamik boleh datang dari pengguna, atau argv, atau sebagainya. Jadi ini sudah bersih. Tetapi apa yang menjengkelkan tentang ini adalah bahawa kini, nama walaupun entah bagaimana asasnya dikaitkan dengan rumah pelajar - ia adalah seorang pelajar yang amat saya ingin mewakili - Saya kini mempunyai dua barisan yang selari dalam erti kata bahawa mereka yang saiz yang sama, dan nama-nama kurungan 0 mungkin peta ke rumah kurungan 0, dan nama-nama kurungan 1 peta ke rumah kurungan 1. Dalam erti kata lain, kehidupan pelajar bahawa dalam rumah itu, dan pelajar lain tinggal di rumah yang lain. Tetapi sudah tentu ini boleh menjadi dilakukan lebih bersih. Nah, ia boleh, sebenarnya. Dan biarlah saya pergi ke hadapan dan membuka sehingga structs.h, dan anda akan melihat idea ini di sini. Perhatikan bahawa saya telah menggunakan typedef, seperti yang anda dirujuk kepada masa yang lalu untuk mengisytiharkan kami jenis data sendiri. Tetapi saya juga menggunakan kata kunci ini lain dipanggil struct yang memberikan saya yang baru struktur data. Dan struktur data ini saya menuntut akan mempunyai dua perkara di dalam ia - tali yang dipanggil nama, dan tali yang dipanggil rumah. Dan nama saya akan memberi struktur data ini akan akan dipanggil pelajar. Saya boleh memanggilnya apa-apa yang saya mahu, tetapi ini semantik membuat rasa kepada saya dalam fikiran saya. Jadi sekarang, jika saya membuka versi yang lebih baik program yang saya mula menulis di sana, biarlah saya tatal ke atas. Dan tidak ada yang lebih baris kod di sini, tetapi biarlah saya memberi tumpuan untuk masa ini pada satu. Saya telah diisytiharkan tetap pelajar yang dipanggil dan keras berkod 3 untuk sekarang. Tetapi sekarang, melihat bagaimana bersih kod saya bermula untuk mendapatkan. Selaras 22, saya mengisytiharkan pelbagai pelajar. Dan melihat bahawa pelajar nampaknya kini merupakan jenis data. Kerana di atas fail ini, notis Saya telah menyertakan fail header yang saya ditarik ke atas hanya sebentar tadi. Dan bahawa fail header cukup sekadar mempunyai definisi ini pelajar. Jadi sekarang, saya telah membuat data adat sendiri jenis yang pengarang C tahun lalu tidak berfikir terlebih dahulu. Tetapi tidak ada masalah. Saya boleh membuat sendiri. Jadi ini adalah pelbagai yang dikenali sebagai pelajar, setiap ahli yang adalah struktur pelajar. Dan saya mahu tiga daripada mereka yang dalam array. Dan sekarang, apakah yang lain program ini lakukan? Saya memerlukan sesuatu yang sewenang-wenangnya. Jadi dari 24 seterusnya dalam talian, Saya melelar dari 0 ke 3. Saya kemudian meminta pengguna untuk nama pelajar. Dan kemudian saya menggunakan GetString seperti sebelum ini. Kemudian saya meminta rumah pelajar, dan saya menggunakan GetString seperti sebelum ini. Tetapi notis - sedikit baru sekeping sintaks - Saya masih boleh indeks kepada pelajar i-th, tetapi bagaimana saya boleh mendapatkan di data tertentu di dalam bidang struct itu? Nah, apa yang nampaknya sekeping baru sintaks? Ia hanya operator titik. Kami telah tidak benar-benar melihat ini sebelum ini. Anda telah melihat dalam pset lima jika anda telah menyelam di sudah dengan fail bitmap. Tetapi titik hanya bermakna dalam ini struct atau pelbagai bidang, memberikan dot nama, atau memberi saya dot rumah. Ini bermakna pergi dalam struct itu dan mendapatkan bidang-bidang tertentu. Apakah seluruh program ini lakukan? Ia bukan semua yang seksi. Perhatikan bahawa saya melelar dari 0 ke 3 lagi, dan saya hanya mewujudkan Inggeris frasa seperti begitu dan begitu juga dalam apa-apa dan seperti rumah, lulus dalam nama dot dari pelajar i-th dan mereka rumah juga. Kemudian akhir sekali, sekarang kita akan mula mendapat dubur tentang perkara ini, sekarang bahawa kami biasa dengan apa yang malloc dan fungsi lain yang telah melakukan semua masa ini. Kenapa saya perlu untuk membebaskan kedua-dua nama dan rumah, walaupun saya tidak memanggil malloc? GetString lakukan. Dan itu adalah rahsia kotor sedikit untuk beberapa minggu, tetapi GetString mempunyai telah bocor memori seluruh meletakkan semua semester setakat ini. Dan valgrand akan akhirnya mendedahkan ini kepada kami. Tetapi ia bukan satu masalah besar, kerana saya tahu bahawa saya hanya boleh membebaskan nama dan rumah itu, walaupun secara teknikal, untuk menjadi super, super selamat, saya perlu melakukan beberapa kesilapan menyemak di sini. Apa yang naluri anda memberitahu anda? Apakah yang perlu saya akan memeriksa sebelum saya melepaskan apa yang tali, aka mana * char? Saya benar-benar perlu menyemak jika pelajar golongan i nama dot tidak batal sama. Kemudian ia akan menjadi OK untuk meneruskan dan percuma penunjuk itu, dan sama atau lain-lain salah satu juga. Jika pelajar kurungan i dot rumah tidak sama dengan nol, sekarang ini akan melindungi terhadap kes sudut di mana GetString mengembalikan sesuatu seperti null. Dan kita melihat masa lalu, printf akan melindungi kita di sini dengan hanya berkata batal, yang akan kelihatan pelik. Tetapi sekurang-kurangnya ia tidak akan segfault, seperti yang kita lihat. Baiklah, biar saya melakukan satu perkara lain di sini. structs-0 adalah jenis program bodoh kerana saya memasukkan semua data ini, dan kemudian ia hilang apabila program berakhir. Tetapi biarlah saya pergi ke hadapan dan melakukan ini. Izinkan saya membuat terminal tingkap sedikit lebih besar. Izinkan saya membuat structs-1, yang adalah versi baru ini. Saya akan zoom sedikit. Dan sekarang mari saya menjalankan dot mengurangkan structs-1. Nama Pelajar - David Mather, mari kita buat Rob Kirkland, mari kita buat Lauren Leverett. Apa yang menarik sekarang adalah notis - dan saya hanya tahu ini kerana Saya menulis program - ada fail sekarang semasa saya direktori dipanggil students.csv. Sebahagian daripada anda mungkin telah melihat ini dalam dunia sebenar. Apakah yang dimaksudkan dengan fail CSV? Nilai koma. Ia adalah jenis seperti orang miskin versi fail Excel. Ia adalah satu jadual baris dan lajur yang anda boleh membuka dalam program seperti Excel, atau Nombor pada Mac. Dan jika saya membuka fail ini di sini gedit, notis - dan nombor-nombor tidak ada. Itu hanya gedit memberitahu nombor talian saya. Perhatikan pada baris pertama ini fail adalah Daud dan Mather. Garis seterusnya adalah Rob koma Kirkland. Dan barisan ketiga ialah Lauren koma Leverett. Jadi apa yang telah saya buat? Sekarang saya telah menulis satu program C yang berkesan boleh menjana spreadsheet yang boleh dibuka di program seperti Excel. Bukan semua yang menarik set data, tetapi jika anda mempunyai ketulan yang lebih besar daripada data yang anda benar-benar mahu memanipulasi dan membuat graf dan suka, ini mungkin merupakan salah satu cara untuk mewujudkan data tersebut. Selain itu, CSVs sebenarnya super biasa hanya untuk menyimpan data mudah - Yahoo Kewangan, sebagai contoh, jika anda mendapat harga saham melalui apa yang dipanggil mereka API, perkhidmatan percuma yang membolehkan anda mendapatkan saham up-to-the-tarikh semasa sebut harga untuk syarikat, mereka memberikan data kembali dalam super format CSV mudah. Jadi bagaimana kita berbuat demikian? Well notis, sebahagian besar daripada program ini yang hampir sama. Tetapi notis ke sini, dan bukannya cetak pelajar keluar, on line 35 seterusnya, saya menuntut bahawa saya menyelamatkan pelajar ke cakera, jadi menyimpan fail. Jadi notis saya mengisytiharkan FILE a * - sekarang, ini adalah jenis anomali C. Untuk apa-apa sebab, FILE adalah topi, yang tidak seperti kebanyakan jenis data lain di C. Tetapi ini adalah terbina dalam jenis data, fail *. Dan saya mengisytiharkan penunjuk kepada fail, adalah bagaimana anda boleh berfikir itu. fopen bermakna fail terbuka. Apakah fail yang anda mahu terbuka? Saya ingin membuka fail yang saya akan sewenang-wenangnya memanggil students.csv. Saya boleh memanggil bahawa apa-apa yang saya mahu. Dan kemudian mengambil tekaan. Apakah hujah kedua untuk fopen mungkin bermakna? Betul, w untuk menulis, boleh menjadi r untuk dibaca. Ada untuk lampiran jika anda mahu menambah baris dan tidak menimpa segala-galanya. Tetapi saya hanya mahu mencipta fail ini sekali, jadi saya akan menggunakan quote unquote w. Dan saya tahu bahawa hanya dari setelah membaca dokumentasi, atau halaman lelaki itu. Jika fail tidak sah - dalam erti kata lain, jika apa-apa yang telah salah di sana - biarlah saya melelar atas pelajar dari 0 ke 3. Dan kini melihat ada sesuatu pernah jadi sedikit berbeza mengenai garis 41 di sini. Ia bukan printf. Ia fprintf untuk fail printf. Jadi ia akan menulis ke fail. Yang file? Satu penunjuk yang anda tentukan sebagai hujah yang pertama. Kemudian kami nyatakan rentetan format. Kemudian kita menentukan apa tali yang kita mahu pasangkan untuk peratus yang pertama, dan maka pemboleh ubah lain atau peratus yang kedua. Kemudian kita menutup fail dengan fclose. Daripada saya membebaskan memori seperti sebelum ini, walaupun Saya perlu kembali dalam dan menambah beberapa cek null. Dan itu sahaja. fopen, fprintf, fclose memberikan saya keupayaan untuk mewujudkan fail teks. Sekarang anda akan melihat dalam masalah set lima, yang melibatkan imej, anda akan menggunakan fail binari sebaliknya. Tetapi asasnya, idea adalah sama, walaupun fungsi-fungsi yang anda akan melihat adalah sedikit berbeza. Jadi lawatan badai, tetapi anda akan mendapat semua terlalu biasa dengan fail I/O-- input dan output - dengan pset lima. Dan mana-mana soalan-soalan mengenai asas-asas awal di sini? Ya? Bagaimana jika anda cuba untuk membebaskan nilai null? Saya percaya, melainkan percuma telah mendapat lebih mesra pengguna sedikit, anda boleh berpotensi segfault. Lulus menyeimbangkan adalah buruk kerana saya tidak percaya percuma mengganggu untuk memeriksa untuk anda, kerana ia mungkin akan menjadi satu pembaziran masa untuk ia lakukan sendiri untuk semua orang di dunia. Soalan yang baik, walaupun. Baiklah, jadi seperti ini mendapat kita satu topik yang menarik. Tema set masalah lima adalah forensik. Sekurang-kurangnya itulah sebahagian set masalah. Forensik secara amnya merujuk kepada pemulihan maklumat yang mungkin atau tidak mungkin telah dipadam sengaja. Oleh itu, saya fikir saya akan memberikan anda cepat rasa apa yang benar-benar berlaku ke atas semua kali ini di bawah bonet komputer anda. Sebagai contoh, jika anda mempunyai dalam anda komputer riba atau komputer meja anda cakera keras, ia adalah sama ada mekanikal peranti yang sebenarnya berputar - ada perkara yang bulat dipanggil pinggan yang kelihatan agak suka apa yang saya hanya mempunyai di skrin di sini, walaupun ini adalah sekolah yang semakin tua. Ini adalah tiga dan setengah inci cakera keras. Dan tiga setengah inci merujuk daripada dengan perkara apabila anda memasang dalam komputer. Ramai daripada anda semua dalam komputer riba anda sekarang mempunyai cakera keadaan pepejal, atau SSDs, yang tidak mempunyai bahagian yang bergerak. Mereka lebih seperti RAM dan kurang seperti alat-alat mekanikal. Tetapi idea-idea yang masih yang sama, sudah tentu kerana ia berkaitan kepada masalah yang ditetapkan lima. Dan jika anda berfikir tentang sekarang cakera keras mewakili menjadi bulatan, yang Saya akan menarik seperti ini di sini. Apabila anda membuat fail pada komputer anda, sama ada ia adalah SSD, atau dalam kes ini, sekolah memandu lebih tua keras, fail yang terdiri daripada pelbagai bit. Mari kita mengatakan bahawa ia adalah ini 0 dan 1, sejumlah 0 dan 1s. Jadi ini adalah memandu seluruh keras saya. Ini adalah jelas fail agak besar. Dan ia menggunakan sehingga 0 dan 1s pada itu bahagian pinggan fizikal. Nah, apa yang adalah bahawa bahagian fizikal? Nah, ternyata bahawa pada cakera keras, sekurang-kurangnya jenis ini, terdapat zarah magnet sedikit kecil. Dan mereka mempunyai asasnya utara dan kutub selatan kepada mereka, supaya jika anda menjadikan salah satu zarah magnet cara ini, mungkin anda mengatakan bahawa ia adalah mewakili 1. Dan jika ia terbalik ke selatan utara, anda mungkin berkata bahawa ia adalah mewakili 0. Jadi dalam dunia fizikal yang sebenar, itu bagaimana anda boleh mewakili sesuatu negeri binari 0 dan 1. Jadi, itu semua fail adalah. Terdapat sejumlah besar magnet zarah yang mereka dengan cara ini atau cara ini, mewujudkan corak 0 dan 1s. Tetapi ternyata apabila anda menyimpan fail, beberapa maklumat yang disimpan secara berasingan. Jadi ini adalah sebuah meja kecil, direktori, jadi untuk bercakap. Dan saya akan memanggil ini nama kolum, dan Saya akan panggil lokasi ruangan ini. Dan saya akan berkata, rasa ini adalah resume saya. Resume.doc saya disimpan di lokasi, katakan 123. Saya selalu pergi untuk nombor tersebut. Tetapi memadai untuk mengatakan bahawa sama seperti dalam RAM, anda boleh mengambil pemacu keras itu adalah satu gigabit atau 200 gigabait atau terabyte, dan anda boleh bilangan semua bait. Anda boleh bilangannya semua ketulan 8 bit. Oleh itu, kita akan mengatakan bahawa ini adalah 123 lokasi. Jadi ini di dalam direktori operasi saya sistem ingat bahawa saya resume adalah di lokasi 123. Tetapi ia menjadi menarik apabila anda memadam fail. Jadi misalnya - dan bersyukur kerana, sebahagian besar dunia mempunyai terperangkap ke ini - apa yang berlaku apabila yang anda heret fail untuk anda Mac OS Sampah atau anda Recycle Bin Windows? Apakah tujuan untuk melakukan itu? Ia adalah jelas untuk menghilangkan fail, tetapi apakah tindakan menarik dan jatuh ke dalam Sampah atau anda anda Recycle Bin lakukan pada komputer? Benar-benar apa-apa, benar-benar. Ia adalah sama seperti folder. Ia adalah satu folder khas, untuk memastikan. Tetapi adakah ia sebenarnya memadam fail? Nah, tidak, kerana sesetengah daripada anda mungkin telah seperti, oh damn, anda tidak bermaksud untuk berbuat demikian. Jadi anda klik dua kali ganda Sampah atau Recycle Bin. Anda telah mencucuk di sekitar dan anda semula fail hanya dengan mengheret keluar dari sana. Jadi jelas, ia tidak semestinya memotong ia. OK, anda lebih bijak daripada itu. Anda tahu bahawa hanya menarik ia ke dalam Sampah atau Recycle Bin tidak bermakna anda mengosongkan tong sampah. Jadi anda pergi ke menu, dan anda berkata Sampah kosong atau kosong Recycle Bin. Kemudian apa yang berlaku? Ya, jadi ia dipadam lebih lagi. Tetapi semua yang berlaku adalah ini. Komputer lupa di mana resume.doc itu. Tetapi apa yang tidak berubah nampaknya di dalam gambar? Bit, 0 dan 1s bahawa saya menuntut adalah di laman web beberapa aspek fizikal perkakasan. Mereka masih ada. Ia hanya komputer mempunyai lupa apa yang mereka. Jadi ia dasarnya dibebaskan fail ini bit supaya mereka boleh digunakan semula. Tetapi tidak sehingga anda membuat lebih fail, dan banyak fail, dan banyak fail akan probabilistically, mereka 0 dan 1s, mereka zarah magnet, mendapatkan semula, sebelah terbalik atau sehingga, untuk fail lain, 0 dan 1s. Jadi, anda mempunyai tingkap masa ini. Dan ia bukan satu diramal panjang, benar-benar. Ia bergantung kepada saiz keras anda memandu dan berapa banyak fail yang anda mempunyai dan berapa cepat anda membuat yang baru. Tetapi ada tingkap masa ini semasa mana fail yang masih sempurna semula. Jadi jika anda pernah menggunakan program seperti McAfee Norton atau cuba untuk memulihkan data, semua yang mereka lakukan adalah cuba untuk pulih ini direktori yang dipanggil untuk memikirkan di mana fail anda berada. Dan kadang-kadang Norton dan akan berkata, fail adalah 93% pulih. Nah, apa maksudnya? Itu hanya bermaksud bahawa sesetengah fail lain kebetulan akhirnya menggunakan, berkata, bit-bit daripada fail asal anda. Jadi apa sebenarnya yang terlibat dalam memulihkan data? Nah, jika anda tidak mempunyai sesuatu seperti Norton pra-dipasang pada komputer anda, yang terbaik kadang-kadang anda boleh lakukan ialah melihat pada pemacu keras mencari corak bit. Dan salah satu daripada tema set masalah lima adalah bahawa anda akan mencari bersamaan cakera keras, forensik imej kad kilat padat dari kamera digital, mencari 0s dan 1s yang biasanya, dengan tinggi kebarangkalian, mewakili mula imej JPEG. Dan anda semua boleh memulihkan imej itu oleh andaian, jika saya melihat corak bit pada gambar forensik, dengan kebarangkalian yang tinggi, yang menandakan permulaan JPEG. Dan jika saya melihat corak yang sama sekali lagi, yang mungkin menandakan permulaan lain JPEG, dan satu lagi JPEG, dan satu lagi JPEG. Dan ini biasanya bagaimana pemulihan data akan berfungsi. Apa yang baik tentang JPEG adalah walaupun format fail itu sendiri adalah agak kompleks, permulaan setiap apa-apa fail adalah sebenarnya agak pasti dan mudah, kerana anda akan melihat, jika anda tidak telah sudah. Jadi mari kita melihat dengan lebih dekat di bawah hud untuk betul-betul apa yang telah berlaku, dan apa yang 0 dan 1s adalah, untuk memberi anda sedikit lebih daripada satu konteks cabaran ini tertentu. [MAIN SEMULA VIDEO] -Jika PC anda menyimpan paling data tetapnya. Untuk berbuat demikian, data bergerak dari RAM bersama-sama dengan perisian isyarat yang memberitahu cakera keras bagaimana untuk menyimpan data tersebut. Litar pemacu keras menterjemahkan orang-orang isyarat kepada voltan turun naik. Ini, seterusnya, mengawal cakera keras ini bahagian yang bergerak, sebahagian daripada beberapa bahagian yang bergerak kiri dalam komputer moden. Sebahagian daripada isyarat kawalan motor yang berputar pinggan-pinggan logam bersalut. Data anda sebenarnya disimpan atas pinggan. Isyarat lain menggerakkan baca / tulis kepala untuk membaca atau menulis data pada pinggan-pinggan. Jentera ini begitu tepat bahawa manusia rambut tidak dapat lulus antara kepala dan berputar pinggan-pinggan. Namun, ia semua kerja-kerja pada kelajuan yang hebat. [AKHIR VIDEO MAIN SEMULA] DAVID MALAN: Zoom dalam sedikit mendalam di apa sebenarnya kepada mereka pinggan-pinggan. [MAIN SEMULA VIDEO] -Mari kita lihat apa yang kita hanya lihat dalam gerakan perlahan. Apabila nadi ringkas elektrik dihantar kepada baca / tulis kepala, jika lambungan pada elektromagnet kecil bagi sebahagian kecil daripada kedua. Magnet mewujudkan satu bidang yang perubahan kekutuban kecil, kecil Sebahagian daripada zarah logam yang kot setiap permukaan pinggan. Satu siri corak ini kecil, bayaran-up kawasan pada cakera mewakili satu bit tunggal data dalam bilangan binari Sistem yang digunakan oleh komputer. Sekarang, jika semasa dihantar satu cara melalui membaca yang / tulis kepala, kawasan adalah polarisasi dalam satu arah. Jika semasa dihantar dalam arah bertentangan, polarisasi bertukar. Bagaimana anda mendapat data dari cakera keras? Hanya membalikkan proses. Jadi ia adalah zarah pada cakera yang mendapat semasa di dalam Kepala baca / tulis bergerak. Meletakkan bersama-sama berjuta-juta ini segmen bermagnet, dan anda mempunyai fail. Kini, keping fail tunggal boleh yang berselerak di seluruh memandu itu pinggan-pinggan, jenis seperti keadaan kucar-kacir kertas-kertas di meja anda. Jadi fail istimewa menjejaki di mana segala-galanya. Tidakkah anda ingin anda mempunyai sesuatu seperti itu? [AKHIR VIDEO MAIN SEMULA] DAVID MALAN: OK, mungkin tidak. Jadi berapa banyak daripada anda semua membesar dengan ini? OK, jadi ia adalah sedikit dan kurang tangan setiap tahun. Tetapi saya gembira anda sekurang-kurangnya biasa dengan mereka, kerana ini dan kita sendiri buku demo, sedih, mati yang sangat melambatkan kematian sini kebiasaan. Tetapi ini adalah apa yang saya, sekurang-kurangnya, pada tahun sekolah tinggi, penggunaan digunakan untuk sandaran. Dan ia adalah menakjubkan, kerana anda boleh menyimpan 1.4 megabait pada ini cakera tertentu. Dan ini adalah versi ketumpatan tinggi, seperti yang ditunjukkan oleh HD, yang mempunyai bermakna sebelum HD video hari ini. Kepadatan Standard adalah 800 kilobytes. Dan sebelum itu, terdapat Cakera 400 kilobait. Dan sebelum itu, terdapat 5 dan 1/4 cakera inci, yang tidak benar-benar liut, dan sedikit lebih luas dan lebih tinggi daripada perkara-perkara ini di sini. Tetapi anda sebenarnya boleh melihat yang dipanggil aspek liut cakera ini. Dan berfungsi, mereka sebenarnya agak sama dengan cakera keras sekurang- kurangnya jenis ini. Sekali lagi, SSDs dalam komputer baru bekerja sedikit berbeza. Tetapi jika anda memindahkan bahawa tab logam sedikit, anda sebenarnya boleh melihat cookies sedikit, atau piring. Ia bukan logam seperti yang satu ini. Yang ini sebenarnya beberapa murah bahan plastik. Dan anda boleh jenis hal bergoyang itu. Dan anda telah trully hanya dihilangkan dari beberapa bilangan bit atau zarah magnet dari cakera ini. Jadi bersyukur, tiada apa-apa di atasnya. Jika perkara itu dengan cara - dan merangkumi mata anda dan orang-orang yang jiran anda - anda boleh hanya jenis tarik ini keseluruhan off sarung seperti itu. Tetapi ada spring sedikit, jadi sedar bahawa dengan mata anda. Jadi sekarang anda mempunyai benar-benar cakera liut. Dan apa yang luar biasa tentang perkara ini adalah bahawa dalam seberapa banyak kerana ini adalah perwakilan kecil-kecilan yang lebih besar cakera keras, perkara-perkara ini super, mudah super. Jika anda picit bahagian bawah ia, sekarang perkara yang logam adalah di luar, dan kulit mereka membuka, semua ada adalah dua keping dirasai dan cakera liut yang dipanggil dengan sekeping logam di bahagian dalam. Dan ada pergi separuh daripada kandungan Cakera saya. Terdapat pergi satu lagi separuh daripada mereka. Tetapi itu semua yang berputar di dalam komputer anda dalam tadi. Dan sekali lagi, untuk meletakkan ini ke dalam perspektif, berapa besar ialah kebanyakan anda keras memandu hari ini? 500 gigabait, terabyte, mungkin dalam komputer meja, 2 terabytes, 3 terabytes, 4 terabytes, bukan? Ini adalah salah satu megabait, memberi atau mengambil, yang tidak dapat menyesuaikan MP3 biasa lagi hari ini, atau fail muzik yang sama. Jadi cenderamata sedikit untuk anda hari ini, dan juga untuk membantu contextualize apa kita akan mengambil untuk diberikan kini dalam masalah menetapkan lima. Jadi mereka adalah milik anda untuk menjaga. Jadi biarlah saya peralihan kepada mana akan menghabiskan pset seterusnya juga. Jadi, sekarang kita telah menetapkan halaman ini untuk - oh, beberapa pengumuman dengan cepat. Jumaat ini, jika anda ingin menyertai CS50 untuk makan tengah hari, pergi ke tempat yang biasa, cs50.net/rsvp. Dan projek akhir - jadi satu sukatan pelajaran, kita telah mencatatkan spesifikasi projek akhir sudah. Menyedari bahawa itu tidak bermakna ia disebabkan terutamanya tidak lama lagi. Ia disiarkan, benar-benar, hanya untuk mendapatkan kamu memikirkan ia. Dan sesungguhnya, yang ketara super peratusan anda akan menangani projek akhir pada bahan yang kita tidak walaupun telah mendapat ke dalam kelas, tetapi akan seawal minggu depan. Notis, walaupun, bahawa spesifikasi memerlukan beberapa komponen yang berbeza daripada projek akhir. Yang pertama, dalam beberapa minggu, adalah pra-cadangan, e-mel yang agak kasual untuk TF anda untuk memberitahu dia atau apa yang anda memikirkan untuk projek anda, dengan Tiada Komitmen. Cadangan akan menjadi tertentu anda komitmen, berkata, di sini, ini adalah apa Saya ingin lakukan untuk projek saya. Apa yang anda fikir? Terlalu besar? Terlalu kecil? Adakah ia terkawal? Dan anda melihat spesifikasi untuk maklumat lanjut. Beberapa minggu selepas itu status laporan, yang adalah sama e-mel biasa untuk TF anda untuk mengatakan betapa jauh di belakang anda berada di akhir anda pelaksanaan projek, diikuti oleh Hackathon yang CS50 yang semua orang adalah dijemput, yang akan menjadi acara dari Pukul 8:00 PM pada satu petang hingga 7:00 AM keesokan harinya. Pizza, kerana saya mungkin telah disebut dalam seminggu sifar, Wil disampaikan pada 9:00 PM, Makanan Cina pada jam 1:00 PM. Dan jika anda masih berjaga pada 5:00 AM kami akan membawa anda ke Ruangan untuk sarapan pagi. Jadi Hackathon adalah salah satu yang lebih pengalaman tidak dapat dilupakan di dalam kelas. Kemudian pelaksanaan adalah kerana, dan maka CS50 Pesta klimaks. Maklumat lanjut mengenai semua ini pada minggu-minggu akan datang. Tetapi biarlah kita kembali kepada sesuatu sekolah lama - lagi, array. Jadi array adalah bagus, kerana ia menyelesaikan masalah seperti yang kita lihat hanya masa lalu dengan struktur pelajar mendapat keluar sedikit kawalan jika kita mahu mempunyai pelajar satu, pelajar dua, tiga pelajar, pelajar dot dot dot, beberapa nombor sewenang-wenangnya pelajar. Jadi array, beberapa minggu lalu, menukik dalam dan menyelesaikan semua masalah kita tidak mengetahui terlebih dahulu berapa banyak perkara jenis sesetengah kita mungkin mahu. Dan kita telah melihat bahawa structs boleh membantu kita terus menganjurkan kod kita dan menyimpan pembolehubah konsep yang sama, seperti nama dan rumah, bersama-sama, supaya kita boleh merawat mereka sebagai satu entiti, di dalam di mana terdapat bahagian yang lebih kecil. Tetapi array mempunyai beberapa kelemahan. Apakah beberapa kelemahan kami telah menemui dengan pameran setakat ini? Apa itu? Saiz tetap - jadi walaupun anda mungkin dapat memperuntukkan memori untuk pelbagai, sebaik sahaja anda tahu berapa ramai pelajar anda mempunyai, berapa banyak aksara yang anda mempunyai daripada pengguna, apabila anda telah diperuntukkan pelbagai, anda telah jenis dicat diri anda ke satu sudut. Kerana anda tidak boleh memasukkan elemen-elemen baru ke tengah-tengah array. Anda tidak boleh memasukkan lebih elemen pada akhir array. Betul, anda perlu mengambil jalan untuk mewujudkan pelbagai baru, seperti yang kita telah dibincangkan, meniru lama ke yang baru. Dan sekali lagi, yang sakit kepala yang GetString memperkatakan untuk anda. Tetapi sekali lagi, anda bahkan tidak boleh memasukkan sesuatu ke tengah-tengah pelbagai jika kadar tidak sepenuhnya diisi. Sebagai contoh, jika ini di sini pelbagai saiz enam hanya mempunyai lima perkara di dalamnya, baik, hanya anda boleh jelujur sesuatu ke akhir. Tetapi bagaimana jika anda mahu untuk memasukkan sesuatu ke tengah-tengah pelbagai, walaupun ia mungkin mempunyai lima daripada enam perkara di dalamnya? Nah, apa yang kita lakukan apabila kita mempunyai segala sukarelawan manusia di atas pentas dalam minggu lalu? Jika kita mahu meletakkan seseorang di sini, sama ada orang-orang bagaimana untuk menggerakkan ini cara atau orang-orang bagaimana untuk menggerakkan ini cara, dan yang menjadi murah. Peralihan orang di dalam sesuatu pelbagai akhirnya menambah sehingga dan berharga kami masa, oleh itu banyak n kuasa dua kami berjalan masa-masa seperti jenis kemasukan, untuk contoh, dalam kes yang paling teruk. Jadi array yang besar, tetapi anda perlu tahu terlebih dahulu bagaimana besar anda mahu mereka. Jadi OK, di sini adalah penyelesaian. Jika saya tidak mengetahui terlebih dahulu berapa banyak pelajar saya mungkin mempunyai, dan saya tahu sekali Saya membuat keputusan, walaupun, saya terperangkap dengan ramai pelajar, mengapa tidak saya sentiasa memperuntukkan ruang dua kali ganda seperti yang saya sangka saya perlukan? Bukankah itu penyelesaian yang berpatutan? Realistik, saya tidak fikir bahawa kita akan memerlukan lebih daripada 50 slot dalam pelbagai untuk kelas bersaiz sederhana, jadi mari kita hanya pusingan up. Saya akan membuat 100 slot dalam pelbagai saya, hanya supaya kita pasti boleh mendapatkan Bilangan pelajar saya berharap untuk berada di dalam beberapa kelas saiz sederhana. Jadi mengapa tidak hanya pusingan dan memperuntukkan memori yang lebih, biasanya, untuk array dari yang anda fikir anda mungkin perlukan? Apa pushback ini mudah kepada idea itu? Anda hanya membuang ingatan. Harfiah setiap program yang anda menulis kemudian ini mungkin menggunakan memori dua kali ganda anda benar-benar perlukan. Dan yang hanya tidak berasa seperti terutamanya penyelesaian elegan. Selain itu, ia hanya mengurangkan kebarangkalian masalah. Jika anda mempunyai kursus popular satu semester dan anda mempunyai 101 pelajar, program anda masih asasnya menghadapi isu yang sama. Jadi bersyukur, ada penyelesaian untuk iklan ini semua masalah kita dalam bentuk struktur data yang lebih kompleks daripada orang-orang yang kita telah melihat setakat ini. Ini, saya menuntut, adalah senarai berkaitan. Ini adalah senarai nombor - 9, 17, 22, 26, dan 34 - yang telah dikaitkan bersama-sama dengan cara apa yang saya telah dilukis sebagai anak panah. Dalam erti kata lain, jika saya mahu untuk mewakili array, saya boleh melakukan sesuatu seperti ini. Dan saya akan meletakkan di atas ini yang dalam hanya seketika. Boleh saya lakukan - hello, hak semua. Berdiri. Komputer baru di sini, yang jelas - hak semua. Jadi jika saya mempunyai nombor-nombor dalam pelbagai - 9, 17, 22, 26, 24 - tidak semestinya mengikut skala. Baiklah, jadi di sini adalah pelbagai saya - oh tuhan. Baiklah, jadi di sini adalah pelbagai saya. Oh tuhan. [Ketawa] DAVID MALAN: berpura-pura. Ia terlalu banyak usaha untuk kembali dan menetapkan itu, jadi di sana - 26. Jadi kita mempunyai pelbagai ini 9, 17, 22, 26, dan 34. Bagi anda boleh lihat kesilapan memalukan saya hanya dibuat, ada ia. Jadi, saya mengatakan bahawa ini adalah satu penyelesaian yang sangat cekap. Saya telah diperuntukkan sebagai banyak sebagai Ints Saya perlu - satu, kedua-dua, tiga, empat, lima atau enam - dan saya kemudian disimpan nombor dalam pelbagai ini. Tetapi rasa, maka, saya ingin memasukkan satu nilai seperti nombor 8? Nah, di mana ia pergi? Katakan saya mahu memasukkan beberapa seperti 20. Nah, di mana ia pergi? Suatu tempat di sana di tengah-tengah, atau nombor 35 telah pergi tempat pada akhir. Tetapi saya keluar semua ruang. Dan jadi ini adalah satu cabaran asas array yang tidak adalah penyelesaian. Saya mendakwa masa yang lalu, GetString menyelesaikan masalah ini. Jika anda ingin memasukkan nombor keenam ke dalam pelbagai ini, apa yang sekurang-kurangnya satu penyelesaian anda boleh kembali kepada yang pasti, seperti yang kita lakukan dengan GetString? Apa itu? Nah, menjadikan ia lebih besar lebih mudah berkata daripada dilakukan. Kita tidak boleh semestinya membuat pelbagai lebih besar, tetapi apa yang kita boleh buat? Buat pelbagai baru yang lebih besar, saiz 6, atau mungkin saiz 10, jika kita mahu untuk mendapatkan lebih awal daripada perkara-perkara, dan kemudian salin pelbagai lama ke baru, dan kemudian membebaskan pelbagai lama. Tetapi apa yang masa berjalan kini dalam proses itu? Ia adalah besar O n, kerana menyalin akan kos anda beberapa unit masa, jadi tidak begitu sesuai jika kita perlu memperuntukkan pelbagai baru, yang akan untuk mengambil dua kali ganda ingatan sementara. Salinan lama ke baru - Maksud aku, ia hanya sakit kepala, yang adalah, sekali lagi, mengapa kita menulis GetString untuk anda. Jadi apa yang kita boleh lakukan, bukan? Nah, bagaimana jika struktur data kami sebenarnya mempunyai jurang di dalamnya? Katakan bahawa saya berehat matlamat saya mempunyai ketulan berdampingan ingatan, di mana 9 betul-betul bersebelahan dengan 17, yang merupakan betul bersebelahan dengan 22, dan sebagainya. Dan andaikan bahawa 9 boleh lebih di sini di RAM, dan 17 boleh terlebih di sini dalam RAM, dan 22 boleh terlebih di sini dalam RAM. Dalam erti kata lain, saya tidak memerlukan mereka walaupun kembali ke belakang lagi. Saya hanya perlu entah bagaimana benang jarum melalui setiap nombor-nombor ini, atau setiap nod ini, seperti yang kita akan memanggil segi empat tepat seperti yang telah saya diambil mereka, ingat bagaimana untuk sampai ke lepas nod itu daripada yang pertama. Jadi, apakah program yang membina kita telah melihat baru-baru ini yang aku boleh melaksanakan benang itu, atau disediakan di sini, dengan yang saya boleh melaksanakan mereka anak panah? Petunjuk Jadi, bukan? Jika saya tidak memperuntukkan hanya int, tetapi nod - dan oleh nod, saya hanya bermakna bekas. Dan visual, saya maksudkan segi empat tepat. Jadi nod nampaknya memerlukan mengandungi dua nilai - int itu sendiri, dan kemudian, seperti yang dibayangkan oleh separuh bahagian bawah segi empat tepat, ruang yang mencukupi untuk int an. Jadi hanya berfikir ke hadapan di sini, bagaimana besar adalah nod ini, ini bekas dalam soalan? Berapa banyak bait untuk int? Mungkin 4, jika ia yang sama seperti biasa. Dan kemudian berapa banyak bait bagi penunjuk? 4. Jadi ini bekas, atau nod ini, adalah akan menjadi satu struktur 8-bait. Oh, dan itu adalah satu kebetulan gembira kita hanya memperkenalkan konsep ini a struct, atau struktur C a. Jadi saya mendakwa bahawa saya ingin mengambil langkah ke arah yang lebih canggih pelaksanaan senarai nombor, satu Senarai berkaitan nombor, saya perlu melakukan berfikir lebih sedikit di depan dan mengaku bukan hanya int, tetapi struct a bahawa saya akan memanggil, konvensional di sini, nod. Kita boleh memanggilnya apa yang kita mahu, tetapi nod akan menjadi tema dalam banyak satu perkara yang kita mula melihat sekarang. Di dalam nod yang merupakan n int. Dan kemudian sintaks ini, sedikit pelik pada pandangan pertama - struct nod * seterusnya. Well bergambar, apakah itu? Itu adalah separuh bahagian bawah segi empat tepat yang kita lihat hanya masa yang lalu. Tetapi mengapa saya mengatakan struct nod * berbanding hanya nod *? Kerana jika penunjuk yang menunjuk pada nod yang lain, ia hanya alamat nod. Itulah yang konsisten dengan apa yang kita telah membincangkan mengenai petunjuk setakat ini. Tetapi mengapa, jika saya menuntut struktur ini adalah dipanggil nod, adakah saya perlu mengatakan struct nod dalam sini? Tepat sekali. Ia adalah jenis kenyataan bodoh C. The typedef, jadi untuk bercakap, tidak mempunyai berlaku lagi. C super literal. Ia berbunyi atas kod anda untuk bawah, kiri ke kanan. Dan sehingga ia mencecah koma bertitik bahawa pada Dasarnya, meneka apa yang tidak wujud sebagai jenis data? Node, quote unquote nod. Tetapi oleh kerana lebih lantung akuan saya lakukan pada baris pertama - typedef nod struct - kerana mendapat tempat pertama, sebelum pendakap kerinting, itulah jenis seperti pra-mendidik dilafaz itu, anda tahu apa, memberi saya satu struct dipanggil nod struct. Terus terang, saya tidak suka memanggil perkara struct nod, struct nod semua sepanjang kod saya. Tetapi saya hanya akan menggunakannya sekali, hanya di dalam, supaya saya boleh berkesan mencipta sejenis rujukan pekeliling, tidak penunjuk kepada diri saya sendiri per se, tetapi penunjuk kepada satu lagi jenis yang sama. Jadi ternyata bahawa pada struktur data seperti ini, terdapat beberapa operasi yang mungkin kepentingan kepada kami. Kita mungkin mahu memasukkan ke dalam senarai seperti ini. Kita mungkin mahu memadam daripada senarai seperti ini. Kita mungkin ingin mencari senarai untuk nilai, atau lebih amnya, gerakan pantas. Dan traverse adalah hanya satu cara mewah berkata permulaan di sebelah kiri dan memindahkan semua jalan ke kanan. Dan notis, walaupun dengan ini lebih sedikit struktur data yang canggih, marilah saya mencadangkan supaya kita boleh meminjam beberapa idea-idea dua minggu lalu dan melaksanakan fungsi yang dipanggil mencari seperti ini. Ia akan kembali benar atau palsu, menunjukkan, ya atau ada, n adalah dalam senarai. Hujah kedua adalah penunjuk ke dalam senarai itu sendiri, jadi penunjuk kepada nod. Semua saya akan lakukan adalah kemudian mengisytiharkan berubah-ubah sementara. Kita akan memanggilnya ptr dengan konvensyen, untuk penunjuk. Dan saya sediakan sama dengan awal senarai. Dan kini melihat gelung sementara. Selagi penunjuk tidak sama untuk menyeimbangkan, saya akan menyemak. Adalah penunjuk arrow n sama dengan n yang telah diluluskan dalam? Dan tunggu satu minit - new sekeping sintaksis. Apakah arrow tiba-tiba? Ya? Tepat sekali. Jadi manakala beberapa minit lalu, kami menggunakan notasi titik untuk mengakses sesuatu dalam sebuah struct, jika berubah-ubah anda tidak adalah struct itu sendiri, tetapi penunjuk kepada struct itu, bersyukur, sekeping sintaks yang akhirnya masuk akal intuitif. Arrow bermakna mengikuti penunjuk, seperti anak panah kita biasanya bermakna bergambar, dan pergi bidang data dalam. Jadi arrow adalah perkara yang sama sebagai titik, tetapi anda gunakan apabila anda mempunyai penunjuk. Jadi untuk menggulung itu, jika bidang n dalam struct yang dipanggil penunjuk sama sama n, kembali benar. Sebaliknya, baris ini di sini - pointer sama penunjuk akan datang. Jadi apa ini dilakukan, notis, jika saya saya sedang menghala ke arah yang struct mengandungi 9, dan 9 tidak adalah bilangan Saya cari - katakan saya mencari n bersamaan 50 - Saya akan mengemas kini penunjuk sementara saya untuk tidak menunjukkan pada nod ini lagi, tetapi penunjuk arrow depan, yang akan meletakkan saya di sini. Sekarang, saya sedar adalah badai pengenalan. Pada hari Rabu, kami benar-benar akan melakukan ini dengan beberapa manusia dan dengan ada yang lebih kod pada kadar yang lebih perlahan. Tetapi sedar, kami sedang membuat data kami struktur yang lebih kompleks supaya kita algoritma boleh mendapatkan lebih cekap, yang akan menjadi perlu untuk pset enam, apabila kita memuatkan, sekali lagi, orang-orang 150,000 perkataan, tetapi perlu untuk berbuat demikian cekap, dan ideal, buat program yang berjalan untuk pengguna kami tidak linear, tidak n kuasa dua, tetapi dalam masa yang berterusan, di ideal. Kami akan melihat anda pada hari Rabu. SPEAKER: Pada CS50 seterusnya, David lupa kes asas beliau. DAVID MALAN: Dan itulah bagaimana anda menghantar mesej teks dengan C. Apa - [MESSAGE TEXT PELBAGAI PEMBERITAHUAN Bunyi]