>> [MÜZİK OYUN]
>> [VİDEO OYNATMA]
>> -Yalan söylüyor.
>> -Ne hakkında?
>> -Bilmiyorum.
>> Biz ne biliyoruz peki?
>> 9:15, Ray -yani Santoya ATM oldu.
-Evet.
Yani soru, ne O 9:16 de yapıyordu?
>> Bir şey de 9 milimetre -Shooting.
Belki nişancıyı gördü.
>> -Yoksa Onunla çalışıyordu.
>> Bekle.
Geri bir gidin.
>> -Ne görüyorsun?
>> Tam ekran yukarı yüzünü getir.
>> -His Gözlük.
>> Bir yansıması -İşte bu.
>> -Bu Nuevitas beyzbol takımı.
Bu onların logosu.
>> -Ve Konuştuğu kim o ceketi giyiyor.
>> [SON OYNATMA]
>> DAVID MALAN: Pekala.
Bu CS50 ve bu biraz daha ve [duyulamaz] hangi sen
sorunu ile dabbling dört set.
Bugün biraz daha bakmaya başlar derinden işaretçileri adı verilen bu şeylere,
o olsa bile hangi Oldukça gizemli bir konu,
o gidiyor çıkıyor aracı olarak hangi biz
bina ve montaj başlayabilirsiniz daha karmaşık programlar.
Ama biz geçen Çarşamba günü yaptım Önce bazı claymation yoluyla.
Yani bu, hatırlama olduğunu Binky ve onu kullanılmış
Bir program bakmak için o gerçekten bir şey ilginç yapmadım,
ama birkaç problem ortaya yaptı.
Peki neden değil yürümek, bugün başlayacak hızlı bir şekilde bu adımların bir kaç aracılığıyla,
İnsanın açısından içine damıtmak deneyin tam olarak ne burada oluyor
ve neden bu kötü, ve sonra hareket ve aslında bir şey oluşturmaya başlayabilirsiniz
Bu teknikle?
Peki bu ilk olduğunu Bu programda iki satır
ve meslekten olmayan şartlarını, ne Bu iki satır yapıyorsun?
Oldukça rahat biri Ne ekranda ilan ediyor ile?
Yapıyor bu iki satır nelerdir?
Her olmadığını Haftanın tek farklı,
ancak bazı yeni özel sembol var.
Evet?
Geri orada.
>> HEDEF KİTLE: işaretçiler bildirmek?
DAVID MALAN: Tekrar söyle?
HEDEF KİTLE: işaretçiler bildirmek?
DAVID MALAN: bildirmek işaretçileri ve en biraz daha rafine edelim.
HEDEF KİTLE: [duyulamaz] adres, x ve y sonra.
DAVID MALAN: Ve sonra adres.
Yani özellikle biz ne yapıyoruz Biz iki değişken bildirmek edilir.
Bu değişkenler, olsa da, gidiyoruz türü int yıldızın, olmak için hangi
daha spesifik olarak ifade Onlar saklamak için gidiyoruz
bir int adresi, sırasıyla x ve y.
Şu anda herhangi bir değerler vardır?
Bu herhangi bir fiili adresleri var mı zaman içinde bu noktada iki değişken?
Hayır.
Bu sadece çöp değerleri sözde var.
Aslında bir atamazsanız RAM oldu ne olursa olsun, değişken,
Daha önce sıfırlarla doldurmak için gidiyor ve olanlar bu değişkenlerin her ikisi de.
Ama biz henüz bilmiyoruz ne olduklarını ve işte
Neden Binky anahtarı olacak Geçen hafta başını kaybetti.
>> Yani bu claymation oldu Bu enkarnasyonunun
bu sayede sadece iki değişken vardır, kil küçük dairesel parçalar,
Bu değişkenler depolamak, ama olabilir sarılmış oklar önermek
aslında işaret değil herhangi bir yerde bilinen.
Öyleyse biz bu çizgi vardı ve bu bellek oldu yeni geçen hafta, malloc
sadece bir fantezi yoludur tahsisi, İşletim sistemini anlatan, Linux
veya Mac OS veya Windows, Hey, bana bazı bellek ver
ve sahip tüm anlatmak için İşletim sistemi
bellek için bunu isterken budur.
Bu ne bakım gitmiyor Eğer onunla yapmak için gidiyoruz
ancak işletim söylememe gerek yok Ne malloc yoluyla sistem.
Evet?
>> HEDEF KİTLE: Ne kadar?
DAVID MALAN: Ne kadar?
Ne kadar bayt ve böylece, bu, yine zoraki bir örnek, sadece söylediğini
Bana bir int boyutunu verir.
Bir int Şimdi büyüklüğü Dört bayt veya 32 bit.
Yani bu sadece bir yoludur diyerek, hey, işletim sistemi,
Bana hafıza dört bayt vermek Benim emrinde kullanabileceğiniz,
ve özellikle, ne yaptığını saygı ile malloc dönüş
Dört bayt o yığın?
HEDEF KİTLE: Adres?
DAVID MALAN: adresi.
Dört bayt bu öbek adresi.
Kesinlikle.
Ve böylece sonuçta depolanan ne biz gerçekten yok neden x ve işte
bakım şey bu sayısı o OX1 veya ox2 olsun adresi,
ya da bazı şifreli onaltılık adresi.
Biz sadece pictorially bakım O x değişkeni artık olduğunu
belleğin o öbek işaret.
Yani ok bir işaretçi temsil veya daha özel olarak, bir bellek adresi.
Fakat yine de, biz genellikle umurumda değil Bu gerçek adresleri nelerdir.
Şimdi, bu hat diyor Ne meslekten olmayan açısından?
Yıldız x 42 noktalı virgül alır.
Bu ne anlama gelir?
Gitmek istiyorsun?
Boynunu çizmeyin.
>> İZLEYİCİ: x adresi 42 yer almaktadır.
>> David MALAN: x adresi 42 yer almaktadır.
Tam değil.
Çok yakın, ama oldukça, var, çünkü Bu x önek var yıldızı.
Yani biz biraz oynamak gerekiyor.
Evet?
>> HEDEF KİTLE: değer, işaretçi x 42 olduğunu işaret ediyor.
DAVID MALAN: Tamam.
Işaretçi x bu değer 42 olması, diyelim etmek zorundadır işaret ederek,
ya da, yıldız başka bir deyişle x ne olursa olsun adrese gidin diyor
bu 1 Oxford olsun, x ise Sokak ya da 33 Oxford Street
ya OX1 ya OX33, ne olursa olsun sayısal adres olduğu
Yıldız x x dereferencing olduğunu.
Yani bu adrese gidin ve sonra oraya numarayı 42. koydu.
Yani olacak bir söyleyerek eşdeğer yolu.
Yani her şey yolunda ve sonra biz resmi temsil edeceğini
aşağıdaki gibi biz ekledik nerede Dört bu öbekte 42
Sağ taraftaki bayt ama işler ters gitti bu nerede çizgi
ve Binky kafası attı Bu noktada kapalı,
kötü şeyler olur, çünkü ne zaman Eğer çöp değerler inceleyebilirsiniz
Geçersiz inceleyebilirsiniz sen ya işaretçiler ve geçersiz say
çünkü bu noktada Hikaye, y içinde ne var?
Temelli y değeri nedir Geçtiğimiz birkaç adım?
Evet?
Bu da ne?
>> HEDEF KİTLE: bir adres.
DAVID MALAN: bir adres.
Bu bir adres olmalı ama ben başlatılmış var?
Yani henüz yok.
Yani orada olmak ne biliniyor?
Sadece bazı çöp değerdir.
O sıfırdan için herhangi bir adres olabilir 2 milyar RAM iki konser varsa,
ya da sıfır 4 milyar Sizin yasiyorsaniz RAM dört gigabayt var.
Bu, bazı çöp değer ama sorun
işletim sistemi olduğu, Seni verilmediği takdirde
bu bellek öbek özellikle Eğer gitmek için çalışıyoruz ki
genellikle ne neden oluyor Biz parçalama arızası olarak gördüm.
Yani aslında, size herhangi birine sahip olan ofis saatlerinde sorunlara mücadele
veya sorunlar o daha var Genellikle anlamaya çalışıyorum ile
Bir segmentasyon hatası, Bu genellikle gelir
Eğer bir segment dokunuyorsun Eğer olmamalıdır bellek.
Belleği dokunmadan konum İşletim sistemi değildir vardır
o olsun, sen dokunmak için izin senin dizide çok giderek
olsun veya olmasın, şimdi başlıyor Eğer dokunmadan çünkü bu kadar
sadece bazı çöp değeri bellek.
>> Yani burada yıldız x yapıyor tanımsız davranış tür.
Bunu oran çünkü bunu asla , program sadece çökmesine gidiyor vardır,
Söylediğiniz çünkü, Bu adrese gitmek
ve hiç bir fikrim var nereye Bu adres aslında.
Yani işletim sistemi muhtemeldir Programınızı çökmesine gidiyor
bir sonucu olarak gerçekten, işte Ne Binky orada oldu.
Bu yüzden, sonuçta, Binky sabit Bu bu sorun.
Bu programın Yani kendisi hatalıydı.
Ama tür adımlarla ilerlemek eğer ve bunun yerine bu satırı yürütmek,
y sadece x eşittir ne demekse adresi bir x, y de koydum.
>> Ve böylece resimsel, biz ettik İki oklarla bu temsil
x ve y den işaret itibaren Aynı yerde.
Yani semantik x eşittir y olanların hem çünkü
Aynı depolamak adres, ergo, 42 işaret
ve şimdi, ne zaman yıldız demek y, y adrese gitmek
Bu ilginç bir yan etkisi yoktur.
Yani y adresi x adrese aynı şey.
Yani eğer sen adrese gitmek demek ve y 13 değerini değiştirin,
başka kim etkileniyor?
X, D noktası, yani, konuşmak için bir hem de etkilenmiş olmalıdır.
>> Ve gerçekten, nasıl Nick bu resmi çizdim claymation tam olarak oldu.
Biz işaretçi izleyin olsa y biz aynı yerde sona erdi
ve bu yüzden yazdırmak için olsaydı x veya y en pointee üzerinden,
o zaman 13 değerini görecekti.
Şimdi, ben pointee olmak demek Video tutarlı.
Programcılar için benim bilgi, asla gerçekte
Kelime pointee demek, sivri olan bu
en ama tutarlılık video ile gerçekleştirmek
oldu hepsi bu durumda geliyordu.
Claymation üzerinde Yani herhangi bir soru veya işaretçileri veya malloc henüz?
Hayır mı?
Pekala.
>> Bu yüzden daha fazla olmadan ado, en bir göz atalım
Bu aslında sahip olduğu at bir süre kullanılmıştır.
Yani biz bu CS50 kütüphanesi yaşadım Bu bu fonksiyonların hepsi var.
Biz, GETINT getString çok kullandım Muhtemelen daha önce GetLongLong
Benim Pset bir ya da öylesine, ama aslında neler oluyor?
Peki, hızlıca bir göz atalım Bir programda başlık altında olduğunu
Size CS50 vermek neden ilham Kütüphane ve aslında geçen hafta olduğu gibi,
Biz o almaya başladı Eğitim tekerlekleri kapalı.
Yani bu şimdi sıralanır Bir postmortem ne
vardır devam CS50 kütüphane içinde,
Şimdi hareket başlayacak olsa da ondan programların çoğu için.
>> Yani bu, 0 scanf denilen bir programdır.
Bu süper kısa.
Sadece bu satırları vardır, ama Bir işlevi çağrılır scanf tanıttı
biz aslında görmek için gidiyoruz CS50 kütüphane içinde bir an,
biraz farklı bir biçimde de olsa.
Hat 16 Yani bu program değişken x ilan edilir.
Bu yüzden bana bir int için dört bayt verir.
Bu kullanıcıyı söyleyip duruyor sayı, lütfen ve sonra
Bu ilginç bir çizgi olduğunu Aslında geçen hafta birbirine bağlayan
ve bu.
SCANF ve sonra bir alır fark biçim dizesi, sadece printf gibi,
% i bir int anlamına gelir ve sonra bir sürer Biraz görünüyor İkinci argüman
korkak.
Bu işareti x, ve hatırlamak için, biz sadece bu kez geçen hafta gördüm.
Işareti x neyi temsil ediyor?
Işareti C ne yapar?
Evet?
>> HEDEF KİTLE: adresi.
DAVID MALAN: adresi.
Yani tam tersi Yıldız operatörün,
Yıldız operatörü diyor, oysa gitmek Bu adres, işareti operatörü
anlamaya diyor Bu değişkenin adresi,
ve böylece bu, çünkü anahtar Hayatta scanf amacı
kullanıcının taramak için klavyeden girdi,
ne bağlı o tipleri, ve sonra bu kullanıcı girişi okumak
Bir değişkene, ama biz Son iki hafta içinde gördüm
Bu takas fonksiyonu o biz uygulamaya zahmetsizce çalıştı
Sadece kırıldı.
Swap fonksiyonu ile hatırlayın, biz sadece ints olarak A ve B ilan eğer,
başarıyla takas yaptım swap içinde iki değişken
Sadece süt ve oj gibi, ancak takas, iade kısa sürede
saygı ile sonuç ne oldu x ve y, özgün değerleri?
Hiçbir şey.
Evet.
Hiçbir şey, çünkü o zaman oldu swap, sadece yerel kopyaları değiştirmek
Tüm demek olan Bu sefer, ne zaman biz ettik
argümanlar geçen edilmiş işlevleri nedeniyle, konum
sadece bu argümanlar kopyalarını geçen.
Bunu yapabilirsiniz Onlarla ne istersen,
ama onlar hayır için gidiyoruz Orijinal değerler üzerinde etkisi.
Yani bu eğer sorunlu scanf gibi bir işlevi var istiyorum
Hayatta, amacı taramak için klavyeden kullanıcının giriş
ve daha sonra bu yüzden, boşlukları doldurmak konuşmak olduğunu, x gibi bir değişken vermek
Bir değer, ben olsaydım, çünkü Sadece scanf için x geçmek için,
son mantığını düşünün hafta, scanf bunu istediğini yapabilir
x bir kopyası, ama yapamadım Verdiğimiz takdirde kalıcı x değiştirmek
, tabiri caizse, bir hazine haritası scanf x nokta işaretleri nerede, bu sayede
Biz böylece x adresinde geçmek scanf orada aslında değişim gidebilirsiniz
x değeri.
Ve böylece aslında tüm bu program yapar
Benim kaynağında scanf 0, yaparsanız 5m rehberi, scanf 0 yapmak,
dot scanf yırtmaç, sayı 50 Lütfen, 50 için teşekkürler.
>> Yani, tüm bu ilginç değil ama aslında ne oluyor
en kısa sürede ben aramak gibi olduğunu burada, x değerini scanf
kalıcı değiştirildi ediliyor.
Şimdi, bu güzel görünüyor ve İyi, ve aslında, o
biz gerçekten ihtiyacımız yok gibi görünüyor Tüm artık at CS50 kütüphanesi.
Örneğin, en çalışmasına izin Burada bu kez daha.
Bana bir saniye için yeniden edelim.
En bir numara deneyelim lütfen yerine eskisi gibi 50 söyleyerek,
Sadece hayır diyelim.
Tamam, bu biraz garip.
TAMAM.
Burada ve sadece bazı saçma.
Bu yüzden görünmüyor hatalı durumlarla başa.
Bu yüzden başlangıç ​​minimal gerekiyor Bazı hata denetimi ekleme
kullanıcının sahip olduğundan emin olmak için 50 gibi bir gerçek sayı yazdığınız,
görünüşe yazarak kelimelerin çünkü sorunlu olarak algılanmaz,
ama muhtemelen olmalıdır.
>> Şimdi de bu bu sürümü bakalım benim girişimi getString reimplement için.
Scanf bu varsa fonksiyonellik, yerleşik
Neden bu uğraşmaya edilmiştir getString gibi eğitim jantlar?
Peki, burada belki de benim kendimin getString basit versiyonu
bu sayede bir hafta önce, dedim olabilir, Bana bir dize vermek ve tampon diyoruz.
Bugün, sadece başlamak için gidiyorum , karakter yıldızı, geri çağırma söyleyerek
sadece eşanlamlı olduğunu.
Bu korkunç görünüyor ama var aynı şey.
Bu yüzden bana bir değişken olarak adlandırılan tampon vermek bir dize depolamak için gidiyor,
Kullanıcı dizesini lütfen söyle ve daha sonra, daha önce olduğu gibi,
Şimdi bu dersi ödünç çalışalım scanf % s bu kez ve sonra tampon içinde geçmektedir.
Şimdi hızlı bir aklı kontrol.
Neden demiyorum işareti bu sefer tampon?
Önceki örnekte sonucuna.
HEDEF KİTLE: Char yıldızı göstericisidir.
DAVID MALAN: Kesinlikle, Bu sefer, Char çünkü
Yıldız, zaten bir gösterici, bir adres Orada olmak o yıldızın tanımı gereği.
Ve scanf bir adres bekliyorsa, sadece tamponda geçmesi yeterlidir.
Ben işareti tampon söylemek gerekmez.
Meraklı için, sen-ebil Böyle bir şey yapmak.
Farklı bir anlamı olurdu.
Bu size bir işaretçi verecek aslında bir işaretçi için
C ancak için geçerli olan Şimdi, en basit tutalım
ve tutarlı bir hikaye tutun.
Ben sadece geçmek için gidiyorum tampon ve bu doğru.
Sorun olsa budur.
Beni go ahead ve bu çalıştıralım derlemeden sonra programı.
Scanf 1 yapın.
Lanet olsun, benim derleyici en benim hata yakalamak.
Bana bir saniye izin ver.
Clang.
En scanf-1.c diyelim.
TAMAM.
Oraya gidiyoruz.
Ona ihtiyacım var.
CS50 kimliği farklı olan yapılandırma ayarları
kendinize karşı korumak.
Ben ederek bu devre dışı bırakmak için gerekli El ile bu defa clang çalışıyor.
Yani dize lütfen.
Devam edin ve yazın gidiyorum Benim en sevdiğim merhaba dünya.
Null, tamam.
Ben yazdığınız değil.
Yani göstergesidir bir şeyler yanlış olmak.
Beni go ahead ve yazın bakalım Gerçekten uzun dize.
Null Teşekkür ve ben bilmiyorum eğer bunu çökmesine edebilmek için gidiyorum.
Hadi biraz kopyasını deneyelim yapıştırın ve bu yardımcı olmadığını görmek.
Sadece bu bir sürü yapıştırın.
Kesinlikle büyük bir var Her zamankinden daha dize.
Sadece gerçekten yazalım.
Hayır.
Kahretsin.
Komut bulunamadı.
Yani hiçbir ilişkisi yoktur.
Ben yapıştırılan Çünkü bu Bazı kötü karakterler,
ancak bu çıkıyor işe gitmiyor.
>> Çünkü en bu kez daha deneyelim biz aslında çökmesine eğer daha eğlenceli.
Şimdi bu tip edelim ve şimdi, ben gerçekten uzun bir dize kopyalamak için gidiyor
ve şimdi en olmadığını görelim biz Bu şeyi çökmesine sebep olabilir.
Ben boşluk ihmal ve Uyarı Yeni hatlar ve noktalı virgül
ve tüm funky karakter.
Girin.
Ve şimdi ağ sadece yavaş davranıyor.
Ben açıkça, çok uzun Command-V aşağı düzenledi.
Kahretsin!
Komut bulunamadı.
>> TAMAM.
Peki, nokta Yine de, aşağıdaki.
Yani aslında neler olduğunu Bu deklarasyonla üzerinde
hat 16 karakter yıldız tampon?
Yani elde neyim Ben bir işaretçi bildirmek zaman?
Ben alıyorum Bütün dört bayt değeri Tampon olarak adlandırılan, ancak bunun içinde ne
o anda?
Sadece bazı çöp değerdir.
Herhangi bir zamanda Çünkü bir değişken bildirmek C, sadece bazı çöp değer,
ve biz başlıyoruz Bu gerçeğin üzerinde yolculuk.
Şimdi, ben scanf söyleyince, Bu adrese gitmek
ve ne olursa olsun kullanıcı türleri koydu.
Kullanıcı türleri varsa merhaba Dünya, iyi, bunu nereye koyacağım?
Tampon bir çöp değeridir.
>> Böylece bir ok gibi bir şey Bu nerede kim bilir işaret ediyor.
Belki de işaret ediyor Burada benim bellek.
Ve böylece, kullanıcı merhaba dünya tipleri,
Program koymak için çalışır Dize merhaba dünya ters eğik çizgi 0
bu bellek öbekte.
Ama yüksek olasılıkla ancak açıkça değil,% 100 olasılık,
Daha sonra bilgisayar çökmesine gidiyor Program bu değil çünkü
Hafıza Ben dokunmak için izin verilmelidir.
Yani kısacası, bu program tam olarak bu nedenden dolayı kusurlu.
Ben temelde neyi yapmıyorum?
Hangi adımları gibi, ihmal var Biz Binky ilk örnek ihmal?
Evet?
>> HEDEF KİTLE: Bellek ayırma?
>> DAVID MALAN: Bellek ayırma.
Aslında tahsis değil Bu dize için herhangi bir bellek.
Bu yüzden şekillerde bir çift bu çözebilirsiniz.
Bir, biz basit tutabilirsiniz ve aslında, şimdi sen
Bir bulanıklık görmeye başlayacağız Neyin arasındaki çizgilerin
bir dizi, bir dize nedir, ne değildir Char yıldız karakter ne bir dizidir
olduğunu.
İşte ikinci örnek dizeleri ve bildirim içeren
Tüm on line yaptık 16 yerine söyleyerek, bir
Bu tampon bir karakter olacak Yıldız, belleğin bir yığın bir işaretçi,
Ben çok proaktif vereceğim 16 karakter kendimi bir tampon,
ve aslında, bilginiz varsa süreli tamponlama ile
Muhtemelen videoları dünyasından, Bir video tamponlama tamponlama olduğu,
tamponlama.
Peki, bağlantı burada ne var?
YouTube Eh, İç ve video oynatıcılar içinde
genellikle bir dizidir Bu 16 daha büyük.
Bu boyutta bir tane bir dizi olabilir megabayt, belki 10 megabayt,
ve bu diziye tarayıcınızı yok bayt bir sürü indir
megabayt bir sürü video ve video oynatıcı,
YouTube ya da kim var, başlar Bu diziden bayt okuma,
ve her zaman gördüğünüz Kelime tamponlama, tamponlama,
o oyuncu var demektir Bu dizinin sonuna kazanılmış.
Ağ değil sahip olduğu çok yavaş Daha fazla bayt ile dizi doldurulmuş
ve böylece bit bitti kullanıcıya gösterilecek.
>> Yani tampon bir apt terim ki burada bu sadece bir dizi, bellek yığın var.
Ve bu bunu çözecektir çıkıyor çünkü
Eğer diziler tedavi olabilir sanki onlar bile tampon olsa, adresler
sadece bir sembol, bir olmasıdır karakter dizisi, tampon
bu benim için yararlıdır, programcı, etrafında adını iletebilirsiniz
o sanki bir gösterici olarak onun olsa
bir yığın adresi vardı 16 karakter hafıza.
Demek bu yüzden ben geçebilir tam scanf o kelime
ve şimdi, ben bu programı yaparsanız, scanf 2 yapmak, nokta çizgi scanf 2,
ve yazın merhaba dünya, Bu zamanımı girin
>> Hmm, ne oldu?
Dize lütfen.
Neyi yanlış yaptım?
Merhaba dünya tampon.
Merhaba Dünya.
Ah, o ne yaptığını biliyorum.
TAMAM.
Yani o kadar okuyor İlk uzay kadar.
Yani sadece bir an için hile izin ve Ben sadece bir şey yazın istedim demek
Gerçekten bu kadar uzun uzun cümle gibi de bu bir, iki, üç, dört, beş,
altı, yedi, sekiz, dokuz, 10, 11, 12, 13, 14, 15, 16.
TAMAM.
Gerçekten uzun bir cümledir.
Yani bu cümle uzun 16 karakter
ve bu yüzden, Enter vurduğunuzda ne olacak?
Eh, bu durumda Hikaye, ben ilan etmişti tampon
aslında bir dizi olmanın gitmek için 16 karakter hazır olan.
Bu yüzden, bir, iki, üç, dört, beş, altı, yedi, sekiz, dokuz, 10, 11, 12, 13, 14,
15, 16.
Yani 16 karakter ve şimdi, ne zaman Bu bir uzun gibi bir şey okumak
cümle ne ne olduğunu gidiyor Ben bu okuyacağım bir uzun
S-E-K-T-E-N = C-E, cümle.
>> Yani bu kasıtlı olduğunu kötü bir şey olduğunu ben
ötesinde yazmaya devam Benim dizinin sınırları,
Benim tampon sınırları ötesinde.
Şanslı ve programın alabilir bakım çalışan tutmak ve olmayacak
ancak genellikle, bu konuşma Gerçekten benim program kilitlenmesine,
ve bir hata olduğunu benim Ben adım anı kod
sınırları ötesinde Bu dizinin, çünkü ben
bu kadar bilmiyorum mutlaka çökmesine gidiyor
ya da ben sadece şanslı alacağım eğer.
Yani bu sorunlu çünkü Bu durumda, işe görünmektedir
ve en olsa bile, burada kader özendirmek izin IDE biraz tahammül gibi görünüyor
of--
>> Oraya gidiyoruz.
Sonunda.
Yani bu görebiliyorum tek kişi benim.
Yani sadece eğlenceli yazarak bir sürü vardı gerçekten uzun bir fiili ifade dışında
kesinlikle aştı 16 byte, çünkü ben
Bu deli uzun multi-line yazdığınız ifade ve sonra ne oldu fark.
Program yazdırmadan çalıştı ve daha sonra bir segment hataya var
ve segmentasyon hataları olduğunda ise Böyle bir şey olur
ve işletim sistemi diyor hayır, bu bellek dokunamaz.
Biz öldüreceğiz tamamen bir program.
>> Yani bu sorunlu görünüyor.
Ben programı sayede geliştirdik En azından, bazı bellek var
ancak bu sınırlandırmak gibi görünüyor almak için fonksiyon GetString
Bazı sonlu uzunluktaki 16 dizeleri.
Daha uzun desteklemek istiyorsanız Yani 16 karakterden daha cümleler,
ne yaparsınız?
Peki, sen artırabilir 32, bu tampon boyutu
veya bu tür kısa görünüyor.
Neden biz sadece yapmazlar o 1000 ama geri itin.
Sezgisel tepkisi nedir Sadece yaparak bu sorunu önleme
1000 karakter gibi, büyük benim tampon?
Bu şekilde getString uygulayarak.
Burada iyi ya da kötü?
Evet?
HEDEF KİTLE: Eğer çok fazla bağlarsanız alan ve bunu kullanmak değil,
o zaman bu alanı tahsis edemiyor.
DAVID MALAN: Kesinlikle.
Bunu yapmazsanız sürece sanki savurgan var aslında bu bayt 900 ihtiyaç
ve henüz sizin için soruyorsun Zaten toplam 1000,
Sadece daha fazla bellek tüketen ediyoruz Gerekirse daha kullanıcının bilgisayarında,
ve hepsi sonra bazı Zaten Karşılaştığınız
hayatta sen o zaman programların çok çalışan
ve onlar, büyük miktarda bellek kadar yiyorsanız Bu aslında performansı etkileyebilir
ve kullanıcının deneyimi bilgisayarda.
Yani bu tür bir tembel çözüm, emin ve tersine,
değil sadece savurgan olduğunu, sorunun ne Hala benim tampon yapmak bile kalır
1000?
Evet?
>> HEDEF KİTLE: dize uzunluğu 1.001 olduğunu.
DAVID MALAN: Kesinlikle.
Senin dize uzunluğu 1001 ise, Eğer aynı sorun var,
ve benim argümanı ile, yapardım Sadece o zaman 2000 yapmak,
ama sen bilmiyorsun olması gerektiği kadar büyük ilerlemek,
ve henüz, benim programı derlemek zorunda insanların kullanımı icar önce ve indirme
o.
Yani bu tam olarak tür şeyler CS50 kütüphane çalışır olduğunu
bize yardımcı ve biz sadece bakışta olacak etmek altında yatan uygulama bazı
Burada, ancak bu CS50 nokta C Bu CS50 IDE oldu dosyadır
Eğer kullanmakta olduğunuz bütün bu hafta.
Önceden derlenmiş ve sen ettik otomatik olarak kullanıyorum
olan doğası gereği clang L CS50 bayrağı dash,
ama hepsi aşağı kaydırma eğer Bu işlevler, burada getString var,
ve sadece sana vermek için Neyin tadı oluyor
en kısaca bir göz atalım göreceli karmaşıklık.
Bu bir süper uzun var fonksiyonu, ama biz yoktu
Tüm sabit düşünmek zorunda nasıl dizeleri alma hakkında gitmek için.
>> Yani burada benim tampon ve ben var görünüşte null başlatılamadı.
Bu, tabii ki, Char yıldızı olarak aynı şey,
ama ben karar verdim CS50 kitaplığı uygulama
Biz gidiyoruz eğer tamamen dinamik
Ben ne kadar büyük önceden bilmiyorum Dize kullanıcıları almak istiyorum gidiyoruz.
Yani başlamak için gidiyorum Sadece boş bir dize ile
ve ben çok kurmak için gidiyorum Bellek I kullanıcı dizesi sığdırmak gerekiyor gibi
ve ben yoksa Yeterince ben soracağım
Daha fazla bellek için işletim sistemi.
Ben onların dize taşımak için gidiyorum bellek, daha büyük bir yığın haline
ve ben serbest veya serbest gidiyorum bellek yetersiz büyük bir yığın
ve biz sadece gidiyoruz iteratif bunu yapmak için.
>> Yani hızlı bir bakışta, Burada sadece bir değişken
hangi ile ben takip edeceğim Benim tampon kapasitesi.
Kaç bayt sığabilir?
İşte değişken n var Ben tutmak için gidiyorum hangi
Aslında kaç byte iz Kullanıcı yazdığınız ya da o tampon.
Eğer daha önce bu görmedim varsa, sizi belirtebilirsiniz bir int gibi bir değişken
, adından da anlaşılacağı gibi, hangi imzasız demek o negatif olmayan, ve niye
Şimdiye kadar belirterek rahatsız istiyorum bir int sadece bir int olmadığı,
ancak bir unsigned int değil mi?
Bu negatif olmayan bir int var.
[Duyulamaz] ne anlama gelir?
>> HEDEF KİTLE: Bir miktar tanımladığı bellek [inaudible] olabilir.
>> DAVID MALAN: Evet.
Ben imzasız demek, yani bu aslında size ekstra bellek bir bit veren
eğer ve aptalca tür gibi görünüyor, ama , ek bellek bir bit var
Birçok iki kat var demektir Temsil değerler,
bir 0 ya da 1 olabilir, çünkü.
Yani, varsayılan olarak, bir int kabaca olabilir Negatif 2 milyar tüm yol
Pozitif 2 milyar kadar.
Bunlar büyük aralıkları, ama hala biraz savurgan var
Sadece umurumda eğer boyutları, hangi sadece sezgisel
Negatif olmayan olmalı veya olumlu ya da 0, iyi o zaman,
Neden 2 milyar harcıyorsun Negatif sayılar için olası değerler
asla bunları kullanmak için gidiyoruz eğer?
Yani can imzasız, şimdi benim int söyleyerek 4 milyar 0 ile kabaca olacak.
>> Yani burada nedenlerden dolayı sadece bir int C bulunuyor Biz sadece şimdi içine almazsınız
yerine bir int var neden Bir char, ama burada
Neler özü Senin ve bazı
Örneğin, kullanıyor olabilir, Hatta Pset dört fgetc işlevi
veya bundan sonra, biz onu göreceğiz Yine problem beş set
fgetc nedeniyle adı olarak güzel tür, çeşit arcanely anlaşılacağı
bir işlev olduğunu Bir karakter alır ve böylece
Ne temelde farklı Biz getString ne yaptığınızı hakkında
Kullandığımız değiliz olduğunu Aynı şekilde scanf.
Biz sadece adım-adım boyunca sürünen ne olursa olsun üzerinde kullanıcı yazdığınız etti,
biz her zaman bir tane tahsis çünkü Char, ve böylece biz her zaman güvenli olabilir
Bir seferde bir Char bakmak ve Sihir burada gerçekleşmesi başlar.
Ben aşağı kaydırmak için gidiyorum Bu fonksiyonun, orta
Sadece kısaca bu işlevi tanıtmak.
Çok bir var gibi malloc işlevi, var
Bir realloc fonksiyonu burada realloc Eğer bellek yığın yeniden tahsis sağlar
ve daha büyük veya daha küçük yapmak.
Çok uzun lafın kısası ile Bugün için elimi bir dalga,
Bu ne biliyor getString yapıyor bu çeşit olduğunu
bir sihirli büyüyen ya da kullanıcı olarak tampon küçülen
onun dize türleri.
>> Yani eğer kullanıcı türleri kısa bir dize, bu kod
Sadece yeterli ayırır Bellek dize sığdırmak için.
Kullanıcı yazarak tutarsa Ben tekrar ve tekrar yaptığımız gibi
ve yine de, eğer Tampon adlı başlangıçta bu büyük
ve programı, anlar Bir dakika bekleyin, ben boş alan kulüpler,
o iki katına gidiyor tampon boyutu
ve daha sonra tamponu boyutunu iki katına ve iki katına yapan kod,
Burada ona bakarsanız, bu kadar Sadece bu akıllı one-liner.
Bu sözdizimi görmüş olabilir daha önce, ancak yıldız eşittir derseniz,
Bu aynı şey gibidir kapasite kez 2 söyleyerek.
Yani bu sadece katlama tutar tampon kapasitesi
ve sonra realloc söylüyorum vermek kendisi çok daha fazla bellek.
>> Şimdi, bir kenara, orada Burada diğer fonksiyonlar
Biz herhangi bir ayrıntı içine bakmak olmaz GETINT göstermek için başka,
Biz GETINT bölgesindeki getString kullanın.
Biz olmadığını kontrol null, hangi, geri çağırma,
özel bir değerdir bir şeyler ters gitti demektir.
Biz bellek bitti.
Daha bunun için kontrol edin.
Ve biz nöbetçi değerini döndürür.
Ama olarak yorumlarına erteleme edeceğiz Neden sonra biz scanf bu kuzeni kullanın
sscanf denilen ve çıkıyor Bu sscanf, veya dize scanf,
Çizginin bir göz atın sağlar o Kullanıcı yazdığınız ve size izin verdi
esasen analiz ve ben neyi Burada ne ben sscanf söylüyorum olduğunu,
kullanıcının sahip olursa olsun analiz yazdığınız ve emin% i yapmak,
Orada buna arasında bir tam sayı, ve olmaz orada da tam olarak neden bugün içine almak
Özetle bir% burada c, ama bu izin verir Kullanıcı yazdığınız varsa bize algılamak
sayıdan sonra sahte bir şey.
Yani Bunun nedeni GETINT ve GetString yeniden, yeniden denemek için size, yeniden
çünkü tüm olduğu biz yazdık o kod,
bu tür kullanıcının giriş bakıyor emin olarak tamamen sayısal bulunuyor
ya da gerçek bir kayan var nokta değeri veya benzeri
Ne değerine bağlı olarak Kullandığınız çalışır.
>> Yaşasın.
TAMAM.
Bu bir lokma oldu ama mesele burada
biz vardı nedeni Bu eğitim tekerlekler üzerinde
Çünkü en düşük seviyede olduğunu Sadece çok şey olduğunu
Biz istedik yanlış gidebilir preemptively işlemek
kesinlikle böyle şeyler sınıfının ilk hafta
ama şimdi Pset dört ve beş ve Pset ötesinde bunu şöyle fazlası var olduğunu göreceksiniz
Eğer aynı zamanda daha yetenekli olduğunu sorunları bu tür çözme
Kendinizi.
GetString veya GETINT üzerinde herhangi bir sorunuz var mı?
Evet?
>> HEDEF KİTLE: Neden iki katına çıkacak tampon kapasitesi
yerine sadece artan daha bunun tam miktarda?
>> DAVID MALAN: İyi bir soru.
Neden kapasitesi iki katına çıkacak tampon aksine
Sadece artan Bazı sabit değeri ile?
Bu bir tasarım karardı.
Biz sadece eğilimi nedeniyle karar verdi Zaman bilge biraz pahalı sormak için bir olmak
İşletim sistemi bellek, we did not
biniyorlar kadar bitirmek istiyorum Büyük dizeleri için bir durum
biz soran ki tekrar ve tekrar işletim sistemi
ve tekrar ve tekrar bellek için hızlı arkaya.
Yani biz sadece biraz, karar keyfi ama biz makul umut,
, sen, haydi biliyorum öncesinde kendimizi elde etmeye çalışmak
ve sadece bu yüzden iki katına tutmak biz kez miktarını en aza indirmek
Biz malloc aramak zorunda veya realloc, ancak toplam yargı
bilerek yokluğunda çağrı Ne Kullanıcıların yazın isteyebilirsiniz.
Her iki yol tartışılabilir olabilir.
Tartışmasız iyi.
>> Yani bir çift de bir göz atalım bellek başka yan etkilerin,
ters gidebilir şeyler ve araçlar yapabilirsiniz
hatalar bu tür yakalamak için kullanın.
O halde hepiniz çıkıyor check50 size kadar söylemedi
buggy yazıyorum edilmiştir Haftanın tek beri kod
hatta tüm check50 testler ise geçti ve hatta eğer sizin ve TF
süper eminiz amaçlanan gibi kod çalışır.
Kodunuzu adamcağız olmuştur veya sizin bütün kusurlu,
CS50 kütüphanesi kullanarak, bellek sızıntısı oylandı.
Sen işletim sistemini soran oldum programlarının çoğunda bellek
Eğer yazdım, ama sen ettik aslında iade asla.
Sen GetString aradım ve GETINT ve GetFloat,
ama getString, sen ettik unGetString veya Give aramadı
Dize Arka veya benzeri ama biz gördük GetString bellek ayrılamadı yaptığı
malloc yoluyla veya bu tarafından Sadece bir fonksiyon realloc,
ruhu çok benzer, ve henüz biz oldum
işletim sistemini soran hafıza ve bellek tekrar tekrar
ama geri vermeyi asla.
>> Şimdi, bir kenara olarak, o çıkıyor Bir program, belleğin tüm çıkar,
otomatik olarak serbest.
Bu yüzden büyük bir anlaşma olmadı.
Bu kırmak için gitmiyor IDE veya yavaş aşağı şeyler,
ama ne zaman programlar yapmak genellikle bellek sızdırıyor
ve uzun bir süre için koşuyoruz.
Hiç aptal gördüm Eğer Mac OS veya kum plaj topu
Windows bu tür nerede yavaşlatan veya düşünce ya da düşünce
ya da sadece gerçekten başlar Bir tarama yavaş,
Çok büyük olasılıkla olabilir Bir bellek sızıntısı sonucu.
Yazdı programcılar Kullandığınız yazılım
bellek işletim sistemi isteyin her birkaç dakikada, her saat.
Ama çalıştırıyorsanız o olsa bile yazılım,
Bilgisayarınızda minimize saatlerce veya günlerce,
Eğer daha soran olabilir Bellek ve asla aslında bunu kullanarak
ve böylece kod olabilir veya olabilir programları, bellek sızıntısı olabilir
ve bellek sızdırıyor başlarsanız, diğer programlar için daha az bellek var,
ve etkisi olan Her şeyi yavaşlatmak.
>> Şimdi, bu kadar biri tarafından En iğrenç programlar
Eğer fırsat olacaktır CS50 çalıştırmak için sürece
onun çıkış bile daha ezoterik olarak clang ya da 's yapmak veya komut herhangi
Daha önce koşuyoruz satırı programları ama Neyse ki, onun çıkış gömülü
Bazı süper yararlı ipuçları olduğunu yararlı ya Pset dört olacak
ya kesinlikle beş Pset.
Yani valgrind bir araçtır Bu bakmak için kullanılabilir
Programda, bellek sızıntıları için.
Bu çalıştırmak nispeten basit.
Hatta, valgrind ve ardından koşmak Biraz ayrıntılı olsa,
dash dash kaçak kontrolü Tam eşittir, ve sonra nokta
çizgi ve programın adıdır.
Yani valgrind sonra programı çalıştırmak olacak ve programın en sonunda
bu beraberliği önce çalışan ve size başka istemi verir
o analiz gidiyor senin Program yürütüyor esnada
ve sen kaçak söylemedi daha henüz bellek ve
Belleği dokunma ki sana ait değil mi?
Her şeyi yakalamak değil, ama bu birçok şey yakalamak oldukça iyi.
>> Yani burada benim sahip vadede bir örnek Bu program çalıştırmak valgrind sahip
adı verilen bir program Bellek ve ben gidiyorum
olan satırları vurgulamak için sonuçta bize ilgi.
Yani daha fazla dikkat dağıtıcı var Ben slayt silinir ettik.
Ama sadece ne bu görelim Program anlattıklarını yeteneğine sahiptir.
Bu bize bir şeyler anlatmaya yetenekli büyüklüğü 4 geçersiz yazma gibi.
Başka bir deyişle, bellek dokunursanız, bellek, özellikle 4 bayt
Eğer olmamalıdır, valgrind sana bunu söyleyebilirim.
Büyüklüğü 4 Geçersiz yazma.
Sen dört bayt dokundu Eğer olmamalıdır.
Nerede yaptın bunu?
Bu güzelliktir.
Bellek nokta c line 21 nereye olduğunu berbat ve yararlı olur bu yüzden.
Çok GDB gibi, yardımcı olabilir Gerçek hataya işaret.
>> Şimdi, bu biraz daha var ayrıntılı, karmaşık değilse.
1 blokta 40 bayt kesinlikle kayıp kaydının 1 1 kaybetti.
Bu ne anlama gelir?
Peki, bu sadece sizin için sorduk demektir 40 byte ve bunu geri vermedim.
Sen malloc denilen ya da denilen GetString ve işletim sistemi
Seni 40 byte, ancak sizi asla verdi serbest veya bellek serbest,
ve adil olmak, biz göstermek hiç nasıl bellek geri vermek.
Süper var Çıkıyor basit bir işlev ücretsiz çağırdı.
Bir argüman, bir şey alır Eğer, ücretsiz ya da geri vermek istiyorum
ancak 40 byte, görünüşe göre, Bu programda
satırında kaybolmuş Bellek 20 c nokta.
>> Yani bu programı görelim.
Bu süper yararsız.
Sadece gösteriyor Bu belirli bir hata.
Yani bir göz atalım.
Burada ana ve ana, haber, aramalar Bir f fonksiyonu ve daha sonra döner çağırdı.
Yani tüm bu ilginç değil.
F ne yapar?
Ben bir prototip ile uğraşmadı dikkat edin.
Ben kodu tutmak istedim mümkün olduğu kadar az.
Yani ana yukarıda f koymak ve Bu kesinlikle iyi,
Böyle kısa programlar için.
Yani f şeyi dönmek ve does değil değil bir şey almak, ama bunu yapmak yok.
Bu çok gibi, beyan Binky örnekte
Bu x adında bir işaretçi gidiyor bir int adresini saklamak için.
Böylece sol taraf var.
İngilizce, nedir yapıyor sağ taraf?
Herkes?
Bu bizim için ne yapıyor?
Evet?
>> HEDEF KİTLE: [duyulamaz] Zaman bir int boyutu
olan 10 kat [duyulamaz]
DAVID MALAN: İyi ve bana özetleyelim.
Yani 10 tamsayılar için yeterli alan tahsis veya 10, bir int boyutu, ne
bu 4 dört bayt, yani 10 kere bulunuyor 40, ben ettik o sağ tarafında, böylece
Vurgulanan bana 40 bayt vermek ve İlk byte adresini saklamak
x içine.
Ve şimdi son olarak, burada nerede Bu program, buggy, ne olduğunu
hat 21 yanlış olduğunu mantığa dayalı?
Ne hat 21 nesi var?
Evet?
HEDEF KİTLE: Yapamazsınız [duyulamaz] x içine dizin.
DAVID MALAN: Evet.
Ben böyle x içine dizin olmamalıdır.
Yani sözdizimsel, sorun değil.
Ne güzel senin gibi çok olduğu Bir dizinin adını tedavi edebilir
sanki benzer bir işaretçi var bu kadar sanki bir işaretçi davranabilirsiniz
bir dizi ve bu yüzden sözdizimsel can x braket şeyler söylemek x braket i,
ama 10 problemlidir.
Neden?
>> HEDEF KİTLE: Bu içeride değil çünkü.
>> DAVID MALAN: Öyle değil bu bellek yığın içinde.
En büyük değeri ne olmalıdır var Bu köşeli parantez içinde koyarak?
9 arasındaki 9, 0.
Sıfır indeksleme çünkü.
Yani 0 ile 9 arasında iyi olurdu.
Parantez 10 iyi değil ve ancak, her zaman olsa da hatırlamak
Ben CS50 IDE yapmaya görünüyor sahte değerler yazarak kazasında,
her zaman, işbirliği yok ve gerçekten de, sık sık
şanslı sırf İşletim sistemi yok
dikkat edin hiç bu kadar biraz belleğin bazı öbek geçmesi,
Eğer teknik olarak içinde kaldı çünkü senin bölüm, ama daha bu konuda
Bir işletim sistemleri sınıfında, Böyle bir şey ve bu yüzden
çok kolay algılanmayan gidebiliriz.
Programınız asla çökmesine gidiyor sürekli ama belki bir süre içinde.
>> Ve o yüzden valgrind deneyelim Bunun üzerine, ve burada
nerede bunalmış alırsınız anlık çıkışı.
Yani bellek valgrind sızıntısı kontrolü yapmak Tam nokta çizgi belleği eşittir.
Söz veriyorum yüzden burada Bu mahçup olur.
İşte valgrind, burada ne var ne Bir programcı, birkaç yıl önce-
iyi bir fikir olacağını karar verdi gibi çıktı bakmak için.
Yani bu anlamda yapalım.
Sol-el Yani tüm yol sebepsiz tarafı
Programın süreç kimliğidir Biz sadece, benzersiz bir tanımlayıcı çalıştırmak
Program için biz sadece koştu.
Biz o silindi slayt, ama orada
Burada bazı yararlı bilgiler.
>> En çok üst yukarı edelim.
Biz başladı burada.
Yani tüm bu çok çıktı değil.
İşte bu geçersiz yazma bulunuyor hat 21 büyüklüğü 4.
Peki, line 21 neydi?
Satır 21 tam olarak Bu ve mantıklı
Ben validly içinde olduğumu Ben çünkü 4 bayt yazma
Bu tamsayı koymak için çalışırken, hangi bir şey olabilir
Sadece olur sıfır, ama ben çalışıyorum
bir yerde koymak için Bu bana ait değil.
Tek üstelik, buraya, 40 byte bloklar kesinlikle kayıt 1 kaybolur.
Ben malloc çağırdığınızda çünkü var Burada, ben aslında belleği serbest asla.
>> Peki bu düzeltebilirim?
Bana devam edelim ve biraz daha güvenli ve orada 9 yapın ve burada serbest x beni.
Bu bugün için yeni bir işlevdir.
Ben şimdi hafıza nokta çizgi yapmak yeniden varsa, , yine buna valgrind çalışmasına izin
Benim pencere maksimize etmek ve Enter tuşuna basın.
Şimdi, bu iyi.
Onlar iyi bir haber gömmek Bu çıkış tüm.
Tüm yığın blokları özgürdü.
Biz neyi yığın geri geleceğiz ancak herhangi bir sızıntı mümkündür.
Yani bu sadece başka bir senin alet kiti için aracı
hangi ile başlayabilirsiniz Şimdi böyle hataları bulmak.
>> Ama bakalım neler daha Burada yanlış gidebilir.
Şimdi geçişi edelim aslında bir sorun çözme.
Bir kenara, bu bir rahatlatmak eğer konfüzyon veya gerginlik biraz,
Bu artık komik.
Evet.
Bu oldukça iyi.
Göstericiler Çünkü adresleri ve adresleri
Kongre tarafından genellikle onaltılık yazılmış.
Ha, ha, bu artık komik.
Her neyse, bu yüzden şimdi atalım aslında bir sorunu çözmek.
Bu, süper olmuş süper şimdiye kadar düşük seviyeli,
ve biz aslında yararlı yapabiliriz Bu düşük seviyeli detayları ile işler.
>> Bu yüzden birkaç hafta tanıttı önce bir dizi kavramı.
Bir dizi güzeldi çünkü Bizim kodunu temizlemek zor
Biz yazmak istedim çünkü eğer Birden öğrencilerle programı
veya birden fazla isim ve evler ve Yurtlar ve kolejler ve bütün,
Biz her şeyi daha saklamak temiz bir dizi içinde.
Ama bir olumsuz önermek Bir dizinin bugüne kadar.
Bunu kendiniz acı değil olsanız bile Bir programda, sadece içgüdüsel,
kötü bir şey ne Bir dizi hakkında, belki?
Bazı üfürümler duyuyorum.
HEDEF KİTLE: Zor boyutunu değiştirmek için.
DAVID MALAN: Bu zor boyutunu değiştirmek için.
Sen boyutunu değiştiremezsiniz Bir dizinin, aslında, tek başına
C. başka dizi ayırabilirsiniz, eski olandan şeyi taşımak
şimdi yeni ve içine bazı ekstra boşluk var,
ama bir gibi değil Java veya Python gibi dil
ya da diğer herhangi bir sayıda diller bazılarınız
tanıdık olabilir nereye Sadece bir şeyler eklemeye devam edebilirsiniz
Bir dizinin sonuna bıktıracak.
Eğer bir dizi varsa onun büyüklüğü büyüklüğü 6,
ve fikri daha önce benzeri çok Belirli bir boyutta bir tampon sahip
Eğer kapıdan tahmin etmek zorunda Ne boyutu olmasını istiyorsun?
Eğer çok büyük tahmin ederseniz Eğer uzay harcıyorsun.
Eğer çok küçük tahmin ederseniz sizi En azından, bu verileri depolamak olamaz
çok daha fazla işsiz.
>> Işaretçileri Yani bugün, teşekkürler, biz Birlikte kendi özel dikiş başlangıç
veri yapıları, ve Aslında, burada bir şey
Bu biraz daha bakar ilk bakışta şifreli,
ama bu bir bağlantılı arayacağım budur Liste ve özetliyor onun adını tür
o.
Bu sayı bir liste veya Bu durumda, numaralarının listesini,
ama bu şey bir liste olabilir, ama Bu arada okları yolu ile bağlantılıdır
ve sadece bir tahmin almak hangi teknik ile
biz güçlü olacak Birlikte dikiş,
çeşit iplikle patlamış mısır gibi, burada bir liste dikdörtgenler bağlantılı?
Onun numaralar?
Altta yatan bir dil özelliği nedir?
>> HEDEF KİTLE: Bir işaretçi.
>> DAVID MALAN: Bir işaretçi.
Peki bu okların her burada temsil Bir gösterici ya da sadece bir adres.
Yani diğer bir deyişle, ben istiyorum numaralarının listesini saklamak için,
Ben istiyorum ben sadece bunu saklayamazsınız büyümek ve küçültmek yeteneği
Bir dizide benim veri yapısı.
Bu yüzden biraz olması gerekir daha sofistike,
ama bu fark Resim tür anlaşılacağı
Sadece küçük parçacığı var eğer o her şeyi birlikte bağlama,
Muhtemelen yer açmak için o kadar da zor değil Bu dikdörtgenler içinde arasında iki
ya da bu düğümlerin iki olarak biz başlayacağız Yeni bir düğüm koymak, onları çağıran,
ve daha sonra bazı yeni iplikle, sadece Birlikte üç düğüm hendek,
Birincisi, sonuncusu, ve bir Sadece orta takıldığında söyledi.
>> Ve gerçekten bir bağlantılı liste, Bir dizi farklı dinamiktir.
Bu büyüyebilir ve can küçültmek ve yok
bilmek ya da peşin nasıl bakmak zorundasınız kadar veri depoladığınız için gidiyoruz,
ama biz biraz olmak zorunda çıkıyor Bu nasıl uygulanacağına dikkat.
Bu yüzden ilk en biz uygulamak nasıl düşünelim Bu küçük dikdörtgenler biri.
Bir int uygulamak kolaydır.
Sadece o int n ve say Eğer bir int için 4 byte olsun,
ama ben bir int alırım nasıl, n diyoruz ve daha sonra bir gösterici, gelecek diyelim.
Biz bu diyebiliriz şeyler şey istediğimiz
ama özel bir veri yapısı gerekir.
Evet?
>> HEDEF KİTLE: Ampersand [duyulamaz].
>> DAVID MALAN: Yani işareti biz kullanacağız potansiyel bir düğümün adresini almak.
Ama biz başka bir ihtiyacımız C özelliği sipariş
Bana oluşturma becerisi vermek Bu özel dikdörtgen, bu özel
Değişken hafızada, olacak eğer.
HEDEF KİTLE: A struct.
DAVID MALAN: Bir struct.
Geçen hafta hatırlayın, biz tanıttı yapı, bu nispeten basit kelime
bu bize böyle şeyler yapmanıza olanak sağlar.
C verilerle gelmedi yapı öğrenciyi denir.
Bu int ve şamandıra ve char ile birlikte geliyor Böyle, ancak öğrenci ile gelmiyor,
ama biz bir öğrenci veri türü oluşturabilir, Bu sözdizimi ile bir öğrenci yapısı,
İşte.
Ve tekrar tekrar bu görürsünüz.
Yani dert etmeyin Anahtar kelimeleri ezberlemeye,
ama önemli anahtar kelime dedik sadece gerçeği yapı
ve sonra biz öğrenciyi denilen ve içinde Öğrencinin bir isim ve bir evdi
Bir yurt veya benzeri ya da.
>> Ve şimdi, bugün, en bu teklif edelim.
Ben birkaç kelime ekledi, ama isterseniz ettik var bu dikdörtgen uygulamak için
bir int ve her ikisi de var işaretçi, sen ne olduğumu biliyorum
düğüm denilen bir yapı bildirmek için gidiyor.
Ben diyecektim, bunun içinde de değilim Bir düğüm, bu dikdörtgen, bir int olduğunu
ve biz onu arayacağım n ve Bir sonraki işaretçi vardır.
Ve bu, biraz ayrıntılı bir ama bu konuda düşünüyorsanız,
Resimde vardı oklar Bir an önce nasıl veri türü vardır?
Nerede bu okların her işaret ediyor veri yapısı ne tür mi?
Bu sadece kendi başına bir int işaret değil.
Bu işaret ediyor Bütün dikdörtgen şey
ve bu dikdörtgen şey Biz düğüm denir, dedi.
Ve böylece biz tür var yinelemeli bu tür tanımlar
bir düğüm, biz, diyelim n adında bir int içerecektir
ve bir işaretçi bir sonraki ve denir veri yapısının tipi
Bu işaretçi noktaları görünüşte struct düğüm olacak.
>> Yani bu rahatsız edici ayrıntılı bir ve sadece bilgiçlik olmak
sebebi biz değil sadece bu demek, hangi açıkçası
, çok daha okunabilir görünüyor hatırlama okumak C o çünkü
şeyler yukarıdan aşağıya, sağdan sola.
Biz noktalı virgül elde edene kadar bu değil Anahtar kelime düğüm aslında var olduğunu.
Biz bu tür olmasını istiyorsanız Yani verilerin içinde döngüsel başvuru
yapı, biz bunu yapmak zorunda, nerede Biz üstündeki yapı düğüm demek ki
bize bu tanımlamanın daha uzun bir yol verir şey, biz yapı düğüm demek o içinde
ve daha sonra çok son satırında diyoruz, tamam, C, bu arada,
Sadece tüm bu lanet çağrı şey bir düğüm ve durdurma
tamamen anahtar yapı kullanma.
Yani bu sadece bir çeşit sözdizimsel olduğu sonuçta bize oluşturmanızı sağlar hüner
aynen şuna benzer bir şey.
>> Şimdi varsayalım eğer biz So C Bu şeyi uygulamak,
nasıl aslında biz bunu Bu geçme başlar?
Eh, aslında, yapmamız gereken tek şey sağa ve sadece soldan yineleme
tür düğümleri eklemek veya düğümleri silmek ya da istediğiniz yere şeyler aramak,
ama bunu yapmak için, en önde gidip yapalım işler biraz daha gerçek bu çünkü
Bugüne kadar süper düşük seviyeli olmuştur.
Herkes tam anlamıyla ilk olmak ister misiniz?
TAMAM.
Yukarı gel.
Adın ne?
>> DAVID: David.
DAVID MALAN: David.
Tanıştığımıza memnun oldum.
Ben de.
Pekala.
Ve biz bir numara 9 ihtiyacım var.
Değil kadar iyi ilk olarak, belki.
Tamam, 9 numaralı.
Bir sayı 17, lütfen.
Bana biraz geriye dönelim.
Sayı 22, lütfen, ve nasıl geriye hakkında
Ben herhangi bir elleri görürseniz Tüm ışık veya hiç sahip.
Birisi orada gönüllü ediliyor.
Eğer gelmek ister misin?
Sizin kol zorla gidiyor.
17 Tamam.
22.
26 iniyor.
Başkasının ister misiniz forcefully-- yukarı gel.
Gerçek bir gönüllü.
>> Yani çok hızlı bir şekilde, eğer Siz düzenlemek olabilir
Kendinizi tıpkı Ekranda düğümler.
Teşekkür ederim.
Ve 26 olacak.
Pekala ve hızlı tanıtımları.
Yani Davut değilim ve ayrıca nelerdir?
DAVID: David.
DAVID MALAN: Ve sen?
Jake: Jake.
SUE: Sue.
ALEX: Alex.
RAPHAEL: Raphael.
TAYLOR: Taylor.
DAVID MALAN: Taylor.
Mükemmel.
Peki bu bizim gönüllüler bugün ve go ahead
ve, bu şekilde biraz vardiya ve sadece go ahead ve tutmak
Eğer ya sizin yanınızdaki gibi numaralar tutan ilk işareti ve sol elinizi kullanarak,
go ahead ve sadece uygulamak Bu oklar, sadece
sol eli tam anlamıyla böylece Eğer işaret etmelidir ne işaret
ve en kendinizi o yüzden bazı oda vermek görsel olarak aslında kollarınızı görebilir
işaret ve sadece işaret edebilir çeşit zemin gayet iyi.
>> Yani burada biz, tek bir bağlantılı liste var iki, üç, dört, beş düğüm başlangıçta
ve biz bu özel olması fark var başında işaretçi
Anahtar biz takip etmek zorunda, çünkü Bütün uzunluk listesinin nasılsa.
Onlar kalacaksın bile bu adamlar, sağa, geriye bellekte arkaya,
aslında herhangi bir yerde olabilir bilgisayarın belleğinde.
Yani bu adamlar olabilir sahnede her yerde ayakta
ve böylece sürece konum olarak iyi, aslında birbirlerine göstererek
ama şeyleri tutmak için temiz ve basit, yaparız
sadece onları çizmek gibi soldan sağa Bu, ancak büyük boşluklar olabilir
Bu düğümler arasında.
>> Şimdi, ben aslında bazı eklemek istiyorsanız yeni değer, en önde gidip yapalım.
Biz şimdi bir fırsat var başka bir düğüm seçin.
En 55 mallocing ile başlayalım söyleyin.
Birisi malloc olmak misin?
Tamam, yukarı gel.
Adın ne?
RAINBOW: Gökkuşağı.
DAVID MALAN: Gökkuşağı?
Pekala.
Malloc Gökkuşağı.
Yukarı gel.
Şimdi biz kendimize sormak zorundayız algoritmik biz 55 koyabilirsiniz.
Yani hepimiz biliyoruz, Açıkçası, nerede o muhtemelen
biz çalışıyorsanız aittir bu sıralama tutmak
ve siz birini almak eğer geri adım yüzden düşmek yok
sahne, bu harika olurdu.
Yani aslında, Gökkuşağı, burada benimle baştan başlamak,
Çünkü biz şimdi bilgisayardan olarak Bir seferde sadece tek bir değişkeni bakın.
Bu ilk düğümü Yani eğer.
O bir düğüm değil dikkat edin O, sadece bir işaretçi var
o olmak çizilir neden ve işte Bir işaretçi sadece boyutu değil,
Bu tam dikdörtgenler biri.
Yani biz her birinde kontrol için gidiyoruz yineleme 9 den 55 daha azdır?
Hayır.
17 den 55 az mı?
Hayır.
22 Az?
26 Az?
34 Az?
Ve şimdi, tabii ki Gökkuşağı sonunda aittir.
Yani net ve ne Senin adın, Taylor?
>> TAYLOR: Taylor.
DAVID MALAN: Taylor arasında Yani sol el ve burada Rainbow elleri,
kimin eli de ne işaret etmek gerekiyor Bu listeye 55 eklemek için sipariş?
Ne yapmamız gerekiyor?
Evet?
>> HEDEF KİTLE: Taylor'ın eli Sol işaret gerekiyor.
>> DAVID MALAN: Kesinlikle.
Yani bir düğüm ekleyerek Listenin sonunda içine
oldukça basit çünkü Taylor, sadece zemin, yerine noktasına sahip
ya da biz, boş arayacağım Boş yokluğu tür
bir işaretçi veya özel bir sıfır gösterici, sen
sol ile işaret edecek El Gökkuşağı ve ardından Rainbow,
nerede sol gereken El muhtemelen gelin?
Down.
Elini tür eğer iyi değil Burada veya sıralama herhangi kapalı işaret
hangi yön.
Bu düşünülebilir Bir çöp değeri,
ama o işaret eğer bazı bilinen değer, biz olacak
sıfır veya boş diyoruz ki tamam Bu bir terim var, çünkü
ve biz liste artık tamamlanmıştır biliyoruz.
>> Peki başka var nispeten basit dava?
Biz 5 malloc miyiz?
Yukarı gel.
Adın ne?
Tiffany: Tiffany.
DAVID MALAN: Üzgünüm?
Tiffany: Tiffany.
DAVID MALAN: Tiffany.
Pekala.
Tiffany malloced edilmiştir değeri 5 ile.
Yukarı gel.
Bu kimse, çok nispeten kolay ama Şimdi işlemlerin sırasını düşünelim.
Oldukça kolay oldu sonunda Taylor ile.
Sayı 5, tabii ki daha az 9 taşımaktadır ve bu yüzden, biz Tiffany var, David var
ve senin adın neydi?
>> Jake: Jake.
>> DAVID MALAN: Jake.
Tiffany, Jake ve David.
Kimin eli öncelikle güncellenmesi gerekir?
Burada ne yapmak istiyorsun?
Birkaç olası yolları var, ama Bir veya daha fazla yanlış yolları da var.
>> HEDEF KİTLE: soldakinden ile başlayın.
>> DAVID MALAN: soldakinden ile başlayın.
Kim o zaman burada soldaki var?
HEDEF KİTLE: İlk.
>> DAVID MALAN: Tamam.
Yani ilk ile başlar ve sizi nereye do David'in ellerini olmak güncelleştirmek istiyor?
HEDEF KİTLE: 5 Doğru.
DAVID MALAN: Tamam.
Beşte Böylece Davut, gelin veya Tiffany burada ve şimdi?
>> HEDEF KİTLE: Tiffany 9 işaret?
DAVID MALAN: Mükemmel, Binky en haricinde Kafa sadece tür doğru, düştü?
Nesi var, çünkü kelimenin tam anlamıyla bu resmi?
HEDEF KİTLE: Hiçbir şey işaret ediyor.
DAVID MALAN: Nothing Şimdi Jake işaret.
Biz tam anlamıyla 9 yetim ettik ve 17 ve tam anlamıyla ettik
Bu belleğin tüm sızan tarafından çünkü İlk David'in elini güncellenmesi, işte
Doğru olduğu gibi sürece ince Şimdi Tiffany işaret ederek,
ama kimse olsaydı Jake işaret etmek görüşte,
o zaman kaybettik Bu listenin tamamı.
O yüzden geri verelim.
Yani iyi bir şey oldu düşmeyeceği ama şimdi düzeltmek edelim.
Ne zaman biz ilk yerine yapmalıyız?
Evet?
>> HEDEF KİTLE: Tiffany 9'da işaret etmelidir?
DAVID MALAN: Yapamam Size bu kadar yakın olsun.
9 kimler işaret etmelidir?
>> HEDEF KİTLE: Tiffany.
>> DAVID MALAN: Pekala.
Yani Tiffany 9'da Birinci nokta olmalıdır.
Yani Tiffany almalı benzer bir değer
Davut'a, hangi görünüyor Bir an için gereksiz,
ancak ikinci, çünkü artık gayet iyi adım biz David'in elini güncelleyebilirsiniz
Tiffany ve daha sonra eğer işaret Biz sadece tür temiz şeyler kadar
Bu bahar gibi tür sanki, Şimdi bu doğru sokma var.
Yani mükemmel.
Yani şimdi neredeyse oradayız.
En tek finalini eklemek edelim değeri 20 gibi değer.
Biz son bir gönüllüye malloc olsaydı?
Yukarı gel.
Yani bu biraz daha zor.
Ama gerçekten, kod we ' yazma, sözlü de olsa,
sadece bir demet olması gibi Şimdi koşulları, doğru olur?
Biz bir durum vardı o aitse kontrol
Sonunda, belki başında.
Biz döngü çeşit gerekiyor ortasında yer bulmak.
Yani senin adın ne o yapsın?
>> ERIC: Eric.
>> DAVID MALAN: Eric?
Eric.
Tanıştığımıza memnun oldum.
Yani biz 20 var.
Beşten az?
Hayır.
Dokuz Az?
Hayır.
17 Az?
Hayır.
TAMAM.
O buraya ait ve senin isimleri yine?
SUE: Sue.
DAVID MALAN: Sue.
ALEX: Alex.
DAVID MALAN: Sue, Alex ve?
ERIC: Eric.
DAVID MALAN: Eric.
Kimin elleri ilk güncellenen almak gerekir?
>> HEDEF KİTLE: Eric.
TAMAM.
Yani Eric nerede işaret etmelidir?
22 at.
İyi.
Ve şimdi sırada ne var?
Sue sonra Eric işaret edebilir ve şimdi, eğer çocuklar sadece
gayet bazı oda yapmak görsel, şimdi ekleme yaptık.
Yani şimdi bir soru düşünelim ama Bizim gönüllüler için size çok teşekkür ederim.
Çok iyi yapılmış.
İsterseniz, bu tutabilirsiniz.
Ve biz güzel bir ayrılık hediyesi eğer var Her bir stres topu almak istiyorum.
Bana sadece bu aşağı geçmek edelim.
Yani bu paket nedir?
Bu inanılmaz gibi görünüyor şimdi var sürece
Bir alternatif tanıttı yani sınırlı değildir dizisi
Bazı sabit boyutta bir dizi.
Onlar dinamik büyüyebilir.
>> Ama biz gibi çok haftalarda gördüm Geçmiş, biz ücretsiz bir şey asla
gibi kesinlikle burada bir trade-off var.
Bağlantılı bir ters Yani Liste, bu dinamizm nedir?
Bu yetenek, açıkçası büyümek ve Biz silme yapmış olabilir
gerektiği gibi ve biz küçültmek olabilir.
Ne fiyat ödüyoruz?
Twice her şeyden önce çok alanı olarak.
Resimde bakarsanız, artık ben ben tamsayılar listesini depolamak.
I'e ait bir listesini depolamak ediyorum tamsayılar artı işaretçiler.
Yani alan miktarını iki katına ediyorum.
Şimdi, belki böyle değil büyük bir anlaşma 4 bayt, 8 bayt,
ama kesinlikle ekleyebilirsiniz büyük veri kümeleri için.
Başka bir dezavantajı nedir?
Evet?
>> HEDEF KİTLE: Biz var onları bir-bir hareket.
DAVID MALAN: Evet.
Biz onları bir-birer hareket ettirmek zorunda.
Sen bu super vazgeçti, ne biliyor Kare dirseğin kullanışlı özellik
gösterim, daha düzgün Rasgele erişim olarak bilinen,
biz sadece atlayabilir nerede bağımsız bir elemana
ama şimdi hala olsaydı Burada benim gönüllüler,
Ben bulmak istiyorsa 22 numara, ben sadece yapamam
braket şey şey atlamak.
Ben çok, liste üzerinde bakmak zorunda doğrusal bizim arama örneklerde olduğu gibi,
sayı 22 bulmak için.
Yani biz orada bir fiyat ödemiş gibi görünüyor.
Ama biz yine de can diğer sorunları çözmek.
>> Aslında, bana tanıştırayım görsellerin sadece bir çift.
Aşağı oldum Yani eğer Mather'ın Yemekhane son zamanlarda
Bunu Hatırlayacaksınız onların Böyle tepsiler yığınları,
Biz bu ödünç Dersten önce Annenberg.
Yani tepsileri bu yığını olsa da, temsilcisi aslında
Bir bilgisayar bilimi veri yapısının.
Bir veri yapısı vardır bilgisayar bilimi
bir yığın olarak bilinen hangi çok güzel Tam bu görsel için oldukça rahat.
Bu kasetlerin her bir değilse Yani tepsi ancak bir sayı gibi ve ben istediğim
sayıları saklamak için, ben Burada bir aşağı koymak olabilir,
ve ben, burada başka bir yere koymak olabilir ve sayıları istifleme devam
birbirlerine ve ne var üstünde Bu konuda potansiyel yararlı
Ne ima olmasıdır Bu veri yapısı?
Ben çekin hangi numara İlk en uygun?
Orada en son tek koymak.
>> Yani bu biz dediğimiz olur bilgisayar bilimi, bir LIFO veri yapısı.
, İlk out sürer.
Ve uzun neden önce görürsünüz Bu, artık yararlı ama için olabilir
Sadece özelliğini düşünün.
Eğer düşünüyorsanız ve bu tür aptal yemekhane yapıyor nasıl.
Her zaman onlar temiz tepsiler ve üstüne taze olanları koymak,
Daha önce temiz olabilir ama sonunda çok kirli ve tozlu
çok altında tepsi eğer hiç aslında
Bunun altına almak yığın, çünkü sen sadece
Yeni koyarak tutmak bunun üstüne temiz olanlar.
Aynı şey gerçekleşebilir Bir süpermarkette de.
Bir vitrinin varsa süt ve her zaman CVS
ya da daha fazla süt alır kim, Sadece sütler kıpırdamak
Zaten arka ve Eğer ön yenilerini koymak
Eğer bazı oldukça kötü zorunda gidiyoruz veri yapısının sonunda süt,
o dibinde daima çünkü ya eşdeğer o arka hep.
>> Ama düşünmek için başka bir yolu var veri ve örneğin, bu sıraya.
O insanlardan biri iseniz kim sever Apple mağazaları dışında sıraya
ne zaman yeni bir ürün geliyor dışarı, muhtemelen konum
Bir yığın verileri kullanılarak değil yapısı sizin için
herkes kim uzaklaştıracaktır sıraya bazı yeni oyuncağı satın almak için.
Aksine, muhtemelen kullanarak konum veri yapısının ne tür
Sistemin veya ne tür gerçek dünyada?
Umarım bu bir çizgi, ya da daha fazla Düzgün veya daha fazla İngiliz gibi bir kuyruk.
Ve bir kuyruk da olduğunu çıkıyor bilgisayar bilimi veri yapısı,
ama bir kuyruk çok var Farklı özellik.
Bu LIFO değil.
, İlk out sürer.
Allah korusun.
Bunun yerine FIFO var.
İlk giren ilk çıkar.
Ve bu iyi bir şey adalet 'uğruna
Kesinlikle ne zaman astar ediyoruz sabah süper erken.
Eğer size orada ilk alırsanız İlk yanı çıkmak istiyorum.
>> Ve böylece bu verilerin hepsi yapıları, kuyruklar ve yığınlar
ve diğerleri salkımları, seni çıkıyor Bu tıpkı bir dizi düşünebilirsiniz.
Bu, belki bir dizidir Sabit boyutu 4, ama istiyorum
biz sadece kazık eğer tür güzel olacak tepsiler neredeyse sonsuz uzun boylu biz eğer
birçok tepsileri veya numaraları vardır.
Bu yüzden belki biz istiyoruz Burada bağlantılı listesini kullanın,
ama ticaret-off olacak Potansiyel biz daha fazla bellek gerektiğini,
biraz daha fazla zaman alır, ama biz yığının yüksekliğini sınırı yok,
çok Mather'ın vitrinin gibi yığının boyutunu sınırlamak olabilir,
ve bu yüzden bu tasarım kararları veya vardır sonuçta bizim için mevcut seçenekler.
Bu verilerle Yani yapıları, biz başladık
Potansiyel yeni üst sınırları görme ne daha önce süper hızlı
ve biz bırakacağım nerede kapalı, bugün ve nerede
biz almak için umut olacak Çarşamba günü, biz olacak
Bir veri bakmaya başlar Bizi arama yapmanızı sağlar yapı
Günlük bitiş zamanında veri üzerinden yeniden.
Ve biz hafta sıfır, hatırlama, gördüm İkili arama veya bölmek olan ve bir
ve fethetmek.
Bu, henüz geri ve daha iyi geliyor Bu Çarşamba Holy Grail
ile gelip olacak Gerçekten çalışan veri yapısı
ya da teorik olarak zaman sabiti, bu sayede,
o kaç önemli değil milyonlarca ya da milyarlarca şeylerin
Biz veri yapısı var, o olacak Bize sürekli zaman alabilir, belki bir adım
veya iki adım veya 10 adım ama adımlarla sürekli sayılar
Bu veri yapısı üzerinden aramak için.
Bu gerçekten Kutsal Kâse olacak ama Çarşamba günü bu konuda daha fazla.
Sonra görüşürüz.
>> [MÜZİK OYUN]