[MÜZİK OYUN]
>> DAVID J. MALAN: Pekala.
Bu CS50 olduğunu.
Ve bu hafta 5 başlangıcıdır.
Ve fark etmiş olabilir, malzemenin bir kısmı
Biraz daha oluyor Karmaşık, küçük yoğun.
>> Ve özellikle, çok kolay Eğer, bir süre alışkanlığı oldum
En aşağı karalamak için çalışıyor olmak Yaptığımız şey, biz sınıfta söylüyorsun.
Ama bu belki de değil, fark İdeal pedagojik yaklaşım
malzeme bu tür öğrenme, ve malzeme daha genel olarak.
Ve böylece biz mutluyuz Bu CS50 kendi Gheng ilan
Gong hazırlamak başladı notlar kurallı dizi
ders için, umudu ki bu, bu biridir
sadece bir işlevi Referans ve kaynak
malzeme gözden ve gidiş için geri malzeme ile sahip olabilir
etrafında seni ilk defa kaçtı ama Ayrıca böylece kafaları olabilir daha fazla
aşağı, ne zaman daha fazla ders zamanı geldiğinde,
Eğer meşgul olabilir ki daha düşünceli, gibi
daha karalanmuş karşı.
>> Bunu dedi, sen ne bulacaksınız Web sitesi bu gibi belgeler olduğunu.
Ve haber, sol üst kısmında, orada sadece içindekiler tablosu,
ama aynı zamanda zaman kodları olduğunu hemen size atlayacaktır
uygun bir parçasına Video online olarak.
Ve burada ne Chang yapmış , esasen, belgelenmiştir
bu ne oldu Özellikle ders.
Ve konferanslar çoktur zaten online şimdi bu URL ile.
Ve biz kalanını sonrası devam edeceğiz Bu hafta sonuna kadar olanların,
böylece kaynak yararlanmak yoktur.
>> Bu yüzden daha fazla uzatmadan, biz geri soyma başladı
olmuştur tabaka bir süre dize.
Ve biz bir dize ne dedin Aslında geçen hafta?
Yani karakter yıldız.
Ve karakter yıldızı, iyi, ne Bu gerçekten demek istedi?
Peki, tüm bu zaman, biz ettik eğer bir işlevi aradım,
getString ve depolama gibi Sözde dönüş
a getString değeri değişken-- denir
Biz yazıyorum string-- s tipi Orada Yukarıdaki kod satırı.
Ben görünce Ve de sadece benim El yazısı burada büyütülmüş
Ben bu ne kadar iğrenç fark yok.
>> Ancak, en varsayalım, Sağ taraftaki
, Yine de, bir makul ne tasviri
Bütün bu devam getString ile zaman.
getString, elbette, bir dize alır.
Ama bu gerçekten ne anlama geliyor?
O bir yığın alır demektir işletim sisteminden bellek
Bir işlevini çağırarak, malloc çağırdı.
Ama daha bu konuda daha sonra.
Sonra da doldurur belleğin o öbek
harflerle kullanıcı var Yazılan ardından, tabii ki,
bir boş karakter, veya ters eğik çizgi en sonunda sıfır.
>> Bu arada, sol tarafta Bu hikayenin, bu sefer,
Biz s gibi, bir değişkeni bildirmek oldum.
Ve bu değişken artık ne olduğunu Bir işaretçi arayarak başlayacak.
Bu hangi içinde bir kutu değil Biz dize koymak, DAV, başına,
ama doğrusu biz bu meydanda koymak Soldaki tam olarak ne üzerine kutusuna?
Evet?
>> İZLEYİCİ: adresi nerede bellekte yer alır.
>> DAVID J. MALAN: Kesinlikle.
Daven adresi bellekte yer almaktadır.
Ve Daven tüm, bulunduğu yerde değil, başına, ama özellikle adres
Neyin?
Evet?
>> İZLEYİCİ: İlk karakter.
>> DAVID J. MALAN: İlk karakteri Bu durumda Daven, içinde,
Ben keyfi oldu önerdi ve gerçek olamayacak kadar 1, OX1,
hangi sadece anlamına gelir 1 onaltılık sayı.
Ama muhtemelen gidiyor çok daha büyük bir sayı olması
Biz çizmek olabilir Bir önek olarak 0x ile,
onaltılık karakteri temsil.
Ve biz nerede olduğunu bilmek gerekmez, çünkü Daven karakter geri kalanı
nedeniyle, ne basit tasarım Karar yıllar önce yapıldığını?
Evet?
>> İZLEYİCİ: Backslash 0.
DAVID J. MALAN: Evet, kesinlikle.
Ters eğik çizgi 0 olsa, size izin verir lineer zaman, dize hareket etmek,
soldan sağa yürüyün, Bir döngü için, ya da bir süre ile
döngü, ya da bir şey gibi Bu, burada, oh, belirlemek
Bu özel dize sonu.
De sadece adresi ile Böylece bir dize başlangıcı,
biz bütününü erişebilirsiniz o, bütün bu süre, çünkü
Bir dize sadece bir karakter yıldızı olmuştur.
>> Yani kullanmaya devam etmek kesinlikle iyi değil CS50 kütüphane ve bu soyutlama,
tabiri caizse, ama yaparız için Tam görmeye başlarsınız
ne oluyor oldu Bütün bu süre altında.
Yani bu örnek Hatırlayacağınız, çok son zaman, 0 karşılaştırmak,
hangi aslında karşılaştırmak yoktu.
Ama biz bu çözmek için başladı.
>> Ama belki de bir tazeleme, Birini ilgi olabilir
pembe bir fil bugün, Ayrıca Chang tarafından yapılan?
Nasıl önünde senin hakkında? [Duyulamaz].
Hadi gel.
>> Ve bu arada, Eğer gelip gibi, diyelim
Sadece bir an için düşünün ne Bu kodu aslında yapıyordu.
Bu iki değişken kadar ilan ediyor En iyi, s ve t ve getString çağrı.
Bu, bir çok kullanıcı dostu bir program değildir o size değil, çünkü ne yapmak.
Ama sadece biz konum varsayalım diyelim sulu kısmı üzerinde duruluyor.
S eşitse Ve sonra, yapmak bu printf demeliyim t eşittir,
Aynı şeyi yazdınız.
Merhaba.
Adınız ne?
>> JANELLE: Janelle.
DAVID J. MALAN: Janelle, tanıştığımıza memnun oldum.
Adresinden meydan Yani Bu fil için el
öncelikle bize ne bir resim çizmek için bu ilk iki temsil edilen
çizgiler.
Yani s ve t olabilir nasıl Ekranda temsil?
Ve sadece bunu çizebilirsiniz Bu büyük ekranda parmağınızı.
>> Yani iki yarıyı var Bu denklemin her iki tarafında.
Yani soldaki ler var, ve Daha sonra sağdaki getString.
Ve sonra t, soldaki var ve sonra sağdaki getString.
Yani biz nasıl başlayabilir Bir resim çizim olduğunu
Neler temsil Burada bellekte, sen söylerdin?
Ve bana açıklamak let Eğer gitmek gibi ne yapıyorsun.
>> JANELLE: Tamam.
Peki, ilk soran olurdu giriş dizesi almak için.
Ve üzgünüm, oh store-- olur.
DAVID J. MALAN: Tamam.
İyi.
Ve bu ne denir?
Tamam, evet.
Devam et.
Ben kesmek istemedim.
JANELLE: Üzgünüm.
Bu yüzden girdi onu içine olur Adres emin of--.
Ben tam sayısını hatırlamıyorum olabilir, ama 0 ile başlayan inanıyorum.
>> DAVID J. MALAN: Hepsi doğru, Ben numaralarını yaptım çünkü,
böylece hiçbir doğru cevap var.
>> JANELLE: 0 yay ile başlayarak.
>> DAVID J. MALAN: Tamam, bu nedenle eleman 0.
Tabii.
>> JANELLE: Ve sonra eğer oldu Sadece bir iki mektupla gibi
>> DAVID J. MALAN: Tamam, size geri.
>> JANELLE: Yani eleman 0, ve daha sonra elemanı 1 ya da elemanı 2.
Hangi parça ve Ve: DAVID J. MALAN resim şu anda çiziyorsun?
getString çağrısı?
Veya s beyanı?
>> JANELLE: beyanı s, ben inanıyorum.
Ah, getString, it would çünkü Her [içine girilebilir? alanı. ?]
>> DAVID J. MALAN: İyi.
Kesinlikle.
Hatta bu etkili olsa Bir dizi, hatırlama verir,
Biz bir dize geri döndüğümde, biz 01 ve 2 kullanarak bu dizeye dizin.
Teknik olarak, bu muhtemelen Bireysel adresleri ile temsil,
ama bu iyi.
>> Peki, varsayalım eğer ben sadece hızlı olabilir bıraktığımız yerden iletmek
son kez, biri ise şeritler, b, e g idi
Ters eğik çizgi 0, böylece temsil Gabe en giriş, nasıl s artık temsil edebilir?
Bu var bellek ise getString tarafından iade edilmiştir?
>> Janelle: o olurdu bir yay tarafından temsil?
>> DAVID J. MALAN: bir yay tarafından mı?
Hayır, evet.
, Sadece resimsel, diyelim bana sadece devam edelim
Bu s eğer, bu öneriyoruz getString dönüş değeridir.
Ve sen 0, 1, 2, bu boğuldum hangi mükemmel makul çünkü biz
gibi dizeye endeksi, yapamam.
Ama sadece tutarlı olmak son kez, beni önde gidelim
ve keyfi bu öneriyoruz Adres 1, bu adres 2,
Bu benzeri adres 3, ve olduğunu.
Ve böylece, sadece süper olmak net, ne oluyor
Bunun bir sonucu olarak s gitmek Kodun ilk satırı, sen söylerdin?
>> JANELLE: Adres 1?
>> DAVID J. MALAN: Kesinlikle.
Yani 0x1 ele.
Ve bu arada, beni önde gidelim ve Ne yaptığının çok yinelenen
ve burada benim kendi t ekleyin.
Gabe yazın olsaydı Yine, ikinci kez,
getString ile istendiğinde, nerede, Tabii, Gabe gidecek?
Peki, presumably--
>> JANELLE: Burada gibi mi?
DAVID J. MALAN: Evet.
JANELLE: Ya aynı kutularda da var?
DAVID J. MALAN: bana evet, teklif edelim tam olarak bu ek kutuları çok.
Ama şimdi ne anahtar bile, yani Ben bu oldukça yakın boğuldum olsa
beraberken- 0x1 bu gerçekte 0x2-- olup,
Bu şimdi, adres 0x10 olabilir Örneğin, ve 0x11 ve 0x12,
ve benzeri yer alır.
Ve böylece, bu durumda eğer, ne t burada sonuna kadar gidiyor?
>> JANELLE: 0x10?
DAVID J. MALAN: Kesinlikle.
Yani 0x10.
Ve şimdi, son bir soru.
Sen, bugüne kadar, çalışmak zorunda Bugüne kadar bir fil için zor.
Artık, ben kodu çekerseniz Yine, ben ne zaman, çizgi üç,
s eşittir t eşitse, ben aslında neyim Burada boğuldum karşılaştırarak bu?
>> JANELLE: İki adresleri?
DAVID J. MALAN: Kesinlikle.
Yani t eşit eşit s diyorum?
Diğer bir deyişle, 10 eşit eşittir 1?
Ve tabii ki, bariz cevap artık hiçbir vardır.
Ve böylece bu program sonunda ise Eğer ne derdi, yazdırmak olacak?
JANELLE >>: o olurdu, Aynı şeyi yazmış?
>> DAVID J. MALAN: Yani eğer s değeri 1 ve t, 10?
>> JANELLE: Farklı şeyler yazdınız.
>> DAVID J. MALAN: Kesinlikle.
Farklı şeyler yazdınız.
Tamam.
Yani alkış yuvarlak, Burada, biz eğer olabilir.
[Alkış]
Bu acı oldu.
Biliyorum.
Güzel yapılır.
Şimdi bakalım, eğer biz değil Düzeltme ne dışında kızdırmak.
Ve tabii ki, biz bu-- sabit zaman ki ben şimdi green-- temsil edeceğiz
Burada birkaç geliştirmeleri yaptım.
İlk olarak, sadece bir aklı olarak Ben ilk kontrol ediyorum, kontrol
s boş eşittir ve t boş eşitse.
Ve sadece temiz olması için, zaman olabilir s veya t böyle kod null?
Zaman s veya t sayısının sıfır olabilir.
Evet?
>> İZLEYİCİ: [duyulamaz].
>> DAVID J. MALAN: Kesinlikle.
Dize kullanıcı bu takdirde yazdığınız yolu çok uzun
belleğe sığdırmak, ya da bazı Böyle garip köşe durumda,
göreceğiz gibi kelimenin tam anlamıyla, getString Bugün, kendi belgelerinde,
o kadar boş dönecektir diyor özel Sentinel değeri,
ya da sadece tür özel bir sembol O bir şeyler ters gitti demektir.
Yani biz kontrol etmek istiyorum çıkıyor, çünkü o
Bu boş çok tehlikeli bir değerdir.
>> Genellikle, bir şeyler yapmayı denerseniz Boş geçirmeden bir function-- içeren
girdi olarak, bu işlevi instance-- için Çok onunla, çökmesine ve olacak olabilir,
senin bütün programını aşağı çekmek.
Yani bu üçüncü hat artık sadece aklı olan eğer sen, hata denetimi kontrol edin.
Bunun için artık iyi bir alışkanlık var Bize her zaman içine almak için biz
Bir değer kullanmak için deneyin potansiyel, boş olabilir.
>> Şimdi, burada dördüncü satırında, "Eğer strcmp (s, t)," iyi,
ne atıfta o?
Peki, biz bu çok kısa ve öz bir olduğunu söyledi dize karşılaştırma için adlandırılmış işlev.
Ve hayatta amacı karşılaştırmaktır İkinci buna karşı ilk argüman,
ancak adresleri açısından, Biz bir an istemeden yaptığı gibi
önce kırmızı kod ile, ancak yerine bu ikisini karşılaştırmak için
insanca sezgisel dizeleri Buna karşı, bu karşılaştırarak yolu,
Bu, bu karşı, ve karşı sonra dururken bir eğer ve
ya da benim parmaklar hem bir ters eğik çizgi 0 vurur.
Yani birisi yıllar önce uygulanan Strcmp işlevselliği bizim için uygulamak
biz aldık umduğunu Sadece iki basit değerleri karşılaştırarak.
>> Şimdi açıkçası, ben çizim tutmak Bu çeşitli tüm numaraları.
Ama gerçek ben oldum, bir Bütün zaman bu kadar yapma.
Ve böylece bana sadece devam edelim ve bu dışarı karalamak
Bir noktayı ki, sonunda Günün ve ileriye doğru hareket,
biz gerçekten umurumda etmeyeceğiz ne şeyler aslında adresleri
bellekte.
Yani bu çekmek için gitmiyorum çok artık sayıların çeşitleri,
Ben uzak bir bu sadece bir soyut değilim Sadece oklarla daha kolay küçük.
>> Diğer bir ifade ile, bir gösterici ise, iyi, en adil, kelimenin tam anlamıyla, o çizelim
bir işaretçi olarak, bir ok işaret , başka bir şey kendisi
ve hakkında çok daha fazla endişelenmeyin Bu adreslerin minutia
hangi yine ben yine uydurdum.
Ama biz bu adresleri görürsünüz, Bazen, kod ayıklarken.
>> Şimdi arada, bu program buraya düzeltmeleri, elbette,
karşılaştırarak bu sorun Bu iki dizeleri.
Ama biz başka bir sorun koştu.
Bu kopyadan oldu , son kez programlamak
bu sayede, ben yararlanmak için çalışıyordu bir dize sadece ilk karakteri.
Ama belirti ne oldu Biz ne zaman son kez gördüm
Bir kullanıcı gibi, bir değer yazdığınız küçük harflerle Gabe, s için,
o zaman biz, t içine s atanan Orada Üçüncü hat olarak,
ve sonra ben denedim t desteğini 0 yararlanmak?
Etkisi neydi t desteğini 0 burada değişiyor?
>> İZLEYİCİ: Bu s değişti.
>> DAVID J. MALAN: Evet, Ben de, s değişti.
Gerçekten ne olup bittiğini Çünkü?
Eh, ben temizlemek eğer bakayım Bu resim kadar, aşağıdaki gibi.
>> S, yeniden, kelime g a, b, c, eğik, 0 ve s'nin
Biz bir kutu gibi çizim devam edeceğiz Burada, ama artık adres.
Eşyalarını oluşturan bırakalım.
Sadece bir resim çizelim dünyayı basitleştirmek için.
>> Ben dize t t beyan zaman, bellek bu yığın oluşturur.
Kare 32 olur En bilgisayarlarda bit.
Aslında, eğer hiç bir duymuştum Bilgisayar, 32-bit mimariye sahip
gerçekten fantezi-konuşan, sadece 32-bit adresleri kullanıyor demektir.
Ve bir kenara teknik olarak, Hiç merak ettiyseniz
Neden eski bilgisayarlar, aslında eğer RAM'i ile çorba onları çalıştı,
yalnızca maksimum olabilir RAM dört gigabayt,
iyi ki kelimenin tam anlamıyla, çünkü var, eski bilgisayar olabilir sadece
4 gibi yüksek saymak milyar, 4 milyar bayt,
Bunun nedeni 32-bit kullanan adresler için numaralar.
>> Ancak her durumda, bu örnek, hikaye çok basit.
t sadece başka gösterici ise, ya da Gerçekten bir karakter yıldızı, aka dize.
Ve nasıl bu resmi güncelleştirmek istiyor musunuz Şimdi kod ikinci hattı ile,
nokta sonra, nokta, nokta?
Ben ne zaman dize t, s noktalı virgül eşittir Bu resim nasıl değişiyor mu?
Evet?
>> İZLEYİCİ: [duyulamaz].
>> DAVID J. MALAN: Evet.
Kesinlikle.
Ben sadece bir ok koymak Aynı adrese t kutusu,
Aynı ilk harf verdi.
Ya teknik, eğer bu Adam, 0x1 hala vardı
Ben vardı sanki bulunuyor Burada 0x1 ve 0x1 burada.
Fakat yine de, kimin umurunda adresleri hakkında?
Şimdi önemli olan sadece bir fikir.
Yani bu Buradaki neler olduğunu.
Tabii, bunu t dirsek Yani Dizi gösterimi 0,
ve elbette-- ve açıkçası, o görünüyor Burada bir dizi var gibi,
ama şimdi bu garip şey var.
Bu programlama dilini bilmek, C, bu özelliği sunuyor
bu sayede, t bile işaretçi, ya da s bir gösterici,
Hala, o tanıdık kullanabilirsiniz rahat köşeli ayraç
notasyonu ilk öğeye gitmek için, İkinci unsur, ya da herhangi bir eleman ya da
Bu işaretçi işaret ettiğini tahminen, çünkü, bu
Bu durumda, de olduğu gibi Bazı dizi işaret.
>> Peki nasıl bu düzeltebilirim?
Bir nereden Açıkçası, bu İlk bakışta biraz ezici.
Ama burada yeni ve geliştirilmiş bir versiyonu.
>> Yani ilk, ben alıyorum CS50 kütüphanesinde kurtulmak,
Sadece gerçekten bu s olduğunu ortaya çıkarmak için Bir karakter yıldızı, sadece bir eş anlamlısı.
Ve t aynı zamanda bir karakter yıldızdır.
Ama üzerinde ne olup bittiğini Bu hattın sağ taraftaki
t değeri atanır nerede?
>> Malloc nedir?
Ne strlen var?
Sizeof (char) nedir?
Neden halt yapar çizgi bakmak çok karmaşık?
Ne yüksek bir düzeyde yapıyor?
Ne t saklamak oluyor?
Evet?
HEDEF KİTLE: Bu tahsis ediyor bir bellek alanı belirli bir miktar.
Bu, saklamak için var sanırım, harfler [duyulamaz].
>> DAVID J. MALAN: Mükemmel.
Mükemmel.
Belirli bir aktarmaktır Bellek alanı miktarı
, muhtemelen, gelecek harfleri saklamak için.
Ve özellikle de, Malloc Bu nedenle ne dönüyor?
>> İZLEYİCİ: [Duyulmaz] Dönüş?
DAVID J. MALAN: Kesinlikle.
Bellek adresini dönersek, hangi söyleyerek bir fantezi yoludur,
adresini döndürür Bu belleğin ilk bayt.
Beni hatırlamak için sorumluluk olduğunu ne kadar bellek aslında
tahsis veya malloc istedi.
>> Şimdi bu ne kadar?
Peki, orada bile Burada parantez bir sürü,
malloc sadece tek bir argüman alır.
Ve ben s strlen belirterek, bu yüzden vereceğim Beni birçok bayt s olduğu gibi,
ama bir tane ekleyin.
Neden?
Evet?
>> İZLEYİCİ: ters eğik çizgi 0.
DAVID J. MALAN: Kesinlikle.
Biz küçük bir temizlik yapmak zorundasın.
Bir ters eğik çizgi var, çünkü Yani 0, daha iyi olduğunu hatırlardım.
Aksi takdirde, biz gidiyoruz bir dize oluşturmak için
Bu özel terminatör yoktur.
>> Bu arada, sadece süper olmak anal, ben, sizeof (char) var
sadece durumda birisi, benim çalışır değil CS50 cihazın kod,
ama belki farklı bir bilgisayar tamamen karakter
Kongre tarafından, bir bayt vardır, ancak iki bayt veya daha büyük bir şey.
Sadece süper olmak var, hataları süper hoşlanmıyorsunuz.
Olsa da, gerçekte, bu büyük olasılıkla 1 olacak.
>> Şimdi, bu arada, ben go ahead ve kopyalama dize, t dirsek i t dirsek s eşittir.
Ve geçen hafta en ertelemek olacak kaynak kodu neler görmek için.
Anahtar paket, ve fakat nedeni, yeşil kodu şimdi koymak
bu son satırda çünkü t dirsek 0, toupper eşittir
etkisine sahiptir sermaye hangi dize?
T ve / veya var?
Kod Bu son satırı.
Ne çünkü >> Sadece, t Bu sefer ne oldu
Ben biraz bu son adımı geri alırsanız, Ben malloc çağırdığınızda ne, isimli ne oldu
Ben aslında belleğin bir yığın olsun Bu orijinaliyle aynı boyutta olduğunu,
Bu aritmetik çünkü ben yaptım.
Ben adresinde t saklanması ediyorum bu bellek yığın.
Hatta bu güzel görünüyor olsa ve, oldukça güzel ve boş,
gerçeklik ne olacak, orada bir Burada, çağırarak çöp değerlerini tutmak.
Bellek Bu öbek olabilir çok de daha önce kullanılmış olması,
Birkaç saniye, bir kaç dakika önce.
Yani kesinlikle sayılar olabilir Sadece orada kaza veya harfler.
Ama ben kadar geçerli değil kendimi bellek bu yığın doldurmak
Gerçek karakter ile, gibi Orada döngü için bu yapmak.
Tamam?
Bir >> Şimdi, doruk Bu üç örnek
O görünüşte, son kez kırıldı Bu Takas örneği, bu işlev
anlamda görev bu a ve b takas söyledi.
Ama başka hangi anlamda işe yaramadı?
Evet?
>> İZLEYİCİ: [duyulamaz].
>> DAVID J. MALAN: Kesinlikle.
Ben bu işlevi çağırmak için olsaydı Örneğin another-- gelen
nerede ana gibi bir işlevden Ben ben olarak, bir değişken, x ve y var
Geçen hafta yaptığı, aynı kod, ve x ve y geçmek
Swap ve sonra Swap-- bu aramak için, Tabii, doğru versiyonu
biz üzereyiz ne see-- işe yaramadı.
Peki düzeltme nedir?
>> Peki, bu kadar adil olmak açık, beni önde gidelim
ve- ikinci Burada bana bir vermek, ve görmek Sana son bir gösterir eğer ki
Ben bulabilirsiniz bakalım in-- olacak Bu gerçek fast-- Tamam, [inaudible].
Tamam, orada öyle.
Yani sadece yazarak kulüpler komutları görmezden.
Ben de almak istiyorum son dakika bir örnek
son kez, gelen hangi artık hiçbir Takas denir.
>> Yani Takas nerede biz son kez bıraktığı
bu sayede, ben başlatıldı 1 x ve 2 y.
Daha sonra 1 ve 2 geçirerek, Swap diyoruz.
Sonra bu işlev Bazı anlamda çalışmış,
ama hiçbir kalıcı vardı x ve y ile ilgili etkiler.
Yani eldeki soru şimdi nasıl olduğunu biz aslında bu sorunu çözerim?
Eldeki çözüm nedir?
>> Peki, bugün yeni swap.c, içinde, farklar bir çift dikkat edin.
x ve y aynı.
Ama ne açıkça hat yaklaşık 25 farklı?
Eğer hatırlarsanız, ne var yeni Bir saniye önce neye benzediğini?
>> İZLEYİCİ: [duyulamaz].
>> DAVID J. MALAN: Evet.
Yani bir yeni parça ve işaretleri vardır sözdizimi sadece bu programda,
ama aynı zamanda daha genel CS50 içinde.
Bugüne kadar, sanmıyorum biz herhangi bir örnek gördüm
ya da gerçekten herhangi onlar hakkında konuştuk Belki, preemptively, başka ayrıntı,
bölümünde, böyle bir işareti.
Peki, bu işareti biridir çıkıyor Yeni sözdizimi son adet
Biz öğrenmek için gidiyoruz.
Demek hepsi Bazı değişkenin adresi.
Ne adres x yaşıyor?
Ama y ne adres yaşıyor?
Çünkü eğer önce temel sorun
Bu, x ve y kabul ediliyordu edildi biz gerçekten ne yapmak istediğinizi kopya olarak
Bir hazine gibi olan Swap sağlamak olduğunu burada x ve y, aslında neden harita
böylece, RAM içinde Takas bu haritayı takip edebilirsiniz
x veya y nokta işaretleri her yerde ve gitmek ve gerçek değerleri değiştirmek 1 ve 2
orada.
>> Yani Takas çok hafif değiştirmek gerekiyor.
Ve ilk bakışta, bu kudreti karakter yıldızı biraz benzer görünüyor.
Ve gerçekten de öyle.
Yani bir veri ne tür bir gösterici, Bu vurgulanan kısım dayalı?
Yani bir int var.
>> Yani, artık bir int bir int adresi var.
Ve benzer b şimdi gidiyor Bir int adresi için.
Yani şimdi Main Swap çağırdığınızda, Ben Swap 1 ve 2 vermek için gitmiyorum.
Ben gibi vereceğim Öküz-şey ve Ox-şey,
yol açacaktır iki adres Gerçek yerlere Takas
Benim bilgisayarın belleğinde.
>> Peki şimdi, benim kalan uygulama bir tad değiştirmek gerekiyor.
Şimdi ne açıkça farklı kod bu üç hatlarında?
Tüm bu lanet yıldızlar var biryere, tamam mı?
Peki burada neler oluyor?
Evet?
>> İZLEYİCİ: Bu [duyulamaz] Açıkçası bu.
>> DAVID J. MALAN: Kesinlikle.
Bu context-- Yani bu değildi En iyi tasarım kararı, kuşkusuz,
yıllar önce.
Bu bağlamda, Eğer sadece bir yıldız var,
ve bir veri türü yok, int gibi, hemen sola,
yerine açıkça, bir eşittir işareti var, Bu bağlamda, derken bir yıldız,
Bu gidip gelir Bir öyle adresi.
Tabiri caizse, hazine haritası izleyin.
>> Ve bu arada hat 37, aynı şeyi ifade eder.
Adres a gidin ve orada ne koydu?
Ne olursa olsun yer almaktadır b belirten konum.
Diğer bir deyişle, b gidin.
Bu değer alın.
Eşit başına, bir gidin ve imzalamak, atama operatörü,
Oradaki değer koymak.
>> Benzer şekilde, int temp sadece bir int.
Hiçbir şey sıcaklığına hakkında değiştirmek gerekiyor.
Bu Annenberg sadece bir yedek cam var Bazı süt veya portakal suyu için.
Ama ben, demek b gitmek gerekiyor.
Bu hedefe gidin ve Orada temp değeri koymak.
Öyleyse ne oluyor?
Aslında, bu defa Swap çağırdığınızda Bu ilk tepsi burada, Main temsil
Bu ikinci tepsi Swap temsil, ne zaman Ben işareti x ve y işareti geçmek
Ana Swap için, sadece, açık olmak Bu yığın çerçeve alıcı nedir?
Evet?
>> İZLEYİCİ: [duyulamaz].
DAVID J. MALAN: Kesinlikle.
x ve y adresi adresi.
Ve bu düşünebilirsiniz posta adresleri gibi.
33 Oxford Street ve 35 Oxford Caddesi ve
İki bina taşımak istiyorum Bu noktada olduğunu.
>> Bu saçma bir fikir çeşit, ama biz adrese demek bu.
Nerede dünya can Eğer bu iki ints bulmak?
Nerede dünya yapabilirsiniz Bu iki bina bulmak?
Sonunda ise, tüm bu zaman I sonrası Bugünün kaynak koduna gitmek ve derlemek
Takas ve çalışma ./swap, nihayet, için İlk kez biz aslında görüyoruz
Benim değerler gerçekten var başarılı takas edildi.
Ve şimdi, biz bile alabilir bu, diyelim ki, gdb not.
>> Bu yüzden bana aynı dosya içine gidelim.
Beni go ahead ve ./swap ve gdb çalıştıralım.
Ve şimdi, Swap, ben gidiyorum önde ve Main bir kırılma noktası ayarlayın.
Ve şimdi ben gidiyorum Önümüzdeki ve programı çalıştırın.
Ve şimdi benim kod görmek Bu çizgide durdu.
>> Ben go ahead ve baskı varsa x burada görmek ne gerekir?
Bu bir soru.
Tekrar söyle?
>> İZLEYİCİ: [duyulamaz].
>> DAVID J. MALAN: Yani rastgele sayılar, belki.
Belki şanslı olsun, ve bu kadar 0 gibi, güzel ve basit.
Ama belki de bazı rasgele numara.
Bu durumda, ben şanslıyım.
Sadece 0 olur.
Ama, gerçekten şans değil kadar çünkü
sonraki yazın ve sonra yazdırma x, vardır kod satırı, satır 19, idam edildi.
>> Bu arada, ben yazarsanız yanında yine, ve Şimdi ben 2 görmek için gidiyorum, y çıktı.
Sonraki yazarsanız Şimdi, bu gidiyor Biraz kafa karıştırıcı olsun, şimdi çünkü,
printf görünmesi için gidiyor Ekran yaptım gibi. x 1'dir.
>> Tekrar yapalım.
Ve şimdi, burada nerede ilginç şeyler olsun.
Ben Swap hatta adımı çağırmadan önce içine, en küçük bir göz atalım.
X, yine, 1'dir.
Y, tabii ki, hızlı aklı olan yani zor değil orada, 2 kontrol edin.
Ama işareti x nedir?
Cevap, bu tür korkak bakıyor.
Ama parantez içinde int yıldızı sadece bir Bu söylemenin GSYH yolu bir adres.
Bu, bir bir işaretçi bir int var değil int, ya da başka bir adrese olarak bilinir.
>> Bu çılgın şey nedir?
Biz bir şey görmedim Oldukça önce böyle.
Yani bu benim bilgisayarın adres olduğu x yaşamak olur nerede bellek.
Bu Ox-şey.
Ve bu açıkçası, neden, olan Ben okları çizim başladım,
yerine numaraları, kimin gerçekten umurunda çünkü
senin int belirli altında olduğunu Büyük işte adres.
Ama bffff0c4, bunların hepsi vardır gerçekten onaltılık basamak,
f ile 0 olan.
>> Yani biz de yaşamak için gidiyoruz değil bu şeyler ne uzun.
Ama y çıktısını eğer, Tabii, ben 2 bkz.
Ama işareti y ben bu adresi görüyorum.
Ve ihbar, meraklı için, ayrı x ve y ne kadar vardır?
Adresin en sayabilirsiniz.
Dört bayt.
Ve bununla tutarlı bizim Daha önce bir int ne kadar büyük olduğunu iddia?
Dört bayt.
Yani her şey astar kadar benziyor güzel, bellekte, umut olabilir gibi.
>> Peki şimdi, sadece hızlı ileri atalım Bu hikayenin sonuna.
, En önde gidip ve adım yazın edelim Swap fonksiyonu dalmak.
Şimdi bir yazarsanız, bu, fark x adrese denk.
Ben b yazarsanız, bu aynı değil y adresine.
Yani ben eğer ne görmelisiniz Bir adrese gitmek demek?
Yani bir yıldızı yazdırın.
Yani yıldız bu bağlamda, oraya gitmek demektir.
Ampersand adresi ne demektir.
Yani bir araç 1 yıldız.
Ve baskı yıldız b bana 2 veriyor.
>> Ve ben şu an için, varsayalım, en azından kodu o
olabilir şimdi yürütmek ilerler bu şekilde aracılığıyla gerekçeli.
Ama biz uzun zaman önce bu fikri tekrar edeceğiz.
Swap Yani bu sürümü Şimdi doğru ve izin verir
Bize bu özel veri türü takas.
>> Böylece herhangi bir soru daha sonra Swap?
Star?
Adresi üzerinde?
Ve sizinle, görürsünüz Sorun, çeşit, 4 set
ama sorun 5, kesinlikle, nasıl bu set şeyler yararlıdır ve almak çok daha
Bir sonuç olarak, bunlarla rahat.
Hiç bir şey?
Tamam.
Yani malloc, bu fonksiyon yine, sadece bellek, bellek ayırır
tahsisi.
Ve neden bu yararlıdır?
Peki, tüm bu sefer, Eğer malloc kullanarak oldum.
Şimdi nasıl düşünürsek işleri getString, muhtemelen, bu kadar
Bir yığın için bir başkasına soruyor Bellek, her zaman kullanıcı türleri bir dize
olarak, kesinlikle çünkü biz bilmiyordum, CS50 personel,
ne kadar büyük bu dizeleri bu insanlarda olabilir yazın gidiyoruz.
>> O yüzden, ilk kez, başlayalım soyma geri nasıl CS50 kütüphane çalışmaları,
örnekler çift yoluyla orada bizi götürecek.
Ben gedit açmak Yani eğer ve, scanf 0 açmak
aşağıdaki kodu görmek için gidiyoruz.
Için web sitesinde mevcuttur scanf 0, Bugün, nispeten daha az kod hatları vardır
Burada, 20 ile 14.
Ve en ne yaptığını görelim.
Bu bir int, denilen x bildirir.
Bu şey gibi, numara lütfen diyor.
Ve şimdi scanf% i, x, diyor.
Yani orada yeni şeyler bir sürü var.
>> Ama scanf, ne tür aklınıza gelebilecek bir printf tersi olarak.
Printf, tabii ki, ekran baskı.
Kullanıcı en gelen taramaların scanf tür Klavye şey o yazmamıştır.
>>% Ben sadece printf gibi.
Bu beklemek anlamına gelir Kullanıcı bir int yazın.
Ve şimdi, neden ben sizce scanf ve x geçen olabilir?
Eğer scanf hayatında amacı kullanıcıdan bir şeyler almak için,
anlamı nedir Şimdi, geçirerek, ve X?
Evet?
>> İZLEYİCİ: [duyulamaz].
DAVID J. MALAN: Kesinlikle.
Ne olursa olsun ben, insan, benim giriş yazın Bu konumda kaydedilmiş olacak.
Sadece için, hatırlama, yeterli değil biz zaten gördüm çünkü, x geçmek,
Herhangi bir zaman, sadece bir ham değişken geçmek bir int gibi, diğer bazı fonksiyonu,
Emin, o değiştirebilir değişken, ama kalıcı.
Bu Main üzerinde bir etkisi olamaz.
Sadece kendi yerel kopyasını değiştirebilirsiniz.
Ama eğer, bunun yerine, değil mi Bana gerçek int ver,
ama bana yön vermek int, ben şimdi, scanf olmak
kesinlikle, ben o takip edebilirsiniz adres ve orada bir numara koymak
böylece siz de ona erişebilir.
Ben bu programı çalıştırdığınızda >> Peki, bakalım.
Scanf 0 nokta çizgi olun, 0 scanf.
Ve ben şimdi bir sayı yazarsanız 50 gibi, 50 için teşekkürler.
Ben şimdi böyle bir sayı yazarsanız Negatif 1 için, 1 negatif.
Ben şimdi hm, 1.5 gibi bir sayı yazın.
Neden benim program beni görmezden mi?
Peki, çünkü sadece, ben söyledim bir int sadece beklemek.
Tamam.
Yani bu bir versiyonu.
En bir çentik şeyleri alalım ve Bu iyi değil öneriyoruz.
Ve burada çok basit bir örnek yatıyor Biz yazı kodu başlayabilirsiniz nasıl
Diğer insanların istismar olabilir ya da kötü şeyler yaparak uzlaşma.
Yani çizgi 16, yani benzer ruhu için önce,
ama bu sefer int ilan değilim.
Ben dize aka, bu Char yıldızı ilan ediyorum.
>> Ama bu gerçekten ne anlama geliyor?
Yani bir adresB belirtmek yoksa ve Ben keyfi olarak arıyorum, tampon,
ama simple-- olması için, s diyebiliriz ve sonra ben, bunu bana açıklayabilir,
Önceki dayalı, eğer olabilir mantık, scanf hat 18 ne yaptığını,
pas% s ve tampon varsa, Bir adres hangisi?
Eğer uygularsanız scanf, nedir sürüm 0 olarak aynı mantık,
Burada yapılacak denemek için gidiyoruz, ne zaman kullanıcı tipleri şey?
Evet?
>> İZLEYİCİ: [duyulamaz].
>> DAVID J. MALAN: Kesinlikle.
Scanf mantık tarafından daha önce, dize almaya gidiyor
İnsan yazdığınızı , şimdi bir dize var in--
bu, muhtemelen, bir sayı değil o cooperates-- eğer
ve bu koymak için denemek için gidiyor ne olursa olsun adreste bellekte dize
tampon belirtir.
Ve bu, büyük tampon çünkü gerçekten bir adres olması gerekiyordu.
>> Ama bu program içinde adamcağız iddia çok ciddi bir şekilde, değeri nedir çünkü
Varsayılan olarak tampon?
Ne içine başlatıldı var?
Bellek nedir yığın?
Ben değil var, değil mi?
>> Ben tahsis ettik yüzden bile olsa bir artık s denir karakter yıldızı,
yerine denir, yani buffer-- en değişkenin adını çizelim
Ben değil varsa artık buffer-- Burada getString veya Malloc denilen
Bu etkili olduğu anlamına gelir Tampon sadece bazı çöp değeridir.
>> Şimdi bu ne anlama geliyor?
Ben scanf söyledim demektir kullanıcıdan bir dize beklemek.
Ve biliyor musun?
Ne olursa olsun bu şey işaret ediyor amaçlara yönelik ve ben soru işareti çizmek,
ama gerçekte, o olacak OX1, 2, 3, gibi bir şey değil mi?
Bazı sahte değer olduğunu sadece önce orada olur.
Yani başka bir deyişle, bu kadar Tampon sadece sanki
bellekte bir şey işaret.
Ben hiçbir fikrim yok.
Ben şimdi gabe yazarsanız >> Yani, gidiyor Orada g-a-b-e / 0 koymak için denemek için.
Ama kim olduğunu biliyor?
Ve geçmişte bir Biz dokunmaya denedim zaman
ait olmayan bellek Bize, ne oldu?
Ya da hemen hemen her zaman.
Segmentasyon hatası, değil mi?
O nerede >> Bu ok, hiçbir fikrim yok işaretleme. sadece bazı rasgele değer.
Ve tabii ki, yorumlamak durumunda Bir adres olarak rastgele bir değer,
Eğer gitmek için gidiyoruz Bazı rastgele hedef.
Yani Gabe kazasında gerçekten olabilir Burada bu durumda benim program.
>> Yani biz neredeyse kötü ne var ne yapabilirim?
Bu üçüncü düşünün ve scanf son örnek.
Bu sürüm hangi anlamda iyidir?
Eğer rahat değilseniz Bir önceki sorunun, bu daha iyidir.
Neden?
>> İZLEYİCİ: [duyulamaz].
DAVID J. MALAN: İyi.
Hat 16 Yani bu durumda anlamda, daha da
Biz açıkça olduğumuzu Bazı bellek ayırma.
Biz, malloc kullanarak değil Biz hafta 2 kullanıyorsanız
sadece bir dizi ilan yaklaşımı.
Ve biz bir dize önce söylediğim karakter sadece bir dizidir,
bu nedenle bu tamamen meşrudur.
Ancak bu gibi, tabii ki, bu 16, sabit boyut not.
>> Yani bu program tamamen güvenli, ben yazarsanız
bir karakter dizeleri, iki karakter dizeleri, 15 karakter dizeleri.
Ama en kısa sürede ben 16 yazmaya başlayın gibi, 17, 18, 1.000 karakter dizeleri,
nerede dize sonuna kadar gidiyor?
Bu kısmen burada sonuna kadar gidiyor.
Ama sonra kim bilir neler sınırları ötesinde
Bu özel dizinin?
Ben ettik sanki >> It Burada 16 kutuları açıkladı.
Bu nedenle tüm 16 çizmek yerine, biz olacak Sadece 16 boğuldum iddia.
Ama ben daha sonra bir dize okumak için çalışırsanız Bu 50 karakter gibi, çok daha uzun,
Ben koyarak başlamak için gidiyorum a, b, c, d, x, y, z.
Ve bu muhtemelen bir Bazı diğer bellek segmenti
Bu, yine, neden olabilir benim program, çökmesine
Ben istedi ettik çünkü Sadece 16 bayt başka bir şey.
>> Peki kimin umurunda?
Peki, burada CS50 kütüphanesi.
Ve bu çoğu sadece bir kontör talimatlar gibi.
CS50 kütüphane, tüm bu sefer, hat 52 bu satırı olmuştur.
Biz typedef gördük, ya da var Eğer typedef göreceksiniz
Sadece bir oluşturur pset 4, içinde eşanlamlı karakter yıldız daha olabilir sayede
sadece dize olarak anılacaktır.
Yani bu biridir Birkaç eğitim jantlar
Biz kaputun altında gizlice kullandım.
>> Bu arada, burada getchar, fonksiyon var.
Şimdi görünüşe, ona hiçbir vücut var.
Ve aslında, ben tutarsanız Kaydırma, aslında yok
Herhangi uygulamaları görmek Bu işlevlerin.
Bir aklı kontrol olarak, neden?
>> İZLEYİCİ: [duyulamaz].
DAVID J. MALAN: Evet.
Yani bu başlık dosyasıdır.
Ve başlık dosyaları prototipler içerir artı diğer bazı şeyler, öyle görünüyor ki,
typedefs gibi.
Ama CS50.c, biz ettik hangi düpedüz seni verilen hiç,
ama CS50 cihaz olmuştur tüm Bu sefer, derin kendi klasörlerin içinde,
bir bütün var olduğunu fark Burada fonksiyonların demet.
>> Aslında, en aşağı kaydırma edelim.
Şimdi için, çoğu görmezden edelim.
Ama GETINT aşağı kaydırma ve GETINT nasıl çalıştığını görmek.
Yani burada GETINT olduğunu.
Hiç gerçekten bakım ve nasıl olsun int burada, çalışan kendi belgelerdir.
Ve yanı sıra o size söyler diyor
değer aralıkları o geri ne.
Bu aslında olumsuz var 2 milyar Pozitif 2 milyar kadar, vermek veya almak.
>> Ve tüm bu çıkıyor zaman, biz asla ettik bile
bunun için kontrol vardı, bir şey yanlış giderse,
tüm bu çıkıyor Bu sefer, GETINT sahip
Özel dönen null, sabit değildir
daha çok olan, INT_MAX Sadece bir programcı kongre.
Burada anlamına özel bir değerdir.
Sadece, bu kontrol etmek için emin olun durumda bir şey yanlış giderse.
Ama biz asla rahatsız ettik bu zamana kadar olan,
Yine, bunun nedeni basitleştirmek için tasarlanmıştır.
>> Ama nasıl GETINT uygulamaya olsun demek?
Eh, bir, hiçbir argüman alır.
Biz biliyoruz.
Bu bir int döndürür.
Biz biliyoruz.
Peki nasıl kaputun altında çalışır?
>> Yani görünüşte sonsuz var Döngü, en azından birinin görünümü.
Biz getString kullanıyorsanız dikkat edin.
Yani ilginç. GETINT Kendi fonksiyonu, getString çağırır.
Ve şimdi neden bu durumda olabilir?
Neden defansif açıyorum Burada hat 165?
Ne doğrultusunda olabilirdi 164, sadece temiz olması için?
Daha önce aynı cevap.
Sadece bellek yetersiz olabilir.
Bir şey, getString ile yanlış gider biz idare edebilmek için var.
Ve nedeni null dönüş yok Bu, teknik olarak, boş bir göstericidir.
GETINT bir int dönmek zorundadır.
Yani keyfi ettik esas olarak, karar
2 milyar olduğunu, gidiyor, vermek veya almak Özel bir değer olarak ben asla can
Aslında kullanıcıdan olsun.
Ben gidiyorum sadece bir değer Bir hata kodu temsil etmek atık.
>> Peki şimdi işler biraz fantezi olsun.
Ve oldukça aynı işlevi değil eskisi gibi, ama çok benzer.
Yani doğrultusunda, burada beyan fark 172, bir int n ve bir char c hem.
Ve sonra, bu korkak satırını kullanın çıkıyor sscanf,
klavyeden bir dize taraması yapmaz.
Varolan dize duruyor kullanıcı zaten yazmış etti.
Yani zaten getString denilen hangi Ben bellekte bir dize var demektir.
sscanf ne olurdu olduğunu Bir ayrıştırma işlevini çağırın.
Ben ettik dize bakar , karakteri, karakter yazdığınız
ve yararlı bir şey yok.
Bu dize satıra kaydedilir.
Ve ben sadece gidiş olduğunu biliyorum Tamam, ah, burada ve diyerek yedeklemek,
Ben lar bu sefer, ama hat denir.
>> Ve şimdi bu biraz farklıdır.
Ancak bu etkin bir nedenden dolayı, demek biz biraz, bugün bizim eller dalga edeceğiz
biz kontrol ediyoruz ki Kullanıcı yazdığınız görmek
ve int ve belki başka bir karakter.
Kullanıcı bir int yazdıysanız, bu kadar Ben için giderek n depolanacak
adresi ile bu geçen, Bugün gördüğüm yeni numara.
Kullanıcı ayrıca yazdıysanız gibi 123X, yani X
Bir sonuna kadar gidiyor karakter c harfi.
>> Şimdi bu sscanf çıkıyor akıllıca, bana anlatacak,
kaç değişken sscanf edildi doldurmak için başarıyla mümkün.
Bu mantığa göre, Yani fonksiyonu I GETINT uygulanışında ediyorum
ama ben kontrol ediyorum, Potansiyel olarak, kullanıcı için
Bir int yazdığınız için başka bir şey, ardından
ne sscanf en istiyorum Dönüş değeri gerçekten olmak?
Amaç almak için ise sadece kullanıcının bir int?
>> Yani eğer sscanf döner 2, bu ne anlama geliyor?
Kullanıcı yazdığınız şey gibi, kelimenin tam anlamıyla,
Sadece saçmalık 123X.
Bu bir hata durumu var, ve Bunun için kontrol etmek istiyorum.
>> Peki bu kullanıcı türleri ise, tarafından Bu mantık, geri dönmek sscanf ne,
Eğer derdi?
Yani çünkü, 2. dönmek için gidiyor 123, burada gidecek
x burada sonuna kadar gidiyor.
Ama x dolu olsun istemiyorum.
Ben sadece başarılı olmak sscanf istiyorum değişkenleri ilk dolum.
Ve böylece bu yüzden ben sscanf 1 dönmek için istiyorum.
>> Ve bu başının üzerinde bir bit olup olmadığını Şu an için, bu tamamen iyi.
Olsa o bir fark GETINT ve getString değerleri
Biz bir halt yapıyorsun olduğunu Bu yüzden böyle hata kontrolü çok
Bu, bugüne kadar, hemen hemen yapabilirsiniz Klavyenizin bir şey yazın
ve biz bunu yakalayacak.
Ve biz kesinlikle, Personel, değil kesinlikle olacak
Bir hata kaynağı senin Program, biz savunmaya çünkü
aptal tüm kontrol Bir kullanıcı yapabilir şeyler,
ne zaman bir dize yazarak gibi Eğer gerçekten int istedi.
Yani biz geleceğiz şimdi-- için buna geri long-- önce
ama tüm bu sefer, getString ve GETINT var
Bu kullanarak başlık altında yapılmış bellek adresleri temel fikir.
>> Peki şimdi, bir üyenin şeyler yapalım Kullanıcı dostu biraz daha fazla.
Eğer Binky son gelen, Hatırlayacağınız gibi defasında bir zaman fare çok cooperate-- eğer
Bu kodu, vardı açıkçası, oldukça saçmadır.
Bu kod şey elde yararlı, ama örnek oldu
O profesör Parlante temsil etmek üzere kullanılan
ne oluyordu bellek içeren bir program.
>> Yani bu anlatmak edelim Hikaye süper kısaca.
Bu ilk iki satır içinde İngilizce, ne söyleyebilirim mı?
Sadece makul insan, ama biraz teknik terimler, bir bıçak almak.
HEDEF KİTLE: [duyulamaz].
>> DAVID J. MALAN: Tamam, sen kuruyoruz senin x ve y değişkenleri için adresleri.
Olarak değil, x ve y değildir çünkü Geleneksel anlamda değişkenler.
x ve y adresleri veya adresi saklar.
Yani bu bir kez daha deneyelim.
Değil kötü bir başlangıç ​​olsa.
Evet?
>> İZLEYİCİ: [duyulamaz].
DAVID J. MALAN: İyi.
Ben biraz daha temiz olduğunu düşünüyorum.
İki işaretçileri, iki tamsayılar bildirmek.
Ve biz onlara x ve y diyorlar.
Ya da biz eğer çizmek için Bu bir resim olarak, yine,
oldukça basit tüm hatırlamak biz ilk hattı ile yapıyoruz
Böyle bir kutu çizim, içinde bazı çöp değeri ile,
ve sonra x arayarak, ve Bu gibi başka bir kutu,
bazı çöp değeri ile o, y çağırarak.
Biz iki ilan ettik işaretçileri sonuçta
Bir int adresini saklar.
Yani hepsi var.
>> Peki Binky ne zaman bu, kil sadece bu gibi görünüyordu.
Ve Nick sadece tür okları sarılmış,
sanki onlar her yerde işaret değil Özellikle, çünkü sadece konum
çöp değerleri.
Onlar açıkça başlatıldı değil her yerde özellikle.
Bir >> Şimdi bir sonraki satır kod, hatırlama, bu oldu.
Makul kullanıcı dostu Yani ama biraz teknik İngilizce,
Kod yapmanın bu hat nedir?
Evet?
>> İZLEYİCİ: [duyulamaz].
>> DAVID J. MALAN: Mükemmel.
Bu bir yığın tahsis ediyor bir int boyutu var bellek.
Ve yarım cevap.
Sen hakkını cevap İfade yarısı.
Neler oluyor eşittir işareti sol taraftaki?
Evet?
HEDEF KİTLE: Ve atar değişken x?
>> DAVID J. MALAN: Ve atar değişken x.
Recap, sağ taraf ayırır Yani Yeterli bellek bir int depolamak için.
Ama malloc özellikle adresini döndürür
Eğer ettik bellek bu yığın, bir Sadece x depolanır önerdi.
>> Nick Binky ile son kez yaptım Peki ne o işaretçi dışarı sürükledi, kil,
bellek beyaz bir yığın şimdi işaret etmek Bu bir int boyutuna eşittir.
Ve gerçekten de, o pinti dört bayt temsil etmek.
Kod >> Şimdi, bir sonraki satır Bu yaptım, yıldız x 42 alır.
Yani 42 basittir Sağ taraftaki, hayatın anlamı.
Sol tarafta, yıldız x ne demek?
Bu Tamam gone-- Bu çok olabilir.
TAMAM MI.
>> İZLEYİCİ: Temelde, [duyulamaz] gitmek
DAVID J. MALAN: İyi.
HEDEF KİTLE: [duyulamaz].
DAVID J. MALAN: Kesinlikle.
Sol taraftaki x gitmek anlamına gelir.
x adres olduğunu.
Bu 33 Oxford Street, veya OX1 gibi.
Ve yıldız, x gitmek anlamına gelir ele almak ve orada ne koydu?
42.
>> Peki gerçekten, bu Nick yaptığını tam olarak ne.
O, saldırıdaki ile başladı esas olarak, zihinsel
Bir parmak işaret X, ok yönünde
Sağ-el beyaz kutu yan, ve orada numarayı 42 koyarak.
Ama sonra işler var bir Biraz tehlikeli, değil mi?
Binky en kafasını kaybetmek üzere.
>> Yıldız y ne demek, 13, kötü şans eşittir?
Yani yıldız y araçlar y adrese gidin.
Ama y adresi nedir?
Pekala, bu çöp değeri doğru, değil mi?
Ben bir soru işareti olarak çekti.
Nick kıvrılmış ok olarak çekti.
Ve kısa sürede deneyin oraya gitmek söyleyerek, yıldız y yapmak,
ancak yasal olmadığı adres, bazı sahte konumu,
Program çökmesine gidiyor.
Ve Binky başı gidiyor yaptığı gibi, burada uçtuğunu.
>> Yani sonunda, bu program Sadece düz dışarı kusur oldu.
Bir adamcağız programı oldu.
Ve sabit gerekiyordu.
Ve tek yolu, gerçekten, bunu düzeltmek için olurdu, örneğin, bu hat,
biz bile alamadım ki, çünkü Program çok yakında çöktü.
Ama biz bunu düzeltmek için olsaydı, ne etkisi y eşit x var yapıyor mu?
Peki, aslında bir y işaret ne olursa olsun değer x işaret edilmektedir.
>> Nick'in hikayesi Yani, veya Binky hikayesi, hem de
x ve y de işaret edilmiştir bellek beyaz yığın,
böylece, nihayet, sizi y yine 13 eşit yıldız yapmak,
sen 13 koyarak sona Uygun konumu.
Yani bu hatların hepsi mükemmel olan meşru, bu biri hariç,
sizden önce oldu ne zaman aslında y bazı değer atanır.
>> Şimdi minnetle, değil mi tüm aracılığıyla akıl var
kendi konularda bu tür.
Beni go ahead ve açalım Burada bir terminal penceresinde yukarı
ve sadece bir an için, açmak, süper kısa program o
Ayrıca çeşit anlamsız.
Bu çirkin.
Bu yararlı bir şey elde etmez.
Ama sorunları göstermek yok hafıza, o yüzden bir göz atalım.
>> Ana, süper basit.
Bu görünüşte bir işlevi çağırır, f, ve sonra 0 döndürür.
Bu karmaşa, bu kadar biraz zor.
Yani ana kadar, oldukça iyidir.
>> Böylece f sorunludur.
Ve sadece çok koymadı adlandırma içine çaba
Burada, kod odağı tutmak için.
f iki satır vardır.
Ve şimdi neler görelim.
Bu nedenle bir yandan ötürü-- ve beni yapalım
Önceki ile bu tutarlı Bir yandan example--,
sol tarafı İngilizce, ne yapıyorsun?
Bu bu--
HEDEF KİTLE: Bir işaretçi oluşturma.
DAVID J. MALAN: bir işaretçi oluşturma bir int ve arama o x.
Yani bu kutulardan birini yaratıyor Ben dokunmatik ekranda çizim devam.
Ve şimdi, sağ taraftan Yan malloc, tabii ki,
Bellek bir yığın tahsis edilir.
Ve sadece temiz olması için, nasıl kadar bellek görünüşte öyle
tahsis, eğer sadece tür burada matematik yapmak?
>> Yani 40 bayt var.
Ve biliyorum ki ben bir biliyorum çünkü int, CS50 cihaz üzerinde, en azından,
Dört bayt.
Yani 10 günlerin 4 40.
Yani bu bir x depolamak, adres 40 ints ilk çıkar ki
geri alan tahsis edilmiştir, geri, geri, geri.
>> Ve bu malloc hakkında önemli ne var.
Biraz hafıza almaz Burada, bir burada biraz, biraz burada.
Bu, size bellek bir yığın verir bitişik, işletme gelen
sistemi.
>> Bu konuda şimdi ne, x dirsek 10 0 eşittir?
Kod Keyfi hattı.
Bu yararlı bir şey elde etmez.
Ama, ilginç x dirsek 10-- çünkü?
Evet?
>> İZLEYİCİ: [duyulamaz]?
>> DAVID J. MALAN x braket 10 boş olmak zorunda değildir.
Boş detay sadece devreye giriyor dizeleri ile, bir dizenin sonunda.
Ama iyi bir düşünce.
>> Bile, bu dizi ne kadar büyük Ben 40 bayt tahsis ettik olsa?
Bu doğru, dokuza kadar 0 değil?
Bu toplam, 10 ints var.
40 byte, ancak 10 ints, 0 ile 0 endeksli.
>> Böylece x dirseği 10 nedir?
Bu aslında bazı bilinmeyen çöp değeri.
Bana ait olmayan bir anı.
Bunu dokunmadan edilmemelidir byte numarası 41, 42, 43, 44.
Ben çok hafif gidiyorum.
>> Ve gerçekten, ben çalıştırırsanız, bu Program, çok iyi çökebilir.
Ama bazen, biz şanslı alırsınız.
Ve böylece sadece göstermek için bu-- ve açıkçası,
sizden önce asla bilemezsiniz bu-- Şimdi bu çalışmasına izin yoktur.
Aslında çökmesine vermedi.
>> Ama ben, bu değişiklik eğer Örneğin, 1000 gibi olmak
Gerçekten bu yapmak için kasıtlı, bakalım
biz alabilirsiniz eğer bu sefer çökmesine.
Tamam, bu çökmesine vermedi.
Nasıl 100.000 'hakkında?
Şunu remake edelim, ve şimdi yeniden çalıştırın.
TAMAM MI.
Vay be.
Tamam.
Yani görünüşe göre, yine bu bellek kesimleri, yani, konuşmak
bu yüzden biz, oldukça büyük olan Tekrar ve tekrar almak şanslı.
Ama sonunda, bir kez saçma olsun ve gerçekten, ekranda çok dışarı çıkmak
Eğer, gerçekten hafıza dokunma Gerçekten sana ait değil.
>> Ama açıkçası, bu böcek türleri gidiyor
sert ve zor olması kendi anlamaya.
Ama neyse ki, programcılar gibi, biz var Bize bizim için bunu yapmak için izin araçlar.
Yani bu belki de, biri çirkin programları,
GDB üretiminin daha çirkin.
Ama her zaman bir çizgi vardır veya süper yararlıdır iki.
>> Valgrind yardımcı olan bir programdır Eğer bir program hata ayıklama değil, başına,
ancak bellek-ilişkili bulmak problemler, özellikle de.
Bu otomatik olarak kodunuzu çalışacak sen ve en az iki şey için bakmak.
Bir, bir şey yaptın Dokunmatik bellek gibi kazara
Bu sana ait değil mi?
Bu o davaları bulmanıza yardımcı olacaktır.
>> Ve iki yardımcı olacaktır Aradığınız şey bulmak
Bellek sızıntıları, biz var tamamen göz ardı, safça,
bir süre için ve tehlikeleri bertaraf.
Ama hepsi, çıkıyor Bu sefer, her
Eğer getString aradım Programlarımızın çok,
Eğer işletim soruyorsun bellek sistemi,
ancak herhangi bir hatırlama var her zamankinden veriyor
geri, yapıyor unalloc, ya da ücretsiz, denir olarak.
Hayır, çünkü biz asla ettik Bunu yapmak istedi.
>> Ama bütün bu zaman, programlar C yazma oldum
bellek sızıntısı edilmiştir, işletim soran
Daha fazla ve daha fazla sistem dizeleri ve etajer için hafıza,
ama geri teslim olmadı.
Ve şimdi bu biraz Bir tefrit,
ama hiç ettik eğer Mac çalıştırmak veya oldukça zaman, açılış için PC
birçok program, belki programları kapatmayı
ve olsa bile senin Bilgisayar çöktü değil,
o, çok yavaş gidiyor Gerçekten var sanki
Bellek bir sürü kullanarak veya kaynaklar, olsa,
Eğer değilseniz bile Klavyeyi dokunmadan,
Bu göre-- ancak always-- olabilir olabilir programlar koşuyoruz ki olacak
kendilerini bellek sızıntıları var.
Ve onlar daha için OS sormaya devam Daha fazla bellek, ancak bu konuda unutmadan,
Aslında, bunu kullanarak değil ama Bu nedenle uzak bellek alarak
Bunu isteyebilirsiniz diğer programlardan.
Yani ortak bir açıklama.
Şimdi burada nerede Valgrind en bulunuyor çıkış tamamen
Bu daha az iğrenç ve hem daha rahat.
Ama ilginç şeyler burada doğru kadar.
Bana bir geçersiz yazma anlatıyor boyutu dört, bu programda olur
Özellikle, memory.c hattı 21'de.
>> Ben gerçekten, hm, 21 hat için oraya gitmek boyutu dört geçersiz yazma olduğunu.
Neden size dört?
Peki, bu number-- ve herhangibirşey olabilecek bir int.
Yani dört bayt var.
Yani dört bayt atıyorum nerede ait değildir.
İşte ne Valgrind var aslında bana anlatıyor.
Ayrıca, aynı zamanda olacak göreceğiz gibi, söyle,
Eğer bu bir gelecekte pset çalıştırmak gibi, eğer Eğer gerçekten bellek, sızdırılmış olduğunuz zaman
Ben aradım, çünkü var malloc, ama aslında değil var
serbest, bu durumda, adı verilen, Hangi biz sonunda göreceğiz
malloc tersidir.
>> Peki şimdi, ben, bir son örneği bence.
Yani bu bir biraz daha var gizli, ancak belki de var
en büyük nedeni bellek ile dikkatli olun
ve neden birçok program ve hatta bu gün / veya web sunucuları,
yerde kötü adamlar tarafından devralınması internette şekilde kim
sunucunuza sahte paketleri gönderme Hesaplarınızı uzlaşmaya çalışırken,
veya veri almak, ya da sadece Genellikle bir makine devralacak.
Tampon taşması gibi isim, araçları da anlaşılacağı
değil bir int, ama bir tampon taşan.
Ve bir tampon sadece bir fantezi yoludur diyerek bellekte bir avuç.
>> Ve gerçekten, ben bir dize denir yerine s tampon, önce.
Bir tampon eğer Çünkü, YouTube anlamında olduğu gibi,
ya da bir videoyu izliyor her zaman, Eğer kelime tamponlama görmüş olabilir,
nokta, nokta nokta.
İnanılmaz sinir bozucu.
Ve bu sadece anlamına gelir video oynatıcı bu
çok indirmek için çalışıyor bayt bayt, bir sürü
internetten bir video.
Ama yavaş, bu yüzden çalışıyor Bunlardan bir demet indirmek için
böylece, bir tampon maddesi, bir konteyner, doldurmak için Bunu daha sonra can yeterli bayt
size videoyu göstermek Sürekli duraklamadan.
Ama yapabilirsiniz, çıkıyor Bu büyük bir tampon var.
Ama bu kadar veri koymak deneyin o, ve çok kötü şeyler olabilir.
Yani örneğin, en bakalım Örneğin bu son iltifat.
Bu da başka bir program Bu, ilk bakışta,
Süper yararlı bir şey yapmaz.
Bu ana fonksiyonu var Bu f bu işlevi çağırır.
Ve bu fonksiyon, f, buraya, var Bir karakter dizisi, büyüklüğü 12, c çağırdı.
Ve sonra bu kullanıyor Yeni işlev strncpy çağırdı.
>> Bu basit, çıkıyor, kod basit çizgi, sadece iki satır,
biz benim bütün programı yaptık ve bu nedenle, benim tüm bilgisayar,
ve benim kullanıcı hesabı ve benim sert herkese potansiyel savunmasız sürücü
kim bilir ve çalıştırmak için yeterince iyi Belirli bir komut satırı ile bu program,
argüman.
Diğer bir deyişle, bu kötü adam yazarak argvargv [1] içinde koyar
Klavyede çok özel hazırlanmış bir Dize, değil abc, 123, ama aslında,
yürütülebilir temsil ikili sembolleri kod, o yazdığı bir program,
bu basit bir program ile programları binlerce temsili
bu, Daresay benzer savunmasız o sonuçta silebilirsiniz
benim sabit diskteki dosyalar, bir olsun o olabilir böylece istemi yanıp
kendi komutları yazın, kendime tüm dosyaları e-posta.
Yapabileceğim bir şey, o ya da o bu kodla yapabilirsiniz.
>> Biz oldukça henüz bu çözmez.
Ve aslında, bu gidiyor Biraz resim dahil
Bu gibi yakında geleceğiz hangi Tüm iyi anlamak için.
Ama bugün için, en üstünde bitirelim , biraz daha umarım, ne
anlaşılabilir XKCD şaka, Önümüzdeki zaman devam kadar.
Tamam.
Çarşamba günü görüşürüz.
>> [MÜZİK OYUN]
>> HOPARLÖR: Ve şimdi, derin DAV Farnham tarafından düşünceler.
Bellek yığını içine atlama gibi Bir Pazar öğleden sonra altın yapraklar.
Rüzgar üfleme, savurma senin oh saçın, ben gün when-- özledim
>> [KAHKAHA]