1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MÜZİK OYUN] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. MALAN: Pekala. 4 00:00:12,640 --> 00:00:14,525 Bu CS50 olduğunu. 5 00:00:14,525 --> 00:00:16,009 Ve bu hafta 5 başlangıcıdır. 6 00:00:16,009 --> 00:00:18,050 Ve fark etmiş olabilir, malzemenin bir kısmı 7 00:00:18,050 --> 00:00:21,050 Biraz daha oluyor Karmaşık, küçük yoğun. 8 00:00:21,050 --> 00:00:24,560 >> Ve özellikle, çok kolay Eğer, bir süre alışkanlığı oldum 9 00:00:24,560 --> 00:00:28,600 En aşağı karalamak için çalışıyor olmak Yaptığımız şey, biz sınıfta söylüyorsun. 10 00:00:28,600 --> 00:00:31,626 Ama bu belki de değil, fark İdeal pedagojik yaklaşım 11 00:00:31,626 --> 00:00:34,250 malzeme bu tür öğrenme, ve malzeme daha genel olarak. 12 00:00:34,250 --> 00:00:37,250 Ve böylece biz mutluyuz Bu CS50 kendi Gheng ilan 13 00:00:37,250 --> 00:00:39,780 Gong hazırlamak başladı notlar kurallı dizi 14 00:00:39,780 --> 00:00:42,100 ders için, umudu ki bu, bu biridir 15 00:00:42,100 --> 00:00:44,030 sadece bir işlevi Referans ve kaynak 16 00:00:44,030 --> 00:00:47,410 malzeme gözden ve gidiş için geri malzeme ile sahip olabilir 17 00:00:47,410 --> 00:00:51,230 etrafında seni ilk defa kaçtı ama Ayrıca böylece kafaları olabilir daha fazla 18 00:00:51,230 --> 00:00:53,740 aşağı, ne zaman daha fazla ders zamanı geldiğinde, 19 00:00:53,740 --> 00:00:56,960 Eğer meşgul olabilir ki daha düşünceli, gibi 20 00:00:56,960 --> 00:00:59,170 daha karalanmuş karşı. 21 00:00:59,170 --> 00:01:02,510 >> Bunu dedi, sen ne bulacaksınız Web sitesi bu gibi belgeler olduğunu. 22 00:01:02,510 --> 00:01:04,660 Ve haber, sol üst kısmında, orada sadece içindekiler tablosu, 23 00:01:04,660 --> 00:01:06,920 ama aynı zamanda zaman kodları olduğunu hemen size atlayacaktır 24 00:01:06,920 --> 00:01:09,077 uygun bir parçasına Video online olarak. 25 00:01:09,077 --> 00:01:11,410 Ve burada ne Chang yapmış , esasen, belgelenmiştir 26 00:01:11,410 --> 00:01:13,340 bu ne oldu Özellikle ders. 27 00:01:13,340 --> 00:01:16,370 Ve konferanslar çoktur zaten online şimdi bu URL ile. 28 00:01:16,370 --> 00:01:20,110 Ve biz kalanını sonrası devam edeceğiz Bu hafta sonuna kadar olanların, 29 00:01:20,110 --> 00:01:22,380 böylece kaynak yararlanmak yoktur. 30 00:01:22,380 --> 00:01:25,740 >> Bu yüzden daha fazla uzatmadan, biz geri soyma başladı 31 00:01:25,740 --> 00:01:28,180 olmuştur tabaka bir süre dize. 32 00:01:28,180 --> 00:01:30,670 Ve biz bir dize ne dedin Aslında geçen hafta? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Yani karakter yıldız. 35 00:01:32,900 --> 00:01:34,900 Ve karakter yıldızı, iyi, ne Bu gerçekten demek istedi? 36 00:01:34,900 --> 00:01:37,150 Peki, tüm bu zaman, biz ettik eğer bir işlevi aradım, 37 00:01:37,150 --> 00:01:40,450 getString ve depolama gibi Sözde dönüş 38 00:01:40,450 --> 00:01:42,910 a getString değeri değişken-- denir 39 00:01:42,910 --> 00:01:47,721 Biz yazıyorum string-- s tipi Orada Yukarıdaki kod satırı. 40 00:01:47,721 --> 00:01:49,970 Ben görünce Ve de sadece benim El yazısı burada büyütülmüş 41 00:01:49,970 --> 00:01:51,930 Ben bu ne kadar iğrenç fark yok. 42 00:01:51,930 --> 00:01:54,180 >> Ancak, en varsayalım, Sağ taraftaki 43 00:01:54,180 --> 00:01:57,070 , Yine de, bir makul ne tasviri 44 00:01:57,070 --> 00:01:58,880 Bütün bu devam getString ile zaman. 45 00:01:58,880 --> 00:02:00,380 getString, elbette, bir dize alır. 46 00:02:00,380 --> 00:02:01,691 Ama bu gerçekten ne anlama geliyor? 47 00:02:01,691 --> 00:02:04,190 O bir yığın alır demektir işletim sisteminden bellek 48 00:02:04,190 --> 00:02:06,040 Bir işlevini çağırarak, malloc çağırdı. 49 00:02:06,040 --> 00:02:07,390 Ama daha bu konuda daha sonra. 50 00:02:07,390 --> 00:02:09,139 Sonra da doldurur belleğin o öbek 51 00:02:09,139 --> 00:02:11,764 harflerle kullanıcı var Yazılan ardından, tabii ki, 52 00:02:11,764 --> 00:02:14,800 bir boş karakter, veya ters eğik çizgi en sonunda sıfır. 53 00:02:14,800 --> 00:02:18,280 >> Bu arada, sol tarafta Bu hikayenin, bu sefer, 54 00:02:18,280 --> 00:02:20,850 Biz s gibi, bir değişkeni bildirmek oldum. 55 00:02:20,850 --> 00:02:24,770 Ve bu değişken artık ne olduğunu Bir işaretçi arayarak başlayacak. 56 00:02:24,770 --> 00:02:29,190 Bu hangi içinde bir kutu değil Biz dize koymak, DAV, başına, 57 00:02:29,190 --> 00:02:32,550 ama doğrusu biz bu meydanda koymak Soldaki tam olarak ne üzerine kutusuna? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Evet? 60 00:02:35,390 --> 00:02:37,118 >> İZLEYİCİ: adresi nerede bellekte yer alır. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. MALAN: Kesinlikle. 62 00:02:38,118 --> 00:02:40,690 Daven adresi bellekte yer almaktadır. 63 00:02:40,690 --> 00:02:44,650 Ve Daven tüm, bulunduğu yerde değil, başına, ama özellikle adres 64 00:02:44,650 --> 00:02:45,150 Neyin? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Evet? 67 00:02:46,810 --> 00:02:47,460 >> İZLEYİCİ: İlk karakter. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. MALAN: İlk karakteri Bu durumda Daven, içinde, 69 00:02:50,209 --> 00:02:53,820 Ben keyfi oldu önerdi ve gerçek olamayacak kadar 1, OX1, 70 00:02:53,820 --> 00:02:55,910 hangi sadece anlamına gelir 1 onaltılık sayı. 71 00:02:55,910 --> 00:02:57,993 Ama muhtemelen gidiyor çok daha büyük bir sayı olması 72 00:02:57,993 --> 00:03:01,260 Biz çizmek olabilir Bir önek olarak 0x ile, 73 00:03:01,260 --> 00:03:02,806 onaltılık karakteri temsil. 74 00:03:02,806 --> 00:03:05,930 Ve biz nerede olduğunu bilmek gerekmez, çünkü Daven karakter geri kalanı 75 00:03:05,930 --> 00:03:09,860 nedeniyle, ne basit tasarım Karar yıllar önce yapıldığını? 76 00:03:09,860 --> 00:03:10,548 Evet? 77 00:03:10,548 --> 00:03:11,651 >> İZLEYİCİ: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. MALAN: Evet, kesinlikle. 79 00:03:12,900 --> 00:03:18,100 Ters eğik çizgi 0 olsa, size izin verir lineer zaman, dize hareket etmek, 80 00:03:18,100 --> 00:03:20,400 soldan sağa yürüyün, Bir döngü için, ya da bir süre ile 81 00:03:20,400 --> 00:03:22,608 döngü, ya da bir şey gibi Bu, burada, oh, belirlemek 82 00:03:22,608 --> 00:03:24,751 Bu özel dize sonu. 83 00:03:24,751 --> 00:03:27,000 De sadece adresi ile Böylece bir dize başlangıcı, 84 00:03:27,000 --> 00:03:30,290 biz bütününü erişebilirsiniz o, bütün bu süre, çünkü 85 00:03:30,290 --> 00:03:32,030 Bir dize sadece bir karakter yıldızı olmuştur. 86 00:03:32,030 --> 00:03:36,370 >> Yani kullanmaya devam etmek kesinlikle iyi değil CS50 kütüphane ve bu soyutlama, 87 00:03:36,370 --> 00:03:38,440 tabiri caizse, ama yaparız için Tam görmeye başlarsınız 88 00:03:38,440 --> 00:03:41,230 ne oluyor oldu Bütün bu süre altında. 89 00:03:41,230 --> 00:03:45,260 Yani bu örnek Hatırlayacağınız, çok son zaman, 0 karşılaştırmak, 90 00:03:45,260 --> 00:03:47,300 hangi aslında karşılaştırmak yoktu. 91 00:03:47,300 --> 00:03:49,070 Ama biz bu çözmek için başladı. 92 00:03:49,070 --> 00:03:52,020 >> Ama belki de bir tazeleme, Birini ilgi olabilir 93 00:03:52,020 --> 00:03:54,261 pembe bir fil bugün, Ayrıca Chang tarafından yapılan? 94 00:03:54,261 --> 00:03:55,760 Nasıl önünde senin hakkında? [Duyulamaz]. 95 00:03:55,760 --> 00:03:56,660 Hadi gel. 96 00:03:56,660 --> 00:03:58,740 >> Ve bu arada, Eğer gelip gibi, diyelim 97 00:03:58,740 --> 00:04:01,670 Sadece bir an için düşünün ne Bu kodu aslında yapıyordu. 98 00:04:01,670 --> 00:04:04,917 Bu iki değişken kadar ilan ediyor En iyi, s ve t ve getString çağrı. 99 00:04:04,917 --> 00:04:08,250 Bu, bir çok kullanıcı dostu bir program değildir o size değil, çünkü ne yapmak. 100 00:04:08,250 --> 00:04:10,541 Ama sadece biz konum varsayalım diyelim sulu kısmı üzerinde duruluyor. 101 00:04:10,541 --> 00:04:14,470 S eşitse Ve sonra, yapmak bu printf demeliyim t eşittir, 102 00:04:14,470 --> 00:04:16,170 Aynı şeyi yazdınız. 103 00:04:16,170 --> 00:04:16,670 Merhaba. 104 00:04:16,670 --> 00:04:17,050 Adınız ne? 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. MALAN: Janelle, tanıştığımıza memnun oldum. 107 00:04:19,529 --> 00:04:21,800 Adresinden meydan Yani Bu fil için el 108 00:04:21,800 --> 00:04:25,230 öncelikle bize ne bir resim çizmek için bu ilk iki temsil edilen 109 00:04:25,230 --> 00:04:25,970 çizgiler. 110 00:04:25,970 --> 00:04:28,139 Yani s ve t olabilir nasıl Ekranda temsil? 111 00:04:28,139 --> 00:04:30,680 Ve sadece bunu çizebilirsiniz Bu büyük ekranda parmağınızı. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Yani iki yarıyı var Bu denklemin her iki tarafında. 114 00:04:34,510 --> 00:04:37,760 Yani soldaki ler var, ve Daha sonra sağdaki getString. 115 00:04:37,760 --> 00:04:40,540 Ve sonra t, soldaki var ve sonra sağdaki getString. 116 00:04:40,540 --> 00:04:42,630 Yani biz nasıl başlayabilir Bir resim çizim olduğunu 117 00:04:42,630 --> 00:04:46,340 Neler temsil Burada bellekte, sen söylerdin? 118 00:04:46,340 --> 00:04:49,150 Ve bana açıklamak let Eğer gitmek gibi ne yapıyorsun. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: Tamam. 120 00:04:49,820 --> 00:04:58,890 Peki, ilk soran olurdu giriş dizesi almak için. 121 00:04:58,890 --> 00:05:00,439 Ve üzgünüm, oh store-- olur. 122 00:05:00,439 --> 00:05:01,230 DAVID J. MALAN: Tamam. 123 00:05:01,230 --> 00:05:01,730 İyi. 124 00:05:01,730 --> 00:05:03,330 Ve bu ne denir? 125 00:05:03,330 --> 00:05:03,950 Tamam, evet. 126 00:05:03,950 --> 00:05:04,450 Devam et. 127 00:05:04,450 --> 00:05:05,575 Ben kesmek istemedim. 128 00:05:05,575 --> 00:05:07,060 JANELLE: Üzgünüm. 129 00:05:07,060 --> 00:05:14,237 Bu yüzden girdi onu içine olur Adres emin of--. 130 00:05:14,237 --> 00:05:17,320 Ben tam sayısını hatırlamıyorum olabilir, ama 0 ile başlayan inanıyorum. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. MALAN: Hepsi doğru, Ben numaralarını yaptım çünkü, 132 00:05:18,420 --> 00:05:19,650 böylece hiçbir doğru cevap var. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: 0 yay ile başlayarak. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. MALAN: Tamam, bu nedenle eleman 0. 135 00:05:24,000 --> 00:05:24,765 Tabii. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: Ve sonra eğer oldu Sadece bir iki mektupla gibi 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. MALAN: Tamam, size geri. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: Yani eleman 0, ve daha sonra elemanı 1 ya da elemanı 2. 139 00:05:33,629 --> 00:05:36,670 Hangi parça ve Ve: DAVID J. MALAN resim şu anda çiziyorsun? 140 00:05:36,670 --> 00:05:37,690 getString çağrısı? 141 00:05:37,690 --> 00:05:38,830 Veya s beyanı? 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: beyanı s, ben inanıyorum. 143 00:05:42,890 --> 00:05:45,980 Ah, getString, it would çünkü Her [içine girilebilir? alanı. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. MALAN: İyi. 145 00:05:46,510 --> 00:05:47,051 Kesinlikle. 146 00:05:47,051 --> 00:05:49,300 Hatta bu etkili olsa Bir dizi, hatırlama verir, 147 00:05:49,300 --> 00:05:53,300 Biz bir dize geri döndüğümde, biz 01 ve 2 kullanarak bu dizeye dizin. 148 00:05:53,300 --> 00:05:56,180 Teknik olarak, bu muhtemelen Bireysel adresleri ile temsil, 149 00:05:56,180 --> 00:05:57,100 ama bu iyi. 150 00:05:57,100 --> 00:06:00,170 >> Peki, varsayalım eğer ben sadece hızlı olabilir bıraktığımız yerden iletmek 151 00:06:00,170 --> 00:06:04,320 son kez, biri ise şeritler, b, e g idi 152 00:06:04,320 --> 00:06:10,337 Ters eğik çizgi 0, böylece temsil Gabe en giriş, nasıl s artık temsil edebilir? 153 00:06:10,337 --> 00:06:12,670 Bu var bellek ise getString tarafından iade edilmiştir? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: o olurdu bir yay tarafından temsil? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. MALAN: bir yay tarafından mı? 157 00:06:18,750 --> 00:06:19,130 Hayır, evet. 158 00:06:19,130 --> 00:06:21,171 , Sadece resimsel, diyelim bana sadece devam edelim 159 00:06:21,171 --> 00:06:25,710 Bu s eğer, bu öneriyoruz getString dönüş değeridir. 160 00:06:25,710 --> 00:06:29,482 Ve sen 0, 1, 2, bu boğuldum hangi mükemmel makul çünkü biz 161 00:06:29,482 --> 00:06:30,940 gibi dizeye endeksi, yapamam. 162 00:06:30,940 --> 00:06:33,340 Ama sadece tutarlı olmak son kez, beni önde gidelim 163 00:06:33,340 --> 00:06:37,310 ve keyfi bu öneriyoruz Adres 1, bu adres 2, 164 00:06:37,310 --> 00:06:39,597 Bu benzeri adres 3, ve olduğunu. 165 00:06:39,597 --> 00:06:41,430 Ve böylece, sadece süper olmak net, ne oluyor 166 00:06:41,430 --> 00:06:44,580 Bunun bir sonucu olarak s gitmek Kodun ilk satırı, sen söylerdin? 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: Adres 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. MALAN: Kesinlikle. 169 00:06:46,420 --> 00:06:47,190 Yani 0x1 ele. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Ve bu arada, beni önde gidelim ve Ne yaptığının çok yinelenen 172 00:06:51,230 --> 00:06:52,740 ve burada benim kendi t ekleyin. 173 00:06:52,740 --> 00:06:56,340 Gabe yazın olsaydı Yine, ikinci kez, 174 00:06:56,340 --> 00:07:01,530 getString ile istendiğinde, nerede, Tabii, Gabe gidecek? 175 00:07:01,530 --> 00:07:02,280 Peki, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: Burada gibi mi? 178 00:07:05,975 --> 00:07:06,850 DAVID J. MALAN: Evet. 179 00:07:06,850 --> 00:07:08,516 JANELLE: Ya aynı kutularda da var? 180 00:07:08,516 --> 00:07:11,940 DAVID J. MALAN: bana evet, teklif edelim tam olarak bu ek kutuları çok. 181 00:07:11,940 --> 00:07:15,230 Ama şimdi ne anahtar bile, yani Ben bu oldukça yakın boğuldum olsa 182 00:07:15,230 --> 00:07:18,650 beraberken- 0x1 bu gerçekte 0x2-- olup, 183 00:07:18,650 --> 00:07:25,750 Bu şimdi, adres 0x10 olabilir Örneğin, ve 0x11 ve 0x12, 184 00:07:25,750 --> 00:07:26,870 ve benzeri yer alır. 185 00:07:26,870 --> 00:07:29,955 Ve böylece, bu durumda eğer, ne t burada sonuna kadar gidiyor? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. MALAN: Kesinlikle. 188 00:07:31,830 --> 00:07:33,180 Yani 0x10. 189 00:07:33,180 --> 00:07:34,570 Ve şimdi, son bir soru. 190 00:07:34,570 --> 00:07:37,510 Sen, bugüne kadar, çalışmak zorunda Bugüne kadar bir fil için zor. 191 00:07:37,510 --> 00:07:42,650 Artık, ben kodu çekerseniz Yine, ben ne zaman, çizgi üç, 192 00:07:42,650 --> 00:07:47,630 s eşittir t eşitse, ben aslında neyim Burada boğuldum karşılaştırarak bu? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: İki adresleri? 194 00:07:49,271 --> 00:07:50,270 DAVID J. MALAN: Kesinlikle. 195 00:07:50,270 --> 00:07:53,350 Yani t eşit eşit s diyorum? 196 00:07:53,350 --> 00:07:56,210 Diğer bir deyişle, 10 eşit eşittir 1? 197 00:07:56,210 --> 00:07:59,710 Ve tabii ki, bariz cevap artık hiçbir vardır. 198 00:07:59,710 --> 00:08:02,920 Ve böylece bu program sonunda ise Eğer ne derdi, yazdırmak olacak? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 JANELLE >>: o olurdu, Aynı şeyi yazmış? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. MALAN: Yani eğer s değeri 1 ve t, 10? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: Farklı şeyler yazdınız. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. MALAN: Kesinlikle. 204 00:08:13,570 --> 00:08:14,480 Farklı şeyler yazdınız. 205 00:08:14,480 --> 00:08:14,850 Tamam. 206 00:08:14,850 --> 00:08:16,714 Yani alkış yuvarlak, Burada, biz eğer olabilir. 207 00:08:16,714 --> 00:08:17,214 [Alkış] 208 00:08:17,214 --> 00:08:17,708 Bu acı oldu. 209 00:08:17,708 --> 00:08:18,208 Biliyorum. 210 00:08:18,208 --> 00:08:19,684 Güzel yapılır. 211 00:08:19,684 --> 00:08:24,690 Şimdi bakalım, eğer biz değil Düzeltme ne dışında kızdırmak. 212 00:08:24,690 --> 00:08:28,040 Ve tabii ki, biz bu-- sabit zaman ki ben şimdi green-- temsil edeceğiz 213 00:08:28,040 --> 00:08:29,690 Burada birkaç geliştirmeleri yaptım. 214 00:08:29,690 --> 00:08:32,409 İlk olarak, sadece bir aklı olarak Ben ilk kontrol ediyorum, kontrol 215 00:08:32,409 --> 00:08:35,110 s boş eşittir ve t boş eşitse. 216 00:08:35,110 --> 00:08:39,440 Ve sadece temiz olması için, zaman olabilir s veya t böyle kod null? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Zaman s veya t sayısının sıfır olabilir. 219 00:08:44,490 --> 00:08:44,990 Evet? 220 00:08:44,990 --> 00:08:45,990 >> İZLEYİCİ: [duyulamaz]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. MALAN: Kesinlikle. 223 00:08:50,510 --> 00:08:52,840 Dize kullanıcı bu takdirde yazdığınız yolu çok uzun 224 00:08:52,840 --> 00:08:56,140 belleğe sığdırmak, ya da bazı Böyle garip köşe durumda, 225 00:08:56,140 --> 00:08:59,010 göreceğiz gibi kelimenin tam anlamıyla, getString Bugün, kendi belgelerinde, 226 00:08:59,010 --> 00:09:02,330 o kadar boş dönecektir diyor özel Sentinel değeri, 227 00:09:02,330 --> 00:09:05,417 ya da sadece tür özel bir sembol O bir şeyler ters gitti demektir. 228 00:09:05,417 --> 00:09:07,500 Yani biz kontrol etmek istiyorum çıkıyor, çünkü o 229 00:09:07,500 --> 00:09:09,720 Bu boş çok tehlikeli bir değerdir. 230 00:09:09,720 --> 00:09:14,250 >> Genellikle, bir şeyler yapmayı denerseniz Boş geçirmeden bir function-- içeren 231 00:09:14,250 --> 00:09:17,470 girdi olarak, bu işlevi instance-- için Çok onunla, çökmesine ve olacak olabilir, 232 00:09:17,470 --> 00:09:19,090 senin bütün programını aşağı çekmek. 233 00:09:19,090 --> 00:09:22,570 Yani bu üçüncü hat artık sadece aklı olan eğer sen, hata denetimi kontrol edin. 234 00:09:22,570 --> 00:09:25,450 Bunun için artık iyi bir alışkanlık var Bize her zaman içine almak için biz 235 00:09:25,450 --> 00:09:28,050 Bir değer kullanmak için deneyin potansiyel, boş olabilir. 236 00:09:28,050 --> 00:09:32,000 >> Şimdi, burada dördüncü satırında, "Eğer strcmp (s, t)," iyi, 237 00:09:32,000 --> 00:09:33,180 ne atıfta o? 238 00:09:33,180 --> 00:09:36,750 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. 239 00:09:36,750 --> 00:09:40,370 Ve hayatta amacı karşılaştırmaktır İkinci buna karşı ilk argüman, 240 00:09:40,370 --> 00:09:44,640 ancak adresleri açısından, Biz bir an istemeden yaptığı gibi 241 00:09:44,640 --> 00:09:48,270 önce kırmızı kod ile, ancak yerine bu ikisini karşılaştırmak için 242 00:09:48,270 --> 00:09:53,210 insanca sezgisel dizeleri Buna karşı, bu karşılaştırarak yolu, 243 00:09:53,210 --> 00:09:56,690 Bu, bu karşı, ve karşı sonra dururken bir eğer ve 244 00:09:56,690 --> 00:09:59,590 ya da benim parmaklar hem bir ters eğik çizgi 0 vurur. 245 00:09:59,590 --> 00:10:04,530 Yani birisi yıllar önce uygulanan Strcmp işlevselliği bizim için uygulamak 246 00:10:04,530 --> 00:10:08,890 biz aldık umduğunu Sadece iki basit değerleri karşılaştırarak. 247 00:10:08,890 --> 00:10:14,929 >> Şimdi açıkçası, ben çizim tutmak Bu çeşitli tüm numaraları. 248 00:10:14,929 --> 00:10:17,470 Ama gerçek ben oldum, bir Bütün zaman bu kadar yapma. 249 00:10:17,470 --> 00:10:19,580 Ve böylece bana sadece devam edelim ve bu dışarı karalamak 250 00:10:19,580 --> 00:10:23,100 Bir noktayı ki, sonunda Günün ve ileriye doğru hareket, 251 00:10:23,100 --> 00:10:30,160 biz gerçekten umurumda etmeyeceğiz ne şeyler aslında adresleri 252 00:10:30,160 --> 00:10:30,790 bellekte. 253 00:10:30,790 --> 00:10:34,320 Yani bu çekmek için gitmiyorum çok artık sayıların çeşitleri, 254 00:10:34,320 --> 00:10:38,970 Ben uzak bir bu sadece bir soyut değilim Sadece oklarla daha kolay küçük. 255 00:10:38,970 --> 00:10:42,060 >> Diğer bir ifade ile, bir gösterici ise, iyi, en adil, kelimenin tam anlamıyla, o çizelim 256 00:10:42,060 --> 00:10:45,430 bir işaretçi olarak, bir ok işaret , başka bir şey kendisi 257 00:10:45,430 --> 00:10:48,280 ve hakkında çok daha fazla endişelenmeyin Bu adreslerin minutia 258 00:10:48,280 --> 00:10:49,910 hangi yine ben yine uydurdum. 259 00:10:49,910 --> 00:10:52,680 Ama biz bu adresleri görürsünüz, Bazen, kod ayıklarken. 260 00:10:52,680 --> 00:10:56,450 >> Şimdi arada, bu program buraya düzeltmeleri, elbette, 261 00:10:56,450 --> 00:10:58,720 karşılaştırarak bu sorun Bu iki dizeleri. 262 00:10:58,720 --> 00:11:00,260 Ama biz başka bir sorun koştu. 263 00:11:00,260 --> 00:11:03,180 Bu kopyadan oldu , son kez programlamak 264 00:11:03,180 --> 00:11:06,880 bu sayede, ben yararlanmak için çalışıyordu bir dize sadece ilk karakteri. 265 00:11:06,880 --> 00:11:09,620 Ama belirti ne oldu Biz ne zaman son kez gördüm 266 00:11:09,620 --> 00:11:14,150 Bir kullanıcı gibi, bir değer yazdığınız küçük harflerle Gabe, s için, 267 00:11:14,150 --> 00:11:19,310 o zaman biz, t içine s atanan Orada Üçüncü hat olarak, 268 00:11:19,310 --> 00:11:22,900 ve sonra ben denedim t desteğini 0 yararlanmak? 269 00:11:22,900 --> 00:11:25,950 Etkisi neydi t desteğini 0 burada değişiyor? 270 00:11:25,950 --> 00:11:27,150 >> İZLEYİCİ: Bu s değişti. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. MALAN: Evet, Ben de, s değişti. 272 00:11:29,360 --> 00:11:31,050 Gerçekten ne olup bittiğini Çünkü? 273 00:11:31,050 --> 00:11:34,130 Eh, ben temizlemek eğer bakayım Bu resim kadar, aşağıdaki gibi. 274 00:11:34,130 --> 00:11:41,390 >> S, yeniden, kelime g a, b, c, eğik, 0 ve s'nin 275 00:11:41,390 --> 00:11:44,084 Biz bir kutu gibi çizim devam edeceğiz Burada, ama artık adres. 276 00:11:44,084 --> 00:11:45,250 Eşyalarını oluşturan bırakalım. 277 00:11:45,250 --> 00:11:47,510 Sadece bir resim çizelim dünyayı basitleştirmek için. 278 00:11:47,510 --> 00:11:52,640 >> Ben dize t t beyan zaman, bellek bu yığın oluşturur. 279 00:11:52,640 --> 00:11:55,850 Kare 32 olur En bilgisayarlarda bit. 280 00:11:55,850 --> 00:11:59,530 Aslında, eğer hiç bir duymuştum Bilgisayar, 32-bit mimariye sahip 281 00:11:59,530 --> 00:12:03,000 gerçekten fantezi-konuşan, sadece 32-bit adresleri kullanıyor demektir. 282 00:12:03,000 --> 00:12:05,370 Ve bir kenara teknik olarak, Hiç merak ettiyseniz 283 00:12:05,370 --> 00:12:09,630 Neden eski bilgisayarlar, aslında eğer RAM'i ile çorba onları çalıştı, 284 00:12:09,630 --> 00:12:12,360 yalnızca maksimum olabilir RAM dört gigabayt, 285 00:12:12,360 --> 00:12:14,860 iyi ki kelimenin tam anlamıyla, çünkü var, eski bilgisayar olabilir sadece 286 00:12:14,860 --> 00:12:17,250 4 gibi yüksek saymak milyar, 4 milyar bayt, 287 00:12:17,250 --> 00:12:20,590 Bunun nedeni 32-bit kullanan adresler için numaralar. 288 00:12:20,590 --> 00:12:23,260 >> Ancak her durumda, bu örnek, hikaye çok basit. 289 00:12:23,260 --> 00:12:27,250 t sadece başka gösterici ise, ya da Gerçekten bir karakter yıldızı, aka dize. 290 00:12:27,250 --> 00:12:30,860 Ve nasıl bu resmi güncelleştirmek istiyor musunuz Şimdi kod ikinci hattı ile, 291 00:12:30,860 --> 00:12:31,950 nokta sonra, nokta, nokta? 292 00:12:31,950 --> 00:12:35,845 Ben ne zaman dize t, s noktalı virgül eşittir Bu resim nasıl değişiyor mu? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Evet? 295 00:12:38,000 --> 00:12:38,916 >> İZLEYİCİ: [duyulamaz]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. MALAN: Evet. 298 00:12:42,020 --> 00:12:42,600 Kesinlikle. 299 00:12:42,600 --> 00:12:45,620 Ben sadece bir ok koymak Aynı adrese t kutusu, 300 00:12:45,620 --> 00:12:47,570 Aynı ilk harf verdi. 301 00:12:47,570 --> 00:12:50,850 Ya teknik, eğer bu Adam, 0x1 hala vardı 302 00:12:50,850 --> 00:12:53,052 Ben vardı sanki bulunuyor Burada 0x1 ve 0x1 burada. 303 00:12:53,052 --> 00:12:54,760 Fakat yine de, kimin umurunda adresleri hakkında? 304 00:12:54,760 --> 00:12:56,345 Şimdi önemli olan sadece bir fikir. 305 00:12:56,345 --> 00:12:57,720 Yani bu Buradaki neler olduğunu. 306 00:12:57,720 --> 00:13:02,690 Tabii, bunu t dirsek Yani Dizi gösterimi 0, 307 00:13:02,690 --> 00:13:05,650 ve elbette-- ve açıkçası, o görünüyor Burada bir dizi var gibi, 308 00:13:05,650 --> 00:13:07,340 ama şimdi bu garip şey var. 309 00:13:07,340 --> 00:13:11,160 Bu programlama dilini bilmek, C, bu özelliği sunuyor 310 00:13:11,160 --> 00:13:14,650 bu sayede, t bile işaretçi, ya da s bir gösterici, 311 00:13:14,650 --> 00:13:18,050 Hala, o tanıdık kullanabilirsiniz rahat köşeli ayraç 312 00:13:18,050 --> 00:13:22,520 notasyonu ilk öğeye gitmek için, İkinci unsur, ya da herhangi bir eleman ya da 313 00:13:22,520 --> 00:13:26,130 Bu işaretçi işaret ettiğini tahminen, çünkü, bu 314 00:13:26,130 --> 00:13:29,410 Bu durumda, de olduğu gibi Bazı dizi işaret. 315 00:13:29,410 --> 00:13:30,340 >> Peki nasıl bu düzeltebilirim? 316 00:13:30,340 --> 00:13:33,660 Bir nereden Açıkçası, bu İlk bakışta biraz ezici. 317 00:13:33,660 --> 00:13:35,340 Ama burada yeni ve geliştirilmiş bir versiyonu. 318 00:13:35,340 --> 00:13:37,460 >> Yani ilk, ben alıyorum CS50 kütüphanesinde kurtulmak, 319 00:13:37,460 --> 00:13:41,170 Sadece gerçekten bu s olduğunu ortaya çıkarmak için Bir karakter yıldızı, sadece bir eş anlamlısı. 320 00:13:41,170 --> 00:13:43,540 Ve t aynı zamanda bir karakter yıldızdır. 321 00:13:43,540 --> 00:13:48,290 Ama üzerinde ne olup bittiğini Bu hattın sağ taraftaki 322 00:13:48,290 --> 00:13:49,970 t değeri atanır nerede? 323 00:13:49,970 --> 00:13:50,790 >> Malloc nedir? 324 00:13:50,790 --> 00:13:51,630 Ne strlen var? 325 00:13:51,630 --> 00:13:52,547 Sizeof (char) nedir? 326 00:13:52,547 --> 00:13:54,380 Neden halt yapar çizgi bakmak çok karmaşık? 327 00:13:54,380 --> 00:13:55,713 Ne yüksek bir düzeyde yapıyor? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Ne t saklamak oluyor? 330 00:13:57,440 --> 00:13:58,646 Evet? 331 00:13:58,646 --> 00:14:01,104 HEDEF KİTLE: Bu tahsis ediyor bir bellek alanı belirli bir miktar. 332 00:14:01,104 --> 00:14:03,032 Bu, saklamak için var sanırım, harfler [duyulamaz]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. MALAN: Mükemmel. 334 00:14:04,032 --> 00:14:04,540 Mükemmel. 335 00:14:04,540 --> 00:14:06,650 Belirli bir aktarmaktır Bellek alanı miktarı 336 00:14:06,650 --> 00:14:08,940 , muhtemelen, gelecek harfleri saklamak için. 337 00:14:08,940 --> 00:14:11,310 Ve özellikle de, Malloc Bu nedenle ne dönüyor? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> İZLEYİCİ: [Duyulmaz] Dönüş? 340 00:14:14,851 --> 00:14:15,850 DAVID J. MALAN: Kesinlikle. 341 00:14:15,850 --> 00:14:18,850 Bellek adresini dönersek, hangi söyleyerek bir fantezi yoludur, 342 00:14:18,850 --> 00:14:21,640 adresini döndürür Bu belleğin ilk bayt. 343 00:14:21,640 --> 00:14:25,460 Beni hatırlamak için sorumluluk olduğunu ne kadar bellek aslında 344 00:14:25,460 --> 00:14:27,140 tahsis veya malloc istedi. 345 00:14:27,140 --> 00:14:28,384 >> Şimdi bu ne kadar? 346 00:14:28,384 --> 00:14:30,550 Peki, orada bile Burada parantez bir sürü, 347 00:14:30,550 --> 00:14:32,970 malloc sadece tek bir argüman alır. 348 00:14:32,970 --> 00:14:37,250 Ve ben s strlen belirterek, bu yüzden vereceğim Beni birçok bayt s olduğu gibi, 349 00:14:37,250 --> 00:14:37,800 ama bir tane ekleyin. 350 00:14:37,800 --> 00:14:38,300 Neden? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Evet? 353 00:14:39,530 --> 00:14:40,840 >> İZLEYİCİ: ters eğik çizgi 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. MALAN: Kesinlikle. 355 00:14:41,840 --> 00:14:43,423 Biz küçük bir temizlik yapmak zorundasın. 356 00:14:43,423 --> 00:14:45,970 Bir ters eğik çizgi var, çünkü Yani 0, daha iyi olduğunu hatırlardım. 357 00:14:45,970 --> 00:14:47,310 Aksi takdirde, biz gidiyoruz bir dize oluşturmak için 358 00:14:47,310 --> 00:14:49,170 Bu özel terminatör yoktur. 359 00:14:49,170 --> 00:14:52,640 >> Bu arada, sadece süper olmak anal, ben, sizeof (char) var 360 00:14:52,640 --> 00:14:55,730 sadece durumda birisi, benim çalışır değil CS50 cihazın kod, 361 00:14:55,730 --> 00:14:58,220 ama belki farklı bir bilgisayar tamamen karakter 362 00:14:58,220 --> 00:15:01,470 Kongre tarafından, bir bayt vardır, ancak iki bayt veya daha büyük bir şey. 363 00:15:01,470 --> 00:15:04,490 Sadece süper olmak var, hataları süper hoşlanmıyorsunuz. 364 00:15:04,490 --> 00:15:06,940 Olsa da, gerçekte, bu büyük olasılıkla 1 olacak. 365 00:15:06,940 --> 00:15:11,490 >> Şimdi, bu arada, ben go ahead ve kopyalama dize, t dirsek i t dirsek s eşittir. 366 00:15:11,490 --> 00:15:14,962 Ve geçen hafta en ertelemek olacak kaynak kodu neler görmek için. 367 00:15:14,962 --> 00:15:17,670 Anahtar paket, ve fakat nedeni, yeşil kodu şimdi koymak 368 00:15:17,670 --> 00:15:22,520 bu son satırda çünkü t dirsek 0, toupper eşittir 369 00:15:22,520 --> 00:15:25,230 etkisine sahiptir sermaye hangi dize? 370 00:15:25,230 --> 00:15:26,960 T ve / veya var? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Kod Bu son satırı. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 Ne çünkü >> Sadece, t Bu sefer ne oldu 375 00:15:35,560 --> 00:15:41,500 Ben biraz bu son adımı geri alırsanız, Ben malloc çağırdığınızda ne, isimli ne oldu 376 00:15:41,500 --> 00:15:45,380 Ben aslında belleğin bir yığın olsun Bu orijinaliyle aynı boyutta olduğunu, 377 00:15:45,380 --> 00:15:47,020 Bu aritmetik çünkü ben yaptım. 378 00:15:47,020 --> 00:15:50,920 Ben adresinde t saklanması ediyorum bu bellek yığın. 379 00:15:50,920 --> 00:15:53,370 Hatta bu güzel görünüyor olsa ve, oldukça güzel ve boş, 380 00:15:53,370 --> 00:15:56,882 gerçeklik ne olacak, orada bir Burada, çağırarak çöp değerlerini tutmak. 381 00:15:56,882 --> 00:15:59,340 Bellek Bu öbek olabilir çok de daha önce kullanılmış olması, 382 00:15:59,340 --> 00:16:00,940 Birkaç saniye, bir kaç dakika önce. 383 00:16:00,940 --> 00:16:04,410 Yani kesinlikle sayılar olabilir Sadece orada kaza veya harfler. 384 00:16:04,410 --> 00:16:08,580 Ama ben kadar geçerli değil kendimi bellek bu yığın doldurmak 385 00:16:08,580 --> 00:16:12,510 Gerçek karakter ile, gibi Orada döngü için bu yapmak. 386 00:16:12,510 --> 00:16:13,180 Tamam? 387 00:16:13,180 --> 00:16:16,180 Bir >> Şimdi, doruk Bu üç örnek 388 00:16:16,180 --> 00:16:20,730 O görünüşte, son kez kırıldı Bu Takas örneği, bu işlev 389 00:16:20,730 --> 00:16:23,670 anlamda görev bu a ve b takas söyledi. 390 00:16:23,670 --> 00:16:25,620 Ama başka hangi anlamda işe yaramadı? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Evet? 393 00:16:28,614 --> 00:16:29,612 >> İZLEYİCİ: [duyulamaz]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. MALAN: Kesinlikle. 396 00:16:36,700 --> 00:16:39,530 Ben bu işlevi çağırmak için olsaydı Örneğin another-- gelen 397 00:16:39,530 --> 00:16:42,870 nerede ana gibi bir işlevden Ben ben olarak, bir değişken, x ve y var 398 00:16:42,870 --> 00:16:46,160 Geçen hafta yaptığı, aynı kod, ve x ve y geçmek 399 00:16:46,160 --> 00:16:49,860 Swap ve sonra Swap-- bu aramak için, Tabii, doğru versiyonu 400 00:16:49,860 --> 00:16:52,220 biz üzereyiz ne see-- işe yaramadı. 401 00:16:52,220 --> 00:16:53,770 Peki düzeltme nedir? 402 00:16:53,770 --> 00:16:56,850 >> Peki, bu kadar adil olmak açık, beni önde gidelim 403 00:16:56,850 --> 00:17:05,450 ve- ikinci Burada bana bir vermek, ve görmek Sana son bir gösterir eğer ki 404 00:17:05,450 --> 00:17:12,464 Ben bulabilirsiniz bakalım in-- olacak Bu gerçek fast-- Tamam, [inaudible]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 Tamam, orada öyle. 407 00:17:19,240 --> 00:17:21,000 Yani sadece yazarak kulüpler komutları görmezden. 408 00:17:21,000 --> 00:17:23,780 Ben de almak istiyorum son dakika bir örnek 409 00:17:23,780 --> 00:17:27,960 son kez, gelen hangi artık hiçbir Takas denir. 410 00:17:27,960 --> 00:17:30,200 >> Yani Takas nerede biz son kez bıraktığı 411 00:17:30,200 --> 00:17:32,930 bu sayede, ben başlatıldı 1 x ve 2 y. 412 00:17:32,930 --> 00:17:35,840 Daha sonra 1 ve 2 geçirerek, Swap diyoruz. 413 00:17:35,840 --> 00:17:37,930 Sonra bu işlev Bazı anlamda çalışmış, 414 00:17:37,930 --> 00:17:40,750 ama hiçbir kalıcı vardı x ve y ile ilgili etkiler. 415 00:17:40,750 --> 00:17:45,430 Yani eldeki soru şimdi nasıl olduğunu biz aslında bu sorunu çözerim? 416 00:17:45,430 --> 00:17:47,820 Eldeki çözüm nedir? 417 00:17:47,820 --> 00:17:53,150 >> Peki, bugün yeni swap.c, içinde, farklar bir çift dikkat edin. 418 00:17:53,150 --> 00:17:54,700 x ve y aynı. 419 00:17:54,700 --> 00:17:57,250 Ama ne açıkça hat yaklaşık 25 farklı? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Eğer hatırlarsanız, ne var yeni Bir saniye önce neye benzediğini? 422 00:18:01,715 --> 00:18:02,565 >> İZLEYİCİ: [duyulamaz]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. MALAN: Evet. 424 00:18:03,440 --> 00:18:06,680 Yani bir yeni parça ve işaretleri vardır sözdizimi sadece bu programda, 425 00:18:06,680 --> 00:18:08,560 ama aynı zamanda daha genel CS50 içinde. 426 00:18:08,560 --> 00:18:10,680 Bugüne kadar, sanmıyorum biz herhangi bir örnek gördüm 427 00:18:10,680 --> 00:18:14,070 ya da gerçekten herhangi onlar hakkında konuştuk Belki, preemptively, başka ayrıntı, 428 00:18:14,070 --> 00:18:16,467 bölümünde, böyle bir işareti. 429 00:18:16,467 --> 00:18:19,300 Peki, bu işareti biridir çıkıyor Yeni sözdizimi son adet 430 00:18:19,300 --> 00:18:20,174 Biz öğrenmek için gidiyoruz. 431 00:18:20,174 --> 00:18:23,500 Demek hepsi Bazı değişkenin adresi. 432 00:18:23,500 --> 00:18:25,070 Ne adres x yaşıyor? 433 00:18:25,070 --> 00:18:26,510 Ama y ne adres yaşıyor? 434 00:18:26,510 --> 00:18:28,700 Çünkü eğer önce temel sorun 435 00:18:28,700 --> 00:18:32,970 Bu, x ve y kabul ediliyordu edildi biz gerçekten ne yapmak istediğinizi kopya olarak 436 00:18:32,970 --> 00:18:38,780 Bir hazine gibi olan Swap sağlamak olduğunu burada x ve y, aslında neden harita 437 00:18:38,780 --> 00:18:41,910 böylece, RAM içinde Takas bu haritayı takip edebilirsiniz 438 00:18:41,910 --> 00:18:47,760 x veya y nokta işaretleri her yerde ve gitmek ve gerçek değerleri değiştirmek 1 ve 2 439 00:18:47,760 --> 00:18:48,270 orada. 440 00:18:48,270 --> 00:18:50,710 >> Yani Takas çok hafif değiştirmek gerekiyor. 441 00:18:50,710 --> 00:18:53,760 Ve ilk bakışta, bu kudreti karakter yıldızı biraz benzer görünüyor. 442 00:18:53,760 --> 00:18:54,850 Ve gerçekten de öyle. 443 00:18:54,850 --> 00:18:59,635 Yani bir veri ne tür bir gösterici, Bu vurgulanan kısım dayalı? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Yani bir int var. 446 00:19:01,620 --> 00:19:04,880 >> Yani, artık bir int bir int adresi var. 447 00:19:04,880 --> 00:19:07,910 Ve benzer b şimdi gidiyor Bir int adresi için. 448 00:19:07,910 --> 00:19:12,470 Yani şimdi Main Swap çağırdığınızda, Ben Swap 1 ve 2 vermek için gitmiyorum. 449 00:19:12,470 --> 00:19:15,540 Ben gibi vereceğim Öküz-şey ve Ox-şey, 450 00:19:15,540 --> 00:19:19,820 yol açacaktır iki adres Gerçek yerlere Takas 451 00:19:19,820 --> 00:19:21,310 Benim bilgisayarın belleğinde. 452 00:19:21,310 --> 00:19:25,580 >> Peki şimdi, benim kalan uygulama bir tad değiştirmek gerekiyor. 453 00:19:25,580 --> 00:19:28,650 Şimdi ne açıkça farklı kod bu üç hatlarında? 454 00:19:28,650 --> 00:19:31,350 Tüm bu lanet yıldızlar var biryere, tamam mı? 455 00:19:31,350 --> 00:19:33,014 Peki burada neler oluyor? 456 00:19:33,014 --> 00:19:33,514 Evet? 457 00:19:33,514 --> 00:19:35,055 >> İZLEYİCİ: Bu [duyulamaz] Açıkçası bu. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. MALAN: Kesinlikle. 460 00:19:37,990 --> 00:19:41,560 Bu context-- Yani bu değildi En iyi tasarım kararı, kuşkusuz, 461 00:19:41,560 --> 00:19:42,530 yıllar önce. 462 00:19:42,530 --> 00:19:45,110 Bu bağlamda, Eğer sadece bir yıldız var, 463 00:19:45,110 --> 00:19:48,240 ve bir veri türü yok, int gibi, hemen sola, 464 00:19:48,240 --> 00:19:53,146 yerine açıkça, bir eşittir işareti var, Bu bağlamda, derken bir yıldız, 465 00:19:53,146 --> 00:19:56,980 Bu gidip gelir Bir öyle adresi. 466 00:19:56,980 --> 00:19:58,870 Tabiri caizse, hazine haritası izleyin. 467 00:19:58,870 --> 00:20:01,720 >> Ve bu arada hat 37, aynı şeyi ifade eder. 468 00:20:01,720 --> 00:20:05,460 Adres a gidin ve orada ne koydu? 469 00:20:05,460 --> 00:20:09,520 Ne olursa olsun yer almaktadır b belirten konum. 470 00:20:09,520 --> 00:20:10,980 Diğer bir deyişle, b gidin. 471 00:20:10,980 --> 00:20:12,130 Bu değer alın. 472 00:20:12,130 --> 00:20:15,620 Eşit başına, bir gidin ve imzalamak, atama operatörü, 473 00:20:15,620 --> 00:20:17,010 Oradaki değer koymak. 474 00:20:17,010 --> 00:20:19,272 >> Benzer şekilde, int temp sadece bir int. 475 00:20:19,272 --> 00:20:20,730 Hiçbir şey sıcaklığına hakkında değiştirmek gerekiyor. 476 00:20:20,730 --> 00:20:24,810 Bu Annenberg sadece bir yedek cam var Bazı süt veya portakal suyu için. 477 00:20:24,810 --> 00:20:27,630 Ama ben, demek b gitmek gerekiyor. 478 00:20:27,630 --> 00:20:31,449 Bu hedefe gidin ve Orada temp değeri koymak. 479 00:20:31,449 --> 00:20:32,490 Öyleyse ne oluyor? 480 00:20:32,490 --> 00:20:36,540 Aslında, bu defa Swap çağırdığınızda Bu ilk tepsi burada, Main temsil 481 00:20:36,540 --> 00:20:42,270 Bu ikinci tepsi Swap temsil, ne zaman Ben işareti x ve y işareti geçmek 482 00:20:42,270 --> 00:20:47,150 Ana Swap için, sadece, açık olmak Bu yığın çerçeve alıcı nedir? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Evet? 485 00:20:49,200 --> 00:20:50,180 >> İZLEYİCİ: [duyulamaz]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. MALAN: Kesinlikle. 487 00:20:51,180 --> 00:20:53,129 x ve y adresi adresi. 488 00:20:53,129 --> 00:20:55,170 Ve bu düşünebilirsiniz posta adresleri gibi. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street ve 35 Oxford Caddesi ve 490 00:20:58,772 --> 00:21:01,230 İki bina taşımak istiyorum Bu noktada olduğunu. 491 00:21:01,230 --> 00:21:04,680 >> Bu saçma bir fikir çeşit, ama biz adrese demek bu. 492 00:21:04,680 --> 00:21:07,000 Nerede dünya can Eğer bu iki ints bulmak? 493 00:21:07,000 --> 00:21:09,470 Nerede dünya yapabilirsiniz Bu iki bina bulmak? 494 00:21:09,470 --> 00:21:15,170 Sonunda ise, tüm bu zaman I sonrası Bugünün kaynak koduna gitmek ve derlemek 495 00:21:15,170 --> 00:21:22,110 Takas ve çalışma ./swap, nihayet, için İlk kez biz aslında görüyoruz 496 00:21:22,110 --> 00:21:25,330 Benim değerler gerçekten var başarılı takas edildi. 497 00:21:25,330 --> 00:21:30,860 Ve şimdi, biz bile alabilir bu, diyelim ki, gdb not. 498 00:21:30,860 --> 00:21:32,740 >> Bu yüzden bana aynı dosya içine gidelim. 499 00:21:32,740 --> 00:21:35,010 Beni go ahead ve ./swap ve gdb çalıştıralım. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Ve şimdi, Swap, ben gidiyorum önde ve Main bir kırılma noktası ayarlayın. 502 00:21:40,547 --> 00:21:42,630 Ve şimdi ben gidiyorum Önümüzdeki ve programı çalıştırın. 503 00:21:42,630 --> 00:21:45,810 Ve şimdi benim kod görmek Bu çizgide durdu. 504 00:21:45,810 --> 00:21:48,330 >> Ben go ahead ve baskı varsa x burada görmek ne gerekir? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Bu bir soru. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Tekrar söyle? 509 00:21:51,530 --> 00:21:52,295 >> İZLEYİCİ: [duyulamaz]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. MALAN: Yani rastgele sayılar, belki. 511 00:21:53,910 --> 00:21:56,010 Belki şanslı olsun, ve bu kadar 0 gibi, güzel ve basit. 512 00:21:56,010 --> 00:21:57,230 Ama belki de bazı rasgele numara. 513 00:21:57,230 --> 00:21:58,090 Bu durumda, ben şanslıyım. 514 00:21:58,090 --> 00:21:59,030 Sadece 0 olur. 515 00:21:59,030 --> 00:22:00,780 Ama, gerçekten şans değil kadar çünkü 516 00:22:00,780 --> 00:22:06,280 sonraki yazın ve sonra yazdırma x, vardır kod satırı, satır 19, idam edildi. 517 00:22:06,280 --> 00:22:10,942 >> Bu arada, ben yazarsanız yanında yine, ve Şimdi ben 2 görmek için gidiyorum, y çıktı. 518 00:22:10,942 --> 00:22:13,900 Sonraki yazarsanız Şimdi, bu gidiyor Biraz kafa karıştırıcı olsun, şimdi çünkü, 519 00:22:13,900 --> 00:22:17,250 printf görünmesi için gidiyor Ekran yaptım gibi. x 1'dir. 520 00:22:17,250 --> 00:22:18,606 >> Tekrar yapalım. 521 00:22:18,606 --> 00:22:20,480 Ve şimdi, burada nerede ilginç şeyler olsun. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Ben Swap hatta adımı çağırmadan önce içine, en küçük bir göz atalım. 524 00:22:26,580 --> 00:22:28,980 X, yine, 1'dir. 525 00:22:28,980 --> 00:22:33,240 Y, tabii ki, hızlı aklı olan yani zor değil orada, 2 kontrol edin. 526 00:22:33,240 --> 00:22:35,740 Ama işareti x nedir? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Cevap, bu tür korkak bakıyor. 529 00:22:39,350 --> 00:22:43,500 Ama parantez içinde int yıldızı sadece bir Bu söylemenin GSYH yolu bir adres. 530 00:22:43,500 --> 00:22:48,290 Bu, bir bir işaretçi bir int var değil int, ya da başka bir adrese olarak bilinir. 531 00:22:48,290 --> 00:22:49,742 >> Bu çılgın şey nedir? 532 00:22:49,742 --> 00:22:51,825 Biz bir şey görmedim Oldukça önce böyle. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Yani bu benim bilgisayarın adres olduğu x yaşamak olur nerede bellek. 535 00:22:58,120 --> 00:22:59,040 Bu Ox-şey. 536 00:22:59,040 --> 00:23:01,290 Ve bu açıkçası, neden, olan Ben okları çizim başladım, 537 00:23:01,290 --> 00:23:03,340 yerine numaraları, kimin gerçekten umurunda çünkü 538 00:23:03,340 --> 00:23:06,890 senin int belirli altında olduğunu Büyük işte adres. 539 00:23:06,890 --> 00:23:12,160 Ama bffff0c4, bunların hepsi vardır gerçekten onaltılık basamak, 540 00:23:12,160 --> 00:23:13,720 f ile 0 olan. 541 00:23:13,720 --> 00:23:16,590 >> Yani biz de yaşamak için gidiyoruz değil bu şeyler ne uzun. 542 00:23:16,590 --> 00:23:19,400 Ama y çıktısını eğer, Tabii, ben 2 bkz. 543 00:23:19,400 --> 00:23:22,440 Ama işareti y ben bu adresi görüyorum. 544 00:23:22,440 --> 00:23:26,527 Ve ihbar, meraklı için, ayrı x ve y ne kadar vardır? 545 00:23:26,527 --> 00:23:27,985 Adresin en sayabilirsiniz. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Dört bayt. 548 00:23:29,920 --> 00:23:33,510 Ve bununla tutarlı bizim Daha önce bir int ne kadar büyük olduğunu iddia? 549 00:23:33,510 --> 00:23:34,130 Dört bayt. 550 00:23:34,130 --> 00:23:37,420 Yani her şey astar kadar benziyor güzel, bellekte, umut olabilir gibi. 551 00:23:37,420 --> 00:23:40,010 >> Peki şimdi, sadece hızlı ileri atalım Bu hikayenin sonuna. 552 00:23:40,010 --> 00:23:43,290 , En önde gidip ve adım yazın edelim Swap fonksiyonu dalmak. 553 00:23:43,290 --> 00:23:46,880 Şimdi bir yazarsanız, bu, fark x adrese denk. 554 00:23:46,880 --> 00:23:52,130 Ben b yazarsanız, bu aynı değil y adresine. 555 00:23:52,130 --> 00:23:57,020 Yani ben eğer ne görmelisiniz Bir adrese gitmek demek? 556 00:23:57,020 --> 00:23:58,120 Yani bir yıldızı yazdırın. 557 00:23:58,120 --> 00:24:00,130 Yani yıldız bu bağlamda, oraya gitmek demektir. 558 00:24:00,130 --> 00:24:02,730 Ampersand adresi ne demektir. 559 00:24:02,730 --> 00:24:05,000 Yani bir araç 1 yıldız. 560 00:24:05,000 --> 00:24:09,590 Ve baskı yıldız b bana 2 veriyor. 561 00:24:09,590 --> 00:24:15,750 >> Ve ben şu an için, varsayalım, en azından kodu o 562 00:24:15,750 --> 00:24:18,950 olabilir şimdi yürütmek ilerler bu şekilde aracılığıyla gerekçeli. 563 00:24:18,950 --> 00:24:21,150 Ama biz uzun zaman önce bu fikri tekrar edeceğiz. 564 00:24:21,150 --> 00:24:23,850 Swap Yani bu sürümü Şimdi doğru ve izin verir 565 00:24:23,850 --> 00:24:26,650 Bize bu özel veri türü takas. 566 00:24:26,650 --> 00:24:29,120 >> Böylece herhangi bir soru daha sonra Swap? 567 00:24:29,120 --> 00:24:29,890 Star? 568 00:24:29,890 --> 00:24:30,690 Adresi üzerinde? 569 00:24:30,690 --> 00:24:33,270 Ve sizinle, görürsünüz Sorun, çeşit, 4 set 570 00:24:33,270 --> 00:24:37,310 ama sorun 5, kesinlikle, nasıl bu set şeyler yararlıdır ve almak çok daha 571 00:24:37,310 --> 00:24:39,584 Bir sonuç olarak, bunlarla rahat. 572 00:24:39,584 --> 00:24:40,430 Hiç bir şey? 573 00:24:40,430 --> 00:24:40,930 Tamam. 574 00:24:40,930 --> 00:24:44,350 Yani malloc, bu fonksiyon yine, sadece bellek, bellek ayırır 575 00:24:44,350 --> 00:24:45,330 tahsisi. 576 00:24:45,330 --> 00:24:47,024 Ve neden bu yararlıdır? 577 00:24:47,024 --> 00:24:48,940 Peki, tüm bu sefer, Eğer malloc kullanarak oldum. 578 00:24:48,940 --> 00:24:52,230 Şimdi nasıl düşünürsek işleri getString, muhtemelen, bu kadar 579 00:24:52,230 --> 00:24:56,140 Bir yığın için bir başkasına soruyor Bellek, her zaman kullanıcı türleri bir dize 580 00:24:56,140 --> 00:24:59,040 olarak, kesinlikle çünkü biz bilmiyordum, CS50 personel, 581 00:24:59,040 --> 00:25:02,710 ne kadar büyük bu dizeleri bu insanlarda olabilir yazın gidiyoruz. 582 00:25:02,710 --> 00:25:07,910 >> O yüzden, ilk kez, başlayalım soyma geri nasıl CS50 kütüphane çalışmaları, 583 00:25:07,910 --> 00:25:10,990 örnekler çift yoluyla orada bizi götürecek. 584 00:25:10,990 --> 00:25:15,300 Ben gedit açmak Yani eğer ve, scanf 0 açmak 585 00:25:15,300 --> 00:25:17,055 aşağıdaki kodu görmek için gidiyoruz. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Için web sitesinde mevcuttur scanf 0, Bugün, nispeten daha az kod hatları vardır 588 00:25:23,530 --> 00:25:25,351 Burada, 20 ile 14. 589 00:25:25,351 --> 00:25:26,600 Ve en ne yaptığını görelim. 590 00:25:26,600 --> 00:25:28,920 Bu bir int, denilen x bildirir. 591 00:25:28,920 --> 00:25:30,850 Bu şey gibi, numara lütfen diyor. 592 00:25:30,850 --> 00:25:33,940 Ve şimdi scanf% i, x, diyor. 593 00:25:33,940 --> 00:25:35,620 Yani orada yeni şeyler bir sürü var. 594 00:25:35,620 --> 00:25:38,420 >> Ama scanf, ne tür aklınıza gelebilecek bir printf tersi olarak. 595 00:25:38,420 --> 00:25:40,090 Printf, tabii ki, ekran baskı. 596 00:25:40,090 --> 00:25:44,410 Kullanıcı en gelen taramaların scanf tür Klavye şey o yazmamıştır. 597 00:25:44,410 --> 00:25:46,550 >>% Ben sadece printf gibi. 598 00:25:46,550 --> 00:25:49,410 Bu beklemek anlamına gelir Kullanıcı bir int yazın. 599 00:25:49,410 --> 00:25:52,820 Ve şimdi, neden ben sizce scanf ve x geçen olabilir? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Eğer scanf hayatında amacı kullanıcıdan bir şeyler almak için, 602 00:25:57,770 --> 00:26:02,480 anlamı nedir Şimdi, geçirerek, ve X? 603 00:26:02,480 --> 00:26:02,980 Evet? 604 00:26:02,980 --> 00:26:03,896 >> İZLEYİCİ: [duyulamaz]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. MALAN: Kesinlikle. 607 00:26:06,540 --> 00:26:12,900 Ne olursa olsun ben, insan, benim giriş yazın Bu konumda kaydedilmiş olacak. 608 00:26:12,900 --> 00:26:17,660 Sadece için, hatırlama, yeterli değil biz zaten gördüm çünkü, x geçmek, 609 00:26:17,660 --> 00:26:21,630 Herhangi bir zaman, sadece bir ham değişken geçmek bir int gibi, diğer bazı fonksiyonu, 610 00:26:21,630 --> 00:26:25,640 Emin, o değiştirebilir değişken, ama kalıcı. 611 00:26:25,640 --> 00:26:27,360 Bu Main üzerinde bir etkisi olamaz. 612 00:26:27,360 --> 00:26:29,420 Sadece kendi yerel kopyasını değiştirebilirsiniz. 613 00:26:29,420 --> 00:26:32,560 Ama eğer, bunun yerine, değil mi Bana gerçek int ver, 614 00:26:32,560 --> 00:26:36,640 ama bana yön vermek int, ben şimdi, scanf olmak 615 00:26:36,640 --> 00:26:41,050 kesinlikle, ben o takip edebilirsiniz adres ve orada bir numara koymak 616 00:26:41,050 --> 00:26:43,280 böylece siz de ona erişebilir. 617 00:26:43,280 --> 00:26:45,120 Ben bu programı çalıştırdığınızda >> Peki, bakalım. 618 00:26:45,120 --> 00:26:49,660 Scanf 0 nokta çizgi olun, 0 scanf. 619 00:26:49,660 --> 00:26:54,030 Ve ben şimdi bir sayı yazarsanız 50 gibi, 50 için teşekkürler. 620 00:26:54,030 --> 00:26:58,150 Ben şimdi böyle bir sayı yazarsanız Negatif 1 için, 1 negatif. 621 00:26:58,150 --> 00:27:04,200 Ben şimdi hm, 1.5 gibi bir sayı yazın. 622 00:27:04,200 --> 00:27:06,030 Neden benim program beni görmezden mi? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Peki, çünkü sadece, ben söyledim bir int sadece beklemek. 625 00:27:09,880 --> 00:27:10,380 Tamam. 626 00:27:10,380 --> 00:27:11,630 Yani bu bir versiyonu. 627 00:27:11,630 --> 00:27:16,600 En bir çentik şeyleri alalım ve Bu iyi değil öneriyoruz. 628 00:27:16,600 --> 00:27:20,530 Ve burada çok basit bir örnek yatıyor Biz yazı kodu başlayabilirsiniz nasıl 629 00:27:20,530 --> 00:27:24,450 Diğer insanların istismar olabilir ya da kötü şeyler yaparak uzlaşma. 630 00:27:24,450 --> 00:27:28,336 Yani çizgi 16, yani benzer ruhu için önce, 631 00:27:28,336 --> 00:27:29,960 ama bu sefer int ilan değilim. 632 00:27:29,960 --> 00:27:32,970 Ben dize aka, bu Char yıldızı ilan ediyorum. 633 00:27:32,970 --> 00:27:35,190 >> Ama bu gerçekten ne anlama geliyor? 634 00:27:35,190 --> 00:27:38,790 Yani bir adresB belirtmek yoksa ve Ben keyfi olarak arıyorum, tampon, 635 00:27:38,790 --> 00:27:43,370 ama simple-- olması için, s diyebiliriz ve sonra ben, bunu bana açıklayabilir, 636 00:27:43,370 --> 00:27:48,630 Önceki dayalı, eğer olabilir mantık, scanf hat 18 ne yaptığını, 637 00:27:48,630 --> 00:27:55,000 pas% s ve tampon varsa, Bir adres hangisi? 638 00:27:55,000 --> 00:27:58,210 Eğer uygularsanız scanf, nedir sürüm 0 olarak aynı mantık, 639 00:27:58,210 --> 00:28:00,640 Burada yapılacak denemek için gidiyoruz, ne zaman kullanıcı tipleri şey? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Evet? 642 00:28:03,409 --> 00:28:04,407 >> İZLEYİCİ: [duyulamaz]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. MALAN: Kesinlikle. 645 00:28:08,890 --> 00:28:11,577 Scanf mantık tarafından daha önce, dize almaya gidiyor 646 00:28:11,577 --> 00:28:13,410 İnsan yazdığınızı , şimdi bir dize var in-- 647 00:28:13,410 --> 00:28:15,790 bu, muhtemelen, bir sayı değil o cooperates-- eğer 648 00:28:15,790 --> 00:28:19,310 ve bu koymak için denemek için gidiyor ne olursa olsun adreste bellekte dize 649 00:28:19,310 --> 00:28:20,340 tampon belirtir. 650 00:28:20,340 --> 00:28:23,870 Ve bu, büyük tampon çünkü gerçekten bir adres olması gerekiyordu. 651 00:28:23,870 --> 00:28:30,470 >> Ama bu program içinde adamcağız iddia çok ciddi bir şekilde, değeri nedir çünkü 652 00:28:30,470 --> 00:28:31,330 Varsayılan olarak tampon? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Ne içine başlatıldı var? 655 00:28:34,790 --> 00:28:35,770 Bellek nedir yığın? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Ben değil var, değil mi? 658 00:28:38,620 --> 00:28:42,265 >> Ben tahsis ettik yüzden bile olsa bir artık s denir karakter yıldızı, 659 00:28:42,265 --> 00:28:48,030 yerine denir, yani buffer-- en değişkenin adını çizelim 660 00:28:48,030 --> 00:28:53,380 Ben değil varsa artık buffer-- Burada getString veya Malloc denilen 661 00:28:53,380 --> 00:28:56,030 Bu etkili olduğu anlamına gelir Tampon sadece bazı çöp değeridir. 662 00:28:56,030 --> 00:28:57,030 >> Şimdi bu ne anlama geliyor? 663 00:28:57,030 --> 00:29:00,220 Ben scanf söyledim demektir kullanıcıdan bir dize beklemek. 664 00:29:00,220 --> 00:29:01,300 Ve biliyor musun? 665 00:29:01,300 --> 00:29:03,883 Ne olursa olsun bu şey işaret ediyor amaçlara yönelik ve ben soru işareti çizmek, 666 00:29:03,883 --> 00:29:07,060 ama gerçekte, o olacak OX1, 2, 3, gibi bir şey değil mi? 667 00:29:07,060 --> 00:29:10,730 Bazı sahte değer olduğunu sadece önce orada olur. 668 00:29:10,730 --> 00:29:13,440 Yani başka bir deyişle, bu kadar Tampon sadece sanki 669 00:29:13,440 --> 00:29:16,180 bellekte bir şey işaret. 670 00:29:16,180 --> 00:29:17,610 Ben hiçbir fikrim yok. 671 00:29:17,610 --> 00:29:24,130 Ben şimdi gabe yazarsanız >> Yani, gidiyor Orada g-a-b-e / 0 koymak için denemek için. 672 00:29:24,130 --> 00:29:25,530 Ama kim olduğunu biliyor? 673 00:29:25,530 --> 00:29:27,480 Ve geçmişte bir Biz dokunmaya denedim zaman 674 00:29:27,480 --> 00:29:29,770 ait olmayan bellek Bize, ne oldu? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Ya da hemen hemen her zaman. 677 00:29:32,870 --> 00:29:34,310 Segmentasyon hatası, değil mi? 678 00:29:34,310 --> 00:29:37,829 O nerede >> Bu ok, hiçbir fikrim yok işaretleme. sadece bazı rasgele değer. 679 00:29:37,829 --> 00:29:40,370 Ve tabii ki, yorumlamak durumunda Bir adres olarak rastgele bir değer, 680 00:29:40,370 --> 00:29:42,610 Eğer gitmek için gidiyoruz Bazı rastgele hedef. 681 00:29:42,610 --> 00:29:46,810 Yani Gabe kazasında gerçekten olabilir Burada bu durumda benim program. 682 00:29:46,810 --> 00:29:50,600 >> Yani biz neredeyse kötü ne var ne yapabilirim? 683 00:29:50,600 --> 00:29:52,660 Bu üçüncü düşünün ve scanf son örnek. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Bu sürüm hangi anlamda iyidir? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Eğer rahat değilseniz Bir önceki sorunun, bu daha iyidir. 688 00:30:01,400 --> 00:30:02,250 Neden? 689 00:30:02,250 --> 00:30:03,250 >> İZLEYİCİ: [duyulamaz]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. MALAN: İyi. 692 00:30:07,110 --> 00:30:09,970 Hat 16 Yani bu durumda anlamda, daha da 693 00:30:09,970 --> 00:30:12,030 Biz açıkça olduğumuzu Bazı bellek ayırma. 694 00:30:12,030 --> 00:30:14,190 Biz, malloc kullanarak değil Biz hafta 2 kullanıyorsanız 695 00:30:14,190 --> 00:30:16,060 sadece bir dizi ilan yaklaşımı. 696 00:30:16,060 --> 00:30:18,130 Ve biz bir dize önce söylediğim karakter sadece bir dizidir, 697 00:30:18,130 --> 00:30:19,690 bu nedenle bu tamamen meşrudur. 698 00:30:19,690 --> 00:30:22,910 Ancak bu gibi, tabii ki, bu 16, sabit boyut not. 699 00:30:22,910 --> 00:30:25,440 >> Yani bu program tamamen güvenli, ben yazarsanız 700 00:30:25,440 --> 00:30:29,760 bir karakter dizeleri, iki karakter dizeleri, 15 karakter dizeleri. 701 00:30:29,760 --> 00:30:34,970 Ama en kısa sürede ben 16 yazmaya başlayın gibi, 17, 18, 1.000 karakter dizeleri, 702 00:30:34,970 --> 00:30:37,390 nerede dize sonuna kadar gidiyor? 703 00:30:37,390 --> 00:30:39,570 Bu kısmen burada sonuna kadar gidiyor. 704 00:30:39,570 --> 00:30:42,820 Ama sonra kim bilir neler sınırları ötesinde 705 00:30:42,820 --> 00:30:44,270 Bu özel dizinin? 706 00:30:44,270 --> 00:30:48,015 Ben ettik sanki >> It Burada 16 kutuları açıkladı. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Bu nedenle tüm 16 çizmek yerine, biz olacak Sadece 16 boğuldum iddia. 709 00:30:52,690 --> 00:30:56,540 Ama ben daha sonra bir dize okumak için çalışırsanız Bu 50 karakter gibi, çok daha uzun, 710 00:30:56,540 --> 00:31:01,270 Ben koyarak başlamak için gidiyorum a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Ve bu muhtemelen bir Bazı diğer bellek segmenti 712 00:31:04,916 --> 00:31:06,790 Bu, yine, neden olabilir benim program, çökmesine 713 00:31:06,790 --> 00:31:10,600 Ben istedi ettik çünkü Sadece 16 bayt başka bir şey. 714 00:31:10,600 --> 00:31:12,260 >> Peki kimin umurunda? 715 00:31:12,260 --> 00:31:13,880 Peki, burada CS50 kütüphanesi. 716 00:31:13,880 --> 00:31:17,220 Ve bu çoğu sadece bir kontör talimatlar gibi. 717 00:31:17,220 --> 00:31:21,670 CS50 kütüphane, tüm bu sefer, hat 52 bu satırı olmuştur. 718 00:31:21,670 --> 00:31:23,680 Biz typedef gördük, ya da var Eğer typedef göreceksiniz 719 00:31:23,680 --> 00:31:27,930 Sadece bir oluşturur pset 4, içinde eşanlamlı karakter yıldız daha olabilir sayede 720 00:31:27,930 --> 00:31:29,290 sadece dize olarak anılacaktır. 721 00:31:29,290 --> 00:31:31,540 Yani bu biridir Birkaç eğitim jantlar 722 00:31:31,540 --> 00:31:34,120 Biz kaputun altında gizlice kullandım. 723 00:31:34,120 --> 00:31:36,490 >> Bu arada, burada getchar, fonksiyon var. 724 00:31:36,490 --> 00:31:38,190 Şimdi görünüşe, ona hiçbir vücut var. 725 00:31:38,190 --> 00:31:40,273 Ve aslında, ben tutarsanız Kaydırma, aslında yok 726 00:31:40,273 --> 00:31:42,080 Herhangi uygulamaları görmek Bu işlevlerin. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Bir aklı kontrol olarak, neden? 729 00:31:45,516 --> 00:31:46,795 >> İZLEYİCİ: [duyulamaz]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. MALAN: Evet. 731 00:31:47,670 --> 00:31:48,950 Yani bu başlık dosyasıdır. 732 00:31:48,950 --> 00:31:52,520 Ve başlık dosyaları prototipler içerir artı diğer bazı şeyler, öyle görünüyor ki, 733 00:31:52,520 --> 00:31:53,780 typedefs gibi. 734 00:31:53,780 --> 00:31:56,910 Ama CS50.c, biz ettik hangi düpedüz seni verilen hiç, 735 00:31:56,910 --> 00:32:02,100 ama CS50 cihaz olmuştur tüm Bu sefer, derin kendi klasörlerin içinde, 736 00:32:02,100 --> 00:32:04,990 bir bütün var olduğunu fark Burada fonksiyonların demet. 737 00:32:04,990 --> 00:32:06,720 >> Aslında, en aşağı kaydırma edelim. 738 00:32:06,720 --> 00:32:08,810 Şimdi için, çoğu görmezden edelim. 739 00:32:08,810 --> 00:32:12,670 Ama GETINT aşağı kaydırma ve GETINT nasıl çalıştığını görmek. 740 00:32:12,670 --> 00:32:13,890 Yani burada GETINT olduğunu. 741 00:32:13,890 --> 00:32:17,727 Hiç gerçekten bakım ve nasıl olsun int burada, çalışan kendi belgelerdir. 742 00:32:17,727 --> 00:32:19,560 Ve yanı sıra o size söyler diyor 743 00:32:19,560 --> 00:32:21,340 değer aralıkları o geri ne. 744 00:32:21,340 --> 00:32:24,400 Bu aslında olumsuz var 2 milyar Pozitif 2 milyar kadar, vermek veya almak. 745 00:32:24,400 --> 00:32:26,420 >> Ve tüm bu çıkıyor zaman, biz asla ettik bile 746 00:32:26,420 --> 00:32:28,570 bunun için kontrol vardı, bir şey yanlış giderse, 747 00:32:28,570 --> 00:32:30,680 tüm bu çıkıyor Bu sefer, GETINT sahip 748 00:32:30,680 --> 00:32:33,600 Özel dönen null, sabit değildir 749 00:32:33,600 --> 00:32:36,760 daha çok olan, INT_MAX Sadece bir programcı kongre. 750 00:32:36,760 --> 00:32:38,846 Burada anlamına özel bir değerdir. 751 00:32:38,846 --> 00:32:41,470 Sadece, bu kontrol etmek için emin olun durumda bir şey yanlış giderse. 752 00:32:41,470 --> 00:32:43,261 Ama biz asla rahatsız ettik bu zamana kadar olan, 753 00:32:43,261 --> 00:32:45,200 Yine, bunun nedeni basitleştirmek için tasarlanmıştır. 754 00:32:45,200 --> 00:32:46,950 >> Ama nasıl GETINT uygulamaya olsun demek? 755 00:32:46,950 --> 00:32:48,450 Eh, bir, hiçbir argüman alır. 756 00:32:48,450 --> 00:32:49,390 Biz biliyoruz. 757 00:32:49,390 --> 00:32:50,820 Bu bir int döndürür. 758 00:32:50,820 --> 00:32:51,950 Biz biliyoruz. 759 00:32:51,950 --> 00:32:54,460 Peki nasıl kaputun altında çalışır? 760 00:32:54,460 --> 00:32:58,290 >> Yani görünüşte sonsuz var Döngü, en azından birinin görünümü. 761 00:32:58,290 --> 00:33:00,290 Biz getString kullanıyorsanız dikkat edin. 762 00:33:00,290 --> 00:33:04,000 Yani ilginç. GETINT Kendi fonksiyonu, getString çağırır. 763 00:33:04,000 --> 00:33:05,645 Ve şimdi neden bu durumda olabilir? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Neden defansif açıyorum Burada hat 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Ne doğrultusunda olabilirdi 164, sadece temiz olması için? 768 00:33:15,639 --> 00:33:16,930 Daha önce aynı cevap. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Sadece bellek yetersiz olabilir. 771 00:33:20,089 --> 00:33:23,130 Bir şey, getString ile yanlış gider biz idare edebilmek için var. 772 00:33:23,130 --> 00:33:27,070 Ve nedeni null dönüş yok Bu, teknik olarak, boş bir göstericidir. 773 00:33:27,070 --> 00:33:29,120 GETINT bir int dönmek zorundadır. 774 00:33:29,120 --> 00:33:31,060 Yani keyfi ettik esas olarak, karar 775 00:33:31,060 --> 00:33:34,600 2 milyar olduğunu, gidiyor, vermek veya almak Özel bir değer olarak ben asla can 776 00:33:34,600 --> 00:33:35,970 Aslında kullanıcıdan olsun. 777 00:33:35,970 --> 00:33:39,930 Ben gidiyorum sadece bir değer Bir hata kodu temsil etmek atık. 778 00:33:39,930 --> 00:33:41,540 >> Peki şimdi işler biraz fantezi olsun. 779 00:33:41,540 --> 00:33:44,670 Ve oldukça aynı işlevi değil eskisi gibi, ama çok benzer. 780 00:33:44,670 --> 00:33:50,120 Yani doğrultusunda, burada beyan fark 172, bir int n ve bir char c hem. 781 00:33:50,120 --> 00:33:53,600 Ve sonra, bu korkak satırını kullanın çıkıyor sscanf, 782 00:33:53,600 --> 00:33:55,990 klavyeden bir dize taraması yapmaz. 783 00:33:55,990 --> 00:33:59,226 Varolan dize duruyor kullanıcı zaten yazmış etti. 784 00:33:59,226 --> 00:34:02,100 Yani zaten getString denilen hangi Ben bellekte bir dize var demektir. 785 00:34:02,100 --> 00:34:05,020 sscanf ne olurdu olduğunu Bir ayrıştırma işlevini çağırın. 786 00:34:05,020 --> 00:34:07,760 Ben ettik dize bakar , karakteri, karakter yazdığınız 787 00:34:07,760 --> 00:34:09,250 ve yararlı bir şey yok. 788 00:34:09,250 --> 00:34:10,969 Bu dize satıra kaydedilir. 789 00:34:10,969 --> 00:34:13,560 Ve ben sadece gidiş olduğunu biliyorum Tamam, ah, burada ve diyerek yedeklemek, 790 00:34:13,560 --> 00:34:15,143 Ben lar bu sefer, ama hat denir. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Ve şimdi bu biraz farklıdır. 793 00:34:18,080 --> 00:34:22,480 Ancak bu etkin bir nedenden dolayı, demek biz biraz, bugün bizim eller dalga edeceğiz 794 00:34:22,480 --> 00:34:26,070 biz kontrol ediyoruz ki Kullanıcı yazdığınız görmek 795 00:34:26,070 --> 00:34:29,909 ve int ve belki başka bir karakter. 796 00:34:29,909 --> 00:34:33,610 Kullanıcı bir int yazdıysanız, bu kadar Ben için giderek n depolanacak 797 00:34:33,610 --> 00:34:36,739 adresi ile bu geçen, Bugün gördüğüm yeni numara. 798 00:34:36,739 --> 00:34:41,570 Kullanıcı ayrıca yazdıysanız gibi 123X, yani X 799 00:34:41,570 --> 00:34:45,060 Bir sonuna kadar gidiyor karakter c harfi. 800 00:34:45,060 --> 00:34:48,739 >> Şimdi bu sscanf çıkıyor akıllıca, bana anlatacak, 801 00:34:48,739 --> 00:34:54,750 kaç değişken sscanf edildi doldurmak için başarıyla mümkün. 802 00:34:54,750 --> 00:34:58,770 Bu mantığa göre, Yani fonksiyonu I GETINT uygulanışında ediyorum 803 00:34:58,770 --> 00:35:00,900 ama ben kontrol ediyorum, Potansiyel olarak, kullanıcı için 804 00:35:00,900 --> 00:35:04,190 Bir int yazdığınız için başka bir şey, ardından 805 00:35:04,190 --> 00:35:08,580 ne sscanf en istiyorum Dönüş değeri gerçekten olmak? 806 00:35:08,580 --> 00:35:10,950 Amaç almak için ise sadece kullanıcının bir int? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Yani eğer sscanf döner 2, bu ne anlama geliyor? 809 00:35:19,300 --> 00:35:21,660 Kullanıcı yazdığınız şey gibi, kelimenin tam anlamıyla, 810 00:35:21,660 --> 00:35:24,770 Sadece saçmalık 123X. 811 00:35:24,770 --> 00:35:27,490 Bu bir hata durumu var, ve Bunun için kontrol etmek istiyorum. 812 00:35:27,490 --> 00:35:32,960 >> Peki bu kullanıcı türleri ise, tarafından Bu mantık, geri dönmek sscanf ne, 813 00:35:32,960 --> 00:35:33,740 Eğer derdi? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Yani çünkü, 2. dönmek için gidiyor 123, burada gidecek 816 00:35:39,130 --> 00:35:41,580 x burada sonuna kadar gidiyor. 817 00:35:41,580 --> 00:35:43,970 Ama x dolu olsun istemiyorum. 818 00:35:43,970 --> 00:35:48,580 Ben sadece başarılı olmak sscanf istiyorum değişkenleri ilk dolum. 819 00:35:48,580 --> 00:35:52,490 Ve böylece bu yüzden ben sscanf 1 dönmek için istiyorum. 820 00:35:52,490 --> 00:35:55,750 >> Ve bu başının üzerinde bir bit olup olmadığını Şu an için, bu tamamen iyi. 821 00:35:55,750 --> 00:36:00,030 Olsa o bir fark GETINT ve getString değerleri 822 00:36:00,030 --> 00:36:03,630 Biz bir halt yapıyorsun olduğunu Bu yüzden böyle hata kontrolü çok 823 00:36:03,630 --> 00:36:07,130 Bu, bugüne kadar, hemen hemen yapabilirsiniz Klavyenizin bir şey yazın 824 00:36:07,130 --> 00:36:08,490 ve biz bunu yakalayacak. 825 00:36:08,490 --> 00:36:10,592 Ve biz kesinlikle, Personel, değil kesinlikle olacak 826 00:36:10,592 --> 00:36:13,300 Bir hata kaynağı senin Program, biz savunmaya çünkü 827 00:36:13,300 --> 00:36:16,270 aptal tüm kontrol Bir kullanıcı yapabilir şeyler, 828 00:36:16,270 --> 00:36:18,900 ne zaman bir dize yazarak gibi Eğer gerçekten int istedi. 829 00:36:18,900 --> 00:36:21,350 Yani biz geleceğiz şimdi-- için buna geri long-- önce 830 00:36:21,350 --> 00:36:23,710 ama tüm bu sefer, getString ve GETINT var 831 00:36:23,710 --> 00:36:29,950 Bu kullanarak başlık altında yapılmış bellek adresleri temel fikir. 832 00:36:29,950 --> 00:36:32,580 >> Peki şimdi, bir üyenin şeyler yapalım Kullanıcı dostu biraz daha fazla. 833 00:36:32,580 --> 00:36:38,740 Eğer Binky son gelen, Hatırlayacağınız gibi defasında bir zaman fare çok cooperate-- eğer 834 00:36:38,740 --> 00:36:42,560 Bu kodu, vardı açıkçası, oldukça saçmadır. 835 00:36:42,560 --> 00:36:45,330 Bu kod şey elde yararlı, ama örnek oldu 836 00:36:45,330 --> 00:36:48,330 O profesör Parlante temsil etmek üzere kullanılan 837 00:36:48,330 --> 00:36:51,840 ne oluyordu bellek içeren bir program. 838 00:36:51,840 --> 00:36:54,850 >> Yani bu anlatmak edelim Hikaye süper kısaca. 839 00:36:54,850 --> 00:36:58,720 Bu ilk iki satır içinde İngilizce, ne söyleyebilirim mı? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Sadece makul insan, ama biraz teknik terimler, bir bıçak almak. 842 00:37:05,430 --> 00:37:06,346 HEDEF KİTLE: [duyulamaz]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. MALAN: Tamam, sen kuruyoruz senin x ve y değişkenleri için adresleri. 845 00:37:11,080 --> 00:37:15,520 Olarak değil, x ve y değildir çünkü Geleneksel anlamda değişkenler. 846 00:37:15,520 --> 00:37:18,054 x ve y adresleri veya adresi saklar. 847 00:37:18,054 --> 00:37:19,220 Yani bu bir kez daha deneyelim. 848 00:37:19,220 --> 00:37:21,010 Değil kötü bir başlangıç ​​olsa. 849 00:37:21,010 --> 00:37:21,510 Evet? 850 00:37:21,510 --> 00:37:22,426 >> İZLEYİCİ: [duyulamaz]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. MALAN: İyi. 853 00:37:24,840 --> 00:37:26,173 Ben biraz daha temiz olduğunu düşünüyorum. 854 00:37:26,173 --> 00:37:28,630 İki işaretçileri, iki tamsayılar bildirmek. 855 00:37:28,630 --> 00:37:30,150 Ve biz onlara x ve y diyorlar. 856 00:37:30,150 --> 00:37:32,790 Ya da biz eğer çizmek için Bu bir resim olarak, yine, 857 00:37:32,790 --> 00:37:36,410 oldukça basit tüm hatırlamak biz ilk hattı ile yapıyoruz 858 00:37:36,410 --> 00:37:39,690 Böyle bir kutu çizim, içinde bazı çöp değeri ile, 859 00:37:39,690 --> 00:37:41,920 ve sonra x arayarak, ve Bu gibi başka bir kutu, 860 00:37:41,920 --> 00:37:43,880 bazı çöp değeri ile o, y çağırarak. 861 00:37:43,880 --> 00:37:45,810 Biz iki ilan ettik işaretçileri sonuçta 862 00:37:45,810 --> 00:37:47,860 Bir int adresini saklar. 863 00:37:47,860 --> 00:37:49,170 Yani hepsi var. 864 00:37:49,170 --> 00:37:53,290 >> Peki Binky ne zaman bu, kil sadece bu gibi görünüyordu. 865 00:37:53,290 --> 00:37:55,350 Ve Nick sadece tür okları sarılmış, 866 00:37:55,350 --> 00:37:57,590 sanki onlar her yerde işaret değil Özellikle, çünkü sadece konum 867 00:37:57,590 --> 00:37:58,250 çöp değerleri. 868 00:37:58,250 --> 00:38:01,670 Onlar açıkça başlatıldı değil her yerde özellikle. 869 00:38:01,670 --> 00:38:03,980 Bir >> Şimdi bir sonraki satır kod, hatırlama, bu oldu. 870 00:38:03,980 --> 00:38:07,510 Makul kullanıcı dostu Yani ama biraz teknik İngilizce, 871 00:38:07,510 --> 00:38:09,790 Kod yapmanın bu hat nedir? 872 00:38:09,790 --> 00:38:10,391 Evet? 873 00:38:10,391 --> 00:38:11,333 >> İZLEYİCİ: [duyulamaz]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. MALAN: Mükemmel. 876 00:38:13,950 --> 00:38:17,016 Bu bir yığın tahsis ediyor bir int boyutu var bellek. 877 00:38:17,016 --> 00:38:18,140 Ve yarım cevap. 878 00:38:18,140 --> 00:38:20,056 Sen hakkını cevap İfade yarısı. 879 00:38:20,056 --> 00:38:22,473 Neler oluyor eşittir işareti sol taraftaki? 880 00:38:22,473 --> 00:38:22,972 Evet? 881 00:38:22,972 --> 00:38:24,814 HEDEF KİTLE: Ve atar değişken x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. MALAN: Ve atar değişken x. 883 00:38:27,690 --> 00:38:31,650 Recap, sağ taraf ayırır Yani Yeterli bellek bir int depolamak için. 884 00:38:31,650 --> 00:38:34,150 Ama malloc özellikle adresini döndürür 885 00:38:34,150 --> 00:38:37,270 Eğer ettik bellek bu yığın, bir Sadece x depolanır önerdi. 886 00:38:37,270 --> 00:38:42,560 >> Nick Binky ile son kez yaptım Peki ne o işaretçi dışarı sürükledi, kil, 887 00:38:42,560 --> 00:38:46,820 bellek beyaz bir yığın şimdi işaret etmek Bu bir int boyutuna eşittir. 888 00:38:46,820 --> 00:38:49,360 Ve gerçekten de, o pinti dört bayt temsil etmek. 889 00:38:49,360 --> 00:38:55,310 Kod >> Şimdi, bir sonraki satır Bu yaptım, yıldız x 42 alır. 890 00:38:55,310 --> 00:38:58,530 Yani 42 basittir Sağ taraftaki, hayatın anlamı. 891 00:38:58,530 --> 00:39:00,500 Sol tarafta, yıldız x ne demek? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Bu Tamam gone-- Bu çok olabilir. 894 00:39:03,280 --> 00:39:04,220 TAMAM MI. 895 00:39:04,220 --> 00:39:06,875 >> İZLEYİCİ: Temelde, [duyulamaz] gitmek 896 00:39:06,875 --> 00:39:07,750 DAVID J. MALAN: İyi. 897 00:39:07,750 --> 00:39:08,760 HEDEF KİTLE: [duyulamaz]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. MALAN: Kesinlikle. 899 00:39:09,760 --> 00:39:11,979 Sol taraftaki x gitmek anlamına gelir. 900 00:39:11,979 --> 00:39:12,520 x adres olduğunu. 901 00:39:12,520 --> 00:39:15,520 Bu 33 Oxford Street, veya OX1 gibi. 902 00:39:15,520 --> 00:39:18,690 Ve yıldız, x gitmek anlamına gelir ele almak ve orada ne koydu? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Peki gerçekten, bu Nick yaptığını tam olarak ne. 905 00:39:21,290 --> 00:39:23,740 O, saldırıdaki ile başladı esas olarak, zihinsel 906 00:39:23,740 --> 00:39:26,270 Bir parmak işaret X, ok yönünde 907 00:39:26,270 --> 00:39:30,670 Sağ-el beyaz kutu yan, ve orada numarayı 42 koyarak. 908 00:39:30,670 --> 00:39:34,120 Ama sonra işler var bir Biraz tehlikeli, değil mi? 909 00:39:34,120 --> 00:39:35,860 Binky en kafasını kaybetmek üzere. 910 00:39:35,860 --> 00:39:39,465 >> Yıldız y ne demek, 13, kötü şans eşittir? 911 00:39:39,465 --> 00:39:43,620 Yani yıldız y araçlar y adrese gidin. 912 00:39:43,620 --> 00:39:45,630 Ama y adresi nedir? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Pekala, bu çöp değeri doğru, değil mi? 915 00:39:49,440 --> 00:39:50,800 Ben bir soru işareti olarak çekti. 916 00:39:50,800 --> 00:39:54,850 Nick kıvrılmış ok olarak çekti. 917 00:39:54,850 --> 00:39:59,600 Ve kısa sürede deneyin oraya gitmek söyleyerek, yıldız y yapmak, 918 00:39:59,600 --> 00:40:03,872 ancak yasal olmadığı adres, bazı sahte konumu, 919 00:40:03,872 --> 00:40:05,080 Program çökmesine gidiyor. 920 00:40:05,080 --> 00:40:08,580 Ve Binky başı gidiyor yaptığı gibi, burada uçtuğunu. 921 00:40:08,580 --> 00:40:12,130 >> Yani sonunda, bu program Sadece düz dışarı kusur oldu. 922 00:40:12,130 --> 00:40:13,540 Bir adamcağız programı oldu. 923 00:40:13,540 --> 00:40:14,760 Ve sabit gerekiyordu. 924 00:40:14,760 --> 00:40:18,260 Ve tek yolu, gerçekten, bunu düzeltmek için olurdu, örneğin, bu hat, 925 00:40:18,260 --> 00:40:21,010 biz bile alamadım ki, çünkü Program çok yakında çöktü. 926 00:40:21,010 --> 00:40:26,170 Ama biz bunu düzeltmek için olsaydı, ne etkisi y eşit x var yapıyor mu? 927 00:40:26,170 --> 00:40:30,010 Peki, aslında bir y işaret ne olursa olsun değer x işaret edilmektedir. 928 00:40:30,010 --> 00:40:32,430 >> Nick'in hikayesi Yani, veya Binky hikayesi, hem de 929 00:40:32,430 --> 00:40:34,640 x ve y de işaret edilmiştir bellek beyaz yığın, 930 00:40:34,640 --> 00:40:38,300 böylece, nihayet, sizi y yine 13 eşit yıldız yapmak, 931 00:40:38,300 --> 00:40:43,080 sen 13 koyarak sona Uygun konumu. 932 00:40:43,080 --> 00:40:47,640 Yani bu hatların hepsi mükemmel olan meşru, bu biri hariç, 933 00:40:47,640 --> 00:40:51,730 sizden önce oldu ne zaman aslında y bazı değer atanır. 934 00:40:51,730 --> 00:40:54,290 >> Şimdi minnetle, değil mi tüm aracılığıyla akıl var 935 00:40:54,290 --> 00:40:56,560 kendi konularda bu tür. 936 00:40:56,560 --> 00:40:59,310 Beni go ahead ve açalım Burada bir terminal penceresinde yukarı 937 00:40:59,310 --> 00:41:03,050 ve sadece bir an için, açmak, süper kısa program o 938 00:41:03,050 --> 00:41:04,360 Ayrıca çeşit anlamsız. 939 00:41:04,360 --> 00:41:05,152 Bu çirkin. 940 00:41:05,152 --> 00:41:06,610 Bu yararlı bir şey elde etmez. 941 00:41:06,610 --> 00:41:10,180 Ama sorunları göstermek yok hafıza, o yüzden bir göz atalım. 942 00:41:10,180 --> 00:41:11,830 >> Ana, süper basit. 943 00:41:11,830 --> 00:41:14,830 Bu görünüşte bir işlevi çağırır, f, ve sonra 0 döndürür. 944 00:41:14,830 --> 00:41:16,310 Bu karmaşa, bu kadar biraz zor. 945 00:41:16,310 --> 00:41:18,540 Yani ana kadar, oldukça iyidir. 946 00:41:18,540 --> 00:41:20,100 >> Böylece f sorunludur. 947 00:41:20,100 --> 00:41:22,120 Ve sadece çok koymadı adlandırma içine çaba 948 00:41:22,120 --> 00:41:23,990 Burada, kod odağı tutmak için. 949 00:41:23,990 --> 00:41:25,740 f iki satır vardır. 950 00:41:25,740 --> 00:41:27,610 Ve şimdi neler görelim. 951 00:41:27,610 --> 00:41:29,840 Bu nedenle bir yandan ötürü-- ve beni yapalım 952 00:41:29,840 --> 00:41:32,680 Önceki ile bu tutarlı Bir yandan example--, 953 00:41:32,680 --> 00:41:35,830 sol tarafı İngilizce, ne yapıyorsun? 954 00:41:35,830 --> 00:41:36,493 Bu bu-- 955 00:41:36,493 --> 00:41:37,701 HEDEF KİTLE: Bir işaretçi oluşturma. 956 00:41:37,701 --> 00:41:40,830 DAVID J. MALAN: bir işaretçi oluşturma bir int ve arama o x. 957 00:41:40,830 --> 00:41:43,789 Yani bu kutulardan birini yaratıyor Ben dokunmatik ekranda çizim devam. 958 00:41:43,789 --> 00:41:45,913 Ve şimdi, sağ taraftan Yan malloc, tabii ki, 959 00:41:45,913 --> 00:41:47,420 Bellek bir yığın tahsis edilir. 960 00:41:47,420 --> 00:41:49,989 Ve sadece temiz olması için, nasıl kadar bellek görünüşte öyle 961 00:41:49,989 --> 00:41:52,030 tahsis, eğer sadece tür burada matematik yapmak? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Yani 40 bayt var. 964 00:41:54,040 --> 00:41:57,400 Ve biliyorum ki ben bir biliyorum çünkü int, CS50 cihaz üzerinde, en azından, 965 00:41:57,400 --> 00:41:58,060 Dört bayt. 966 00:41:58,060 --> 00:41:59,610 Yani 10 günlerin 4 40. 967 00:41:59,610 --> 00:42:04,924 Yani bu bir x depolamak, adres 40 ints ilk çıkar ki 968 00:42:04,924 --> 00:42:07,340 geri alan tahsis edilmiştir, geri, geri, geri. 969 00:42:07,340 --> 00:42:08,470 >> Ve bu malloc hakkında önemli ne var. 970 00:42:08,470 --> 00:42:11,261 Biraz hafıza almaz Burada, bir burada biraz, biraz burada. 971 00:42:11,261 --> 00:42:14,220 Bu, size bellek bir yığın verir bitişik, işletme gelen 972 00:42:14,220 --> 00:42:15,240 sistemi. 973 00:42:15,240 --> 00:42:18,500 >> Bu konuda şimdi ne, x dirsek 10 0 eşittir? 974 00:42:18,500 --> 00:42:19,470 Kod Keyfi hattı. 975 00:42:19,470 --> 00:42:21,100 Bu yararlı bir şey elde etmez. 976 00:42:21,100 --> 00:42:26,128 Ama, ilginç x dirsek 10-- çünkü? 977 00:42:26,128 --> 00:42:26,628 Evet? 978 00:42:26,628 --> 00:42:27,912 >> İZLEYİCİ: [duyulamaz]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. MALAN x braket 10 boş olmak zorunda değildir. 980 00:42:30,500 --> 00:42:35,070 Boş detay sadece devreye giriyor dizeleri ile, bir dizenin sonunda. 981 00:42:35,070 --> 00:42:36,700 Ama iyi bir düşünce. 982 00:42:36,700 --> 00:42:39,615 >> Bile, bu dizi ne kadar büyük Ben 40 bayt tahsis ettik olsa? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Bu doğru, dokuza kadar 0 değil? 985 00:42:43,690 --> 00:42:45,120 Bu toplam, 10 ints var. 986 00:42:45,120 --> 00:42:48,790 40 byte, ancak 10 ints, 0 ile 0 endeksli. 987 00:42:48,790 --> 00:42:50,930 >> Böylece x dirseği 10 nedir? 988 00:42:50,930 --> 00:42:53,090 Bu aslında bazı bilinmeyen çöp değeri. 989 00:42:53,090 --> 00:42:54,780 Bana ait olmayan bir anı. 990 00:42:54,780 --> 00:42:59,650 Bunu dokunmadan edilmemelidir byte numarası 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Ben çok hafif gidiyorum. 992 00:43:01,420 --> 00:43:04,490 >> Ve gerçekten, ben çalıştırırsanız, bu Program, çok iyi çökebilir. 993 00:43:04,490 --> 00:43:05,790 Ama bazen, biz şanslı alırsınız. 994 00:43:05,790 --> 00:43:07,706 Ve böylece sadece göstermek için bu-- ve açıkçası, 995 00:43:07,706 --> 00:43:11,000 sizden önce asla bilemezsiniz bu-- Şimdi bu çalışmasına izin yoktur. 996 00:43:11,000 --> 00:43:12,480 Aslında çökmesine vermedi. 997 00:43:12,480 --> 00:43:15,032 >> Ama ben, bu değişiklik eğer Örneğin, 1000 gibi olmak 998 00:43:15,032 --> 00:43:16,740 Gerçekten bu yapmak için kasıtlı, bakalım 999 00:43:16,740 --> 00:43:18,710 biz alabilirsiniz eğer bu sefer çökmesine. 1000 00:43:18,710 --> 00:43:20,070 Tamam, bu çökmesine vermedi. 1001 00:43:20,070 --> 00:43:22,600 Nasıl 100.000 'hakkında? 1002 00:43:22,600 --> 00:43:25,000 Şunu remake edelim, ve şimdi yeniden çalıştırın. 1003 00:43:25,000 --> 00:43:25,500 TAMAM MI. 1004 00:43:25,500 --> 00:43:25,960 Vay be. 1005 00:43:25,960 --> 00:43:26,460 Tamam. 1006 00:43:26,460 --> 00:43:29,090 Yani görünüşe göre, yine bu bellek kesimleri, yani, konuşmak 1007 00:43:29,090 --> 00:43:32,660 bu yüzden biz, oldukça büyük olan Tekrar ve tekrar almak şanslı. 1008 00:43:32,660 --> 00:43:36,510 Ama sonunda, bir kez saçma olsun ve gerçekten, ekranda çok dışarı çıkmak 1009 00:43:36,510 --> 00:43:39,120 Eğer, gerçekten hafıza dokunma Gerçekten sana ait değil. 1010 00:43:39,120 --> 00:43:40,870 >> Ama açıkçası, bu böcek türleri gidiyor 1011 00:43:40,870 --> 00:43:43,020 sert ve zor olması kendi anlamaya. 1012 00:43:43,020 --> 00:43:47,880 Ama neyse ki, programcılar gibi, biz var Bize bizim için bunu yapmak için izin araçlar. 1013 00:43:47,880 --> 00:43:50,140 Yani bu belki de, biri çirkin programları, 1014 00:43:50,140 --> 00:43:52,060 GDB üretiminin daha çirkin. 1015 00:43:52,060 --> 00:43:55,670 Ama her zaman bir çizgi vardır veya süper yararlıdır iki. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind yardımcı olan bir programdır Eğer bir program hata ayıklama değil, başına, 1017 00:44:00,310 --> 00:44:03,500 ancak bellek-ilişkili bulmak problemler, özellikle de. 1018 00:44:03,500 --> 00:44:07,590 Bu otomatik olarak kodunuzu çalışacak sen ve en az iki şey için bakmak. 1019 00:44:07,590 --> 00:44:10,680 Bir, bir şey yaptın Dokunmatik bellek gibi kazara 1020 00:44:10,680 --> 00:44:11,980 Bu sana ait değil mi? 1021 00:44:11,980 --> 00:44:13,590 Bu o davaları bulmanıza yardımcı olacaktır. 1022 00:44:13,590 --> 00:44:15,710 >> Ve iki yardımcı olacaktır Aradığınız şey bulmak 1023 00:44:15,710 --> 00:44:19,270 Bellek sızıntıları, biz var tamamen göz ardı, safça, 1024 00:44:19,270 --> 00:44:21,380 bir süre için ve tehlikeleri bertaraf. 1025 00:44:21,380 --> 00:44:23,140 Ama hepsi, çıkıyor Bu sefer, her 1026 00:44:23,140 --> 00:44:26,620 Eğer getString aradım Programlarımızın çok, 1027 00:44:26,620 --> 00:44:28,930 Eğer işletim soruyorsun bellek sistemi, 1028 00:44:28,930 --> 00:44:32,070 ancak herhangi bir hatırlama var her zamankinden veriyor 1029 00:44:32,070 --> 00:44:36,169 geri, yapıyor unalloc, ya da ücretsiz, denir olarak. 1030 00:44:36,169 --> 00:44:37,960 Hayır, çünkü biz asla ettik Bunu yapmak istedi. 1031 00:44:37,960 --> 00:44:41,250 >> Ama bütün bu zaman, programlar C yazma oldum 1032 00:44:41,250 --> 00:44:43,800 bellek sızıntısı edilmiştir, işletim soran 1033 00:44:43,800 --> 00:44:46,190 Daha fazla ve daha fazla sistem dizeleri ve etajer için hafıza, 1034 00:44:46,190 --> 00:44:47,870 ama geri teslim olmadı. 1035 00:44:47,870 --> 00:44:50,080 Ve şimdi bu biraz Bir tefrit, 1036 00:44:50,080 --> 00:44:53,550 ama hiç ettik eğer Mac çalıştırmak veya oldukça zaman, açılış için PC 1037 00:44:53,550 --> 00:44:55,790 birçok program, belki programları kapatmayı 1038 00:44:55,790 --> 00:44:57,795 ve olsa bile senin Bilgisayar çöktü değil, 1039 00:44:57,795 --> 00:45:01,690 o, çok yavaş gidiyor Gerçekten var sanki 1040 00:45:01,690 --> 00:45:04,290 Bellek bir sürü kullanarak veya kaynaklar, olsa, 1041 00:45:04,290 --> 00:45:06,070 Eğer değilseniz bile Klavyeyi dokunmadan, 1042 00:45:06,070 --> 00:45:10,430 Bu göre-- ancak always-- olabilir olabilir programlar koşuyoruz ki olacak 1043 00:45:10,430 --> 00:45:11,920 kendilerini bellek sızıntıları var. 1044 00:45:11,920 --> 00:45:15,645 Ve onlar daha için OS sormaya devam Daha fazla bellek, ancak bu konuda unutmadan, 1045 00:45:15,645 --> 00:45:18,470 Aslında, bunu kullanarak değil ama Bu nedenle uzak bellek alarak 1046 00:45:18,470 --> 00:45:20,500 Bunu isteyebilirsiniz diğer programlardan. 1047 00:45:20,500 --> 00:45:23,940 Yani ortak bir açıklama. 1048 00:45:23,940 --> 00:45:25,940 Şimdi burada nerede Valgrind en bulunuyor çıkış tamamen 1049 00:45:25,940 --> 00:45:29,290 Bu daha az iğrenç ve hem daha rahat. 1050 00:45:29,290 --> 00:45:32,690 Ama ilginç şeyler burada doğru kadar. 1051 00:45:32,690 --> 00:45:37,060 Bana bir geçersiz yazma anlatıyor boyutu dört, bu programda olur 1052 00:45:37,060 --> 00:45:40,640 Özellikle, memory.c hattı 21'de. 1053 00:45:40,640 --> 00:45:45,450 >> Ben gerçekten, hm, 21 hat için oraya gitmek boyutu dört geçersiz yazma olduğunu. 1054 00:45:45,450 --> 00:45:46,250 Neden size dört? 1055 00:45:46,250 --> 00:45:49,500 Peki, bu number-- ve herhangibirşey olabilecek bir int. 1056 00:45:49,500 --> 00:45:50,450 Yani dört bayt var. 1057 00:45:50,450 --> 00:45:52,550 Yani dört bayt atıyorum nerede ait değildir. 1058 00:45:52,550 --> 00:45:55,080 İşte ne Valgrind var aslında bana anlatıyor. 1059 00:45:55,080 --> 00:45:57,600 Ayrıca, aynı zamanda olacak göreceğiz gibi, söyle, 1060 00:45:57,600 --> 00:46:01,490 Eğer bu bir gelecekte pset çalıştırmak gibi, eğer Eğer gerçekten bellek, sızdırılmış olduğunuz zaman 1061 00:46:01,490 --> 00:46:05,300 Ben aradım, çünkü var malloc, ama aslında değil var 1062 00:46:05,300 --> 00:46:08,010 serbest, bu durumda, adı verilen, Hangi biz sonunda göreceğiz 1063 00:46:08,010 --> 00:46:09,830 malloc tersidir. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Peki şimdi, ben, bir son örneği bence. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Yani bu bir biraz daha var gizli, ancak belki de var 1068 00:46:16,690 --> 00:46:19,180 en büyük nedeni bellek ile dikkatli olun 1069 00:46:19,180 --> 00:46:24,490 ve neden birçok program ve hatta bu gün / veya web sunucuları, 1070 00:46:24,490 --> 00:46:28,200 yerde kötü adamlar tarafından devralınması internette şekilde kim 1071 00:46:28,200 --> 00:46:33,390 sunucunuza sahte paketleri gönderme Hesaplarınızı uzlaşmaya çalışırken, 1072 00:46:33,390 --> 00:46:36,420 veya veri almak, ya da sadece Genellikle bir makine devralacak. 1073 00:46:36,420 --> 00:46:38,910 Tampon taşması gibi isim, araçları da anlaşılacağı 1074 00:46:38,910 --> 00:46:40,740 değil bir int, ama bir tampon taşan. 1075 00:46:40,740 --> 00:46:43,490 Ve bir tampon sadece bir fantezi yoludur diyerek bellekte bir avuç. 1076 00:46:43,490 --> 00:46:46,710 >> Ve gerçekten, ben bir dize denir yerine s tampon, önce. 1077 00:46:46,710 --> 00:46:49,234 Bir tampon eğer Çünkü, YouTube anlamında olduğu gibi, 1078 00:46:49,234 --> 00:46:52,400 ya da bir videoyu izliyor her zaman, Eğer kelime tamponlama görmüş olabilir, 1079 00:46:52,400 --> 00:46:53,040 nokta, nokta nokta. 1080 00:46:53,040 --> 00:46:54,240 İnanılmaz sinir bozucu. 1081 00:46:54,240 --> 00:46:55,990 Ve bu sadece anlamına gelir video oynatıcı bu 1082 00:46:55,990 --> 00:46:58,710 çok indirmek için çalışıyor bayt bayt, bir sürü 1083 00:46:58,710 --> 00:47:00,170 internetten bir video. 1084 00:47:00,170 --> 00:47:02,920 Ama yavaş, bu yüzden çalışıyor Bunlardan bir demet indirmek için 1085 00:47:02,920 --> 00:47:06,430 böylece, bir tampon maddesi, bir konteyner, doldurmak için Bunu daha sonra can yeterli bayt 1086 00:47:06,430 --> 00:47:09,174 size videoyu göstermek Sürekli duraklamadan. 1087 00:47:09,174 --> 00:47:11,340 Ama yapabilirsiniz, çıkıyor Bu büyük bir tampon var. 1088 00:47:11,340 --> 00:47:15,710 Ama bu kadar veri koymak deneyin o, ve çok kötü şeyler olabilir. 1089 00:47:15,710 --> 00:47:22,780 Yani örneğin, en bakalım Örneğin bu son iltifat. 1090 00:47:22,780 --> 00:47:24,720 Bu da başka bir program Bu, ilk bakışta, 1091 00:47:24,720 --> 00:47:26,540 Süper yararlı bir şey yapmaz. 1092 00:47:26,540 --> 00:47:29,590 Bu ana fonksiyonu var Bu f bu işlevi çağırır. 1093 00:47:29,590 --> 00:47:36,640 Ve bu fonksiyon, f, buraya, var Bir karakter dizisi, büyüklüğü 12, c çağırdı. 1094 00:47:36,640 --> 00:47:39,340 Ve sonra bu kullanıyor Yeni işlev strncpy çağırdı. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Bu basit, çıkıyor, kod basit çizgi, sadece iki satır, 1097 00:47:45,190 --> 00:47:49,130 biz benim bütün programı yaptık ve bu nedenle, benim tüm bilgisayar, 1098 00:47:49,130 --> 00:47:54,000 ve benim kullanıcı hesabı ve benim sert herkese potansiyel savunmasız sürücü 1099 00:47:54,000 --> 00:47:58,170 kim bilir ve çalıştırmak için yeterince iyi Belirli bir komut satırı ile bu program, 1100 00:47:58,170 --> 00:47:58,900 argüman. 1101 00:47:58,900 --> 00:48:03,400 Diğer bir deyişle, bu kötü adam yazarak argvargv [1] içinde koyar 1102 00:48:03,400 --> 00:48:08,750 Klavyede çok özel hazırlanmış bir Dize, değil abc, 123, ama aslında, 1103 00:48:08,750 --> 00:48:15,180 yürütülebilir temsil ikili sembolleri kod, o yazdığı bir program, 1104 00:48:15,180 --> 00:48:19,190 bu basit bir program ile programları binlerce temsili 1105 00:48:19,190 --> 00:48:23,610 bu, Daresay benzer savunmasız o sonuçta silebilirsiniz 1106 00:48:23,610 --> 00:48:26,680 benim sabit diskteki dosyalar, bir olsun o olabilir böylece istemi yanıp 1107 00:48:26,680 --> 00:48:30,170 kendi komutları yazın, kendime tüm dosyaları e-posta. 1108 00:48:30,170 --> 00:48:34,660 Yapabileceğim bir şey, o ya da o bu kodla yapabilirsiniz. 1109 00:48:34,660 --> 00:48:36,575 >> Biz oldukça henüz bu çözmez. 1110 00:48:36,575 --> 00:48:38,700 Ve aslında, bu gidiyor Biraz resim dahil 1111 00:48:38,700 --> 00:48:41,470 Bu gibi yakında geleceğiz hangi Tüm iyi anlamak için. 1112 00:48:41,470 --> 00:48:44,480 Ama bugün için, en üstünde bitirelim , biraz daha umarım, ne 1113 00:48:44,480 --> 00:48:48,360 anlaşılabilir XKCD şaka, Önümüzdeki zaman devam kadar. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Tamam. 1116 00:48:51,600 --> 00:48:53,446 Çarşamba günü görüşürüz. 1117 00:48:53,446 --> 00:48:54,754 >> [MÜZİK OYUN] 1118 00:48:54,754 --> 00:48:57,790 >> HOPARLÖR: Ve şimdi, derin DAV Farnham tarafından düşünceler. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Bellek yığını içine atlama gibi Bir Pazar öğleden sonra altın yapraklar. 1121 00:49:04,770 --> 00:49:09,000 Rüzgar üfleme, savurma senin oh saçın, ben gün when-- özledim 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [KAHKAHA] 1124 00:49:12,650 --> 00:49:13,750