1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [REPRODUCCIÓ DE MÚSICA] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. Malan: Molt bé. 4 00:00:12,640 --> 00:00:14,525 Això és CS50. 5 00:00:14,525 --> 00:00:16,009 I aquest és el començament de la setmana 5. 6 00:00:16,009 --> 00:00:18,050 I com t'hauràs adonat, alguns dels materials 7 00:00:18,050 --> 00:00:21,050 és cada vegada una mica més complexa, el poc dens. 8 00:00:21,050 --> 00:00:24,560 >> I és molt fàcil, especialment si vostè ha estat en l'hàbit durant algun temps, 9 00:00:24,560 --> 00:00:28,600 estar tractant de gargots més qualsevol cosa que fem, estem dient a classe. 10 00:00:28,600 --> 00:00:31,626 Però s'adonen, que no és potser l'enfocament pedagògic ideals 11 00:00:31,626 --> 00:00:34,250 per a l'aprenentatge d'aquest tipus de material, i el material de manera més general. 12 00:00:34,250 --> 00:00:37,250 I així tenim el plaer de anunciar pròpia gheng que CS50 13 00:00:37,250 --> 00:00:39,780 Gong ha començat a preparar un conjunt canònic de notes 14 00:00:39,780 --> 00:00:42,100 per al curs, l'esperança de i és que, un, aquests 15 00:00:42,100 --> 00:00:44,030 no només servir com un de referència i un recurs 16 00:00:44,030 --> 00:00:47,410 per revisar el material i va de tornada a través de material que pogués tenir 17 00:00:47,410 --> 00:00:51,230 li va escapar la primera vegada, però També perquè els seus caps poden ser més 18 00:00:51,230 --> 00:00:53,740 dalt que a baix, quan es arriba el moment de donar una conferència, 19 00:00:53,740 --> 00:00:56,960 pel que és possible de participar més pensatiu, com 20 00:00:56,960 --> 00:00:59,170 enfront dels més scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Dit això, el que trobarà a el lloc web és documents com aquest. 22 00:01:02,510 --> 00:01:04,660 I fixin-, a la part superior esquerra, hi ha no només una taula de continguts, 23 00:01:04,660 --> 00:01:06,920 sinó també els codis de temps que li saltarà immediatament 24 00:01:06,920 --> 00:01:09,077 a la part apropiada en el vídeo en línia. 25 00:01:09,077 --> 00:01:11,410 I ho ha fet aquí Chang és, essencialment, documentat 26 00:01:11,410 --> 00:01:13,340 el que va succeir en aquest especialment conferència. 27 00:01:13,340 --> 00:01:16,370 I moltes de les conferències són ja en línia ara amb aquesta URL. 28 00:01:16,370 --> 00:01:20,110 I seguirem per publicar la resta dels que a finals d'aquesta setmana, 29 00:01:20,110 --> 00:01:22,380 així que aprofitar aquest recurs. 30 00:01:22,380 --> 00:01:25,740 >> Així que sense més preàmbuls, comencem a pelar 31 00:01:25,740 --> 00:01:28,180 la capa que ha estat cadena durant algun temps. 32 00:01:28,180 --> 00:01:30,670 I ho vam dir una cadena en realitat és la setmana passada? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Estrelles Així caràcters. 35 00:01:32,900 --> 00:01:34,900 I l'estrella char, així, el que què significa això realment? 36 00:01:34,900 --> 00:01:37,150 Bé, tot aquest temps, si hem estat cridada a una funció, 37 00:01:37,150 --> 00:01:40,450 com getString i emmagatzematge la crida de retorn 38 00:01:40,450 --> 00:01:42,910 valor d'getString en un variable-- es diu 39 00:01:42,910 --> 00:01:47,721 s tipus string-- hem estat escrivint la línia de codi que hi ha allà dalt. 40 00:01:47,721 --> 00:01:49,970 I és només quan veig al meu escriptura magnificada aquí 41 00:01:49,970 --> 00:01:51,930 m'adono del atroç que és això. 42 00:01:51,930 --> 00:01:54,180 >> No obstant això, anem a suposar que, en el costat dret 43 00:01:54,180 --> 00:01:57,070 és, però, una raonable representació del que és 44 00:01:57,070 --> 00:01:58,880 estat succeint tot això temps amb getString. 45 00:01:58,880 --> 00:02:00,380 getString, per descomptat, crear una cadena. 46 00:02:00,380 --> 00:02:01,691 Però, què significa això realment? 47 00:02:01,691 --> 00:02:04,190 En aquest cas es posa un tros de de memòria des del sistema operatiu 48 00:02:04,190 --> 00:02:06,040 cridant a una funció, anomenada malloc. 49 00:02:06,040 --> 00:02:07,390 Però més sobre això més endavant. 50 00:02:07,390 --> 00:02:09,139 I llavors pobla que parteix de la memòria 51 00:02:09,139 --> 00:02:11,764 amb les lletres l'usuari té escrit en, seguit de, per descomptat, 52 00:02:11,764 --> 00:02:14,800 un caràcter nul, ni la barra invertida zero al final. 53 00:02:14,800 --> 00:02:18,280 >> Mentrestant, a la banda esquerra d'aquesta història, tot aquest temps, 54 00:02:18,280 --> 00:02:20,850 hem estat declarant una variable, com s. 55 00:02:20,850 --> 00:02:24,770 I aquesta variable és el que ara es comença a trucar a un punter. 56 00:02:24,770 --> 00:02:29,190 No és una caixa a l'interior posem la cadena, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 sinó que posem en aquesta plaça caixa de l'esquerra què és exactament? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Sí? 60 00:02:35,390 --> 00:02:37,118 >> AUDIÈNCIA: La direcció de on es troba a la memòria. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. Malan: Exactament. 62 00:02:38,118 --> 00:02:40,690 La direcció d'on Daven es troba a la memòria. 63 00:02:40,690 --> 00:02:44,650 I no en tots Daven es troba, per se, sinó específicament la direcció 64 00:02:44,650 --> 00:02:45,150 de què? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Sí? 67 00:02:46,810 --> 00:02:47,460 >> AUDIÈNCIA: Primer caràcter. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. Malan: El primer caràcter en Daven, que, en aquest cas, 69 00:02:50,209 --> 00:02:53,820 Em proposava era arbitrària i poc realista 1, Ox1, 70 00:02:53,820 --> 00:02:55,910 que només significa la nombre hexadecimal d'1. 71 00:02:55,910 --> 00:02:57,993 Però probablement va en ser un nombre molt més gran 72 00:02:57,993 --> 00:03:01,260 que podríem anomenar la amb un 0x com un prefix, 73 00:03:01,260 --> 00:03:02,806 representa un caràcter hexadecimal. 74 00:03:02,806 --> 00:03:05,930 I pel fet que no necessitem saber on la resta dels caràcters de Daven 75 00:03:05,930 --> 00:03:09,860 són, de manera que el disseny senzill decisió que va ser feta fa molts anys? 76 00:03:09,860 --> 00:03:10,548 Sí? 77 00:03:10,548 --> 00:03:11,651 >> AUDIÈNCIA: backslash 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. Malan: Sí, exactament. 79 00:03:12,900 --> 00:03:18,100 La barra invertida 0 li permet, encara que de temps lineal, per travessar la cadena, 80 00:03:18,100 --> 00:03:20,400 caminar d'esquerra a dreta, amb un bucle, o un temps 81 00:03:20,400 --> 00:03:22,608 llaç, o alguna cosa així això, i determinar, oh, aquí 82 00:03:22,608 --> 00:03:24,751 és el final d'aquesta cadena particular. 83 00:03:24,751 --> 00:03:27,000 Així que amb només la direcció en el principi d'una cadena, 84 00:03:27,000 --> 00:03:30,290 podem accedir a la totalitat de , Perquè durant tot aquest temps, 85 00:03:30,290 --> 00:03:32,030 una cadena només ha estat una estrella de carbó. 86 00:03:32,030 --> 00:03:36,370 >> Pel que és sens dubte molt bé per continuar utilitzant la biblioteca CS50 i aquesta abstracció, 87 00:03:36,370 --> 00:03:38,440 per així dir-ho, però anem a començar a veure exactament 88 00:03:38,440 --> 00:03:41,230 el que ha estat passant sota de tot aquest temps. 89 00:03:41,230 --> 00:03:45,260 Així que vostè pot recordar aquest exemple, també, de l'última vegada, comparar 0, 90 00:03:45,260 --> 00:03:47,300 que no compari realitat. 91 00:03:47,300 --> 00:03:49,070 Però vam començar a resoldre això. 92 00:03:49,070 --> 00:03:52,020 >> Però com potser un refresc, podria jo interessar a algú 93 00:03:52,020 --> 00:03:54,261 en un elefant rosa avui, també fabricada per Chang? 94 00:03:54,261 --> 00:03:55,760 ¿I vostè davant? [Inaudible]. 95 00:03:55,760 --> 00:03:56,660 Anem amunt. 96 00:03:56,660 --> 00:03:58,740 >> I mentrestant, a mesura que sorgeixen, anem a 97 00:03:58,740 --> 00:04:01,670 considerar per un moment el que Aquest codi va ser realment fent. 98 00:04:01,670 --> 00:04:04,917 Es declara dues variables dalt superior, s i t, i cridant getString. 99 00:04:04,917 --> 00:04:08,250 Aquest no és un programa molt fàcil d'usar, perquè no et diu què fer. 100 00:04:08,250 --> 00:04:10,541 Però anem a suposar que estem centrant-se en la part sucosa. 101 00:04:10,541 --> 00:04:14,470 I llavors el que fem, si s és igual a és igual a t, ha de dir printf, 102 00:04:14,470 --> 00:04:16,170 que ha escrit la mateixa cosa. 103 00:04:16,170 --> 00:04:16,670 Hola. 104 00:04:16,670 --> 00:04:17,050 Quin és el teu nom? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. Malan: Janelle, Encantada de conèixer-te. 107 00:04:19,529 --> 00:04:21,800 Així que el seu desafiament a la mà per a aquest elefant 108 00:04:21,800 --> 00:04:25,230 és primer ens facin un dibuix del que és està representat en els dos primers 109 00:04:25,230 --> 00:04:25,970 línies. 110 00:04:25,970 --> 00:04:28,139 Així que s i t pot ser representat la forma a la pantalla? 111 00:04:28,139 --> 00:04:30,680 I només es pot dibuixar amb el dit en aquesta pantalla gran. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Així que hi ha dues meitats a cada costat de l'equació. 114 00:04:34,510 --> 00:04:37,760 Així que hi ha es de l'esquerra, i llavors getString a la dreta. 115 00:04:37,760 --> 00:04:40,540 I després hi ha el t de l'esquerra, i després getString a la dreta. 116 00:04:40,540 --> 00:04:42,630 Llavors, ¿com podríem començar un dibuix que 117 00:04:42,630 --> 00:04:46,340 representa el que està passant aquí a la memòria, què li diries? 118 00:04:46,340 --> 00:04:49,150 I m'ho dius a mi deixar-te expliques el que estàs fent sobre la marxa. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Bé, en primer lloc, que estaria demanant a obtenir la cadena d'entrada. 121 00:04:58,890 --> 00:05:00,439 I seria almacén-- oh, ho sento. 122 00:05:00,439 --> 00:05:01,230 DAVID J. Malan: OK. 123 00:05:01,230 --> 00:05:01,730 Bé. 124 00:05:01,730 --> 00:05:03,330 I això es diu, ¿què? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Segueix endavant. 127 00:05:04,450 --> 00:05:05,575 No vaig voler interrompre. 128 00:05:05,575 --> 00:05:07,060 Janelle: Ho sento. 129 00:05:07,060 --> 00:05:14,237 Pel que seria l'entrada en la direcció no de-- segur. 130 00:05:14,237 --> 00:05:17,320 No puc recordar exactament el nombre, però crec que començava amb 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. Malan: Està bé, perquè vaig fer els números cap amunt, 132 00:05:18,420 --> 00:05:19,650 així que no hi ha resposta correcta. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: A partir de la 0 d'arc. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. Malan: OK, de manera que l'element 0. 135 00:05:24,000 --> 00:05:24,765 Clar. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: I després, si era com només un dos-letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. Malan: OK, de nou a vostè. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Així que l'element 0, i a continuació, l'element 1 o de l'element 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. Malan: I què peça de la imatge se li dibuixava en aquest moment? 140 00:05:36,670 --> 00:05:37,690 La crida a getString? 141 00:05:37,690 --> 00:05:38,830 O la declaració de s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: La declaració de s, crec. 143 00:05:42,890 --> 00:05:45,980 Oh, la getString, perquè faria ser introduïda en cadascun [? àrea. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. Malan: Good. 145 00:05:46,510 --> 00:05:47,051 Exactament. 146 00:05:47,051 --> 00:05:49,300 Tot i que això efectivament retorna una matriu, el record, 147 00:05:49,300 --> 00:05:53,300 quan tornem una cadena, podem índex en aquesta cadena usant 01 i 2. 148 00:05:53,300 --> 00:05:56,180 Tècnicament, aquests són probablement representada per les direccions individuals, 149 00:05:56,180 --> 00:05:57,100 però això està bé. 150 00:05:57,100 --> 00:06:00,170 >> Així que suposem que, si puc només és ràpid remetre a on ho vam deixar 151 00:06:00,170 --> 00:06:04,320 l'última vegada, si un les cordes era g a b i, 152 00:06:04,320 --> 00:06:10,337 barra invertida 0, la qual cosa representa una de gabe d'entrada, com podríem representar s ara? 153 00:06:10,337 --> 00:06:12,670 Si aquesta és la memòria que és estat retornat per getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Seria representat per un arc? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. Malan: Per un arc? 157 00:06:18,750 --> 00:06:19,130 Bé, no. 158 00:06:19,130 --> 00:06:21,171 Diguem, il · lustrat, m'ho dius a mi seguir endavant 159 00:06:21,171 --> 00:06:25,710 i proposar que, si això és s, aquest és el valor retornat per getString. 160 00:06:25,710 --> 00:06:29,482 I que ha dibuixat això com 0, 1, 2, que és perfectament raonable, perquè 161 00:06:29,482 --> 00:06:30,940 pot indexar a la cadena, com a tal. 162 00:06:30,940 --> 00:06:33,340 Però només per estar d'acord amb l'última vegada, deixa anar per davant 163 00:06:33,340 --> 00:06:37,310 i proposar arbitràriament que aquest és la direcció 1, aquesta és l'adreça 2, 164 00:06:37,310 --> 00:06:39,597 Aquesta és l'adreça 3, i així successivament. 165 00:06:39,597 --> 00:06:41,430 I així, només per estar súper clar, el que passa 166 00:06:41,430 --> 00:06:44,580 anar en si com a resultat d'aquest primera línia de codi, què li diries? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Direcció 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. Malan: Exactament. 169 00:06:46,420 --> 00:06:47,190 Així abordar 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 I mentrestant, deixa que me'n vagi per davant i duplicarien gran part del que has fet 172 00:06:51,230 --> 00:06:52,740 i afegir el meu propi t aquí. 173 00:06:52,740 --> 00:06:56,340 Si hagués d'escriure gabe de nou, un segon temps, 174 00:06:56,340 --> 00:07:01,530 quan se li demani amb getString, on, per descomptat, es gabe anirà? 175 00:07:01,530 --> 00:07:02,280 Bé, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Igual que en aquesta llista? 178 00:07:05,975 --> 00:07:06,850 DAVID J. Malan: Si. 179 00:07:06,850 --> 00:07:08,516 Janelle: O és també en les mateixes caixes? 180 00:07:08,516 --> 00:07:11,940 DAVID J. Malan: Déjame proposo, sí, exactament, pel que en aquestes caixes addicionals. 181 00:07:11,940 --> 00:07:15,230 Però el que és clau ara és que, fins i tot encara que jo he dibuixat aquests molt a prop 182 00:07:15,230 --> 00:07:18,650 junts-- 0x1, aquest es 0x2-- en la realitat, 183 00:07:18,650 --> 00:07:25,750 això ara podria ser la direcció 0x10, per exemple, i 0x11, i 0x12, 184 00:07:25,750 --> 00:07:26,870 i així successivament. 185 00:07:26,870 --> 00:07:29,955 I així, si aquest és el cas, el que va a acabar ací, en t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. Malan: Exactament. 188 00:07:31,830 --> 00:07:33,180 Així 0x10. 189 00:07:33,180 --> 00:07:34,570 I ara, la pregunta final. 190 00:07:34,570 --> 00:07:37,510 Has, de moment, va haver de treballar el més difícil per a un elefant fins al moment. 191 00:07:37,510 --> 00:07:42,650 Per ara, si m'aixeco el codi de nou, quan ho faig, en la línia 3, 192 00:07:42,650 --> 00:07:47,630 si s és igual a és igual a t, el que estic realment comparant que hem dibuixat aquí? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Les dues direccions? 194 00:07:49,271 --> 00:07:50,270 DAVID J. Malan: Exactament. 195 00:07:50,270 --> 00:07:53,350 Així que jo estic dient és S igual igual at? 196 00:07:53,350 --> 00:07:56,210 En altres paraules, és igual 1 igual a 10? 197 00:07:56,210 --> 00:07:59,710 I, per descomptat, la resposta òbvia ara és, no. 198 00:07:59,710 --> 00:08:02,920 I pel que aquest programa és en última instància, va a imprimir el que, què li diries? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Seria, que ha escrit la mateixa cosa? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. Malan: Així que si s és 1 i t és de 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Ha escrit diferents coses. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. Malan: Exactament. 204 00:08:13,570 --> 00:08:14,480 Ha escrit diferents coses. 205 00:08:14,480 --> 00:08:14,850 Bé. 206 00:08:14,850 --> 00:08:16,714 Així que un aplaudiment, si poguéssim, aquí. 207 00:08:16,714 --> 00:08:17,214 [Aplaudiments] 208 00:08:17,214 --> 00:08:17,708 Això va ser dolorós. 209 00:08:17,708 --> 00:08:18,208 Ho sé. 210 00:08:18,208 --> 00:08:19,684 Molt ben fet. 211 00:08:19,684 --> 00:08:24,690 Així que ara anem a veure si no podem esmicolar el que era la solució. 212 00:08:24,690 --> 00:08:28,040 I per descomptat, quan ens fixem esto-- que ara vaig a represento a green-- 213 00:08:28,040 --> 00:08:29,690 vam fer un parell de millores aquí. 214 00:08:29,690 --> 00:08:32,409 En primer lloc, igual que un seny comprovar, estic consultar primer 215 00:08:32,409 --> 00:08:35,110 si s és igual a nul i t és igual a zero. 216 00:08:35,110 --> 00:08:39,440 I només per ser clars, quan podria s o t ser nul en codi com aquest? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Quan poden s o t ser nul. 219 00:08:44,490 --> 00:08:44,990 Sí? 220 00:08:44,990 --> 00:08:45,990 >> AUDIÈNCIA: [inaudible]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. Malan: Exactament. 223 00:08:50,510 --> 00:08:52,840 Si la cadena que l'usuari teclejat és massa llarg 224 00:08:52,840 --> 00:08:56,140 per cabre en la memòria, o alguna cas cantonada estrany com això, 225 00:08:56,140 --> 00:08:59,010 getString, com veurem, literalment avui, en la seva documentació, 226 00:08:59,010 --> 00:09:02,330 diu que retornarà un valor nul com un valor especial sentinella, 227 00:09:02,330 --> 00:09:05,417 o simplement una mena de símbol especial això vol dir que alguna cosa va sortir malament. 228 00:09:05,417 --> 00:09:07,500 Així que volem comprovar si hi ha que, perquè resulta que 229 00:09:07,500 --> 00:09:09,720 que nul és un valor molt perillós. 230 00:09:09,720 --> 00:09:14,250 >> Sovint, si vostè tracta de fer alguna cosa amb nul que implica un function-- passant 231 00:09:14,250 --> 00:09:17,470 com a entrada, per instance-- aquesta funció podria molt s'estavellarà i, amb ella, 232 00:09:17,470 --> 00:09:19,090 acabar amb tot el seu programa. 233 00:09:19,090 --> 00:09:22,570 Així que aquesta tercera línia ara és només un seny comprovar, comprovació d'errors, si es vol. 234 00:09:22,570 --> 00:09:25,450 Això és un bon hàbit ara per ens fiquem en qualsevol moment que 235 00:09:25,450 --> 00:09:28,050 tractar d'usar un valor que podrien, potencialment, ser nul. 236 00:09:28,050 --> 00:09:32,000 >> Ara, en la quarta línia d'aquí, "Si strcmp (s, t)," bé, 237 00:09:32,000 --> 00:09:33,180 ¿Quin és el que es refereix a? 238 00:09:33,180 --> 00:09:36,750 Bé, vam dir que això era una manera molt succinta funció anomenada per a la comparació de cadenes. 239 00:09:36,750 --> 00:09:40,370 I el seu propòsit a la vida és comparar el seu primer argument en contra d'ella en segon lloc, 240 00:09:40,370 --> 00:09:44,640 però no en termes de les seves direccions, com ho vam fer sense voler un moment 241 00:09:44,640 --> 00:09:48,270 fa amb el codi vermell, però en lloc de comparar els dos 242 00:09:48,270 --> 00:09:53,210 cadenes al humanament intuïtiva mitjançant la comparació d'aquesta manera, en contra d'aquest, 243 00:09:53,210 --> 00:09:56,690 contra això, contra això, i després s'aturen si i quan un 244 00:09:56,690 --> 00:09:59,590 o els dos dels meus dits realitza una barra invertida 0. 245 00:09:59,590 --> 00:10:04,530 Strcmp Així que fa anys algú implementades per posar en pràctica per a nosaltres la funcionalitat 246 00:10:04,530 --> 00:10:08,890 que esperem ens haguéssim aconseguit només per comparació de dos valors simples. 247 00:10:08,890 --> 00:10:14,929 >> Ara, francament, no deixo de dibuix tots aquests diversos nombres. 248 00:10:14,929 --> 00:10:17,470 Però la realitat és, que he estat fent aquests cap amunt tot el temps. 249 00:10:17,470 --> 00:10:19,580 I així que permetin-me simplement seguir endavant i gargotejar aquestes fora 250 00:10:19,580 --> 00:10:23,100 per fer un punt que, al final del dia i es mou cap endavant, 251 00:10:23,100 --> 00:10:30,160 no estem realment va a preocupar-se per el que aborda les coses són en realitat 252 00:10:30,160 --> 00:10:30,790 en la memòria. 253 00:10:30,790 --> 00:10:34,320 Així que no vaig a dibuixar aquests classes de nombres molt més, 254 00:10:34,320 --> 00:10:38,970 Sóc només un resum aquesta distància 01:00 poc més amable amb només fletxes. 255 00:10:38,970 --> 00:10:42,060 >> En altres paraules, si s és un punter, així, anem a dibuixar és, literalment, 256 00:10:42,060 --> 00:10:45,430 com un punter, una fletxa apuntant de si mateix a una altra cosa, 257 00:10:45,430 --> 00:10:48,280 i no et preocupis massa més sobre les minúcies d'aquestes adreces 258 00:10:48,280 --> 00:10:49,910 que, de nou, vaig fer de totes maneres. 259 00:10:49,910 --> 00:10:52,680 Però anem a veure aquestes adreces, de vegades, quan la depuració del codi. 260 00:10:52,680 --> 00:10:56,450 >> Ara mentre tant, aquest programa aquí correccions, és clar, 261 00:10:56,450 --> 00:10:58,720 aquest problema comparant aquestes dues cadenes. 262 00:10:58,720 --> 00:11:00,260 Però ens trobem amb un altre problema. 263 00:11:00,260 --> 00:11:03,180 Aquesta era de la còpia programar l'última vegada, 264 00:11:03,180 --> 00:11:06,880 amb la qual cosa, jo estava tractant de capitalitzar només el primer caràcter d'una cadena. 265 00:11:06,880 --> 00:11:09,620 Però el que era el símptoma vam veure l'última vegada quan 266 00:11:09,620 --> 00:11:14,150 un usuari va escriure en un valor, com gabe en minúscules, per s, 267 00:11:14,150 --> 00:11:19,310 llavors assignem s en t, com en la tercera línia d'allà, 268 00:11:19,310 --> 00:11:22,900 i després vaig tractar de capitalitzar t suport 0? 269 00:11:22,900 --> 00:11:25,950 Quin va ser l'efecte de la canviant t suport 0 aquí? 270 00:11:25,950 --> 00:11:27,150 >> AUDIÈNCIA: Va canviar s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. Malan: Sí, Vaig canviar s, també. 272 00:11:29,360 --> 00:11:31,050 Perquè el que realment estava passant? 273 00:11:31,050 --> 00:11:34,130 Bé, deixa veure si puc netejar aquesta imatge, com segueix. 274 00:11:34,130 --> 00:11:41,390 >> Si s és, de nou, la paraula g, a, b, i, barra invertida, 0 i s 275 00:11:41,390 --> 00:11:44,084 continuarem dibuix com una caixa aquí, però hi ha més adreces. 276 00:11:44,084 --> 00:11:45,250 Anem a deixar de fer les coses. 277 00:11:45,250 --> 00:11:47,510 Anem a fer un dibuix per simplificar el món. 278 00:11:47,510 --> 00:11:52,640 >> Quan declaro t amb una corda t, que cregui que part de la memòria. 279 00:11:52,640 --> 00:11:55,850 Plaça passa a ser 32 bits en la majoria d'ordinadors. 280 00:11:55,850 --> 00:11:59,530 De fet, si alguna vegada has sentit parlar d'un ordinador que té una arquitectura de 32 bits, 281 00:11:59,530 --> 00:12:03,000 realment de luxe-parlar, que només vol dir que utilitza adreces de 32 bits. 282 00:12:03,000 --> 00:12:05,370 I com una tècnica a un costat, si alguna vegada s'ha preguntat 283 00:12:05,370 --> 00:12:09,630 ¿Per què els equips més antics, si realment tractat de sopa per dalt amb una gran quantitat de memòria RAM, 284 00:12:09,630 --> 00:12:12,360 només podia tenir un màxim de quatre gigabytes de RAM, 285 00:12:12,360 --> 00:12:14,860 bé això és perquè, literalment, seu antic equip només podia 286 00:12:14,860 --> 00:12:17,250 comptar tan alt com 4 mil milions, 4000000000 de bytes, 287 00:12:17,250 --> 00:12:20,590 perquè estava usant 32 bits números d'adreces. 288 00:12:20,590 --> 00:12:23,260 >> Però en qualsevol cas, en aquest exemple, d'història molt més simple. 289 00:12:23,260 --> 00:12:27,250 t és només un altre punter, o realment una estrella char, també conegut com a cadena. 290 00:12:27,250 --> 00:12:30,860 I com és el que vull per actualitzar la imatge ara amb la segona línia de codi, 291 00:12:30,860 --> 00:12:31,950 després del punt, punt, punt? 292 00:12:31,950 --> 00:12:35,845 Quan faig cadena t és igual a s punt i coma, Com canvia aquesta foto? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Sí? 295 00:12:38,000 --> 00:12:38,916 >> AUDIÈNCIA: [inaudible]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. Malan: Si. 298 00:12:42,020 --> 00:12:42,600 Exactament. 299 00:12:42,600 --> 00:12:45,620 Acabo de posar una fletxa de la t caixa a la mateixa direcció, 300 00:12:45,620 --> 00:12:47,570 la mateixa primera lletra va donar. 301 00:12:47,570 --> 00:12:50,850 O tècnicament, si això noi estaven encara en 0x1, 302 00:12:50,850 --> 00:12:53,052 és com si tingués 0x1 0x1 aquí i aquí. 303 00:12:53,052 --> 00:12:54,760 Però, de nou, a qui li importa sobre les direccions? 304 00:12:54,760 --> 00:12:56,345 És només la idea que ara importa. 305 00:12:56,345 --> 00:12:57,720 Així que això és el que està passant aquí. 306 00:12:57,720 --> 00:13:02,690 Així que per descomptat, si ho fa t suport 0, que és la notació de matriu, 307 00:13:02,690 --> 00:13:05,650 descomptat-- i, francament, sembla que hi ha una gran varietat aquí, 308 00:13:05,650 --> 00:13:07,340 però ara hi ha una cosa estranya. 309 00:13:07,340 --> 00:13:11,160 Has de saber que el llenguatge de programació, C, li ofereix aquesta funció, 310 00:13:11,160 --> 00:13:14,650 de manera que, fins i tot si t és un punter, o s és un punter, 311 00:13:14,650 --> 00:13:18,050 pot seguir utilitzant aquest familiar, claudàtor còmode 312 00:13:18,050 --> 00:13:22,520 notació per anar al primer element, o el segon element, o qualsevol element 313 00:13:22,520 --> 00:13:26,130 que aquest punter està apuntant a, ja que, presumiblement, es 314 00:13:26,130 --> 00:13:29,410 és, com en aquest cas, apuntant en algun matriu. 315 00:13:29,410 --> 00:13:30,340 >> Llavors, com podem solucionar aquest problema? 316 00:13:30,340 --> 00:13:33,660 Francament, aquí és on es va aconseguir un mica aclaparador a primera vista. 317 00:13:33,660 --> 00:13:35,340 Però aquí és una versió nova i millorada. 318 00:13:35,340 --> 00:13:37,460 >> Així que primer, m'estic posant desfer-se de la biblioteca CS50, 319 00:13:37,460 --> 00:13:41,170 només per exposar que s és de fet una estrella char, només un sinònim. 320 00:13:41,170 --> 00:13:43,540 I t és també una estrella de carbó. 321 00:13:43,540 --> 00:13:48,290 Però el que està succeint en el costat dret d'aquesta línia 322 00:13:48,290 --> 00:13:49,970 on t s'assigna un valor? 323 00:13:49,970 --> 00:13:50,790 >> Què és malloc? 324 00:13:50,790 --> 00:13:51,630 Què strlen? 325 00:13:51,630 --> 00:13:52,547 Què és sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Per què dimonis fa això mirada tan complexa línia? 327 00:13:54,380 --> 00:13:55,713 Què fa a un alt nivell? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Què s'emmagatzema en t? 330 00:13:57,440 --> 00:13:58,646 Sí? 331 00:13:58,646 --> 00:14:01,104 AUDIÈNCIA: És l'assignació d'un certa quantitat d'espai de memòria. 332 00:14:01,104 --> 00:14:03,032 És per emmagatzemar, suposo, cartes [inaudible]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. Malan: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfect. 335 00:14:04,540 --> 00:14:06,650 És l'assignació d'un determinat quantitat d'espai de memòria 336 00:14:06,650 --> 00:14:08,940 per emmagatzemar, presumiblement, cartes futures. 337 00:14:08,940 --> 00:14:11,310 I en particular, malloc per tant, està tornant què? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> AUDIÈNCIA: Devolució de la [inaudible]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. Malan: Exactament. 341 00:14:15,850 --> 00:14:18,850 Tornant la direcció d'aquesta memòria, que és una forma elegant de dir, 342 00:14:18,850 --> 00:14:21,640 retorna la direcció de la primer byte d'aquesta memòria. 343 00:14:21,640 --> 00:14:25,460 La responsabilitat recau en mi recordar la quantitat de memòria que en realitat 344 00:14:25,460 --> 00:14:27,140 assignat o sol · licitat per malloc. 345 00:14:27,140 --> 00:14:28,384 >> Ara, quant és això? 346 00:14:28,384 --> 00:14:30,550 Bé, tot i que no hi ha un munt de parèntesi aquí, 347 00:14:30,550 --> 00:14:32,970 malloc pren un sol argument. 348 00:14:32,970 --> 00:14:37,250 I estic especificant strlen de s, de manera que donen em tants bytes com n'hi ha en si, 349 00:14:37,250 --> 00:14:37,800 però afegeix un. 350 00:14:37,800 --> 00:14:38,300 Per què? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Sí? 353 00:14:39,530 --> 00:14:40,840 >> AUDIÈNCIA: La barra invertida 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. Malan: Exactament. 355 00:14:41,840 --> 00:14:43,423 Hem de fer una mica de neteja. 356 00:14:43,423 --> 00:14:45,970 Així que perquè hi ha una barra invertida 0, serà millor record. 357 00:14:45,970 --> 00:14:47,310 En cas contrari, anem per crear una cadena que 358 00:14:47,310 --> 00:14:49,170 no ha de terminador especial. 359 00:14:49,170 --> 00:14:52,640 >> Mentrestant, només per estar súper anal, tinc sizeof (char), 360 00:14:52,640 --> 00:14:55,730 per si de cas algú es queda la meva codi no en l'aparell CS50, 361 00:14:55,730 --> 00:14:58,220 però potser un equip diferent en total, on caràcters 362 00:14:58,220 --> 00:15:01,470 són un byte, per convenció, però dos bytes, o alguna cosa més gran que això. 363 00:15:01,470 --> 00:15:04,490 És només de ser súper, súper reticent a errors. 364 00:15:04,490 --> 00:15:06,940 Tot i que, en realitat, és més probable que va a ser un 1. 365 00:15:06,940 --> 00:15:11,490 >> Ara, mentrestant, segueixo endavant i copio el corda, t suport i és igual a t suport s. 366 00:15:11,490 --> 00:15:14,962 I vaig a ajornar fins a la setmana del passat codi font per veure el que està passant. 367 00:15:14,962 --> 00:15:17,670 Però el punt clau, i la raó per la qual posar el codi ara en verd, 368 00:15:17,670 --> 00:15:22,520 es deu al fet que l'última línia, t suport 0 és igual ToUpper, 369 00:15:22,520 --> 00:15:25,230 té l'efecte de capitalització quina cadena? 370 00:15:25,230 --> 00:15:26,960 t i / o s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Aquesta última línia de codi. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Just t, perquè el que és passat aquest temps, 375 00:15:35,560 --> 00:15:41,500 si puc desfer una mica l'últim pas, El que passa és, quan dic a malloc, 376 00:15:41,500 --> 00:15:45,380 Jo essencialment amb si un tros de memòria que és la mateixa mida que l'original, 377 00:15:45,380 --> 00:15:47,020 perquè aquesta és l'aritmètica que vaig fer. 378 00:15:47,020 --> 00:15:50,920 Estic emmagatzemant en t la direcció d'aquest tros de memòria. 379 00:15:50,920 --> 00:15:53,370 Tot i que aquest es veu bé i bonica, agradable i en blanc, 380 00:15:53,370 --> 00:15:56,882 la realitat és que hi ha, el que anem a seguir trucant, els valors d'escombraries aquí. 381 00:15:56,882 --> 00:15:59,340 Aquest tros de memòria podria molt així s'han usat abans, 382 00:15:59,340 --> 00:16:00,940 uns segons, fa uns minuts. 383 00:16:00,940 --> 00:16:04,410 Així que no podria absolutament ser nombres o cartes allà, només per accident. 384 00:16:04,410 --> 00:16:08,580 Però no són vàlides, fins que jo poblen aquest tros de memòria 385 00:16:08,580 --> 00:16:12,510 amb caràcters reals, com jo fer en aquest bucle allà. 386 00:16:12,510 --> 00:16:13,180 Bé? 387 00:16:13,180 --> 00:16:16,180 >> Així que ara, el punt culminant de aquests tres exemples 388 00:16:16,180 --> 00:16:20,730 que van ser aparentment trencat l'última vegada, aquest exemple d'intercanvi, aquesta funció 389 00:16:20,730 --> 00:16:23,670 treballat en el sentit que va canviar a i b. 390 00:16:23,670 --> 00:16:25,620 Però no va funcionar en l'altre sentit? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Sí? 393 00:16:28,614 --> 00:16:29,612 >> AUDIÈNCIA: [inaudible]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. Malan: Exactament. 396 00:16:36,700 --> 00:16:39,530 Si hagués de trucar a aquesta funció de altre-- per exemple, 397 00:16:39,530 --> 00:16:42,870 d'una funció com a principal, on Tinc una variable, x i i, com jo 398 00:16:42,870 --> 00:16:46,160 ho va fer la setmana passada, el mateix codi, i pas en x i y 399 00:16:46,160 --> 00:16:49,860 l'intercanvi, i després trucar a Swap-- això, per descomptat, és la versió correcta 400 00:16:49,860 --> 00:16:52,220 és el que estem a punt de veure-- no va funcionar. 401 00:16:52,220 --> 00:16:53,770 Llavors, ¿quina és la solució? 402 00:16:53,770 --> 00:16:56,850 >> Bé, de manera que només per estar clar, deixa anar per davant 403 00:16:56,850 --> 00:17:05,450 y-- dóna'm un segon aquí, i veure si et puc mostrar l'última, que 404 00:17:05,450 --> 00:17:12,464 serà en-- anem a veure si puc trobar aquesta veritable Acceptar fast--, [inaudible]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 Bé, aquí està. 407 00:17:19,240 --> 00:17:21,000 Així que ignora les ordres Només estic escrivint. 408 00:17:21,000 --> 00:17:23,780 Vull que es recuperi en l'últim minut un exemple 409 00:17:23,780 --> 00:17:27,960 de l'última vegada, que ara es diu no swap. 410 00:17:27,960 --> 00:17:30,200 >> Així que no és d'intercanvi on el deixem l'última vegada, 411 00:17:30,200 --> 00:17:32,930 per la qual cosa, I inicialitza x i i d'1 a 2. 412 00:17:32,930 --> 00:17:35,840 Llavors jo dic swap, que passa a 1 i 2. 413 00:17:35,840 --> 00:17:37,930 I llavors aquesta funció treballat en algun sentit, 414 00:17:37,930 --> 00:17:40,750 però no tenia permanent efectuar en xi y. 415 00:17:40,750 --> 00:17:45,430 Així que la pregunta en qüestió és, com ara és el que realment solucioni aquest problema? 416 00:17:45,430 --> 00:17:47,820 Quina és la solució a la mà? 417 00:17:47,820 --> 00:17:53,150 >> Bé, en swap.c, que és nou avui, compte un parell de diferències. 418 00:17:53,150 --> 00:17:54,700 x i i són el mateix. 419 00:17:54,700 --> 00:17:57,250 Però el que és clarament diferent en la línia 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Què hi ha de nou allà, si vostè recorda el que semblava fa un segon? 422 00:18:01,715 --> 00:18:02,565 >> AUDIÈNCIA: [inaudible]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. Malan: Si. 424 00:18:03,440 --> 00:18:06,680 Així que els símbols d'unió són una nova peça de la sintaxi, no només en aquest programa, 425 00:18:06,680 --> 00:18:08,560 sinó també de forma més general a CS50. 426 00:18:08,560 --> 00:18:10,680 Fins ara, no crec hem vist alguns exemples 427 00:18:10,680 --> 00:18:14,070 o realment parlat d'ells en qualsevol detall, que no sigui, potser, de forma preventiva 428 00:18:14,070 --> 00:18:16,467 en secció, un símbol d'unió així. 429 00:18:16,467 --> 00:18:19,300 Bé, resulta que signe és un de les últimes peces de nova sintaxi 430 00:18:19,300 --> 00:18:20,174 anem a aprendre. 431 00:18:20,174 --> 00:18:23,500 L'únic que significa és la direcció d'alguna variable. 432 00:18:23,500 --> 00:18:25,070 En quina direcció ho fa x viuen? 433 00:18:25,070 --> 00:18:26,510 Però, ¿quina direcció i què viuen? 434 00:18:26,510 --> 00:18:28,700 Perquè si el problema fonamental abans 435 00:18:28,700 --> 00:18:32,970 es es van anar passant que x i y com còpies, el que realment volem fer 436 00:18:32,970 --> 00:18:38,780 es proporcionarà Intercanvi amb com un tresor mapa que condueix a on x i y en realitat 437 00:18:38,780 --> 00:18:41,910 són a la memòria RAM, de manera que Intercanviar pot seguir aquest mapa 438 00:18:41,910 --> 00:18:47,760 i anar a on vulgui x o i marca el lloc i canviar els valors actuals 1 i 2 439 00:18:47,760 --> 00:18:48,270 Ja està. 440 00:18:48,270 --> 00:18:50,710 >> Així Intercanviar ha de canviar una mica massa. 441 00:18:50,710 --> 00:18:53,760 I a primera vista, això podria semblar una mica similar a l'estrella de carbó. 442 00:18:53,760 --> 00:18:54,850 I de fet ho és. 443 00:18:54,850 --> 00:18:59,635 Així que a és un punter a quin tipus de dades, basat en aquesta porció ressaltada? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Així que és un int. 446 00:19:01,620 --> 00:19:04,880 >> Així que una ja no és un int, que és la direcció d'un int. 447 00:19:04,880 --> 00:19:07,910 I de manera similar, b ara va és la direcció d'un int. 448 00:19:07,910 --> 00:19:12,470 Així que quan dono la paraula d'intercanvi de principal, Jo no vaig a donar Intercanvi 1 i 2. 449 00:19:12,470 --> 00:19:15,540 Vaig a donar-li com Ox-alguna cosa i Ox-alguna cosa, 450 00:19:15,540 --> 00:19:19,820 dues direccions que condueixin Canviar per les seves ubicacions reals 451 00:19:19,820 --> 00:19:21,310 a la memòria del meu ordinador. 452 00:19:21,310 --> 00:19:25,580 >> Així que ara, la meva implementació restant ha de canviar una mica. 453 00:19:25,580 --> 00:19:28,650 Quin és òbviament diferent ara en aquestes tres línies de codi? 454 00:19:28,650 --> 00:19:31,350 Hi ha aquestes maleïdes totes les estrelles el lloc, d'acord? 455 00:19:31,350 --> 00:19:33,014 Llavors, què està passant aquí? 456 00:19:33,014 --> 00:19:33,514 Sí? 457 00:19:33,514 --> 00:19:35,055 >> AUDIÈNCIA: Òbviament és [inaudible]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. Malan: Exactament. 460 00:19:37,990 --> 00:19:41,560 Així que en aquest contexto-- i això no era la millor decisió de disseny, cal reconèixer-ho, 461 00:19:41,560 --> 00:19:42,530 fa anys. 462 00:19:42,530 --> 00:19:45,110 En aquest context, on només hi ha una estrella, 463 00:19:45,110 --> 00:19:48,240 i vostè no té un tipus de dades, com int, immediatament a l'esquerra, 464 00:19:48,240 --> 00:19:53,146 en canvi vostè té un signe igual, amb claredat, en aquest context, quan dius protagonitzar una, 465 00:19:53,146 --> 00:19:56,980 això significa anar a la direcció que està en un. 466 00:19:56,980 --> 00:19:58,870 Seguiu el mapa del tresor, per així dir-ho. 467 00:19:58,870 --> 00:20:01,720 >> I mentrestant, en la línia 37, que significa el mateix. 468 00:20:01,720 --> 00:20:05,460 Aneu a la direcció d'una, i posar el que hi ha? 469 00:20:05,460 --> 00:20:09,520 Tot el que és en l' ubicació que especifica b. 470 00:20:09,520 --> 00:20:10,980 En altres paraules, aneu a b. 471 00:20:10,980 --> 00:20:12,130 Obtenir aquest valor. 472 00:20:12,130 --> 00:20:15,620 Anar a una i, per la igualtat signar, l'operador d'assignació, 473 00:20:15,620 --> 00:20:17,010 ja que el valor allà. 474 00:20:17,010 --> 00:20:19,272 >> De la mateixa manera, int temp és només un int. 475 00:20:19,272 --> 00:20:20,730 Res ha de canviar de temp. 476 00:20:20,730 --> 00:20:24,810 És només un got de recanvi de Annenberg una mica de llet o suc de taronja. 477 00:20:24,810 --> 00:20:27,630 Però jo necessito dir, aneu a b. 478 00:20:27,630 --> 00:20:31,449 Anar a aquest destí i posar el valor en temp allà. 479 00:20:31,449 --> 00:20:32,490 Llavors, què està passant llavors? 480 00:20:32,490 --> 00:20:36,540 Quan en realitat dic Canvieu aquest moment, si aquesta primera safata aquí representa Main, 481 00:20:36,540 --> 00:20:42,270 aquesta segona safata representa swap, quan Pas ampersand x i símbol d'unió i 482 00:20:42,270 --> 00:20:47,150 des Principal a swap, per ser clars, Què és això pila marc de recepció? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Sí? 485 00:20:49,200 --> 00:20:50,180 >> AUDIÈNCIA: [inaudible]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. Malan: Exactament. 487 00:20:51,180 --> 00:20:53,129 La direcció de la direcció de xi de y. 488 00:20:53,129 --> 00:20:55,170 I vostè pot pensar en aquests com adreces postals. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street i 35 Oxford Street, i vostè 490 00:20:58,772 --> 00:21:01,230 desitgi moure els dos edificis que es troben en aquests llocs. 491 00:21:01,230 --> 00:21:04,680 >> És una espècie d'una idea ridícula, però això és tot el que volem dir amb la direcció. 492 00:21:04,680 --> 00:21:07,000 On en el món pot a trobar aquests dos sencers? 493 00:21:07,000 --> 00:21:09,470 On en el món es pot trobar els dos edificis? 494 00:21:09,470 --> 00:21:15,170 Així que si, finalment, després de tant temps em entrar en el codi font d'avui i compilar 495 00:21:15,170 --> 00:21:22,110 Intercanviar i córrer ./swap, finalment, per al primera vegada que fem realment per veure que 496 00:21:22,110 --> 00:21:25,330 els meus valors tenen a la veritat ha intercanviat amb èxit. 497 00:21:25,330 --> 00:21:30,860 I ara, fins i tot podem tenir nota d'aquesta, diguem, en gdb. 498 00:21:30,860 --> 00:21:32,740 >> Així que m'ho dius a mi anar en el mateix arxiu. 499 00:21:32,740 --> 00:21:35,010 Déjame anar per davant i córrer gdb de ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 I ara, al Swap, aniré endavant i establir un punt de ruptura en principal. 502 00:21:40,547 --> 00:21:42,630 I ara me'n vaig a anar endavant i executar el programa. 503 00:21:42,630 --> 00:21:45,810 I ara veiem meu codi detingut en aquesta línia. 504 00:21:45,810 --> 00:21:48,330 >> Si segueixo endavant i imprimir x, el que he de veure aquí? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 És una pregunta. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Digues-ho de nou? 509 00:21:51,530 --> 00:21:52,295 >> AUDIÈNCIA: [inaudible]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. Malan: Així números a l'atzar, potser. 511 00:21:53,910 --> 00:21:56,010 Potser tinc sort, i és agradable i simple, com 0. 512 00:21:56,010 --> 00:21:57,230 Però potser és una mica de nombres aleatoris. 513 00:21:57,230 --> 00:21:58,090 En aquest cas, vaig tenir sort. 514 00:21:58,090 --> 00:21:59,030 És només passa a ser 0. 515 00:21:59,030 --> 00:22:00,780 Però sí que és sort, perquè no fins que 516 00:22:00,780 --> 00:22:06,280 escrigui al costat i després print x ha de línia de codi, la línia 19, ha executat. 517 00:22:06,280 --> 00:22:10,942 >> Mentrestant, si escric la propera vegada, i Ara imprimir i, vaig a veure 2. 518 00:22:10,942 --> 00:22:13,900 Ara, si escric següent, que serà ser una mica confús, perquè ara, 519 00:22:13,900 --> 00:22:17,250 el printf va a aparèixer en la pantalla, com ho va fer. x és 1. 520 00:22:17,250 --> 00:22:18,606 >> Anem a fer això de nou. 521 00:22:18,606 --> 00:22:20,480 I ara, aquí és on les coses es posen interessants. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Abans que jo dic Intercanviar o fins i tot pas en ella, anem a fer un petit cop d'ull. 524 00:22:26,580 --> 00:22:28,980 x és, de nou, 1. 525 00:22:28,980 --> 00:22:33,240 I és, per descomptat, el seny ràpida comprovar, 2, de manera que no és difícil que hi ha. 526 00:22:33,240 --> 00:22:35,740 Però el que és signe x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Resposta, és una espècie de funky cerca. 529 00:22:39,350 --> 00:22:43,500 Però el int estrelles de parèntesis és només forma de dir això del PIB és una adreça. 530 00:22:43,500 --> 00:22:48,290 No és un int, que és un punter a un int, o també coneguda com una adreça. 531 00:22:48,290 --> 00:22:49,742 >> Què és aquesta bogeria? 532 00:22:49,742 --> 00:22:51,825 Mai hem vist una mica tan així abans. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Així que aquesta és la direcció en el meu equip de record d'on x passa a viure. 535 00:22:58,120 --> 00:22:59,040 És Ox-alguna cosa. 536 00:22:59,040 --> 00:23:01,290 I això és, francament, per què He començat a dibuixar fletxes, 537 00:23:01,290 --> 00:23:03,340 en lloc de nombres, ja que realment es preocupa 538 00:23:03,340 --> 00:23:06,890 que la seva int es troba en un determinat direcció que és tan gran. 539 00:23:06,890 --> 00:23:12,160 Però bffff0c4, aquests són tots de fet dígits hexadecimals, 540 00:23:12,160 --> 00:23:13,720 que són de 0 a f. 541 00:23:13,720 --> 00:23:16,590 >> Així que no insistirem massa molt del que són aquestes coses. 542 00:23:16,590 --> 00:23:19,400 Però si imprimeixo i, per descomptat, veig 2. 543 00:23:19,400 --> 00:23:22,440 Però ampersand i, veig aquesta direcció. 544 00:23:22,440 --> 00:23:26,527 I fixin-, per als curiosos, Quina distància separa x i i? 545 00:23:26,527 --> 00:23:27,985 Pot passar per alt la major part de la direcció. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Quatre bytes. 548 00:23:29,920 --> 00:23:33,510 I això és consistent amb la nostra abans afirmar que el gran és un int? 549 00:23:33,510 --> 00:23:34,130 Quatre bytes. 550 00:23:34,130 --> 00:23:37,420 Així que sembla que la guarnició de tot cap amunt molt bé, com era d'esperar, a la memòria. 551 00:23:37,420 --> 00:23:40,010 >> Així que ara, anem a avançar ràpidament fins al final d'aquesta història. 552 00:23:40,010 --> 00:23:43,290 Seguirem endavant i escriviu pas, submergir-se en la funció Swap. 553 00:23:43,290 --> 00:23:46,880 Ara noti, si escric una, és idèntica a la direcció de x. 554 00:23:46,880 --> 00:23:52,130 Si el tipus B, que és idèntica a l'adreça de i. 555 00:23:52,130 --> 00:23:57,020 Llavors, què he de veure si diuen, aneu a la direcció d'un? 556 00:23:57,020 --> 00:23:58,120 Així imprimir protagonitzar un. 557 00:23:58,120 --> 00:24:00,130 Així estrella significa anar-hi, en aquest context. 558 00:24:00,130 --> 00:24:02,730 Ampersand significa el que és l'adreça d'. 559 00:24:02,730 --> 00:24:05,000 Així estrella un mitjà 1. 560 00:24:05,000 --> 00:24:09,590 I print star b em fa 2. 561 00:24:09,590 --> 00:24:15,750 >> I m'ho dius a mi assumeixo, de moment, que almenys el codi que 562 00:24:15,750 --> 00:24:18,950 procedeix a executar pot ser ara motivat a través d'aquesta manera. 563 00:24:18,950 --> 00:24:21,150 Però ens tornarem a visitar aquesta idea en poc temps. 564 00:24:21,150 --> 00:24:23,850 Així que aquesta versió d'Intercanvi ara és correcta i permet 565 00:24:23,850 --> 00:24:26,650 ens canviem a aquest tipus de dades en particular. 566 00:24:26,650 --> 00:24:29,120 >> Així que qualsevol pregunta llavors swap? 567 00:24:29,120 --> 00:24:29,890 Per estrella? 568 00:24:29,890 --> 00:24:30,690 En la direcció d'? 569 00:24:30,690 --> 00:24:33,270 I veuràs, amb problemes 4, classe de, 570 00:24:33,270 --> 00:24:37,310 però problemes 5, sens dubte, com es coses són ajudes i molt més 571 00:24:37,310 --> 00:24:39,584 còmode amb ells, com a resultat. 572 00:24:39,584 --> 00:24:40,430 Qualsevol cosa en absolut? 573 00:24:40,430 --> 00:24:40,930 Bé. 574 00:24:40,930 --> 00:24:44,350 Així malloc és, de nou, aquesta funció que només assigna memòria, la memòria 575 00:24:44,350 --> 00:24:45,330 l'assignació. 576 00:24:45,330 --> 00:24:47,024 I per què és això útil? 577 00:24:47,024 --> 00:24:48,940 Bé, tot aquest temps, vostè ha estat utilitzant malloc. 578 00:24:48,940 --> 00:24:52,230 Si es té en compte ara com getString obres, presumiblement, és 579 00:24:52,230 --> 00:24:56,140 estat demanant a algú per un tros de la memòria, en qualsevol moment l'usuari escriu una cadena 580 00:24:56,140 --> 00:24:59,040 en, ja que sens dubte no sabia, ja que el personal CS50, 581 00:24:59,040 --> 00:25:02,710 el gran que aquestes cadenes que els humans van a escriure podria ser. 582 00:25:02,710 --> 00:25:07,910 >> Així que anem a, per primera vegada, comencen a Peli com funciona la biblioteca CS50, 583 00:25:07,910 --> 00:25:10,990 per mitjà d'un parell d'exemples que ens portarà allà. 584 00:25:10,990 --> 00:25:15,300 Així que si obro el gedit i obrir scanf 0, 585 00:25:15,300 --> 00:25:17,055 anem a veure el següent codi. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, disponible al lloc web per avui en dia, té relativament poques línies de codi 588 00:25:23,530 --> 00:25:25,351 aquí, 14 a través de 20. 589 00:25:25,351 --> 00:25:26,600 I anem a veure el que està fent. 590 00:25:26,600 --> 00:25:28,920 Es declara un int, anomenat x. 591 00:25:28,920 --> 00:25:30,850 Diu una cosa així com: nombre per favor. 592 00:25:30,850 --> 00:25:33,940 I ara diu, scanf% i, i x. 593 00:25:33,940 --> 00:25:35,620 Així que hi ha un munt de coses noves allà. 594 00:25:35,620 --> 00:25:38,420 >> Però scanf, quin tipus de es pugui imaginar de com el contrari printf. 595 00:25:38,420 --> 00:25:40,090 printf, per descomptat, s'imprimeix a la pantalla. 596 00:25:40,090 --> 00:25:44,410 tipus scanf d'exploracions des de l'usuari de teclat cosa que ell o ella ha escrit. 597 00:25:44,410 --> 00:25:46,550 >> % I és igual que printf. 598 00:25:46,550 --> 00:25:49,410 Això vol dir esperar que el usuari escriviu un int. 599 00:25:49,410 --> 00:25:52,820 I ara, per què creus que podria passar scanf i x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Si el propòsit en la vida de scanf és aconseguir alguna cosa de l'usuari, 602 00:25:57,770 --> 00:26:02,480 Quin és el significat de passar, i x, ara? 603 00:26:02,480 --> 00:26:02,980 Sí? 604 00:26:02,980 --> 00:26:03,896 >> AUDIÈNCIA: [inaudible]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. Malan: Exactament. 607 00:26:06,540 --> 00:26:12,900 El que jo, l'ésser humà, escric en la meva entrada serà fora de perill en aquest lloc. 608 00:26:12,900 --> 00:26:17,660 No n'hi ha prou, recordem, a Va esdevenir en x, perquè hem vist ja, 609 00:26:17,660 --> 00:26:21,630 cada vegada que passen només una variable prima, com un int, per a alguna altra funció, 610 00:26:21,630 --> 00:26:25,640 Segur, pot canviar això variable, però no de forma permanent. 611 00:26:25,640 --> 00:26:27,360 No pot tenir un efecte sobre Principal. 612 00:26:27,360 --> 00:26:29,420 Només pot canviar la seva pròpia còpia local. 613 00:26:29,420 --> 00:26:32,560 Però si, en canvi, no ho fa dóna'm el int real, 614 00:26:32,560 --> 00:26:36,640 però vostè em dóna adreces a que int, ara, sent scanf, 615 00:26:36,640 --> 00:26:41,050 sens dubte, puc seguir aquest abordar i posar un nombre no 616 00:26:41,050 --> 00:26:43,280 pel que té accés a ell també. 617 00:26:43,280 --> 00:26:45,120 >> Així que quan executo aquest programa, anem a veure. 618 00:26:45,120 --> 00:26:49,660 Fer scanf 0 punt slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 I si ara estic escrivint un nombre com 50, gràcies pel 50. 620 00:26:54,030 --> 00:26:58,150 Si ara escric un nombre com 1 negatiu, pel negatiu 1. 621 00:26:58,150 --> 00:27:04,200 Ara estic escrivint un nombre com 1.5, hm. 622 00:27:04,200 --> 00:27:06,030 Per què el meu programa em ignoren? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Bé, perquè simplement, li vaig dir d'esperar només un int. 625 00:27:09,880 --> 00:27:10,380 Bé. 626 00:27:10,380 --> 00:27:11,630 Així que aquesta és una versió d'aquest. 627 00:27:11,630 --> 00:27:16,600 Anem a prendre les coses a un nivell superior i proposen que això no és bo. 628 00:27:16,600 --> 00:27:20,530 I aquí rau un exemple molt senzill de com podem començar a escriure codi 629 00:27:20,530 --> 00:27:24,450 que altres persones puguin explotar o comprometre en fer coses dolentes. 630 00:27:24,450 --> 00:27:28,336 Així que la línia 16, tan similar en esperit d'abans, 631 00:27:28,336 --> 00:27:29,960 però no vaig a declarar int aquest moment. 632 00:27:29,960 --> 00:27:32,970 Estic declarant que l'estrella char, també conegut com a cadena. 633 00:27:32,970 --> 00:27:35,190 >> Però, què significa això realment? 634 00:27:35,190 --> 00:27:38,790 Així que si no específic 1 address-- i Estic trucant de manera arbitrària, tampó, 635 00:27:38,790 --> 00:27:43,370 però vaig poder dic és, per ser simple-- i després faig això, explico a mi, 636 00:27:43,370 --> 00:27:48,630 si pogués, basat en l'anterior lògica, el que està fent scanf en la línia 18, 637 00:27:48,630 --> 00:27:55,000 si s passi% i tampó, que és l'adreça? 638 00:27:55,000 --> 00:27:58,210 Què és scanf, si s'aplica el exactament la mateixa lògica que la versió 0, 639 00:27:58,210 --> 00:28:00,640 va a tractar de fer aquí, quan l'usuari escriu alguna cosa en? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Sí? 642 00:28:03,409 --> 00:28:04,407 >> AUDIÈNCIA: [inaudible]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. Malan: Exactament. 645 00:28:08,890 --> 00:28:11,577 Scanf, per la lògica anterior, es prendrà la cadena 646 00:28:11,577 --> 00:28:13,410 que el mecanografiada humana en-- ara és una cadena, 647 00:28:13,410 --> 00:28:15,790 no és un nombre, és de suposar, si ell o ella cooperates-- 648 00:28:15,790 --> 00:28:19,310 i que va a tractar de posar aquest cadena a la memòria en qualsevol direcció 649 00:28:19,310 --> 00:28:20,340 memòria intermèdia específica. 650 00:28:20,340 --> 00:28:23,870 I això és molt bo, perquè memòria intermèdia és de fet la intenció de ser una adreça. 651 00:28:23,870 --> 00:28:30,470 >> Però jo sostinc aquest programa està lliure d'errors en un manera molt greu, perquè ¿quin valor té 652 00:28:30,470 --> 00:28:31,330 esmorteir per defecte? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Què he inicialitzat a? 655 00:28:34,790 --> 00:28:35,770 El tros de memòria? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Jo no tinc, no? 658 00:28:38,620 --> 00:28:42,265 >> Així que tot i que ha assignat un estrella de carbó que ja no es diu s, 659 00:28:42,265 --> 00:28:48,030 es diu en lloc, per la buffer-- anem a dibuixar el nom de la variable 660 00:28:48,030 --> 00:28:53,380 ara com buffer-- si no tinc getString trucada o malloc aquí, 661 00:28:53,380 --> 00:28:56,030 això vol dir efectivament que tampó és només un valor d'escombraries. 662 00:28:56,030 --> 00:28:57,030 >> Ara, què vol dir això? 663 00:28:57,030 --> 00:29:00,220 Significa que jo he dit scanf esperar una cadena de l'usuari. 664 00:29:00,220 --> 00:29:01,300 I saps què? 665 00:29:01,300 --> 00:29:03,883 Sigui el que està apuntant A-- i dibuix signe d'interrogació, 666 00:29:03,883 --> 00:29:07,060 però en realitat, que serà una mena Ox1, 2, 3, no? 667 00:29:07,060 --> 00:29:10,730 És cert valor fals que només passa a ser-hi des d'abans. 668 00:29:10,730 --> 00:29:13,440 Així que dit d'una altra manera, és com si tampó és només 669 00:29:13,440 --> 00:29:16,180 que apunta a alguna cosa en la memòria. 670 00:29:16,180 --> 00:29:17,610 No tinc ni idea de què. 671 00:29:17,610 --> 00:29:24,130 >> Així que si escric en gabe ara, va per tractar de posar g-a-b-e / 0 no. 672 00:29:24,130 --> 00:29:25,530 Però, ¿qui sap el que és això? 673 00:29:25,530 --> 00:29:27,480 I en el passat, qualsevol temps hem tractat de tocar 674 00:29:27,480 --> 00:29:29,770 memòria que no li pertany a nosaltres, ¿què ha passat? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 O gairebé sempre. 677 00:29:32,870 --> 00:29:34,310 Decisió de segmentació, oi? 678 00:29:34,310 --> 00:29:37,829 >> Aquesta fletxa, no tinc ni idea d'on és assenyalant. és només un valor aleatori. 679 00:29:37,829 --> 00:29:40,370 I per descomptat, si vostè interpreta un valor aleatori com una adreça, 680 00:29:40,370 --> 00:29:42,610 vostè va a anar a alguna destinació a l'atzar. 681 00:29:42,610 --> 00:29:46,810 Així gabe podria efectivament accident el meu programa en aquest cas aquí. 682 00:29:46,810 --> 00:29:50,600 >> Llavors, què podem fer això és gairebé tan dolent? 683 00:29:50,600 --> 00:29:52,660 Penseu aquesta tercera i últim exemple d'scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Aquesta versió és millor en quin sentit? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Si se sent còmode amb el problema anterior, això és millor. 688 00:30:01,400 --> 00:30:02,250 Per què? 689 00:30:02,250 --> 00:30:03,250 >> AUDIÈNCIA: [inaudible]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. Malan: Good. 692 00:30:07,110 --> 00:30:09,970 Així que aquest cas de la línia 16 és millor, en el sentit 693 00:30:09,970 --> 00:30:12,030 que estem explícitament l'assignació d'una certa memòria. 694 00:30:12,030 --> 00:30:14,190 No estem usant malloc, estem usant la setmana 2 695 00:30:14,190 --> 00:30:16,060 enfocament de simplement declarar una matriu. 696 00:30:16,060 --> 00:30:18,130 I hem dit abans que una cadena és només un conjunt de caràcters, 697 00:30:18,130 --> 00:30:19,690 així que això és totalment legítim. 698 00:30:19,690 --> 00:30:22,910 Però és, per descomptat, com nota, grandària fixa, 16. 699 00:30:22,910 --> 00:30:25,440 >> Així que aquest programa és totalment segur, si escric 700 00:30:25,440 --> 00:30:29,760 en les cadenes d'un personatge, de dos caràcters cadenes, 15 cadenes de caràcters. 701 00:30:29,760 --> 00:30:34,970 Però tan aviat com em poso a escriure 16, 17, 18, 1000, cadenes de caràcters 702 00:30:34,970 --> 00:30:37,390 on està aquesta cadena va a acabar? 703 00:30:37,390 --> 00:30:39,570 Es va a acabar en part aquí. 704 00:30:39,570 --> 00:30:42,820 Però llavors, ¿qui sap què més està més enllà de les fronteres 705 00:30:42,820 --> 00:30:44,270 d'aquesta sèrie en particular? 706 00:30:44,270 --> 00:30:48,015 >> És com si jo tinc declarat 16 caixes aquí. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Així que en lloc de treure els 16, anem a només pretenc que he dibuixat 16. 709 00:30:52,690 --> 00:30:56,540 Però si llavors intento llegir un string això és molt més llarg, com 50 caràcters, 710 00:30:56,540 --> 00:31:01,270 Vaig a començar a posar a, b, c, d, x, i, z. 711 00:31:01,270 --> 00:31:04,916 I això és, presumiblement, algun altre segment de memòria 712 00:31:04,916 --> 00:31:06,790 que, de nou, podria causar meu programa es bloquegi, 713 00:31:06,790 --> 00:31:10,600 perquè jo no he demanat res més que 16 bytes. 714 00:31:10,600 --> 00:31:12,260 >> Així que a qui li importa? 715 00:31:12,260 --> 00:31:13,880 Bé, aquí està la biblioteca CS50. 716 00:31:13,880 --> 00:31:17,220 I la majoria d'això és només com instruccions de dalt. 717 00:31:17,220 --> 00:31:21,670 La biblioteca CS50, tot aquest temps, ha tingut aquesta línia en la línia 52. 718 00:31:21,670 --> 00:31:23,680 Hem vist typedef, o veurà typedef 719 00:31:23,680 --> 00:31:27,930 en conjunt de processadors 4, que només crea un Sinònim qual estrella carbó pot ser més 720 00:31:27,930 --> 00:31:29,290 referència simplement com a cadena. 721 00:31:29,290 --> 00:31:31,540 Així que aquest és un dels poques rodes d'entrenament 722 00:31:31,540 --> 00:31:34,120 hem utilitzat secretament sota de la caputxa. 723 00:31:34,120 --> 00:31:36,490 >> Mentrestant, aquí hi ha la funció getchar. 724 00:31:36,490 --> 00:31:38,190 Ara, aparentment, no hi ha cos per a això. 725 00:31:38,190 --> 00:31:40,273 I de fet, si segueixo desplaçament, no ho sé en realitat 726 00:31:40,273 --> 00:31:42,080 veure les implementacions d'aquestes funcions. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Com una comprovació de validesa, per què és això? 729 00:31:45,516 --> 00:31:46,795 >> AUDIÈNCIA: [inaudible]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. Malan: Si. 731 00:31:47,670 --> 00:31:48,950 Així que aquest és l'arxiu de capçalera. 732 00:31:48,950 --> 00:31:52,520 I els arxius de capçalera contenen prototips, a més d'algunes altres coses, pel que sembla, 733 00:31:52,520 --> 00:31:53,780 com typedefs. 734 00:31:53,780 --> 00:31:56,910 Però en CS50.c, que hem Mai li ha donat absoluta, 735 00:31:56,910 --> 00:32:02,100 però ha estat en l'aparell CS50 tot aquesta vegada, en el fons de les seves carpetes, 736 00:32:02,100 --> 00:32:04,990 compte que hi ha un conjunt munt de funcions aquí. 737 00:32:04,990 --> 00:32:06,720 >> De fet, anem a desplaçar-se cap avall. 738 00:32:06,720 --> 00:32:08,810 Anem a ignorar la majoria d'ells, per ara. 739 00:32:08,810 --> 00:32:12,670 Però desplaceu-vos cap avall per getInt i vegi com funciona getInt. 740 00:32:12,670 --> 00:32:13,890 Així que aquí és getInt. 741 00:32:13,890 --> 00:32:17,727 I si alguna vegada realment importava com arribar int funciona, aquí està la seva documentació. 742 00:32:17,727 --> 00:32:19,560 I entre les coses que diu és el que diu 743 00:32:19,560 --> 00:32:21,340 el que els rangs de valors que poden tornar. 744 00:32:21,340 --> 00:32:24,400 És essencialment negatiu 2000000000 a positiu 2 mil milions, més o menys. 745 00:32:24,400 --> 00:32:26,420 >> I resulta que, tot això temps, tot i que mai hem 746 00:32:26,420 --> 00:32:28,570 calia trobar-lo, si alguna cosa surt malament, 747 00:32:28,570 --> 00:32:30,680 resulta que tot aquest temps, getInt té 748 00:32:30,680 --> 00:32:33,600 ha de tornar un especial constant, no nul, 749 00:32:33,600 --> 00:32:36,760 sinó més aviat INT_MAX, que és convenció a només un programador. 750 00:32:36,760 --> 00:32:38,846 Això significa aquí és un valor especial. 751 00:32:38,846 --> 00:32:41,470 Assegureu-vos de comprovar això, simplement en cas que alguna cosa va malament. 752 00:32:41,470 --> 00:32:43,261 Però mai hem molestat amb que fins a la data, 753 00:32:43,261 --> 00:32:45,200 perquè, de nou, aquest s'entén per simplificar. 754 00:32:45,200 --> 00:32:46,950 >> Però, com aconseguir getInt implementat? 755 00:32:46,950 --> 00:32:48,450 Bé, un, que no té arguments. 756 00:32:48,450 --> 00:32:49,390 Sabem que. 757 00:32:49,390 --> 00:32:50,820 Retorna un int. 758 00:32:50,820 --> 00:32:51,950 Sabem que. 759 00:32:51,950 --> 00:32:54,460 Així que, com funciona sota de la caputxa? 760 00:32:54,460 --> 00:32:58,290 >> Així que hi ha pel que sembla un infinit llaç, almenys l'aparença d'un. 761 00:32:58,290 --> 00:33:00,290 Noteu que estem fent servir getString. 762 00:33:00,290 --> 00:33:04,000 Així que això és interessant. getInt crida la nostra pròpia funció, getString. 763 00:33:04,000 --> 00:33:05,645 I ara, ¿podria ser aquest el cas? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Per què estic sent defensiva aquí en línia de 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Què podria passar en línia 164, per ser clars? 768 00:33:15,639 --> 00:33:16,930 És la mateixa resposta que abans. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Podria simplement estar fora de la memòria. 771 00:33:20,089 --> 00:33:23,130 Alguna cosa va malament amb getString, hem de ser capaços de manejar això. 772 00:33:23,130 --> 00:33:27,070 I la raó per la qual no torna nul és que, tècnicament, és un punter nul. 773 00:33:27,070 --> 00:33:29,120 getInt ha de retornar un int. 774 00:33:29,120 --> 00:33:31,060 Així que he arbitràriament decidit, en essència, 775 00:33:31,060 --> 00:33:34,600 que 2 mil milions, més o menys, va ser un valor especial que mai pot 776 00:33:34,600 --> 00:33:35,970 en realitat arribar des de l'usuari. 777 00:33:35,970 --> 00:33:39,930 És només el valor que jo vaig perdre per representar un codi d'error. 778 00:33:39,930 --> 00:33:41,540 >> Així que ara, les coses es posen una mica de fantasia. 779 00:33:41,540 --> 00:33:44,670 I no és exactament la mateixa funció com abans, però és molt similar. 780 00:33:44,670 --> 00:33:50,120 Llavors noto, declaro aquí, en línia 172, tant en un int n i un char c. 781 00:33:50,120 --> 00:33:53,600 I llavors jo faig servir aquesta línia covard, sscanf, el que resulta 782 00:33:53,600 --> 00:33:55,990 no analitza una cadena des del teclat. 783 00:33:55,990 --> 00:33:59,226 Es destaca una cadena existent que l'usuari ja ha teclejat. 784 00:33:59,226 --> 00:34:02,100 Així que ja vaig trucar getString, que vol dir que tinc una cadena a la memòria. 785 00:34:02,100 --> 00:34:05,020 sscanf és el que cridar a una funció d'anàlisi. 786 00:34:05,020 --> 00:34:07,760 Es veu en la cadena que he teclejat, caràcter per caràcter, 787 00:34:07,760 --> 00:34:09,250 i fa alguna cosa útil. 788 00:34:09,250 --> 00:34:10,969 Aquesta cadena s'emmagatzema en línia. 789 00:34:10,969 --> 00:34:13,560 I sé que només per anar una còpia de seguretat aquí i dir, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Vaig trucar a no s aquest cop, però la línia. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> I ara això és una mica diferent. 793 00:34:18,080 --> 00:34:22,480 Però això significa, efectivament, per raons anem una mica agitem les nostres mans en l'actualitat, 794 00:34:22,480 --> 00:34:26,070 que estem comprovant a veure si l'usuari va escriure en 795 00:34:26,070 --> 00:34:29,909 i int i potser un altre caràcter. 796 00:34:29,909 --> 00:34:33,610 Si l'usuari va escriure en un int, és va a emmagatzemar en n, perquè sóc 797 00:34:33,610 --> 00:34:36,739 l'aprovació d'aquesta per la direcció, el nou truc que hem vist avui. 798 00:34:36,739 --> 00:34:41,570 Si l'usuari també escriu com en 123x, que x 799 00:34:41,570 --> 00:34:45,060 es va a acabar un carta de caràcter c. 800 00:34:45,060 --> 00:34:48,739 >> Ara resulta que sscanf em diran, intel · ligent, 801 00:34:48,739 --> 00:34:54,750 quants diferents variables es sscanf èxit capaç d'omplir. 802 00:34:54,750 --> 00:34:58,770 Esta és la lògica, si la funció Estic d'execució és getInt, 803 00:34:58,770 --> 00:35:00,900 però jo estic comprovant, potencialment, per a l'usuari 804 00:35:00,900 --> 00:35:04,190 haver escrit en un int seguit per una altra cosa, 805 00:35:04,190 --> 00:35:08,580 Què vull de sscanf valor de retorn de veritat que sigui? 806 00:35:08,580 --> 00:35:10,950 Si el propòsit és aconseguir només un int de l'usuari? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Així que si sscanf devolucions 2, què significa això? 809 00:35:19,300 --> 00:35:21,660 L'usuari va escriure en alguna cosa així com, literalment, 810 00:35:21,660 --> 00:35:24,770 123x, que és una tonteria. 811 00:35:24,770 --> 00:35:27,490 És una condició d'error, i Vull comprovar per això. 812 00:35:27,490 --> 00:35:32,960 >> Així que si l'usuari escriu això en, per aquesta lògica, el que fa sscanf tornar, 813 00:35:32,960 --> 00:35:33,740 Què li diries? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Així que va a tornar 2, perquè el 123 va anar aquí, 816 00:35:39,130 --> 00:35:41,580 i la x va a acabar ací. 817 00:35:41,580 --> 00:35:43,970 Però jo no vull que la x per aconseguir ple. 818 00:35:43,970 --> 00:35:48,580 Vull sscanf només per tenir èxit en omplir la primera de les seves variables. 819 00:35:48,580 --> 00:35:52,490 I per això és que jo Vull sscanf per tornar 1. 820 00:35:52,490 --> 00:35:55,750 >> I si això és una mica més del cap de moment, això és totalment bé. 821 00:35:55,750 --> 00:36:00,030 Adonar però, que un dels valors de getInt i getString 822 00:36:00,030 --> 00:36:03,630 és que nosaltres estem fent una diables d'un gran quantitat de comprovació d'errors com aquest, així 823 00:36:03,630 --> 00:36:07,130 que, fins ara, vostè pot gairebé escriure res en el seu teclat, 824 00:36:07,130 --> 00:36:08,490 i anem a atrapar. 825 00:36:08,490 --> 00:36:10,592 I sens dubte, la personal, definitivament no ho farà 826 00:36:10,592 --> 00:36:13,300 ser la font d'un error en la seva programa, perquè estem a la defensiva 827 00:36:13,300 --> 00:36:16,270 la comprovació de tots els estúpids coses que un usuari podria fer, 828 00:36:16,270 --> 00:36:18,900 com escriure una cadena, quan realment volia int. 829 00:36:18,900 --> 00:36:21,350 Així que per ara-- vindrem de nou a això abans long-- 830 00:36:21,350 --> 00:36:23,710 però tot aquest temps, getString i getInt tenen 831 00:36:23,710 --> 00:36:29,950 estat per sota de la campana, amb aquest idea bàsica d'adreces de memòria. 832 00:36:29,950 --> 00:36:32,580 >> Així que ara, farem les coses una poc més fàcil d'utilitzar. 833 00:36:32,580 --> 00:36:38,740 Com es recordarà, des Binky última temps-- si el meu ratolí cooperate-- així 834 00:36:38,740 --> 00:36:42,560 vam tenir el codi, que francament, és bastant absurd. 835 00:36:42,560 --> 00:36:45,330 Aquest codi no aconsegueix res útil, però era l'exemple 836 00:36:45,330 --> 00:36:48,330 aquest professor Parlant utilitzat per representar 837 00:36:48,330 --> 00:36:51,840 el que estava passant en un programa que involucra la memòria. 838 00:36:51,840 --> 00:36:54,850 >> Així que anem a tornar a contar aquesta història molt breument. 839 00:36:54,850 --> 00:36:58,720 Aquestes dues primeres línies, en Anglès, què què, què li diries? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Just in raonablement humà, però lleugerament termes tècnics, prendre una punyalada. 842 00:37:05,430 --> 00:37:06,346 AUDIÈNCIA: [inaudible]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. Malan: OK, que està establint adreces per les seves variables x i y. 845 00:37:11,080 --> 00:37:15,520 No del tot, perquè x i i no són variables en el sentit tradicional. 846 00:37:15,520 --> 00:37:18,054 x i y són adreces o emmagatzemarà la direcció. 847 00:37:18,054 --> 00:37:19,220 Així que anem a provar això una vegada més. 848 00:37:19,220 --> 00:37:21,010 No és un mal començament, però. 849 00:37:21,010 --> 00:37:21,510 Sí? 850 00:37:21,510 --> 00:37:22,426 >> AUDIÈNCIA: [inaudible]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. Malan: Good. 853 00:37:24,840 --> 00:37:26,173 Crec que això és una mica més net. 854 00:37:26,173 --> 00:37:28,630 La declaració de dos punters, dos enters. 855 00:37:28,630 --> 00:37:30,150 I els estem cridant x i y. 856 00:37:30,150 --> 00:37:32,790 O si haguéssim de dibuixar això com una imatge, de nou, 857 00:37:32,790 --> 00:37:36,410 recordar simplement que tots que estem fent amb aquesta primera línia 858 00:37:36,410 --> 00:37:39,690 està dibuixant un quadre com aquest, amb un valor d'escombraries en ella, 859 00:37:39,690 --> 00:37:41,920 i dir que és X, i després un altre quadre com aquest, 860 00:37:41,920 --> 00:37:43,880 amb un valor d'escombraries en ella, cridant i. 861 00:37:43,880 --> 00:37:45,810 Hem declarat dos punters que en última instància 862 00:37:45,810 --> 00:37:47,860 emmagatzemarà la direcció d'un int. 863 00:37:47,860 --> 00:37:49,170 Així que això és tot el que hi ha. 864 00:37:49,170 --> 00:37:53,290 >> Així que quan Binky va fer això, el argila només es veia així. 865 00:37:53,290 --> 00:37:55,350 I Nick només tipus de embolicat en les fletxes, 866 00:37:55,350 --> 00:37:57,590 com si no estan apuntant en qualsevol lloc en particular, perquè són just 867 00:37:57,590 --> 00:37:58,250 valors d'escombraries. 868 00:37:58,250 --> 00:38:01,670 No estan inicialitzats explícitament en qualsevol lloc en particular. 869 00:38:01,670 --> 00:38:03,980 >> Ara, la següent línia de codi, el record, era això. 870 00:38:03,980 --> 00:38:07,510 Així que en raonablement fàcil d'usar, però anglès bé tècnic, 871 00:38:07,510 --> 00:38:09,790 el que és aquesta línia de codi fent? 872 00:38:09,790 --> 00:38:10,391 Sí? 873 00:38:10,391 --> 00:38:11,333 >> AUDIÈNCIA: [inaudible]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. Malan: Perfect. 876 00:38:13,950 --> 00:38:17,016 És l'assignació de la part de la memòria que és de la mida d'un int. 877 00:38:17,016 --> 00:38:18,140 I això és la meitat de la resposta. 878 00:38:18,140 --> 00:38:20,056 Ha respost la dreta mitjà de l'expressió. 879 00:38:20,056 --> 00:38:22,473 El que està passant a l' costat esquerre del signe igual? 880 00:38:22,473 --> 00:38:22,972 Sí? 881 00:38:22,972 --> 00:38:24,814 AUDIÈNCIA: I cessionaris a la variable x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. Malan: I cessionaris a la variable x. 883 00:38:27,690 --> 00:38:31,650 Així que per recapitular, assigna del costat dret suficient memòria per emmagatzemar un int. 884 00:38:31,650 --> 00:38:34,150 Però malloc específicament retorna l'adreça 885 00:38:34,150 --> 00:38:37,270 d'aquest tros de memòria, el que vostè té acaba de proposar s'emmagatzema en x. 886 00:38:37,270 --> 00:38:42,560 >> Així que el que Nick va fer l'última vegada amb Binky és arrossegar a aquest punter a terme, l'argila, 887 00:38:42,560 --> 00:38:46,820 apuntar ara en un tros blanc de la memòria que és igual a la grandària d'un int. 888 00:38:46,820 --> 00:38:49,360 I de fet, això significava per representar quatre bytes. 889 00:38:49,360 --> 00:38:55,310 >> Ara, la següent línia de codi va fer això, estrella x aconsegueix 42. 890 00:38:55,310 --> 00:38:58,530 Així 42 és senzill en el costat dret, sentit de la vida. 891 00:38:58,530 --> 00:39:00,500 Costat esquerre, estrella x vol dir què? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Això també podria tenir gone-- això està bé. 894 00:39:03,280 --> 00:39:04,220 Okay. 895 00:39:04,220 --> 00:39:06,875 >> AUDIÈNCIA: Bàsicament, anar a la [inaudible] 896 00:39:06,875 --> 00:39:07,750 DAVID J. Malan: Good. 897 00:39:07,750 --> 00:39:08,760 AUDIÈNCIA: [inaudible]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. Malan: Exactament. 899 00:39:09,760 --> 00:39:11,979 Costat esquerre significa anar a x. 900 00:39:11,979 --> 00:39:12,520 x és la direcció. 901 00:39:12,520 --> 00:39:15,520 És com 33 Oxford Street, o Ox1. 902 00:39:15,520 --> 00:39:18,690 I l'estrella x significa anar a aquest abordar i posar el que hi ha? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Així que de fet, això és exactament el que Nick va fer. 905 00:39:21,290 --> 00:39:23,740 Va començar amb per, essencialment, mental 906 00:39:23,740 --> 00:39:26,270 assenyalant amb el dit a x, seguint la fletxa 907 00:39:26,270 --> 00:39:30,670 per al quadre blanc a la mà dreta banda, i posant el número 42 allà. 908 00:39:30,670 --> 00:39:34,120 Però després les coses es van posar un poc perillós, oi? 909 00:39:34,120 --> 00:39:35,860 Binky està a punt de perdre el cap. 910 00:39:35,860 --> 00:39:39,465 >> Estrella i és igual a 13, la mala sort, vol dir què? 911 00:39:39,465 --> 00:39:43,620 Així que cap mitjà estrelles van a la direcció en i. 912 00:39:43,620 --> 00:39:45,630 Però quina és la direcció en i? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Molt bé, és el valor d'escombraries, oi? 915 00:39:49,440 --> 00:39:50,800 El vaig dibuixar com un signe d'interrogació. 916 00:39:50,800 --> 00:39:54,850 Nick el va dibuixar com una fletxa arraulit. 917 00:39:54,850 --> 00:39:59,600 I tan aviat com vostè tracta de fer estrella i, paraula, veu allà, 918 00:39:59,600 --> 00:40:03,872 però no hi ha una legítima direcció, que és una ubicació falsa, 919 00:40:03,872 --> 00:40:05,080 el programa va a estavellar. 920 00:40:05,080 --> 00:40:08,580 I el cap de Binky va a volar aquí, com ho va fer. 921 00:40:08,580 --> 00:40:12,130 >> Així que al final, aquest programa era només falla a tota màquina. 922 00:40:12,130 --> 00:40:13,540 Va ser un programa amb errors. 923 00:40:13,540 --> 00:40:14,760 I cal que es fixi. 924 00:40:14,760 --> 00:40:18,260 I l'única manera, en realitat, per arreglar seria, per exemple, aquesta línia, 925 00:40:18,260 --> 00:40:21,010 que ni tan sols vam poder, perquè el programa es va estavellar abans d'hora. 926 00:40:21,010 --> 00:40:26,170 Però si anéssim a solucionar aquest problema, el que efecte fa fer i x tenen iguals? 927 00:40:26,170 --> 00:40:30,010 Bé, que apunta essencialment a en qualsevol valor x està apuntant. 928 00:40:30,010 --> 00:40:32,430 >> Així que en la història de Nick, o la història de Binky, tant 929 00:40:32,430 --> 00:40:34,640 x i i assenyalaven el tros blanc de la memòria, 930 00:40:34,640 --> 00:40:38,300 de manera que, finalment, quan es no és igual a 13 en estrella I de nou, 931 00:40:38,300 --> 00:40:43,080 acabes posant 13 a la ubicació adequada. 932 00:40:43,080 --> 00:40:47,640 Així que totes aquestes línies són perfectament legítim, a excepció d'aquest, 933 00:40:47,640 --> 00:40:51,730 quan va succeir abans realitat i assignat un valor. 934 00:40:51,730 --> 00:40:54,290 >> Ara per sort, no ho fa de raonar a través de tots 935 00:40:54,290 --> 00:40:56,560 d'aquest tipus de problemes pel seu compte. 936 00:40:56,560 --> 00:40:59,310 Déjame anar endavant i obrir una finestra de terminal aquí 937 00:40:59,310 --> 00:41:03,050 i obrir, per un moment, un programa súper curt que 938 00:41:03,050 --> 00:41:04,360 També és una mena de sentit. 939 00:41:04,360 --> 00:41:05,152 És lleig. 940 00:41:05,152 --> 00:41:06,610 No aconseguir res útil. 941 00:41:06,610 --> 00:41:10,180 Però sí demostra qüestions de la memòria, així que anem a fer una ullada. 942 00:41:10,180 --> 00:41:11,830 >> Principal, super simple. 943 00:41:11,830 --> 00:41:14,830 Pel que sembla crida a una funció, f i, a continuació, retorna 0. 944 00:41:14,830 --> 00:41:16,310 És una mica difícil d'arruïnar això. 945 00:41:16,310 --> 00:41:18,540 Així principal és bastant bo, fins ara. 946 00:41:18,540 --> 00:41:20,100 >> Així que f és problemàtica. 947 00:41:20,100 --> 00:41:22,120 I simplement no posar gaire esforç en nomenar- 948 00:41:22,120 --> 00:41:23,990 aquí, per mantenir l'atenció en el codi. 949 00:41:23,990 --> 00:41:25,740 f té dues línies. 950 00:41:25,740 --> 00:41:27,610 I anem a veure el que està passant ara. 951 00:41:27,610 --> 00:41:29,840 Així, d'una banda aquí-- i permetin-me fer 952 00:41:29,840 --> 00:41:32,680 aquesta consistent amb l'anterior exemple-- d'una banda, 953 00:41:32,680 --> 00:41:35,830 el costat esquerre és fent el que, en anglès? 954 00:41:35,830 --> 00:41:36,493 És és-- 955 00:41:36,493 --> 00:41:37,701 AUDIÈNCIA: Creació d'un punter. 956 00:41:37,701 --> 00:41:40,830 DAVID J. Malan: Creació d'un punter a un int i dir que és x. 957 00:41:40,830 --> 00:41:43,789 Així que és la creació d'una d'aquestes caixes Segueixo dibuixant a la pantalla tàctil. 958 00:41:43,789 --> 00:41:45,913 I ara, a la mà dreta banda, malloc, és clar, 959 00:41:45,913 --> 00:41:47,420 és l'assignació d'una part de la memòria. 960 00:41:47,420 --> 00:41:49,989 I perquè quedi clar, com quantitat de memòria que aparentment 961 00:41:49,989 --> 00:41:52,030 assignació, si només tipus de fer els càlculs aquí? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Així que és de 40 bytes. 964 00:41:54,040 --> 00:41:57,400 I sé que només perquè sé que un int, en l'aparell CS50, almenys, 965 00:41:57,400 --> 00:41:58,060 és de quatre bytes. 966 00:41:58,060 --> 00:41:59,610 Així que 10 vegades 4 és 40. 967 00:41:59,610 --> 00:42:04,924 Així que aquest és l'emmagatzematge d'una x, la direcció del primer dels 40 punts que 968 00:42:04,924 --> 00:42:07,340 s'han assignat espai enrere, cap enrere, cap enrere, cap enrere. 969 00:42:07,340 --> 00:42:08,470 >> I això és el que és clau sobre malloc. 970 00:42:08,470 --> 00:42:11,261 No es necessita una mica de memòria aquí, una mica aquí, una mica aquí. 971 00:42:11,261 --> 00:42:14,220 Li dóna un tros de memòria, contigua, de l'operació 972 00:42:14,220 --> 00:42:15,240 sistema. 973 00:42:15,240 --> 00:42:18,500 >> Ara què passa amb això, x suport 10 és igual a 0? 974 00:42:18,500 --> 00:42:19,470 Línia arbitrària de codi. 975 00:42:19,470 --> 00:42:21,100 No aconseguir res útil. 976 00:42:21,100 --> 00:42:26,128 Però és interessant, perquè x suport 10--? 977 00:42:26,128 --> 00:42:26,628 Sí? 978 00:42:26,628 --> 00:42:27,912 >> AUDIÈNCIA: [inaudible]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. Malan: x suport 10 no ha de ser nul. 980 00:42:30,500 --> 00:42:35,070 El detall nul només entra en joc amb cordes, al final d'una cadena. 981 00:42:35,070 --> 00:42:36,700 Però un bon pensament. 982 00:42:36,700 --> 00:42:39,615 >> Què tan gran és aquesta matriu, fins i tot encara que he assignar 40 bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 És 0 al nou, no? 985 00:42:43,690 --> 00:42:45,120 És 10 ints, total. 986 00:42:45,120 --> 00:42:48,790 40 bytes, però 10 intercepcions, 0 0 indexades a través. 987 00:42:48,790 --> 00:42:50,930 >> Llavors, què és que x suport de 10? 988 00:42:50,930 --> 00:42:53,090 En realitat és una mica escombraries valor desconegut. 989 00:42:53,090 --> 00:42:54,780 És la memòria que no pertany a mi. 990 00:42:54,780 --> 00:42:59,650 No hauria d'estar tocant que número 41, 42, 43, 44 byte. 991 00:42:59,650 --> 00:43:01,420 M'estic tornant una mica massa lluny. 992 00:43:01,420 --> 00:43:04,490 >> I de fet, si em quedo aquesta programa, que molt bé podria estavellar-se. 993 00:43:04,490 --> 00:43:05,790 Però de vegades, tinguem sort. 994 00:43:05,790 --> 00:43:07,706 I el que acaba de demostrar esto-- i, francament, 995 00:43:07,706 --> 00:43:11,000 mai se sap abans de Què it-- anem a córrer això. 996 00:43:11,000 --> 00:43:12,480 És en realitat no bloquegi. 997 00:43:12,480 --> 00:43:15,032 >> Però si canvi d'això, per exemple, que sigui com 1000, 998 00:43:15,032 --> 00:43:16,740 per fer això realment deliberada, vegem 999 00:43:16,740 --> 00:43:18,710 si podem aconseguir que es bloquegi aquest moment. 1000 00:43:18,710 --> 00:43:20,070 Bé, no es va estavellar. 1001 00:43:20,070 --> 00:43:22,600 Què hi ha de 100.000? 1002 00:43:22,600 --> 00:43:25,000 Anem a refer, i ara tornar a executar-lo. 1003 00:43:25,000 --> 00:43:25,500 Okay. 1004 00:43:25,500 --> 00:43:25,960 Ufff. 1005 00:43:25,960 --> 00:43:26,460 Bé. 1006 00:43:26,460 --> 00:43:29,090 Així que pel que sembla, una vegada més, aquests segments de memòria, per així dir-ho, 1007 00:43:29,090 --> 00:43:32,660 són bastant grans, pel que podem tenir sort una i altra vegada. 1008 00:43:32,660 --> 00:43:36,510 Però amb el temps, una vegada que arribi ridícul i realment anar molt lluny a la pantalla, 1009 00:43:36,510 --> 00:43:39,120 toca de memòria que realment, realment no pertany a vostè. 1010 00:43:39,120 --> 00:43:40,870 >> Però, francament, aquests tipus de bestioles van 1011 00:43:40,870 --> 00:43:43,020 a ser més difícil i més difícil esbrinar pel seu compte. 1012 00:43:43,020 --> 00:43:47,880 Però, per sort, com programadors, tenim eines que ens permeten fer això per nosaltres. 1013 00:43:47,880 --> 00:43:50,140 Així que aquesta és, potser, un dels programes més lletges, 1014 00:43:50,140 --> 00:43:52,060 fins i tot més lleig que la sortida de gdb. 1015 00:43:52,060 --> 00:43:55,670 Però sempre té una línia o 2 que són molt útils. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind és un programa que ajuda a no depurar un programa, per se, 1017 00:44:00,310 --> 00:44:03,500 però troba relacionada amb la memòria problemes, específicament. 1018 00:44:03,500 --> 00:44:07,590 S'executarà automàticament el codi per vostè i busca almenys dues coses. 1019 00:44:07,590 --> 00:44:10,680 Un, ¿vas fer alguna cosa accidental com la memòria tàctil 1020 00:44:10,680 --> 00:44:11,980 això no et pertany? 1021 00:44:11,980 --> 00:44:13,590 L'ajudarà a trobar aquests casos. 1022 00:44:13,590 --> 00:44:15,710 >> I dos, que l'ajudarà a trobar alguna cosa que es diu 1023 00:44:15,710 --> 00:44:19,270 pèrdues de memòria, que tenim completament ignorat, ingènuament, 1024 00:44:19,270 --> 00:44:21,380 durant algun temps i feliçment. 1025 00:44:21,380 --> 00:44:23,140 Però resulta que, tot aquesta vegada, sempre que sigui 1026 00:44:23,140 --> 00:44:26,620 vostè ha cridat getString a així que molts dels nostres programes, 1027 00:44:26,620 --> 00:44:28,930 vostè està demanant l'operatiu sistema per a la memòria, 1028 00:44:28,930 --> 00:44:32,070 però tens cap record de tant donant 1029 00:44:32,070 --> 00:44:36,169 esquena, fent unalloc, o lliure, com se l'anomena. 1030 00:44:36,169 --> 00:44:37,960 No, perquè mai hem Li ha demanat que ho faci. 1031 00:44:37,960 --> 00:44:41,250 >> Però tot aquest temps, els programes de que has estat escrivint en C 1032 00:44:41,250 --> 00:44:43,800 han estat fuites de memòria, demanant a l'operació 1033 00:44:43,800 --> 00:44:46,190 sistema per obtenir més i més memòria per a les cadenes i tot això, 1034 00:44:46,190 --> 00:44:47,870 però mai va tornar. 1035 00:44:47,870 --> 00:44:50,080 I ara això és una mica d'una simplificació excessiva, 1036 00:44:50,080 --> 00:44:53,550 però si alguna vegada t'has dirigit teu Mac o teu PC des de fa força temps, l'obertura 1037 00:44:53,550 --> 00:44:55,790 un munt de programes, potser tancar els programes, 1038 00:44:55,790 --> 00:44:57,795 i malgrat que la seva equip no s'ha estavellat, 1039 00:44:57,795 --> 00:45:01,690 cada vegada és molt més lent, com si realment 1040 00:45:01,690 --> 00:45:04,290 utilitzant una gran quantitat de memòria o recursos, tot i que, 1041 00:45:04,290 --> 00:45:06,070 si vostè no és encara Tocar el teclat, 1042 00:45:06,070 --> 00:45:10,430 que podria ser-- però no podia sempre-- ser que els programes que s'estan executant 1043 00:45:10,430 --> 00:45:11,920 tenen a si mateixos les pèrdues de memòria. 1044 00:45:11,920 --> 00:45:15,645 I segueixen demanant al OS de més i més memòria, però oblidant d'això, 1045 00:45:15,645 --> 00:45:18,470 en realitat no l'utilitzi, però Per tant, tenint la memòria de distància 1046 00:45:18,470 --> 00:45:20,500 d'altres programes que vulguin ell. 1047 00:45:20,500 --> 00:45:23,940 Així que aquesta és una explicació comuna. 1048 00:45:23,940 --> 00:45:25,940 Ara aquí és on Valgrind de sortida és completament 1049 00:45:25,940 --> 00:45:29,290 atroç als menys i més semblants còmode. 1050 00:45:29,290 --> 00:45:32,690 Però l'interessant coses és just aquí. 1051 00:45:32,690 --> 00:45:37,060 M'està dient una escriptura no vàlida de talla 4 succeeix en aquest programa, 1052 00:45:37,060 --> 00:45:40,640 en particular, en la línia 21 de memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Si vaig a la línia 21, hm, aquí sí és una escriptura no vàlid de mida 4. 1054 00:45:45,450 --> 00:45:46,250 Per què la mida 4? 1055 00:45:46,250 --> 00:45:49,500 Bé, això number-- i podria ser qualsevol cosa-- és un int. 1056 00:45:49,500 --> 00:45:50,450 Així que és quatre bytes. 1057 00:45:50,450 --> 00:45:52,550 Així que em vaig a posar 4 bytes on no pertanyen. 1058 00:45:52,550 --> 00:45:55,080 Això és el que Valgrind és en realitat em diu. 1059 00:45:55,080 --> 00:45:57,600 D'altra banda, també ho farà digues-me, com veurem, 1060 00:45:57,600 --> 00:46:01,490 ja que es corre aquest en un conjunt de processadors futurs, sempre i quan has filtraste memòria, el que de fet 1061 00:46:01,490 --> 00:46:05,300 Que tinc, perquè jo he anomenat malloc, però no ho he fet realitat 1062 00:46:05,300 --> 00:46:08,010 anomenat, en aquest cas, lliure, que veurem amb el temps 1063 00:46:08,010 --> 00:46:09,830 és el contrari malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Així que ara, crec, un últim exemple. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Així que aquest és una mica més arcà, però és potser 1068 00:46:16,690 --> 00:46:19,180 la raó més gran per anar amb compte amb la memòria, 1069 00:46:19,180 --> 00:46:24,490 i la raó que molts programes i / o servidors web, fins i tot a aquest dia, 1070 00:46:24,490 --> 00:46:28,200 són assumides pels nois dolents en algun lloc a l'Internet que són d'alguna manera 1071 00:46:28,200 --> 00:46:33,390 l'enviament de paquets falsos al seu servidor tractant de comprometre els seus comptes, 1072 00:46:33,390 --> 00:46:36,420 o prendre les seves dades, o simplement generalment fer-se càrrec d'una màquina. 1073 00:46:36,420 --> 00:46:38,910 Desbordament de memòria intermèdia, com la nom indica, mitjans 1074 00:46:38,910 --> 00:46:40,740 desbordant no un int, però un memòria intermèdia. 1075 00:46:40,740 --> 00:46:43,490 I un tampó és només una forma elegant de dir que és un munt de memòria. 1076 00:46:43,490 --> 00:46:46,710 >> I, de fet, vaig trucar a una cadena abans de tampó, en lloc de s. 1077 00:46:46,710 --> 00:46:49,234 Perquè si és una memòria intermèdia, com en el sentit de YouTube, 1078 00:46:49,234 --> 00:46:52,400 o en qualsevol moment que estiguis veient un vídeo, que podria haver vist la paraula buffering, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 És increïblement molest. 1081 00:46:54,240 --> 00:46:55,990 I això només significa que el seu reproductor de vídeo 1082 00:46:55,990 --> 00:46:58,710 està tractant de descarregar un munt de bytes, un munt de bytes 1083 00:46:58,710 --> 00:47:00,170 d'un vídeo d'internet. 1084 00:47:00,170 --> 00:47:02,920 Però és lent, pel que està tractant per descarregar un munt d'ells 1085 00:47:02,920 --> 00:47:06,430 per omplir un tampó, un contenidor, de manera que vostè té suficients bytes que pot llavors 1086 00:47:06,430 --> 00:47:09,174 li mostrarà el vídeo, sense aturar constantment. 1087 00:47:09,174 --> 00:47:11,340 Però resulta que, vostè pot tenir un buffer per aquesta mida. 1088 00:47:11,340 --> 00:47:15,710 Però tractar de posar aquesta quantitat de dades en , I molt dolentes coses poden succeir. 1089 00:47:15,710 --> 00:47:22,780 Així, per exemple, donem una ullada a aquest desafiament per a la final d'un exemple. 1090 00:47:22,780 --> 00:47:24,720 Aquest és un altre programa que, a primera vista, 1091 00:47:24,720 --> 00:47:26,540 no fa res super útil. 1092 00:47:26,540 --> 00:47:29,590 Té una funció principal que crida a aquesta funció, f. 1093 00:47:29,590 --> 00:47:36,640 I aquesta funció, f, fins aquí, té una matriu de caràcters, anomenat c, de cos 12. 1094 00:47:36,640 --> 00:47:39,340 I després hi ha l'ús d'aquest nova funció anomenada strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Resulta que, amb aquest senzill, simple línia de codi, a només dos línies, 1097 00:47:45,190 --> 00:47:49,130 hem fet tota la meva programa, i per tant, tot el meu equip, 1098 00:47:49,130 --> 00:47:54,000 i el meu compte d'usuari, i el meu disc conduir potencialment vulnerable a qualsevol 1099 00:47:54,000 --> 00:47:58,170 que sap i és prou bo per córrer aquest programa amb una línia d'ordres certa 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 En altres paraules, si aquest noi dolent posa dins argvargv [1] escrivint 1102 00:48:03,400 --> 00:48:08,750 en el teclat d'un molt especialment dissenyat cadena, no abc, 123, però en essència, 1103 00:48:08,750 --> 00:48:15,180 símbols binaris que representen executable codi, un programa que ell o ella va escriure, 1104 00:48:15,180 --> 00:48:19,190 amb aquest senzill programa, que és representant de milers de programes de 1105 00:48:19,190 --> 00:48:23,610 que són igualment vulnerables, m'atreveixo a dir, ell o ella en última instància, pot esborrar tots 1106 00:48:23,610 --> 00:48:26,680 els arxius en el meu disc dur, aconseguir un parpelleig ràpid perquè ell o ella pot 1107 00:48:26,680 --> 00:48:30,170 escriure ordres pel seu compte, correu electrònic tots els arxius a mi mateix. 1108 00:48:30,170 --> 00:48:34,660 Tot el que puc fer, o ella pot fer amb aquest codi. 1109 00:48:34,660 --> 00:48:36,575 >> No anem a resoldre aquest bastant encara. 1110 00:48:36,575 --> 00:48:38,700 I, de fet, va implicar una petita imatge 1111 00:48:38,700 --> 00:48:41,470 així, que aviat vindrem per entendre millor. 1112 00:48:41,470 --> 00:48:44,480 Però per ara, anem a acabar en el que és, amb sort, una mica més 1113 00:48:44,480 --> 00:48:48,360 broma XKCD comprensible, fins que reprenguem la propera vegada. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Bé. 1116 00:48:51,600 --> 00:48:53,446 Ens veiem dimecres. 1117 00:48:53,446 --> 00:48:54,754 >> [REPRODUCCIÓ DE MÚSICA] 1118 00:48:54,754 --> 00:48:57,790 >> ALTAVEU: I ara, en el fons pensaments, per Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 La memòria és com saltar en un pila de fulles d'or en una tarda de diumenge. 1121 00:49:04,770 --> 00:49:09,000 Bufat vent, llançant la seva hair-- oh, trobo a faltar els dies cuando-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Rialles] 1124 00:49:12,650 --> 00:49:13,750