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