1 00:00:00,000 --> 00:00:11,242 >> [Reproducció de música] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. Malan: Bé això és CS50 i aquest és el començament de la cinquena setmana. 3 00:00:16,630 --> 00:00:21,480 Així que avui, per sota dels coixins dels seients, no trobaràs res. 4 00:00:21,480 --> 00:00:24,790 Però abans, vostè ha de trobar aquests un petita mostra del nostre agraïment per 5 00:00:24,790 --> 00:00:26,970 tota la feina que es posa en el joc dels Quinze. 6 00:00:26,970 --> 00:00:30,290 Simplement tregui el petit cercle en el sota per començar a jugar per al 7 00:00:30,290 --> 00:00:31,680 resta de la classe. 8 00:00:31,680 --> 00:00:38,930 >> Així que recorda que, o saber que problema plantejat 04:00, que va sortir aquest cap de setmana, 9 00:00:38,930 --> 00:00:40,340 implica escriure un altre joc. 10 00:00:40,340 --> 00:00:43,740 Però aquesta vegada es tracta d'utilitzar un interfície gràfica d'usuari real, no una 11 00:00:43,740 --> 00:00:46,310 de textual com Joc dels Quinze era. 12 00:00:46,310 --> 00:00:50,210 I el joc que està davant teu, si encara no has vist aquesta propera, 13 00:00:50,210 --> 00:00:52,310 es veu una mica d'alguna cosa com això. 14 00:00:52,310 --> 00:00:55,170 Vaig a entrar en el meu terminal aquí a BGF finestra. 15 00:00:55,170 --> 00:00:58,600 I jo seguiré endavant i executar el necessitat de personal, que es pot accedir 16 00:00:58,600 --> 00:01:01,010 després d'executar l'actualització 50, com de costum. 17 00:01:01,010 --> 00:01:04,090 >> Però em vaig a posar en una mica de manera secreta, un petit ou de Pasqua, 18 00:01:04,090 --> 00:01:08,480 anomenat mode Déu, posar a Déu en argv1. 19 00:01:08,480 --> 00:01:12,920 I he de seguir les meves pròpies adreces, executar en la meva pròpia 20 00:01:12,920 --> 00:01:14,220 problema de configurar el directori. 21 00:01:14,220 --> 00:01:19,190 Així que ja ho veus una versió completa del joc de Breakout. 22 00:01:19,190 --> 00:01:21,090 De fet, aquest és la manera de no-mans. 23 00:01:21,090 --> 00:01:24,850 Així que en realitat és - 24 00:01:24,850 --> 00:01:26,470 captivar tot i que podria ser - 25 00:01:26,470 --> 00:01:30,850 bastant trivial per implementar la manera Déu en Breakout, a diferència del joc dels Quinze, 26 00:01:30,850 --> 00:01:33,590 que alguns de vostès han abordat per a l'edició dels pirates cibernètics. 27 00:01:33,590 --> 00:01:37,890 >> En Breakout ha prou en Déu la manera amb què es faci el que, 28 00:01:37,890 --> 00:01:41,220 intuïtivament amb la pala? 29 00:01:41,220 --> 00:01:45,630 Així que tingui la mateixa sigui quin sigui el posició horitzontal de la pilota. 30 00:01:45,630 --> 00:01:49,220 I mentre ho fa al mateix ritme amb la pilota en moviment el joc es 31 00:01:49,220 --> 00:01:53,100 Mai, mai, mai perdis la pilota i que guanyarà cada vegada. 32 00:01:53,100 --> 00:01:55,430 >> Però en l'edició pirata de la setmana hi ha alguna cosa més que la manera de Déu. 33 00:01:55,430 --> 00:01:56,720 Hi ha un nombre d'altres característiques. 34 00:01:56,720 --> 00:01:58,140 Entre ells, els làsers. 35 00:01:58,140 --> 00:02:01,070 Així que si vostè realment aconsegueix impacient que pot iniciar l'enderroc dels maons 36 00:02:01,070 --> 00:02:02,120 i alguns altres. 37 00:02:02,120 --> 00:02:04,560 I per a aquells de vostès que li agradaria calibrar estàndard versus hackers 38 00:02:04,560 --> 00:02:08,750 edició, veig que d'aquesta setmana edició pirata informàtic deliberadament una 39 00:02:08,750 --> 00:02:12,830 poc més factible, per exemple, que Déu manera va ser amb el joc dels Quinze. 40 00:02:12,830 --> 00:02:15,300 >> Així que si vostè està a la recerca d'un tram i vostè està buscant una mica de diversió addicional 41 00:02:15,300 --> 00:02:18,400 característiques fan busseig en si d'interessos. 42 00:02:18,400 --> 00:02:21,280 Ara més pràcticament, permetin-me assenyalar a terme una cosa així. 43 00:02:21,280 --> 00:02:24,780 GDB, que alguns de vosaltres encara no poden tenir tocat personalment, cosa que està bé. 44 00:02:24,780 --> 00:02:28,530 Però ara és realment el temps per acostumar a això i còmode amb aquesta eina 45 00:02:28,530 --> 00:02:31,510 ja que farà que les seves vides molt més fàcil, realment. 46 00:02:31,510 --> 00:02:34,900 >> Per la conferència de Rob en GDB un parell de setmanes enrere, recordar 47 00:02:34,900 --> 00:02:36,810 que GDB és un depurador. 48 00:02:36,810 --> 00:02:41,230 És una eina que li permet executar el seu programa, però el porta pas a pas, la línia 49 00:02:41,230 --> 00:02:45,680 per línia, perquè pugui furgar, perquè vegis les coses que succeeixen, pel 50 00:02:45,680 --> 00:02:47,310 que es pot imprimir valors de les variables. 51 00:02:47,310 --> 00:02:50,580 En poques paraules, li dóna molt més energia que printDef fa. 52 00:02:50,580 --> 00:02:52,900 >> Ara és cert, la interfície és bastant misteriós. 53 00:02:52,900 --> 00:02:55,180 Interfície de text en blanc i negre en la seva major part. 54 00:02:55,180 --> 00:02:57,400 Les comandes són una mica difícils per recordar al primer. 55 00:02:57,400 --> 00:03:01,230 Però tot i que podria haver de mitjana una hora, una hora, per dir que per avançat 56 00:03:01,230 --> 00:03:02,940 inversió de temps en ella, confia en mi. 57 00:03:02,940 --> 00:03:06,440 Certament, abans de final de semestre es guardarà que un ordre de magnitud més 58 00:03:06,440 --> 00:03:07,600 temps que això. 59 00:03:07,600 --> 00:03:09,200 >> Així que a principis de la setmana capbussar 60 00:03:09,200 --> 00:03:13,200 I en termes de Breakout, sap que pot fer-ho sempre que vostè té 61 00:03:13,200 --> 00:03:18,230 el codi de distribució o el seu propi codi en curs en el directori Pst4. 62 00:03:18,230 --> 00:03:21,680 Sàpiga que vostè pot executar gdb. / Ruptura. 63 00:03:21,680 --> 00:03:23,490 >> Això va a obrir una finestra com aquesta. 64 00:03:23,490 --> 00:03:25,530 Deixeu-me em lliuro més d'una finestra de terminal. 65 00:03:25,530 --> 00:03:27,770 I llavors el que vaig a seguir endavant i fer, és no només el dirigeix. 66 00:03:27,770 --> 00:03:30,690 Vaig a establir per primera vegada un punt d'inflexió recordo, que li permet fer una pausa 67 00:03:30,690 --> 00:03:32,500 execució en un determinat lloc. 68 00:03:32,500 --> 00:03:35,750 >> Només per mantenir les coses simples que vaig trencar en la línia un amb tan sols escriure 69 00:03:35,750 --> 00:03:37,000 el número u. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Permetin-me realment tornar a obrir aquesta finestra perquè s'està fent un 72 00:03:43,250 --> 00:03:45,700 mica petit allà. 73 00:03:45,700 --> 00:03:53,270 Així que el que ara faré aquí és si obro la meva finestra de terminal. 74 00:03:53,270 --> 00:03:53,910 Anem, aquí anem. 75 00:03:53,910 --> 00:03:59,850 >> Així que ara si torno a dropbox, Pst4 i executar gdb. / breakout entrar, es va adonar 76 00:03:59,850 --> 00:04:02,600 Vaig a trencar un per establir un punt de trencament en la línia un. 77 00:04:02,600 --> 00:04:04,840 I ara em vaig a anar endavant i escriviu run. 78 00:04:04,840 --> 00:04:07,370 I quan ho faci, observi res sembla succeir. 79 00:04:07,370 --> 00:04:08,120 >> No hi ha pop up. 80 00:04:08,120 --> 00:04:09,790 No hi ha gràfic interfície d'usuari encara. 81 00:04:09,790 --> 00:04:13,340 Però això és comprensible perquè estic literalment, en la línia que està en el meu programa. 82 00:04:13,340 --> 00:04:17,110 I noto que he avança ràpidament, específicament ara a 62, perquè tots 83 00:04:17,110 --> 00:04:20,600 les coses a la part superior d'aquest arxiu és coses com els comentaris i les constants i 84 00:04:20,600 --> 00:04:22,460 sense interès material per ara. 85 00:04:22,460 --> 00:04:25,840 >> Així que ara estic dins del principal, pel que sembla, en la línia 62. 86 00:04:25,840 --> 00:04:27,960 I això és només la distribució codi, el record. 87 00:04:27,960 --> 00:04:33,810 Si obro aquesta per anar, de manera similar, en el meu directori de bústia a Pst4, 88 00:04:33,810 --> 00:04:35,450 en breakout.c. 89 00:04:35,450 --> 00:04:40,670 I si em desplaço cap avall i avall i avall, i vull seguir endavant i encenc 90 00:04:40,670 --> 00:04:44,990 els meus números de línia. 91 00:04:44,990 --> 00:04:50,300 >> El que vaig a veure si em desplaço fins línia 62, és exactament la línia que 92 00:04:50,300 --> 00:04:50,910 hem aturar a. 93 00:04:50,910 --> 00:04:53,720 Així que aquesta línia d'aquí, 62 anys, és quan estem a punt de ser-ho. 94 00:04:53,720 --> 00:04:57,470 Així que ara a GDB, si segueixo endavant i escric ia continuació, escrigui que va a 95 00:04:57,470 --> 00:04:58,450 executar aquesta línia. 96 00:04:58,450 --> 00:05:00,610 I voila, tenim la l'anomenada finestra de g. 97 00:05:00,610 --> 00:05:02,800 Si no està familiaritzat amb el que una GWindow és a dir, que no es preocupés. 98 00:05:02,800 --> 00:05:05,740 L'especificació li donarà a conèixer, com així com una sèrie de vídeos tutorial 99 00:05:05,740 --> 00:05:06,830 incrustat en l'especificació. 100 00:05:06,830 --> 00:05:08,610 >> Però ara anem a fer d'aquest un mica més interessant. 101 00:05:08,610 --> 00:05:10,960 Vaig a moure aquesta finestra a través de a un costat una mica. 102 00:05:10,960 --> 00:05:13,480 Permetin-me fer una mica la finestra gran perquè pugui veure més. 103 00:05:13,480 --> 00:05:16,140 >> I ara me n'aniré per davant i fer la propera vegada. 104 00:05:16,140 --> 00:05:17,550 I no són els meus maons. 105 00:05:17,550 --> 00:05:20,490 Si escric propera vegada ara veig la pilota. 106 00:05:20,490 --> 00:05:23,520 I si escric propera vegada ara veig la paleta. 107 00:05:23,520 --> 00:05:26,690 >> I afortunadament això no és gedit realment cooperar mostrant 108 00:05:26,690 --> 00:05:27,660 tot el que vull. 109 00:05:27,660 --> 00:05:30,820 Però si faig el següent una altra vegada, següent una altra vegada, estic 110 00:05:30,820 --> 00:05:32,260 declarar algunes variables. 111 00:05:32,260 --> 00:05:34,750 I puc imprimir qualsevol d'aquests nois. 112 00:05:34,750 --> 00:05:37,170 Maons d'impressió, impressions vides. 113 00:05:37,170 --> 00:05:39,910 >> I ara, si segueixo fent següent, noto que seré 114 00:05:39,910 --> 00:05:40,870 a l'interior d'aquest bucle. 115 00:05:40,870 --> 00:05:43,380 No obstant això, el codi es va a executar exactament el que jo esperava. 116 00:05:43,380 --> 00:05:45,810 Així que quan vaig arribar a aquesta funció, esperi de Click, que farà 117 00:05:45,810 --> 00:05:46,830 literalment això. 118 00:05:46,830 --> 00:05:48,870 Així que em semblava haver perdut el control sobre el programa. 119 00:05:48,870 --> 00:05:50,480 >> BGF no em dóna un altre avís. 120 00:05:50,480 --> 00:05:51,500 Però no es preocupi. 121 00:05:51,500 --> 00:05:53,720 Aneu al meu joc, feu clic a algun lloc. 122 00:05:53,720 --> 00:05:56,270 >> I ja està, ara es procedeix a la línia 86. 123 00:05:56,270 --> 00:05:59,460 Així que de nou, és molt valuosa, en última instància, per als problemes de depuració. 124 00:05:59,460 --> 00:06:03,050 Perquè vostè pot caminar literalment a través el seu codi, imprimir coses i molt més, 125 00:06:03,050 --> 00:06:03,640 molt, més. 126 00:06:03,640 --> 00:06:07,210 Però per ara, les eines per si sols ha t'ofereix molt més. 127 00:06:07,210 --> 00:06:10,050 >> Així que estem, per descomptat, fer una ullada en Gràfiques ara, de cop i volta. 128 00:06:10,050 --> 00:06:12,350 I ara el nostre món es torna una mica més interessant. 129 00:06:12,350 --> 00:06:15,680 I vostè sap, potser, d'alguns dels vídeos en línia que tenim aquests 130 00:06:15,680 --> 00:06:18,280 curts que has estat veient com a part de conjunts de problemes. 131 00:06:18,280 --> 00:06:20,460 >> I han estat afusellats, deliberadament, contra un teló de fons blanc. 132 00:06:20,460 --> 00:06:23,380 I alguns d'ells tenen l'ensenyament Els becaris de dibuix un text en el 133 00:06:23,380 --> 00:06:25,490 pantalla que se superposa al costat d'ells. 134 00:06:25,490 --> 00:06:27,760 Però, és clar, això no és tot el que interessant en el món real. 135 00:06:27,760 --> 00:06:30,520 Això és només una sala de conferències amb una pantalla gran de color blanc i un teló de fons. 136 00:06:30,520 --> 00:06:33,330 I el nostre increïble equip de producció tipus de fa que tot sembli bonic 137 00:06:33,330 --> 00:06:36,620 després dels fets pels quals afloren o superposició de res 138 00:06:36,620 --> 00:06:37,840 que fem o no volem. 139 00:06:37,840 --> 00:06:41,560 >> Ara només has de motivar aquesta setmana i realment, on es pot anar, en última instància, 140 00:06:41,560 --> 00:06:42,560 amb la informàtica. 141 00:06:42,560 --> 00:06:44,260 No només després de problema plantejat 04:00. 142 00:06:44,260 --> 00:06:48,240 Però després d'un altre curs o un enter currículum és increïble el que es pot 143 00:06:48,240 --> 00:06:51,090 fer en aquests dies, en termes de gràfics en particular. 144 00:06:51,090 --> 00:06:53,440 >> Alguns de vosaltres heu vist aquest flueix al voltant en línia. 145 00:06:53,440 --> 00:06:56,240 Però vaig pensar que t'anava a presentar, per un parell de minuts, una visió del 146 00:06:56,240 --> 00:07:01,890 tecnologia informàtica i el que CGI, gràfics d'ordinador poden fer en aquests dies 147 00:07:01,890 --> 00:07:04,510 amb una cançó coneguda i potser pel · lícula. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LLANA DE L'RAY, "JOVE I BELLA] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> ALTAVEU 1: És només una mica increïble, potser, el 151 00:10:52,470 --> 00:10:52,857 omnipresent - 152 00:10:52,857 --> 00:10:57,040 >> [Aplaudiments] 153 00:10:57,040 --> 00:10:59,230 >> ALTAVEU 1: Acabo de descarregar ell. 154 00:10:59,230 --> 00:11:02,920 Però és realment increïble, crec que, igual com el programari omnipresent i codi i 155 00:11:02,920 --> 00:11:04,230 eines com aquesta realitat. 156 00:11:04,230 --> 00:11:07,685 Així que això és una mostra de la direcció en el qual es pot anar. 157 00:11:07,685 --> 00:11:10,620 Oh, no més Appliance avui. 158 00:11:10,620 --> 00:11:14,640 Bé, això és realment tràgic moment donat al punt que només vaig tractar de fer. 159 00:11:14,640 --> 00:11:18,670 >> Molt bé, així que anem a llançar Fusió de nou. 160 00:11:18,670 --> 00:11:20,800 Recordar més tard. 161 00:11:20,800 --> 00:11:24,190 Molt bé, i que hauria d'haver aconseguit una correu electrònic en un a part si es va fer un 162 00:11:24,190 --> 00:11:25,460 compte així. 163 00:11:25,460 --> 00:11:29,940 Molt bé, així que recordar que la setmana passada comencem a pelar aquest 164 00:11:29,940 --> 00:11:31,380 més tard conegut com a cadena. 165 00:11:31,380 --> 00:11:34,700 >> string recorda un tipus de dades que és declarat a la biblioteca CS50. 166 00:11:34,700 --> 00:11:37,740 I és part de les rodes d'entrenament que ara començarà a enlairar-se. 167 00:11:37,740 --> 00:11:41,280 Era un concepte útil des del principi. 168 00:11:41,280 --> 00:11:43,750 Però ara es posarà més interessant i més poderosa per 169 00:11:43,750 --> 00:11:48,330 realment veure que sota el capó, una cadena és just el que, ens vam dir? 170 00:11:48,330 --> 00:11:50,500 >> Sí, així que és una crida char *. 171 00:11:50,500 --> 00:11:53,860 I el * denota que no hi ha algun tipus de direcció dels involucrats. 172 00:11:53,860 --> 00:11:58,690 I així, quan vostè diu char * només dir una variable el tipus de dades és un 173 00:11:58,690 --> 00:11:59,290 punter ara. 174 00:11:59,290 --> 00:12:01,770 El fet que no hi ha l'estrella simplement vol dir que vostè està declarant un 175 00:12:01,770 --> 00:12:03,020 els anomenats punter. 176 00:12:03,020 --> 00:12:06,220 I aquest punter va a semblar emmagatzemar la direcció de, per 177 00:12:06,220 --> 00:12:07,810 Per descomptat, un char. 178 00:12:07,810 --> 00:12:08,960 >> Ara, per què té sentit? 179 00:12:08,960 --> 00:12:11,200 Bé, el que és una cadena sota de la caputxa? 180 00:12:11,200 --> 00:12:15,130 Bé, fa temps que hem estat dient que una cadena sota de la campana és 181 00:12:15,130 --> 00:12:18,460 només h-I-l-l-o, per exemple. 182 00:12:18,460 --> 00:12:21,585 >> Però ja hem parlat d'això com sent, en essència, una matriu. 183 00:12:21,585 --> 00:12:25,410 I un conjunt llavors mirar una mica de la mateixa família, amb cada un d'aquests 184 00:12:25,410 --> 00:12:26,460 fer un mos. 185 00:12:26,460 --> 00:12:28,710 I hem dit que hi ha alguna cosa especial tornar aquí, el 186 00:12:28,710 --> 00:12:31,270 barra invertida 0 o terminador nul. 187 00:12:31,270 --> 00:12:35,230 >> Així que tot aquest temps, això aquí ha estat una cadena. 188 00:12:35,230 --> 00:12:38,320 Però, en realitat, una cadena és en realitat una direcció. 189 00:12:38,320 --> 00:12:43,210 I les direccions, com veurem, són sovint amb el prefix 0x per convenció. 190 00:12:43,210 --> 00:12:44,540 Què denoten 0x? 191 00:12:44,540 --> 00:12:45,970 Algú ho sap? 192 00:12:45,970 --> 00:12:47,320 >> Tan sols significa hexadecimal. 193 00:12:47,320 --> 00:12:52,360 Així que vostè pot recordar, en realitat, des Pst 1, crec, una de les d'escalfament 194 00:12:52,360 --> 00:12:55,740 preguntes realment els va preguntar sobre notació hexadecimal, a més de 195 00:12:55,740 --> 00:12:57,100 binari i decimal. 196 00:12:57,100 --> 00:13:00,460 I la motivació aquí és que amb hexadecimal que té 16 197 00:13:00,460 --> 00:13:01,770 els dígits a la seva disposició. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, seguit per a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> I si es compten tots els de dalt, s'obté un total de 16. 200 00:13:10,430 --> 00:13:13,200 Així que això és en contrast amb decimal, on tenim 10 201 00:13:13,200 --> 00:13:14,690 dígits, del 0 al 9. 202 00:13:14,690 --> 00:13:17,750 És en contrast amb el binari on només tenim 0 i 1. 203 00:13:17,750 --> 00:13:21,450 >> Però al final del dia vostè pot simplement representar els mateixos números, però 204 00:13:21,450 --> 00:13:22,500 alguna cosa diferent. 205 00:13:22,500 --> 00:13:25,840 I hexadecimal és comú, ja que resulta que - i veurem aquesta 206 00:13:25,840 --> 00:13:28,790 més endavant en el curs - fins i tot quan ens a la programació web en el context de 207 00:13:28,790 --> 00:13:32,100 HTML i els codis de color, hexadecimal és agradable. 208 00:13:32,100 --> 00:13:36,390 Com que cada dígit, resulta que, representa quatre bits perfectament. 209 00:13:36,390 --> 00:13:39,280 Per tant, només una mica de línies molt bé com veurem amb el temps veiem. 210 00:13:39,280 --> 00:13:44,720 Així que això podria ser Ox123 o alguna cosa així, que denota la direcció 123 211 00:13:44,720 --> 00:13:47,050 en algun lloc dins meu la memòria de l'ordinador. 212 00:13:47,050 --> 00:13:50,600 >> Però, és clar, sorgeixen alguns problemes a causa d'això subjacent 213 00:13:50,600 --> 00:13:51,520 aplicació. 214 00:13:51,520 --> 00:13:55,930 I recordo que vaig prendre una punyalada en implementació d'una funció com aquesta - 215 00:13:55,930 --> 00:14:00,260 comparar tauler 0 punts c la setmana passada, que tot i que semblava que era 216 00:14:00,260 --> 00:14:04,270 bé, simplement no es pot comparar dues cordes correctament. 217 00:14:04,270 --> 00:14:07,470 >> He tirat principal, i m'he llançat lluny els comentaris dels clients es centrin en l' 218 00:14:07,470 --> 00:14:08,970 el codi que és d'interès aquí. 219 00:14:08,970 --> 00:14:10,660 I és en vermell perquè és erroni. 220 00:14:10,660 --> 00:14:11,670 Per quina raó? 221 00:14:11,670 --> 00:14:15,890 >> Bé, a la part superior existeix quan vaig declarar una cadena, el que realment estava passant 222 00:14:15,890 --> 00:14:17,260 sota de la caputxa? 223 00:14:17,260 --> 00:14:19,530 Bé, deixa anar a la Aquí la pantalla i dibuixar això. 224 00:14:19,530 --> 00:14:23,230 Així que jo vaig declarar, de nou, string s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Així que seguiré endavant i ara s per dibuixar el que realment és. 226 00:14:26,640 --> 00:14:28,590 Serà una plaça aquí. 227 00:14:28,590 --> 00:14:30,490 I vaig a reclamar que això és 32 bits. 228 00:14:30,490 --> 00:14:32,890 Almenys en general és, almenys en el CS50 229 00:14:32,890 --> 00:14:34,520 aparell en una gran quantitat d'equips. 230 00:14:34,520 --> 00:14:35,980 Vaig a cridar s. 231 00:14:35,980 --> 00:14:39,070 >> Però ara recordo que anomenada GetString. 232 00:14:39,070 --> 00:14:41,430 Així que torna GetString, per descomptat, una cadena. 233 00:14:41,430 --> 00:14:45,790 Si l'usuari escriu en h-e-l-l-o entren la cadena hola es retorna. 234 00:14:45,790 --> 00:14:51,010 I aquesta cadena, com acabem de dir, acaba a la memòria del seu ordinador a algun lloc 235 00:14:51,010 --> 00:14:53,240 amb una barra invertida 0 al final. 236 00:14:53,240 --> 00:14:56,650 Vaig a trucar aquesta com la matriu - o bloc contigu de caràcters - 237 00:14:56,650 --> 00:14:58,330 que en realitat és. 238 00:14:58,330 --> 00:15:01,790 >> I ara, què és getString fet tornar? 239 00:15:01,790 --> 00:15:04,340 Què ha estat tornant getString tot aquest temps? 240 00:15:04,340 --> 00:15:07,520 Bé, diem, en setmanes anteriors, retorna una cadena. 241 00:15:07,520 --> 00:15:10,250 No obstant això, més tècnicament, el que fa GetString retorn semblar? 242 00:15:10,250 --> 00:15:11,610 >> AUDIÈNCIA: Una adreça. 243 00:15:11,610 --> 00:15:12,600 >> ALTAVEU 1: Una adreça. 244 00:15:12,600 --> 00:15:16,630 Específicament, es torna la direcció de la primera mossegada, el que sigui. 245 00:15:16,630 --> 00:15:18,830 Segueixo fent servir un, dos, tres perquè és convenient. 246 00:15:18,830 --> 00:15:21,380 >> Es retorna l'adreça de la primera caràcter en la cadena. 247 00:15:21,380 --> 00:15:23,510 I vam dir la setmana passada que que és suficient. 248 00:15:23,510 --> 00:15:26,710 Perquè sempre podem esbrinar on al final de la cadena amb només 249 00:15:26,710 --> 00:15:30,150 iterar sobre ella, potser, amb una de llaç o bucle while o alguna cosa així 250 00:15:30,150 --> 00:15:34,990 que, només a la recerca de "barra invertida 0", el caràcter especial sentinella. 251 00:15:34,990 --> 00:15:37,220 >> I sabem que la cadena passa a ser de longitud - 252 00:15:37,220 --> 00:15:37,980 en aquest cas - 253 00:15:37,980 --> 00:15:38,670 05:00. 254 00:15:38,670 --> 00:15:43,800 Així que tècnicament ho fa GetString es torna Ox123 en aquest cas. 255 00:15:43,800 --> 00:15:53,670 I tècnicament el que passa llavors és que emmagatzemem, a l'interior de s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Al final del dia, tot i que aquest és nou concepte, els punters, són 257 00:15:56,460 --> 00:15:57,350 només variables. 258 00:15:57,350 --> 00:16:00,440 Però succeeix que emmagatzemar bits que representar col · lectivament una adreça. 259 00:16:00,440 --> 00:16:03,700 Així que tècnicament tot el que obté emmagatzemats en si és Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Però nosaltres, com a éssers humans - 261 00:16:04,680 --> 00:16:06,020 inclòs avui en endavant - 262 00:16:06,020 --> 00:16:09,290 realment no s'importarà, en general, quina és l'adreça real és 263 00:16:09,290 --> 00:16:10,520 d'alguna part de la memòria. 264 00:16:10,520 --> 00:16:14,040 És només que a menor nivell de detall ser intel · lectualment interessant. 265 00:16:14,040 --> 00:16:15,440 Així que em vaig a desfer això. 266 00:16:15,440 --> 00:16:19,810 I en canvi, més alt nivell, simplement dir que quan estem parlant de punters 267 00:16:19,810 --> 00:16:22,170 Jo només vaig a trucar més arrow fàcil d'usar que transmet la 268 00:16:22,170 --> 00:16:26,060 mateixa idea i abstreu els detalls del que l'actual 269 00:16:26,060 --> 00:16:27,700 Direcció subjacent. 270 00:16:27,700 --> 00:16:33,290 >> Ara bé, si ens remuntem en el codi, el que va passar la setmana passada si tenim cadena t 271 00:16:33,290 --> 00:16:34,510 és igual a GetString? 272 00:16:34,510 --> 00:16:38,630 Bé, si de nou, escriviu hola aquesta vegada ho aconseguiré 273 00:16:38,630 --> 00:16:40,460 altra part de la memòria. 274 00:16:40,460 --> 00:16:44,820 h-I-l-l-o barra invertida 0. 275 00:16:44,820 --> 00:16:48,320 >> Però perquè vaig trucar GetString per segona vegada - 276 00:16:48,320 --> 00:16:51,100 i sé que això de mirar la codi font per GetString - fins i tot 277 00:16:51,100 --> 00:16:54,350 encara que és una coincidència que hola era escrit en dues ocasions, GetString no és 278 00:16:54,350 --> 00:16:55,890 anem a tractar d'optimitzar i ser intel · ligent. 279 00:16:55,890 --> 00:16:58,550 No només va a aconseguir un altre tros de la memòria de l'ordinador, que és 280 00:16:58,550 --> 00:16:59,640 serà en una altra direcció. 281 00:16:59,640 --> 00:17:02,330 Anem a dir simplement arbitrària 456. 282 00:17:02,330 --> 00:17:04,079 >> I llavors, què es va a tornar? 283 00:17:04,079 --> 00:17:08,030 Es va a tornar 456 i deseu-lo en t. 284 00:17:08,030 --> 00:17:12,010 Llavors, què està passant en realitat, al esquerra és que tinc un altre tros 285 00:17:12,010 --> 00:17:14,260 de la memòria, típicament 32 bits. 286 00:17:14,260 --> 00:17:16,720 I aquí es va a anar Ox456. 287 00:17:16,720 --> 00:17:20,140 Però, de nou, no estic interessat en aquests números particulars més. 288 00:17:20,140 --> 00:17:23,069 Jo només vaig a abstractament dibuixar com una fletxa. 289 00:17:23,069 --> 00:17:25,202 >> Així que aquesta és ara una nova explicació. 290 00:17:25,202 --> 00:17:28,735 Però és la mateixa idea exacta que és vingut succeint durant tot aquest temps. 291 00:17:28,735 --> 00:17:33,150 I així, la raó, doncs, que aquesta primera versió de comparació era amb errors 292 00:17:33,150 --> 00:17:34,480 la setmana passada és la raó? 293 00:17:34,480 --> 00:17:38,000 Quan ho faci, si s és igual a igual t ¿Quins són realment 294 00:17:38,000 --> 00:17:40,550 sota de la caputxa comparant? 295 00:17:40,550 --> 00:17:41,910 >> Vostè està comparant les direccions. 296 00:17:41,910 --> 00:17:47,950 I només intuïtivament, clarament, Ox123 no va a la igualtat Ox456. 297 00:17:47,950 --> 00:17:49,380 Aquests números, aquests bits són només diferents. 298 00:17:49,380 --> 00:17:53,220 >> I així, constantment, la setmana passada, va dir escriu coses diferents, encara que el 299 00:17:53,220 --> 00:17:55,360 paraules van ser textualment la mateixa. 300 00:17:55,360 --> 00:17:58,770 Així que podem solucionar aquest problema. 301 00:17:58,770 --> 00:18:00,120 En termes senzills, quina va ser la solució? 302 00:18:00,120 --> 00:18:02,110 >> AUDIÈNCIA: Utilitzeu una funció. 303 00:18:02,110 --> 00:18:02,870 >> ALTAVEU 1: Utilitzeu una funció. 304 00:18:02,870 --> 00:18:05,190 O les estrelles són sens dubte involucrats, però l'ús d'una funció per fer què? 305 00:18:05,190 --> 00:18:05,962 >> AUDIÈNCIA: Comparar les cordes. 306 00:18:05,962 --> 00:18:07,390 >> ALTAVEU 1: Comparar les cordes. 307 00:18:07,390 --> 00:18:11,030 Així que el problema fonamental era que només estava pensant en la 308 00:18:11,030 --> 00:18:15,870 qualitat de cadenes a ser definida per comparació de les seves direccions. 309 00:18:15,870 --> 00:18:18,540 I, òbviament, això és tonto ara, un cop vostè entén el que està passant 310 00:18:18,540 --> 00:18:19,510 sota de la caputxa. 311 00:18:19,510 --> 00:18:23,270 Per comparar realment les cadenes per veure si que són iguals en la forma en què un ésser humà 312 00:18:23,270 --> 00:18:26,680 es consideren dues cadenes són iguals necessitem comparar caràcter de 313 00:18:26,680 --> 00:18:28,070 caràcter a caràcter. 314 00:18:28,070 --> 00:18:30,020 >> Ara jo podria haver fet aquesta molt prolixament. 315 00:18:30,020 --> 00:18:32,240 Però familiarment, estem utilitzant un bucle. 316 00:18:32,240 --> 00:18:36,050 I just comparar s abraçadora i contra el suport t i. 317 00:18:36,050 --> 00:18:39,590 s i suport més 1 contra t suport i + 1, i així successivament, a l'interior 318 00:18:39,590 --> 00:18:40,580 algun tipus de bucle. 319 00:18:40,580 --> 00:18:44,950 I si veig qualsevol dels dos personatges que són diferents, o si m'adono que ooh, s és 320 00:18:44,950 --> 00:18:48,410 més curt que t o més llarg que t El que puc dir immediatament fals, 321 00:18:48,410 --> 00:18:49,390 no són el mateix. 322 00:18:49,390 --> 00:18:55,370 >> Però si em poso a través de s i t i dir mateix, la mateixa, igual, igual, igual, final de 323 00:18:55,370 --> 00:18:58,520 ambdues cadenes, puc dir cert, són iguals. 324 00:18:58,520 --> 00:19:01,040 Fa Bé, per sort, any a algú escriure que codifiquen per a nosaltres. 325 00:19:01,040 --> 00:19:03,790 >> I ho van cridar STRCOMP per a la comparació de cadenes. 326 00:19:03,790 --> 00:19:11,900 I tot i que és un petit taulell intuïtiva, StrComp retorna 0 si els 327 00:19:11,900 --> 00:19:14,520 dues cadenes, s i t són els mateixos. 328 00:19:14,520 --> 00:19:18,090 Però torna valor negatiu si s ha de venir abans de t alfabètic o 329 00:19:18,090 --> 00:19:20,610 valor positiu si s'hauria després de t alfabèticament. 330 00:19:20,610 --> 00:19:24,030 >> Així que si mai voleu ordenar alguna cosa, resulta que StrComp és útil. 331 00:19:24,030 --> 00:19:26,660 A causa que no es limita a dir si o no, iguals o no. 332 00:19:26,660 --> 00:19:30,440 Li dóna un sentit d'ordenar com una força diccionari. 333 00:19:30,440 --> 00:19:33,770 Així StrComp, s comes t és igual a és igual a 0 significa que el 334 00:19:33,770 --> 00:19:35,200 cadenes són realment iguals. 335 00:19:35,200 --> 00:19:38,680 Perquè qui va escriure aquesta funció Fa anys utilitzat presumiblement un bucle 336 00:19:38,680 --> 00:19:42,840 o un bucle while o alguna cosa així per integrar més dels caràcters de nou 337 00:19:42,840 --> 00:19:45,270 i una i altra vegada. 338 00:19:45,270 --> 00:19:47,300 >> No obstant això, dos problemes van sorgir aquí. 339 00:19:47,300 --> 00:19:48,750 Aquest era copy0.c. 340 00:19:48,750 --> 00:19:51,680 I els dos en vermell és perquè és defectuós. 341 00:19:51,680 --> 00:19:52,800 I el que vam fer aquí? 342 00:19:52,800 --> 00:19:54,310 Bé, primer que vaig trucar GetString. 343 00:19:54,310 --> 00:19:56,255 I vaig guardar el valor de retorn en si. 344 00:19:56,255 --> 00:20:00,260 Així que això és més o menys el mateix que aquesta part superior de la imatge. 345 00:20:00,260 --> 00:20:01,490 >> Però, què ve després? 346 00:20:01,490 --> 00:20:04,980 Bé, deixa anar endavant i desfaig d'un munt d'això. 347 00:20:04,980 --> 00:20:09,650 Anem a rebobinar en el temps per al qual només que s, que ara és consistent amb 348 00:20:09,650 --> 00:20:10,940 línia un allà. 349 00:20:10,940 --> 00:20:11,400 >> Reviso. 350 00:20:11,400 --> 00:20:13,450 Si s és igual a és igual a 0. 351 00:20:13,450 --> 00:20:18,670 Ara, una nota ràpida, quan podria GetString tornar 0? 352 00:20:18,670 --> 00:20:19,580 No hi ha prou memòria. 353 00:20:19,580 --> 00:20:19,880 Cert? 354 00:20:19,880 --> 00:20:22,310 >> És estrany que això va a succeir, sens dubte en un equip que està 355 00:20:22,310 --> 00:20:24,740 té centenars de megues o fins i tot gigues de RAM. 356 00:20:24,740 --> 00:20:27,080 Però podria, en teoria, tornar 0, especialment si el 357 00:20:27,080 --> 00:20:28,080 usuari no coopera. 358 00:20:28,080 --> 00:20:31,640 Hi ha maneres de fer veure que no ho ha fet res d'entrada i el parany 359 00:20:31,640 --> 00:20:34,100 GetString a la volta 0 eficaçment. 360 00:20:34,100 --> 00:20:35,470 >> Així que va a comprovar això. 361 00:20:35,470 --> 00:20:39,430 Perquè si algun de vostès han començat a aconseguir, ja, de segment - 362 00:20:39,430 --> 00:20:42,280 que probablement ha estat una font de certa frustració - 363 00:20:42,280 --> 00:20:46,150 aquests són gairebé sempre el resultat d'error relacionat amb la memòria. 364 00:20:46,150 --> 00:20:50,440 D'alguna manera en mal estat respecte a un punter, encara que no es va adonar 365 00:20:50,440 --> 00:20:51,530 hi va haver un punter. 366 00:20:51,530 --> 00:20:55,260 Així que podria haver induït la segmentació defectes tan aviat com la primera setmana amb 367 00:20:55,260 --> 00:21:02,100 alguna cosa així com un bucle o un temps llaç i una matriu per anar massa lluny 368 00:21:02,100 --> 00:21:05,900 més enllà dels límits de la matriu que alguns vostè va declarar, en la segona setmana de 369 00:21:05,900 --> 00:21:06,690 en particular. 370 00:21:06,690 --> 00:21:09,220 >> És possible que hagi fet, fins i tot en un problema establir 4 amb Breakout. 371 00:21:09,220 --> 00:21:12,910 Tot i que probablement no ha vist les estrelles en el codi de distribució per 372 00:21:12,910 --> 00:21:17,410 Breakout, resulta que els GRect i GOVAL i altres coses, 373 00:21:17,410 --> 00:21:19,650 aquests són en realitat punters sota de la caputxa. 374 00:21:19,650 --> 00:21:23,430 >> Però Stanford, igual que nosaltres, més o menys oculta que detalli almenys per a les biblioteques 375 00:21:23,430 --> 00:21:26,540 fins, igual que fem de corda i char *. 376 00:21:26,540 --> 00:21:30,060 Però GRect i GOVAL i tots els coses que vostès estan o van a utilitzar 377 00:21:30,060 --> 00:21:32,630 aquesta setmana són en última instància, adreces de memòria. 378 00:21:32,630 --> 00:21:33,650 Simplement no ho saps. 379 00:21:33,650 --> 00:21:37,240 >> Així que no és sorprenent, llavors, potser, que podria ensopegar amb alguna 380 00:21:37,240 --> 00:21:38,580 errors de segmentació. 381 00:21:38,580 --> 00:21:41,290 Però l'interessant aquí, si després comprovem el 0 que fem 382 00:21:41,290 --> 00:21:43,460 cadena t aconsegueix s. 383 00:21:43,460 --> 00:21:44,690 Bé, deixa declaro t. 384 00:21:44,690 --> 00:21:47,730 Vaig a dibuixar un quadrat, 32 bits, anomenat t. 385 00:21:47,730 --> 00:21:49,740 I llavors em vaig a fer es s. 386 00:21:49,740 --> 00:21:51,130 >> Bé, què significa això? 387 00:21:51,130 --> 00:21:53,280 Bé, és una mica difícil pensar respecte quadre savi. 388 00:21:53,280 --> 00:21:55,025 Però anem a pensar en el que hi ha dins de x? 389 00:21:55,025 --> 00:21:59,430 Què és, literalment, dins d'aquesta variable? 390 00:21:59,430 --> 00:22:01,500 El Ox123 valor. 391 00:22:01,500 --> 00:22:05,815 >> Així que quan dic cadena t aconsegueix s, que només literalment significa prendre el nombre 392 00:22:05,815 --> 00:22:10,070 en si, que és Ox123 i el va posar Ox123. 393 00:22:10,070 --> 00:22:13,740 O gràficament, si tipus de resum lluny de detall que té la 394 00:22:13,740 --> 00:22:16,600 efecte de fer literalment això també. 395 00:22:16,600 --> 00:22:22,110 >> Ara, pensi en la setmana passada quan es va procedir a la capitalista T. I 396 00:22:22,110 --> 00:22:23,800 fer T bracket 0. 397 00:22:23,800 --> 00:22:27,150 Bé, T bracket 0, tot i que es tracta d'un indicador, es pot tractar com si 398 00:22:27,150 --> 00:22:29,220 és una matriu, amb un quadrat notació de claudàtors. 399 00:22:29,220 --> 00:22:31,550 >> Llavors, ¿on és el suport T 0? 400 00:22:31,550 --> 00:22:32,990 Bé, és l'hora. 401 00:22:32,990 --> 00:22:36,800 I així, quan s'utilitza la línia de codi, dos superiors, que està que c type.h 402 00:22:36,800 --> 00:22:38,460 arxiu de capçalera, que és on està declarada. 403 00:22:38,460 --> 00:22:44,410 Vostè està capitalitzant aquesta H. Però, Per descomptat, aquesta és la mateixa h exacta que és 404 00:22:44,410 --> 00:22:46,540 interior de s, per dir-ho. 405 00:22:46,540 --> 00:22:51,930 I ara que ha canviat o capitalitzat tant l'original com la 406 00:22:51,930 --> 00:22:53,120 l'anomenada còpia. 407 00:22:53,120 --> 00:22:56,620 Perquè vostè no va fer una còpia al forma en què un ésser humà voldria que fos. 408 00:22:56,620 --> 00:22:59,710 >> Llavors, quin era el punt de referència aquí, en copy1.c setmana passada? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funcions, així que podríem copiar la cadena. 411 00:23:05,580 --> 00:23:08,700 I fonamentalment, què és el que necessitem fer per copiar la cadena? 412 00:23:08,700 --> 00:23:12,070 >> Bé, en aquesta versió de la imatge aquí estic farem un nivell força baix. 413 00:23:12,070 --> 00:23:14,260 En realitat, hi ha funcions podrien ajudar amb això. 414 00:23:14,260 --> 00:23:17,710 Però la més bàsica i la més 01:00 familiar, almenys, aviat serà 415 00:23:17,710 --> 00:23:19,600 familiar per a nosaltres, és la següent - 416 00:23:19,600 --> 00:23:21,910 pel que un a la primera línia de codi en verd ara. 417 00:23:21,910 --> 00:23:23,970 >> Em va tornar a escriure com char * s. 418 00:23:23,970 --> 00:23:25,250 No hi ha funcional diferència. 419 00:23:25,250 --> 00:23:28,790 Em vaig desfer de la biblioteca i CS50 Estic trucant a ser el que és, un char *. 420 00:23:28,790 --> 00:23:31,640 >> Ara, punt, punt, punt, perquè no eren comprovació d'errors que no és 421 00:23:31,640 --> 00:23:33,200 interessant parlar de nou. 422 00:23:33,200 --> 00:23:34,710 Així que ara t es declara. 423 00:23:34,710 --> 00:23:35,780 També ell és un char *. 424 00:23:35,780 --> 00:23:38,280 Així que vaig dibuixar una placeta la pantalla com abans. 425 00:23:38,280 --> 00:23:41,870 >> Però al costat de la dreta, malloc, vam dir és assignar memòria. 426 00:23:41,870 --> 00:23:44,130 Així que assignar part tros de memòria. 427 00:23:44,130 --> 00:23:48,830 I quants bytes és el que realment vol assignar, què sembla? 428 00:23:48,830 --> 00:23:50,340 >> Doncs bé, la longitud de la cadena del s. 429 00:23:50,340 --> 00:23:52,310 Així que si és hola això és va a ser cinc. 430 00:23:52,310 --> 00:23:53,950 Direm h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Així 05:00 bytes. 432 00:23:55,090 --> 00:23:57,960 >> Però llavors, més 1, ¿per què 1? 433 00:23:57,960 --> 00:23:58,830 El caràcter 0. 434 00:23:58,830 --> 00:24:03,640 Si no deixem espai per a aquest tipus que podria crear una situació accidental 435 00:24:03,640 --> 00:24:05,600 on la cadena és h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 I llavors la propera vegada GetString és Vaig trucar i em introdueixo en, per exemple, 437 00:24:08,470 --> 00:24:14,020 David D-a-v-i-d, l'equip va pensar que s és en realitat 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d perquè no hi ha sense descans entre les paraules. 439 00:24:18,900 --> 00:24:19,810 >> Així que hem de trencar. 440 00:24:19,810 --> 00:24:20,720 Així que no volem 05:00. 441 00:24:20,720 --> 00:24:22,100 Volem 06:00 bytes. 442 00:24:22,100 --> 00:24:23,110 >> I em diuen bytes. 443 00:24:23,110 --> 00:24:25,220 Però és la mida realment el temps de la xerrada. 444 00:24:25,220 --> 00:24:28,040 Tècnicament char és gairebé sempre un sol byte. 445 00:24:28,040 --> 00:24:31,030 >> Però per fer que el nostre codi portable, per així dir-ho, de manera que funciona a 446 00:24:31,030 --> 00:24:33,750 diferents sistemes encara que podria ser diferent sota de la 447 00:24:33,750 --> 00:24:36,590 campana, vaig a genèricament dir que la mida de la xerrada perquè 448 00:24:36,590 --> 00:24:37,660 el meu codi sempre funciona. 449 00:24:37,660 --> 00:24:40,610 I jo no he de tornar a compilar només perquè jo actualitzo el meu ordinador o ús 450 00:24:40,610 --> 00:24:42,140 alguna plataforma diferent. 451 00:24:42,140 --> 00:24:45,300 >> Així que tinc 6 vegades la mida de un char, que passa a ser 1. 452 00:24:45,300 --> 00:24:47,440 Així que això significa malloc podrien dóna'm 6 bytes. 453 00:24:47,440 --> 00:24:49,140 El que estan fent realment? 454 00:24:49,140 --> 00:24:52,810 Bé, deixa Fer Retrocedir en el temps aquí d'on som en la història. 455 00:24:52,810 --> 00:24:57,620 >> Així que si torno aquí, he declarat un char * trucada t. 456 00:24:57,620 --> 00:25:00,280 Ara he trucat malloc durant sis bytes. 457 00:25:00,280 --> 00:25:06,400 I ara em vaig a treure els sis bytes igual que la matriu anterior. 458 00:25:06,400 --> 00:25:10,570 Però en realitat no sé el que és dins d'aquesta gamma. 459 00:25:10,570 --> 00:25:14,640 >> Si s'assigna memòria resulta que no es pot confiar que hi ha una mica de 460 00:25:14,640 --> 00:25:15,810 valor conegut allà. 461 00:25:15,810 --> 00:25:18,400 Podria haver estat utilitzat per alguna cosa una altra cosa, alguna altra funció, alguna altra 462 00:25:18,400 --> 00:25:19,630 línia de codi que vostè va escriure. 463 00:25:19,630 --> 00:25:22,870 Així que tindrem generalment anomenem a aquestes escombraries valors i dibuixar ells, potser, com 464 00:25:22,870 --> 00:25:26,170 signes d'interrogació, just el que indica que no saben el que en realitat existeix. 465 00:25:26,170 --> 00:25:30,390 I això no és gran cosa, sempre i quan ens són prou intel · ligents com per sobreescriure les 466 00:25:30,390 --> 00:25:34,550 valors d'escombraries amb números o caràcters que ens interessen. 467 00:25:34,550 --> 00:25:36,340 >> Així que en aquest cas, què faré? 468 00:25:36,340 --> 00:25:38,670 Bé, el codi de la meva línia de següent, tinc quatre. 469 00:25:38,670 --> 00:25:41,350 int i obtenir 0, n obté el longitud de la cadena del s. 470 00:25:41,350 --> 00:25:42,750 Així que un familiar per bucle. 471 00:25:42,750 --> 00:25:45,875 I és menor o igual a n, que en general està per sobre. 472 00:25:45,875 --> 00:25:47,500 >> Però aquesta vegada és deliberada. 473 00:25:47,500 --> 00:25:51,890 R + +, i després simplement em faig t i suport es s. 474 00:25:51,890 --> 00:25:56,320 A causa de que la meva imatge es veu així en Actualment, emmagatzemada en t és el 475 00:25:56,320 --> 00:25:59,530 direcció d'aquest fragment a l'atzar de la memòria els valors són desconeguts. 476 00:25:59,530 --> 00:26:03,030 Però tan aviat com jo t suport 0 que em posi aquí. 477 00:26:03,030 --> 00:26:07,430 >> I el que acaba sent atrets? 478 00:26:07,430 --> 00:26:08,740 Acabem posant h. 479 00:26:08,740 --> 00:26:11,170 Perquè això és el que està en el suport s 0. 480 00:26:11,170 --> 00:26:14,300 I el mateix per I, i L, i L, i o. 481 00:26:14,300 --> 00:26:17,930 >> n, per què vaig anar a través d' igual al núm? 482 00:26:17,930 --> 00:26:19,200 A causa del caràcter 0. 483 00:26:19,200 --> 00:26:23,580 Així que per ser clars, llavors, si realment esborrar qualsevol que aquestes escombraries 484 00:26:23,580 --> 00:26:28,870 valors i després en realitat es basen en el que espero, és s suport 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, a més de que està arrossegant nou personatge. 486 00:26:32,440 --> 00:26:36,080 >> I ara, si seguim més enllà del punt, punt, punt en aquesta versió correcta 487 00:26:36,080 --> 00:26:41,930 i capitalitzat t bracket 0 Ho faria, de Per descomptat, es capitalitza només per aquesta 488 00:26:41,930 --> 00:26:47,050 tipus aquí, que conceptualment, era en última instància la meta. 489 00:26:47,050 --> 00:26:48,040 Així que això és tot el que el punter es troba. 490 00:26:48,040 --> 00:26:51,430 >> I vostè ha estat utilitzant durant setmanes ara en el context de cadenes. 491 00:26:51,430 --> 00:26:53,530 Però sota de la caputxa són una mica més complex. 492 00:26:53,530 --> 00:26:57,520 Però si es pensa en ells en aquest forma pictòrica proposo que estan 493 00:26:57,520 --> 00:27:01,720 Probablement no és tan difícil com es podria semblar a primera vista, a primera vista, 494 00:27:01,720 --> 00:27:04,730 particularment per tal nova sintaxi. 495 00:27:04,730 --> 00:27:07,290 Teniu preguntes sobre els punters, cordes o carbons? 496 00:27:07,290 --> 00:27:07,580 Sí? 497 00:27:07,580 --> 00:27:09,252 >> AUDIÈNCIA: Es pot tornar a la [inaudible]? 498 00:27:09,252 --> 00:27:10,502 >> ALTAVEU 1: Per descomptat. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> AUDIÈNCIA: Llavors com és que en el seu últim línia, vostè no té una línia * t 501 00:27:19,525 --> 00:27:21,513 i * s en la línia? 502 00:27:21,513 --> 00:27:23,004 No tens la referència a la - 503 00:27:23,004 --> 00:27:24,640 >> ALTAVEU 1: Ah, una molt bona pregunta. 504 00:27:24,640 --> 00:27:26,800 Per què no tinc un t * ja * s? 505 00:27:26,800 --> 00:27:30,340 A causa breument, la setmana passada, igual que en el nostre funció d'intercanvi, jo he dit que quan 506 00:27:30,340 --> 00:27:33,350 tens un punter el mitjà pel que vas allà com vam 507 00:27:33,350 --> 00:27:36,590 físicament a l'escenari, era en realitat utilitzar l'operador estrelles. 508 00:27:36,590 --> 00:27:40,570 >> Resulta que aquest claudàtor notació és el que anomenarem sintàctica 509 00:27:40,570 --> 00:27:44,190 sucre, que és només una forma atractiva d' dient que és la notació abreujada de 510 00:27:44,190 --> 00:27:45,950 exactament el que estàs descrivint. 511 00:27:45,950 --> 00:27:49,385 Però és una mica més intuïtiu. 512 00:27:49,385 --> 00:27:53,510 I a risc de fer que això sembli més complicat del que ha de ser, 513 00:27:53,510 --> 00:27:56,990 el que realment està passant aquí és el següent - 514 00:27:56,990 --> 00:28:01,450 Si dic * t que significa anar a la direcció emmagatzemada en t. 515 00:28:01,450 --> 00:28:04,350 >> Així que, literalment, si t és l'emmagatzematge la direcció d'aquest h 516 00:28:04,350 --> 00:28:07,300 Inicialment, * t vol dir anar aquí. 517 00:28:07,300 --> 00:28:10,730 Ara, què significa t bracket 0? 518 00:28:10,730 --> 00:28:11,560 Exactament el mateix. 519 00:28:11,560 --> 00:28:13,510 És una mica més fàcil amigable per escriure. 520 00:28:13,510 --> 00:28:14,430 >> Però no he acabat encara. 521 00:28:14,430 --> 00:28:17,800 No puc dir * t * s aconsegueix. 522 00:28:17,800 --> 00:28:19,440 Perquè el que estaria fent llavors? 523 00:28:19,440 --> 00:28:22,950 Estaria posant h, h, h, h, h llarg de tot l'assumpte. 524 00:28:22,950 --> 00:28:22,995 Cert? 525 00:28:22,995 --> 00:28:26,020 >> A causa de * t és anar a la direcció en t. 526 00:28:26,020 --> 00:28:27,580 Però estem dins d'un bucle. 527 00:28:27,580 --> 00:28:32,150 ¿I quin valor he incrementant, per descomptat, en cada iteració? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Però hi ha una oportunitat aquí, oi? 530 00:28:34,590 --> 00:28:37,870 Tot i que això se sent com s'està fent una mica més sofisticat 531 00:28:37,870 --> 00:28:40,730 de la notació de claudàtors hem utilitzat durant algun temps - 532 00:28:40,730 --> 00:28:43,840 m'ho dius a mi desfer el meu canvi h allà - 533 00:28:43,840 --> 00:28:48,870 tot i que això està posant una mica elegant, la idea bàsica, si * t 534 00:28:48,870 --> 00:28:53,630 significa aquí i * t és anar a la direcció en t. 535 00:28:53,630 --> 00:28:54,990 >> Però quina era la direcció en t? 536 00:28:54,990 --> 00:28:56,850 El nombre seguim usant? 537 00:28:56,850 --> 00:29:00,540 Com Ox456, anem a portar aquest nou només pel bé de la discussió. 538 00:29:00,540 --> 00:29:05,380 Bé, si vull arribar a la direcció en t string, només vull anar, 539 00:29:05,380 --> 00:29:06,460 essencialment, 456. 540 00:29:06,460 --> 00:29:09,230 >> O més aviat, 457. 541 00:29:09,230 --> 00:29:10,590 Només he d'afegir un. 542 00:29:10,590 --> 00:29:11,790 Però no puc fer això, oi? 543 00:29:11,790 --> 00:29:14,680 Perquè t, encara que segueixo dibuix ara com una fletxa, que és només una 544 00:29:14,680 --> 00:29:16,570 nombre, Ox456. 545 00:29:16,570 --> 00:29:21,400 I si afegeixo un d'això, o més Generalment, si afegeixo que perquè pugui 546 00:29:21,400 --> 00:29:24,350 realment aconseguir exactament on vull. 547 00:29:24,350 --> 00:29:26,260 Així que si realment faig - 548 00:29:26,260 --> 00:29:28,970 i això és el que s'anomena ara aritmètica de punters - 549 00:29:28,970 --> 00:29:30,375 Puc eliminar aquesta línia. 550 00:29:30,375 --> 00:29:33,550 Què és, francament, crec que més clar i una mica més fàcil d'usar per llegir. 551 00:29:33,550 --> 00:29:35,970 Però això no és menys correcte. 552 00:29:35,970 --> 00:29:38,570 >> Aquesta línia de codi ara està utilitzant aritmètica de punters. 553 00:29:38,570 --> 00:29:40,920 És a dir anar a la seguint la direcció - 554 00:29:40,920 --> 00:29:44,670 qualsevol que sigui l'inici d't és, que és t més i, que inicialment 555 00:29:44,670 --> 00:29:45,730 és 0, la qual cosa és genial. 556 00:29:45,730 --> 00:29:49,280 Perquè això vol dir que l'inici de t més 1, més 2, més 3, i així successivament. 557 00:29:49,280 --> 00:29:51,030 I el mateix acord amb s. 558 00:29:51,030 --> 00:29:52,750 >> Així sucre sintàctica per això. 559 00:29:52,750 --> 00:29:55,900 Però la comprensió del que realment està passant sota de la caputxa, jo diria, 560 00:29:55,900 --> 00:29:57,410 és en realitat útil en i de si mateix. 561 00:29:57,410 --> 00:30:00,620 Perquè vol dir que ja no hi ha molt més la màgia passa 562 00:30:00,620 --> 00:30:01,620 sota de la caputxa. 563 00:30:01,620 --> 00:30:03,920 No seran molts més capes que es pot pelar per a vostè. 564 00:30:03,920 --> 00:30:04,810 Aquesta és c. 565 00:30:04,810 --> 00:30:06,410 I aquesta és la programació. 566 00:30:06,410 --> 00:30:08,002 Molt bona pregunta. 567 00:30:08,002 --> 00:30:11,570 >> Molt bé, així que això va ser que amb errors programa que em referia abans. 568 00:30:11,570 --> 00:30:12,650 intercanvi era defectuós. 569 00:30:12,650 --> 00:30:14,070 Si sembla funcionar. 570 00:30:14,070 --> 00:30:17,390 Recordem que igual que amb la llet i el suc de taronja - que vaig començar 571 00:30:17,390 --> 00:30:18,660 beure la manifestació d'avui. 572 00:30:18,660 --> 00:30:22,220 Així que igual que amb el suc de taronja i la llet, que havia de fer servir un 573 00:30:22,220 --> 00:30:26,200 variable temporal, tmp, per celebrar una temporalment perquè poguéssim llavors 574 00:30:26,200 --> 00:30:28,820 canviar el seu valor i després actualitzar b. 575 00:30:28,820 --> 00:30:32,870 >> Però aquesta funció, es va dir, o aquesta programa en què aquesta funció era 576 00:30:32,870 --> 00:30:35,670 escrit estava equivocat i erroni, per què? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Sí? 579 00:30:39,090 --> 00:30:42,471 >> AUDIÈNCIA: [inaudible]. 580 00:30:42,471 --> 00:30:44,940 >> ALTAVEU 1: Exactament, quan cridar swap - 581 00:30:44,940 --> 00:30:47,820 o, més generalment, quan es trucar a gairebé qualsevol funció - 582 00:30:47,820 --> 00:30:51,210 si els arguments d'aquesta funció són primitius, per dir-ho, enters i caràcters 583 00:30:51,210 --> 00:30:56,740 i dobles i carrosses, coses sense estrelles, està de pas en una còpia de 584 00:30:56,740 --> 00:30:57,540 l'argument. 585 00:30:57,540 --> 00:31:01,580 Així que si era 1 x i i era 2, una va que és 1 i b va a ser 2. 586 00:31:01,580 --> 00:31:05,250 Però ells seran diferents trossos dels bits, els diferents trossos de 587 00:31:05,250 --> 00:31:07,540 memòria que passen a ser l'emmagatzematge valors idèntics. 588 00:31:07,540 --> 00:31:12,160 >> Així que aquest codi és molt perfecta en l'intercanvi a i b. 589 00:31:12,160 --> 00:31:13,850 No és bo per a l'intercanvi - 590 00:31:13,850 --> 00:31:15,290 en l'exemple de la setmana passada - 591 00:31:15,290 --> 00:31:16,390 x i y. 592 00:31:16,390 --> 00:31:18,780 Perquè de nou, són en l'àmbit equivocat. 593 00:31:18,780 --> 00:31:21,310 >> Ara, com arreglarem això? 594 00:31:21,310 --> 00:31:23,140 Vam haver de fer la funció mirar una mica més lleig. 595 00:31:23,140 --> 00:31:25,250 Però un cop més, tingui en compte el això només significa. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> I, de fet, em va deixar, per coherència, canviar una cosa pel que és idèntic al 598 00:31:31,500 --> 00:31:33,200 el que acabem de fer. 599 00:31:33,200 --> 00:31:35,690 Com diu la setmana passada, no ho fa importa a on va. 600 00:31:35,690 --> 00:31:38,120 De fet, en general vostè posaria la estrella al costat del nom de la variable. 601 00:31:38,120 --> 00:31:40,750 Però crec que seria una mica més fàcil per considerar el * al costat de la 602 00:31:40,750 --> 00:31:44,910 tipus de dades en el sentit que és un punter a un int en aquest cas. 603 00:31:44,910 --> 00:31:46,270 >> Llavors, què estic fent aquí? 604 00:31:46,270 --> 00:31:49,590 Jo estic dient que no em donen un int seguit d'un altre int, 605 00:31:49,590 --> 00:31:50,810 cridant-los a i b. 606 00:31:50,810 --> 00:31:52,460 Dóna'm la direcció d'un int. 607 00:31:52,460 --> 00:31:53,960 Dóna'm la direcció d'un altre int. 608 00:31:53,960 --> 00:31:56,330 Truqui a aquestes adreces a i b. 609 00:31:56,330 --> 00:32:00,860 >> I a continuació, utilitzant la notació baix * a continuació, anar a cadascuna de les direccions 610 00:32:00,860 --> 00:32:05,290 segons sigui necessari per obtenir ja sigui o establir el seu valor. 611 00:32:05,290 --> 00:32:07,400 Però hi ha una excepció. 612 00:32:07,400 --> 00:32:11,130 Per què no tinc un asterisc al costat del tmp? 613 00:32:11,130 --> 00:32:15,070 Per què no puc fer això, per exemple? 614 00:32:15,070 --> 00:32:19,370 Se sent com si hagués d'anar tots sortir i corregir tot. 615 00:32:19,370 --> 00:32:19,752 Sí? 616 00:32:19,752 --> 00:32:21,002 >> AUDIÈNCIA: [inaudible]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> ALTAVEU 1: No he declarat tmp com una cadena. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Així que això anava a declarar, en aquest cas, 01:00 tmp ser la direcció d'un int. 621 00:32:34,950 --> 00:32:37,380 Però això no és tot el que vull, per un parell de raons. 622 00:32:37,380 --> 00:32:38,616 >> AUDIÈNCIA: No vol per intercanviar-les. 623 00:32:38,616 --> 00:32:41,800 >> ALTAVEU 1: Exactament, jo no vull canviar res amb tmp. tmp és només 624 00:32:41,800 --> 00:32:42,790 setmana-una cosa. 625 00:32:42,790 --> 00:32:45,150 Tot el que vull és una variable per emmagatzemar un nombre. 626 00:32:45,150 --> 00:32:47,330 Ni tan sols em preocupo per les direccions en aquest moment. 627 00:32:47,330 --> 00:32:50,530 >> Només necessito 32 bits o així que per guardar un int. 628 00:32:50,530 --> 00:32:56,690 I vull posar en aquests 32 bits tot el que no està en una, per així dir-ho, però 629 00:32:56,690 --> 00:33:01,260 el que està en una, per ser més precisos. 630 00:33:01,260 --> 00:33:06,420 Perquè si a és una adreça, un mitjà * anar-hi i obtenir el valor 1. 631 00:33:06,420 --> 00:33:10,560 Per exemple, en l'exemple de la setmana passada o en el cas de b, obtenir el valor de 2. 632 00:33:10,560 --> 00:33:11,750 >> Així que el que realment està passant? 633 00:33:11,750 --> 00:33:15,070 Permetin-me que assenyali una imatge aquí on es només esmicolar part d'avui. 634 00:33:15,070 --> 00:33:18,580 Però això seguirà apareixent des de fa força temps. 635 00:33:18,580 --> 00:33:22,430 >> Això, reclam, és el que l'equip de la memòria es veu com quan s'executa una 636 00:33:22,430 --> 00:33:24,060 programa, qualsevol programa. 637 00:33:24,060 --> 00:33:28,340 Quan s'executa un programa a la part superior de memòria RAM de l'ordinador - així que pensar en 638 00:33:28,340 --> 00:33:33,530 aquest rectangle, en veritat, ja que el seu RAM o la memòria de l'ordinador, tot 101 639 00:33:33,530 --> 00:33:36,920 milers de milions de bytes de la mateixa, tot dos milions de bytes, els dos gigabytes de la mateixa, 640 00:33:36,920 --> 00:33:39,910 qualsevol que sigui la quantitat que es té és, anem a dibuixar com un rectangle. 641 00:33:39,910 --> 00:33:43,260 I afirmo que quan s'executa un programa com Microsoft Word o Chrome 642 00:33:43,260 --> 00:33:49,220 ni res d'això, els bits que Microsoft o Google que va escriure - 643 00:33:49,220 --> 00:33:50,910 en els casos dels programes - 644 00:33:50,910 --> 00:33:54,490 es carreguen a la memòria de l'equip en què es poden executar més 645 00:33:54,490 --> 00:33:57,520 ràpidament i s'introdueix en la CPU, la qual cosa és el cervell de l'ordinador. 646 00:33:57,520 --> 00:34:00,940 >> I en TAM estan emmagatzemats en el mateix la part superior del seu programa, per així dir-ho. 647 00:34:00,940 --> 00:34:03,300 En altres paraules, si es tracta d'un tros de memòria, en fer doble clic a 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, els bits arriben de la unitat de disc dur. 649 00:34:05,740 --> 00:34:06,680 Ells es carreguen a la memòria RAM. 650 00:34:06,680 --> 00:34:10,330 I ens empenyem cap amunt a la part superior d'aquest rectangle conceptualment. 651 00:34:10,330 --> 00:34:13,010 >> Bé, la resta de la seva memòria és usat per a diferents coses. 652 00:34:13,010 --> 00:34:16,460 A la part superior es veu inicialitzar de dades i desinicializar dades. 653 00:34:16,460 --> 00:34:20,500 Això té a veure, en la seva major part, amb constants o variables globals 654 00:34:20,500 --> 00:34:21,340 que tenen valors. 655 00:34:21,340 --> 00:34:22,980 Però més sobre això en un altre moment. 656 00:34:22,980 --> 00:34:25,150 >> Llavors vostè té la pila, el que tornarem a. 657 00:34:25,150 --> 00:34:28,420 Però en el fons és la part que és particularment pertinent en aquests moments. 658 00:34:28,420 --> 00:34:30,210 És l'anomenada pila. 659 00:34:30,210 --> 00:34:33,850 Així que igual que en gairebé qualsevol sala D aquí a campus, que té aquestes safates que 660 00:34:33,850 --> 00:34:37,210 simplement apilar una a sobre d'una altra en la qual vostè pot posar el menjar i altres coses. 661 00:34:37,210 --> 00:34:40,139 La pila en un sistema informàtic és molt similar. 662 00:34:40,139 --> 00:34:42,679 Excepte mentre que la safata, com s'utilitza en el menjador, per descomptat, s'entén 663 00:34:42,679 --> 00:34:45,710 per portar les coses de les safates o els marcs - 664 00:34:45,710 --> 00:34:49,469 com els anomenarem - en un ordinador d' la memòria s'utilitza per mantenir 665 00:34:49,469 --> 00:34:51,610 variables i valors. 666 00:34:51,610 --> 00:34:53,929 >> Així que el que realment passa sota de la caputxa? 667 00:34:53,929 --> 00:34:55,820 Bé, deixeu-me donar-li la volta a la pantalla aquí. 668 00:34:55,820 --> 00:34:58,370 I ens centrarem només en la part inferior per un moment. 669 00:34:58,370 --> 00:35:02,770 Si aquesta és la part inferior de la meva la memòria de l'ordinador és quan 670 00:35:02,770 --> 00:35:05,350 cridar a la funció principal - que resulta, francament, 671 00:35:05,350 --> 00:35:06,950 automàticament per a mi - 672 00:35:06,950 --> 00:35:10,510 Tinc un tros de memòria a la fons de la meva memòria RAM per dir-ho. 673 00:35:10,510 --> 00:35:13,390 I aquí és on la principal és variables locals van. 674 00:35:13,390 --> 00:35:16,770 És el lloc on argc i argv potser anar, i les variables d'E 675 00:35:16,770 --> 00:35:18,170 declarar dins del principal. 676 00:35:18,170 --> 00:35:20,260 Acaben a la part inferior de la memòria RAM de l'ordinador. 677 00:35:20,260 --> 00:35:25,040 >> Ara suposem que les crides a funcions principals com swap, com ho va fer la setmana passada? 678 00:35:25,040 --> 00:35:30,620 Bé, bàsicament posem una nova safata, 1 nou marc, en el meu tros de memòria. 679 00:35:30,620 --> 00:35:34,160 I jo vaig a descriure això com pertinença a la funció d'intercanvi. 680 00:35:34,160 --> 00:35:35,770 >> Ara el que hi ha dins de bescanvi? 681 00:35:35,770 --> 00:35:39,240 Bé, basat en el programa de la setmana passada i la que acabem de veure un fragment de, 682 00:35:39,240 --> 00:35:46,590 dins del marc de l'intercanvi, o en intercanvi d' safata, són el que les variables? 683 00:35:46,590 --> 00:35:47,970 Bé, a i b. 684 00:35:47,970 --> 00:35:51,850 Perquè aquests eren els seus arguments locals, més una tercera, tmp. 685 00:35:51,850 --> 00:35:54,470 Així que en realitat, podria arribar a aquesta una mica més neta. 686 00:35:54,470 --> 00:35:56,680 Deixin-me seguir endavant i desfer l'etiqueta. 687 00:35:56,680 --> 00:35:58,520 I permetin-me pretenc que vostè sap el que? 688 00:35:58,520 --> 00:36:00,560 >> 1 és probablement va a acabar aquí. 689 00:36:00,560 --> 00:36:02,160 B va a acabar aquí. 690 00:36:02,160 --> 00:36:03,810 I tmp va a acabar aquí. 691 00:36:03,810 --> 00:36:05,160 Ara, l'ordre podria ser una mica diferent. 692 00:36:05,160 --> 00:36:06,840 Però conceptualment aquesta és la idea. 693 00:36:06,840 --> 00:36:11,490 >> I només col · lectivament, això és el que anomenarem marc d'intercanvi, o 694 00:36:11,490 --> 00:36:12,136 safata de menjador-sala. 695 00:36:12,136 --> 00:36:13,150 I el mateix s'ocupen de principal. 696 00:36:13,150 --> 00:36:14,040 Però no vaig a tornar a dibuixar això. 697 00:36:14,040 --> 00:36:17,810 Però aquí és on argc i argv i qualsevol de les seves variables locals com x i y 698 00:36:17,810 --> 00:36:18,940 podria ser així. 699 00:36:18,940 --> 00:36:22,170 >> Així que ara considerar el que realment està succeint quan es diu intercanvi. 700 00:36:22,170 --> 00:36:26,370 Quan es diu a swap, executar codi com això, vostè està passant, al 701 00:36:26,370 --> 00:36:30,670 versió amb errors, a i b com còpies de x i y. 702 00:36:30,670 --> 00:36:34,300 Així que si ho faig ara extrec aquesta a la pantalla - 703 00:36:34,300 --> 00:36:36,700 ha de millorar en això - 704 00:36:36,700 --> 00:36:40,850 pel que la història que m'estava dient a mi mateix va ser en aquesta versió amb errors, quan 705 00:36:40,850 --> 00:36:46,130 truqui a intercanviar passant literalment a i b com enters, el que realment està passant? 706 00:36:46,130 --> 00:36:48,250 >> Bé, el que realment està succeint és això. 707 00:36:48,250 --> 00:36:52,850 Deixin-me seguir endavant i desfer simplement per esborrar una mica d'espai aquí. 708 00:36:52,850 --> 00:36:54,720 Així que aquesta és la memòria del meu ordinador. 709 00:36:54,720 --> 00:36:57,510 >> Així que si jo, per exemple - 710 00:36:57,510 --> 00:36:58,910 En realitat ho farem d'aquesta manera - 711 00:36:58,910 --> 00:37:02,690 si afirmo que això és x, l'emmagatzematge el valor 1 al igual que la setmana passada. 712 00:37:02,690 --> 00:37:05,930 I això és, emmagatzemar el valor 2 igual que la setmana passada. 713 00:37:05,930 --> 00:37:11,370 I aquest és el principal, quan dic swap, el que em dóna accés a una i 714 00:37:11,370 --> 00:37:15,150 b i tmp que vaig a dir que aquesta és una i aquesta és 1. 715 00:37:15,150 --> 00:37:16,080 >> Això és b. 716 00:37:16,080 --> 00:37:17,010 Això és 2. 717 00:37:17,010 --> 00:37:18,370 Això es diu tmp. 718 00:37:18,370 --> 00:37:23,360 >> I en un principi, té un valor escombraries fins que ho retinc en una, 719 00:37:23,360 --> 00:37:24,450 que és 1. 720 00:37:24,450 --> 00:37:28,320 Llavors segueixo endavant i canviar un ésser què? 721 00:37:28,320 --> 00:37:29,720 El valor de B. 722 00:37:29,720 --> 00:37:31,980 >> I així que ara tinc dos aquí. 723 00:37:31,980 --> 00:37:34,050 I llavors vam dir b aconsegueix tmp. 724 00:37:34,050 --> 00:37:37,670 Un cop més, igual que un xec del seny, la tercera línia de codi aquí és simplement això 725 00:37:37,670 --> 00:37:39,440 un, b aconsegueix tmp. 726 00:37:39,440 --> 00:37:41,730 >> I finalment, què faig? 727 00:37:41,730 --> 00:37:46,800 Segueixo endavant i canviar de b sigui el que sigui el valor d'tmp és, que és 1. 728 00:37:46,800 --> 00:37:48,390 No toco tmp nou. 729 00:37:48,390 --> 00:37:54,100 >> Però ara, el problema és que tan aviat com swap devolucions, perquè no està lliurant 730 00:37:54,100 --> 00:37:57,540 còpia d'algun valor, no hi ha retorn declaració explícitament en ella. 731 00:37:57,540 --> 00:37:59,080 Què està succeint realment? 732 00:37:59,080 --> 00:38:03,480 Bé, bàsicament tot això de memòria - 733 00:38:03,480 --> 00:38:07,410 Bé, pel que sembla, l'esborrany li agrada només un dit a la vegada - 734 00:38:07,410 --> 00:38:08,180 simplement desapareix. 735 00:38:08,180 --> 00:38:10,070 >> Ara bé, en realitat no ho és enlloc. 736 00:38:10,070 --> 00:38:11,810 Però vostè pot pensar en ell ara com signes d'interrogació. 737 00:38:11,810 --> 00:38:14,040 Com que ja no és realment en ús. 738 00:38:14,040 --> 00:38:17,470 I no es fa res amb aquests valors. 739 00:38:17,470 --> 00:38:21,920 >> Així en el cas de la versió verda de aquest codi, el que en el seu lloc està sent 740 00:38:21,920 --> 00:38:24,640 passat a intercanvi? 741 00:38:24,640 --> 00:38:25,770 Així que s'adreça. 742 00:38:25,770 --> 00:38:28,520 Així la direcció de x i la direcció de i. 743 00:38:28,520 --> 00:38:35,790 Així que si tornar a explicar aquesta història una última temps, i que en realitat dibuixar intercanvi de nou, 744 00:38:35,790 --> 00:38:44,620 però amb punters, sent aquesta una, aquesta on b, i sent tmp, el que és 745 00:38:44,620 --> 00:38:49,080 efectivament emmagatzemada en una en aquest verd versió del codi en què estic passant 746 00:38:49,080 --> 00:38:52,110 en direccions? 747 00:38:52,110 --> 00:38:53,780 >> Serà un punter a x. 748 00:38:53,780 --> 00:38:54,890 Així que podria dibuixar una fletxa. 749 00:38:54,890 --> 00:38:57,310 Però farem servir la mateixa arbitrària exemple com abans. 750 00:38:57,310 --> 00:39:01,220 Diguem que es tracta d' alguna cosa així com Ox123. 751 00:39:01,220 --> 00:39:04,970 I això serà perquè Ox127 és quatre bytes de distància perquè és un 752 00:39:04,970 --> 00:39:07,370 int, per la Ox127. 753 00:39:07,370 --> 00:39:09,080 >> I una altra vegada, estic prenent algunes llibertats amb els números. 754 00:39:09,080 --> 00:39:11,430 Són molt més petits del que seria ser en realitat i en un ordre diferent. 755 00:39:11,430 --> 00:39:14,350 Però així és com la imatge ara és diferent. 756 00:39:14,350 --> 00:39:19,060 >> Però quan s'utilitza aquest codi verd i jo tmp int obtinc * a. 757 00:39:19,060 --> 00:39:25,010 * Un mitjà per fer el següent, prengui la enfront del que està en un i anar a la mateixa, 758 00:39:25,010 --> 00:39:26,190 que és 1. 759 00:39:26,190 --> 00:39:28,480 I això és el que es va posar en tmp. 760 00:39:28,480 --> 00:39:32,480 Mentrestant, en la següent línia de codi aquí, * a obté b, què vol dir això? 761 00:39:32,480 --> 00:39:36,910 >> Bé, * a, així que veu aquí aconsegueix * b, el que significa anar-hi. 762 00:39:36,910 --> 00:39:39,310 I això vol dir posar el valor a allà. 763 00:39:39,310 --> 00:39:43,670 Finalment, l'última línia de codi simplement va dir * b es tmp. 764 00:39:43,670 --> 00:39:48,900 >> Així b diu anar-hi i sobreescriure amb tmp que, en aquest cas, es va 765 00:39:48,900 --> 00:39:51,520 ser, de nou, 1. 766 00:39:51,520 --> 00:39:54,920 I aquesta és la raó per la versió verda de nostre codi funciona, mentre que el vermell 767 00:39:54,920 --> 00:39:56,010 versió mai ho va fer. 768 00:39:56,010 --> 00:39:59,020 Tot es redueix només a la forma en la memòria es gestiona i on és 769 00:39:59,020 --> 00:40:02,580 efectivament despatxat al seu RAM de l'ordinador. 770 00:40:02,580 --> 00:40:07,270 I per ara, això és una de les coses que la pila s'està utilitzant per. 771 00:40:07,270 --> 00:40:09,225 >> Preguntes sobre el disseny? 772 00:40:09,225 --> 00:40:10,380 En els punters? 773 00:40:10,380 --> 00:40:11,630 O l'intercanvi? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> D'acord, malloc, recordo, va fer alguna cosa com això. 776 00:40:17,043 --> 00:40:18,260 Aquest va ser un exemple super simple. 777 00:40:18,260 --> 00:40:20,550 I aquest va ser el que Binky ens va presentar, encara que bastant 778 00:40:20,550 --> 00:40:21,870 ràpidament, al final de la classe. 779 00:40:21,870 --> 00:40:24,480 Maleïda sigui, aquí anem de nou. 780 00:40:24,480 --> 00:40:28,780 >> Així recordar que aquest va ser l'exemple que Binky ens va presentar, encara que 781 00:40:28,780 --> 00:40:30,360 alguna cosa ràpidament al final de la classe. 782 00:40:30,360 --> 00:40:33,640 I aquí hem utilitzat malloc realment per la segona vegada. 783 00:40:33,640 --> 00:40:37,330 A causa de que la primera vegada que el fem servir per crear prou RAM, assignar prou memòria RAM 784 00:40:37,330 --> 00:40:38,340 per emmagatzemar una cadena. 785 00:40:38,340 --> 00:40:40,250 >> Aquesta vegada Binky mantenir simple. 786 00:40:40,250 --> 00:40:42,465 Així que és per emmagatzemar només 01:00 int, pel que sembla. 787 00:40:42,465 --> 00:40:43,510 I això és totalment bé. 788 00:40:43,510 --> 00:40:46,560 És una mica estrany, la veritat, a la utilitzar malloc per assignar un int. 789 00:40:46,560 --> 00:40:50,650 Però el punt d'animació amb plastilina de Nick era realment explicar la història del que 790 00:40:50,650 --> 00:40:53,830 passa o no passa quan maltractes memòria. 791 00:40:53,830 --> 00:40:56,520 >> Així doncs, en aquest cas, aquest programa va fer un parell de coses. 792 00:40:56,520 --> 00:41:01,580 En el primer cas aquí, que declara un punter anomenat x a un int. 793 00:41:01,580 --> 00:41:04,480 A continuació, es declara un punter i va cridar a un int. 794 00:41:04,480 --> 00:41:06,150 A continuació, emmagatzema en x, què? 795 00:41:06,150 --> 00:41:07,110 Una altra persona ara. 796 00:41:07,110 --> 00:41:09,685 El que s'emmagatzema en x d'acord amb la tercera línia d'aquest programa? 797 00:41:09,685 --> 00:41:12,380 >> AUDIÈNCIA: [inaudible]. 798 00:41:12,380 --> 00:41:14,130 >> ALTAVEU 1: Bé, no del tot bytes, per dir. 799 00:41:14,130 --> 00:41:16,760 Sigui més precís ara. 800 00:41:16,760 --> 00:41:18,325 El que s'emmagatzema en x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Una adreça, crec que ho vaig escoltar. 803 00:41:22,060 --> 00:41:23,570 >> Llavors, ¿què tornar malloc? 804 00:41:23,570 --> 00:41:26,030 malloc comportament assigna un tros de memòria. 805 00:41:26,030 --> 00:41:27,850 Però com se li dóna accés a ella? 806 00:41:27,850 --> 00:41:29,460 Retorna què? 807 00:41:29,460 --> 00:41:32,000 La direcció del primer byte en el bloc de memòria. 808 00:41:32,000 --> 00:41:33,020 >> Ara, això és molt simple. 809 00:41:33,020 --> 00:41:35,380 És només un byte, el que significa que el Abordem estem tornant és el 810 00:41:35,380 --> 00:41:37,300 direcció de tot l'assumpte. 811 00:41:37,300 --> 00:41:42,070 Així emmagatzemat en x, llavors, és l'adreça d'aquest tros de memòria. 812 00:41:42,070 --> 00:41:43,400 Mentrestant, què passa després? 813 00:41:43,400 --> 00:41:45,890 Així que en realitat, seguirem endavant i dibuixar això molt ràpid. 814 00:41:45,890 --> 00:41:52,490 >> Així que si anem a la pantalla d'aquí i juguem això int * x i int * i 815 00:41:52,490 --> 00:41:53,740 que va a fer el que a mi? 816 00:41:53,740 --> 00:41:58,280 Jo sostinc que només va a fer alguna cosa com això i dir-x, i 817 00:41:58,280 --> 00:42:00,010 això i en diuen i. 818 00:42:00,010 --> 00:42:03,110 Mentrestant, la tercera línia de codi és va a assignar la mida d'un int, 819 00:42:03,110 --> 00:42:06,160 que passa a ser - ho sento si vaig dir un abans em referia 01:00 int - 820 00:42:06,160 --> 00:42:08,280 04:00 bytes en un ordinador típic. 821 00:42:08,280 --> 00:42:09,720 Almenys amb l'aparell CS50. 822 00:42:09,720 --> 00:42:11,490 >> Així que això va a assignar , ¿Qui sap? 823 00:42:11,490 --> 00:42:12,800 En algun lloc per aquí. 824 00:42:12,800 --> 00:42:15,780 I això s'emmagatzema en algun Direcció del Bou, qui sap? 825 00:42:15,780 --> 00:42:18,330 Però, què quedarà tornat és aquesta direcció. 826 00:42:18,330 --> 00:42:22,270 Però anem a dibuixar aquest pictòricament tan sols una fletxa així. 827 00:42:22,270 --> 00:42:25,430 >> Ara, en la següent línia * x rep 42. 828 00:42:25,430 --> 00:42:29,400 Què fa * x significa en termes simples? 829 00:42:29,400 --> 00:42:30,040 Només has d'anar-hi. 830 00:42:30,040 --> 00:42:30,960 Anar a aquesta direcció. 831 00:42:30,960 --> 00:42:35,900 O en altres paraules, seguir el fletxa i posar 42 allà. 832 00:42:35,900 --> 00:42:38,140 Però llavors una cosa dolenta va passar a Binky, oi? 833 00:42:38,140 --> 00:42:43,950 >> Recordem que la línia cinc aquí, * i es 13, de fet un nombre de mala sort, 834 00:42:43,950 --> 00:42:44,760 va fer el que per a nosaltres? 835 00:42:44,760 --> 00:42:47,320 Bé, * vol dir que I hi van. 836 00:42:47,320 --> 00:42:50,460 Bé, això no s'ha donat un valor encara, oi? 837 00:42:50,460 --> 00:42:54,090 El codi no té sent i inicialitzat a res. 838 00:42:54,090 --> 00:42:56,120 Havíem x s'inicialitza a una adreça. 839 00:42:56,120 --> 00:42:57,640 No obstant això, i va ser declarat per la part superior. 840 00:42:57,640 --> 00:43:00,250 Però llavors, un punt i coma, sense valor es va posar realment en ell. 841 00:43:00,250 --> 00:43:02,330 Així que és just dir que aquest un valor escombraries. 842 00:43:02,330 --> 00:43:03,430 Qui sap el que hi ha? 843 00:43:03,430 --> 00:43:07,160 És les restes de bits que es van utilitzar per alguna línia de codi anterior en 844 00:43:07,160 --> 00:43:08,300 el meu programa. 845 00:43:08,300 --> 00:43:13,250 >> Així que si em diuen que vagi allà, això és com, No tinc ni idea d'on aquesta fletxa és 846 00:43:13,250 --> 00:43:14,490 va a acabar. 847 00:43:14,490 --> 00:43:17,720 I aquí és quan normalment aconseguir una fallada de segmentació. 848 00:43:17,720 --> 00:43:22,430 Si accidentalment eliminar la referència, pel que parlar, o anar a una direcció que no és 849 00:43:22,430 --> 00:43:25,400 en realitat una adreça legítima, passen coses dolentes. 850 00:43:25,400 --> 00:43:27,550 >> I això és exactament el que va passar pensar Binky. 851 00:43:27,550 --> 00:43:31,060 Així que recorda que la història que Nick era dient aquí és la mateixa idea que el 852 00:43:31,060 --> 00:43:34,050 He dibuixat amb la il · lusió de guix al tauler allà. 853 00:43:34,050 --> 00:43:35,960 X i Y es declaren. 854 00:43:35,960 --> 00:43:39,690 >> Després ens van donar la mida de 01:00 int i emmagatzemats en x. 855 00:43:39,690 --> 00:43:42,130 A continuació, la següent línia que vam fer * x. 856 00:43:42,130 --> 00:43:46,070 Aquesta va ser la vareta màgica de Nick d'eliminació de referències. 857 00:43:46,070 --> 00:43:49,780 Això va posar 42 en la memòria assenyalat per x. 858 00:43:49,780 --> 00:43:51,600 >> Però aquí és on les coses va sortir horriblement malament. 859 00:43:51,600 --> 00:43:51,820 Cert? 860 00:43:51,820 --> 00:43:53,550 Hem tractat d'eliminar la referència a. 861 00:43:53,550 --> 00:43:55,620 No obstant això, i tenia un valor fals, no? 862 00:43:55,620 --> 00:43:57,720 >> Aquesta fletxa a la part inferior esquerra cantonada, no és 863 00:43:57,720 --> 00:43:58,950 en realitat apunta a res. 864 00:43:58,950 --> 00:44:01,520 És una espècie de fer el que va fer aquí al tauler. 865 00:44:01,520 --> 00:44:05,900 Així que les coses dolentes li succeeixen, la segmentació culpa o Binky culpa, en aquest cas. 866 00:44:05,900 --> 00:44:10,800 >> Però si ens fixem llavors que al fer x obté i com canvia la història? 867 00:44:10,800 --> 00:44:15,760 Bé, si ho faig x aconsegueix i, això és efectivament el mateix que dir 868 00:44:15,760 --> 00:44:19,235 sigui el que sigui, Ox-cosa serà el mateix aquí, 869 00:44:19,235 --> 00:44:20,080 Ox-alguna cosa. 870 00:44:20,080 --> 00:44:22,970 O gràficament anem a dibuixar una fletxa. 871 00:44:22,970 --> 00:44:25,530 >> Així que aquí en el tauler amb Binky, amb la línia de 872 00:44:25,530 --> 00:44:28,350 codi, * i significa anar-hi. 873 00:44:28,350 --> 00:44:29,400 On hi ha? 874 00:44:29,400 --> 00:44:30,820 Això vol dir que per aquí. 875 00:44:30,820 --> 00:44:36,050 >> I quan ens posem al dia que per ser 13 només haurà d'anar, i 876 00:44:36,050 --> 00:44:39,470 escriure 13 aquí. 877 00:44:39,470 --> 00:44:44,130 Així que potser no completament senzill a primera vista. 878 00:44:44,130 --> 00:44:47,740 Però per recapitular i per utilitzar la mateixa argot que Binky estava usant aquí, així 879 00:44:47,740 --> 00:44:50,485 els dos primers assignar els punters, x i y, però no els pointees. 880 00:44:50,485 --> 00:44:54,750 I no és un pointees usat generalment termini. 881 00:44:54,750 --> 00:44:56,120 No obstant això, és absolutament punter. 882 00:44:56,120 --> 00:44:59,200 Però és el que es va assenyalar en la nomenclatura de Binky. 883 00:44:59,200 --> 00:45:01,660 >> Aquesta línia següent, per descomptat, assigna un pointee int. 884 00:45:01,660 --> 00:45:04,840 Així que una bona part de la memòria - que vaig dibuixar sobre el el costat dret allà - i setembre 885 00:45:04,840 --> 00:45:06,470 x igual a apuntar a ell. 886 00:45:06,470 --> 00:45:11,350 Això elimina referències x per guardar 42 a la memòria que s'està assenyalant. 887 00:45:11,350 --> 00:45:13,380 I a continuació, això, per descomptat, era una cosa dolenta. 888 00:45:13,380 --> 00:45:15,600 Perquè i no apuntava en res. 889 00:45:15,600 --> 00:45:16,530 Això ho arregla. 890 00:45:16,530 --> 00:45:18,240 Així que això segueix sent el programa amb errors. 891 00:45:18,240 --> 00:45:21,580 El fet que estem bufant a través de la codi línia per línia i dir, bé, 892 00:45:21,580 --> 00:45:22,690 deixa que xoc allà. 893 00:45:22,690 --> 00:45:23,420 Això és una mala cosa. 894 00:45:23,420 --> 00:45:26,790 El més probable és el programa només va a avortar per complet en aquesta línia. 895 00:45:26,790 --> 00:45:30,550 Però si hagués de treure la estavellar alinear i substituir-la per les dues últimes 896 00:45:30,550 --> 00:45:32,470 línies cal assigna - 897 00:45:32,470 --> 00:45:35,310 amb assignació de punter - i perquè apunti a x com a punt T. 898 00:45:35,310 --> 00:45:39,280 I després dereference I d'una manera molt segura. 899 00:45:39,280 --> 00:45:41,520 >> Llavors, on ens deixa això? 900 00:45:41,520 --> 00:45:45,350 Bé, resulta que sota el capó a la biblioteca CS50, els punters són 901 00:45:45,350 --> 00:45:46,320 utilitzat al llarg. 902 00:45:46,320 --> 00:45:48,910 I nosaltres realment comencem a pelar nou aquesta capa en poc temps. 903 00:45:48,910 --> 00:45:51,740 Però resulta també, una expressió que alguns de vostès podrien estar familiaritzats amb, 904 00:45:51,740 --> 00:45:54,580 en particular els més còmode, és en realitat el d'una molt popular 905 00:45:54,580 --> 00:45:56,390 lloc web, o de desbordament de pila, en aquests dies. 906 00:45:56,390 --> 00:45:58,720 >> Però això en realitat té molt significat tècnic. 907 00:45:58,720 --> 00:46:00,160 Ara sabem el que és una pila. 908 00:46:00,160 --> 00:46:02,550 És com una pila de safates a l'interior d'un menjador. 909 00:46:02,550 --> 00:46:05,140 >> O a l'interior del seu equip de memòria its aquests marcs 910 00:46:05,140 --> 00:46:06,900 que són utilitzats per les funcions. 911 00:46:06,900 --> 00:46:10,760 Bé, resulta que, a causa que molt simple aplicació de 912 00:46:10,760 --> 00:46:14,970 la memòria i els marcs de l'anomenada pila, vostè pot prendre el control 913 00:46:14,970 --> 00:46:17,050 d'un sistema informàtic amb força facilitat. 914 00:46:17,050 --> 00:46:22,180 Pot introduir-se en un sistema si la gent com nosaltres no hem escrit el nostre codi 915 00:46:22,180 --> 00:46:23,300 particularment bé. 916 00:46:23,300 --> 00:46:26,670 >> Si la gent com nosaltres utilitzen trossos de memòria o l'ús arrays - 917 00:46:26,670 --> 00:46:27,810 fins i tot més comunament - 918 00:46:27,810 --> 00:46:31,800 però de vegades s'oblidi de comprovar la límits de la nostra gamma com pot ser que 919 00:46:31,800 --> 00:46:38,470 Deixar-se vegades i iterada massa lluny més enllà del final d'una matriu. 920 00:46:38,470 --> 00:46:40,520 En el millor dels casos, el programa d' només podria bloquejar-se. 921 00:46:40,520 --> 00:46:42,280 Decisió de segmentació, tipus de vergonya. 922 00:46:42,280 --> 00:46:45,480 No és genial, però no és necessàriament una enorme mala cosa. 923 00:46:45,480 --> 00:46:49,480 >> Però si el programa és en realitat el veritable equips dels usuaris, si s'està executant 924 00:46:49,480 --> 00:46:53,070 en un lloc web que la gent a l'atzar reals a l'Internet estan colpejant, deixant 925 00:46:53,070 --> 00:46:56,690 persones indueixen coses dolentes en el teu codi és generalment no és una bona cosa perquè 926 00:46:56,690 --> 00:46:59,930 que significa una oportunitat per el control de l'equip. 927 00:46:59,930 --> 00:47:01,350 I això es va a veure una mica críptic. 928 00:47:01,350 --> 00:47:04,570 Però jo vaig pensar que et espanto amb aquest últim exemple. 929 00:47:04,570 --> 00:47:05,650 >> Heus aquí un exemple de codi. 930 00:47:05,650 --> 00:47:07,370 I hi ha una bona Wikipedia article que camina a través d' 931 00:47:07,370 --> 00:47:08,530 això amb més detall. 932 00:47:08,530 --> 00:47:13,890 Tinc principal a la part inferior anomenada foo, passant de argv 1. 933 00:47:13,890 --> 00:47:15,750 I això és només perquè pugui executar el programa i passar 934 00:47:15,750 --> 00:47:17,080 una entrada arbitrària. 935 00:47:17,080 --> 00:47:20,180 >> I llavors foo es declara la superior com l'acceptació d'una cadena, o més 936 00:47:20,180 --> 00:47:21,700 Precisament, un char *. 937 00:47:21,700 --> 00:47:23,860 A continuació, es declara una matriu de caràcters. 938 00:47:23,860 --> 00:47:27,130 Diguem que és un tampó, més en general, de cos 12. 939 00:47:27,130 --> 00:47:30,900 Així que 12 caràcters poden cabre dins d'aquesta matriu anomenada c. 940 00:47:30,900 --> 00:47:33,510 >> I a continuació, utilitza aquesta nova funció, que és nou, però no és difícil d' 941 00:47:33,510 --> 00:47:34,930 entendre, còpia de la memòria. 942 00:47:34,930 --> 00:47:39,290 Es copia la memòria del bar, que era el passat variable n, qualsevol que sigui el 943 00:47:39,290 --> 00:47:42,080 usuari va escriure en argv 1 al c. 944 00:47:42,080 --> 00:47:43,090 Quants bytes? 945 00:47:43,090 --> 00:47:44,260 La longitud de la cadena de la barra. 946 00:47:44,260 --> 00:47:48,380 >> En altres paraules, si l'usuari escriu al h-e-l-l-o enter, la longitud de la cadena 947 00:47:48,380 --> 00:47:49,260 hola és de cinc. 948 00:47:49,260 --> 00:47:52,790 Així que cinc d'aquests bytes es posarà còpia en la matriu anomenada c, que 949 00:47:52,790 --> 00:47:54,110 és de grandària 12. 950 00:47:54,110 --> 00:47:58,710 Però el que l'usuari escriu en un molt més temps paraula que és 13 caràcters o 14 951 00:47:58,710 --> 00:48:01,250 caràcters o 100 caràcters o més? 952 00:48:01,250 --> 00:48:02,660 >> A on van a anar? 953 00:48:02,660 --> 00:48:06,090 Bé, aquest marc, aquesta safata a la pila de menjador-saló, 954 00:48:06,090 --> 00:48:06,930 que van a anar-hi. 955 00:48:06,930 --> 00:48:10,080 I només va a començar a sobreescriure altres coses que ja 956 00:48:10,080 --> 00:48:12,880 a la pila, que desborda la pila, per així dir-ho. 957 00:48:12,880 --> 00:48:14,780 >> Així pictòricament, pensar d'aquesta manera. 958 00:48:14,780 --> 00:48:17,970 Aquesta és només una versió acolorida de la imatge que hem vingut assenyalant. 959 00:48:17,970 --> 00:48:20,060 A la part inferior, diguem, és el principal. 960 00:48:20,060 --> 00:48:24,690 I a la part superior, el que estem veient ara és el marc, codi de color ara, per a un 961 00:48:24,690 --> 00:48:26,090 funció anomenada foo. 962 00:48:26,090 --> 00:48:30,170 Però l'interessant aquí sobre foo és que aquí és el seu marc. 963 00:48:30,170 --> 00:48:32,860 Així es dibuixa com jo ho va fer, però en color blau clar. 964 00:48:32,860 --> 00:48:35,220 I ara, aquest és el lloc on c bracket 0 va. 965 00:48:35,220 --> 00:48:37,410 I aquí és on c abraçadora 11 va a acabar. 966 00:48:37,410 --> 00:48:39,670 >> En altres paraules, es passa a ser representat com un quadrat. 967 00:48:39,670 --> 00:48:42,320 Però si et quedes plopping bytes avall - o caràcters - que van a acabar 968 00:48:42,320 --> 00:48:46,070 fins a la posició 0 fins al final fins a 11 perquè és 0 indexat. 969 00:48:46,070 --> 00:48:49,170 >> Però on és el caràcter 13 va a acabar? 970 00:48:49,170 --> 00:48:50,310 On és el 14? 971 00:48:50,310 --> 00:48:52,430 On és el caràcter número 50 va a acabar? 972 00:48:52,430 --> 00:48:54,070 >> Es va a seguir baixant. 973 00:48:54,070 --> 00:48:57,350 Perquè tot i que hem tret el imatge amb la pila creixia, la 974 00:48:57,350 --> 00:48:59,920 adreces, resulta que van des petites adreces, petita 975 00:48:59,920 --> 00:49:01,830 punters, a les grans direccions. 976 00:49:01,830 --> 00:49:03,540 Per tant, només segueix pujant i pujant. 977 00:49:03,540 --> 00:49:05,660 >> Així que si l'usuari escriu en hola, això és genial. 978 00:49:05,660 --> 00:49:08,650 No hi ha errors, cap problema, segur de tots. 979 00:49:08,650 --> 00:49:11,940 Però si l'usuari escriu en el que anem a cridar codi acusatori, representada 980 00:49:11,940 --> 00:49:16,040 genèricament com un atac, atac, atac, atac, què pot passar? 981 00:49:16,040 --> 00:49:19,760 >> Doncs bé, si la totalitat de l'entrada que l'usuari teclejat no és només un amistós 982 00:49:19,760 --> 00:49:21,540 o una cadena de caràcters ofensius. 983 00:49:21,540 --> 00:49:24,050 En realitat és una seqüència de caràcters que si ho va compilar, 984 00:49:24,050 --> 00:49:26,050 el que realment és codi. 985 00:49:26,050 --> 00:49:29,570 Potser és el codi que elimina tota la arxius en el seu disc dur o envia correu brossa 986 00:49:29,570 --> 00:49:30,810 o alguna cosa per l'estil. 987 00:49:30,810 --> 00:49:35,110 Tingueu en compte que el que és clau aquí és que si el dolent de la pel · lícula té la sort de 988 00:49:35,110 --> 00:49:37,830 sobreescriure el tros vermell de la memòria - 989 00:49:37,830 --> 00:49:41,080 el que no em baso en la meva imatge, però aquesta foto Wikipedia té aquí - 990 00:49:41,080 --> 00:49:42,890 seva crida remet. 991 00:49:42,890 --> 00:49:47,470 >> Quan torna el menjar, quan torna d'intercanvi, Com sap l'ordinador per anar de 992 00:49:47,470 --> 00:49:49,790 aquí a aquí? 993 00:49:49,790 --> 00:49:52,920 O en el segment de tecnologia per sobre, com Com sap que anar a la permuta 994 00:49:52,920 --> 00:49:54,870 codi - el 0 i 1 de que componen swap - 995 00:49:54,870 --> 00:49:56,020 tornar a l'inici? 996 00:49:56,020 --> 00:50:00,450 Hi ha una adreça anomenada volta emmagatzemada en el mateix marc de pila, en 997 00:50:00,450 --> 00:50:02,140 la mateixa safata de cafeteria. 998 00:50:02,140 --> 00:50:06,080 >> Així que si el dolent de la pel · lícula és prou intel ligent com per posar codi d'atac, el codi d'atac, atac 999 00:50:06,080 --> 00:50:07,960 codi, i obtenir la sort - 1000 00:50:07,960 --> 00:50:11,630 sovint a través d'assaig i error - a sobreescriure aquest remitent vermell, 1001 00:50:11,630 --> 00:50:14,360 amb la direcció i l'avís la part superior. 1002 00:50:14,360 --> 00:50:16,830 Avís 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Ha escrit a l'inrevés sobre de la tapa de raons per les quals potser va a visitar. 1004 00:50:20,650 --> 00:50:22,050 Aquest és aquest número. 1005 00:50:22,050 --> 00:50:25,790 >> Així que si el dolent de la pel · lícula es la sort o és prou intel ligent com per sobreescriure el vermell 1006 00:50:25,790 --> 00:50:29,480 despullar de la memòria amb la direcció de codi que ell o ella té d'alguna manera 1007 00:50:29,480 --> 00:50:34,980 injecta en l'equip, suposo que codi serà retornat a 1008 00:50:34,980 --> 00:50:38,260 tan aviat com foo es fa executant? 1009 00:50:38,260 --> 00:50:39,440 >> Codi del dolent. 1010 00:50:39,440 --> 00:50:43,610 Així que aquest codi d'atac, AAA, de nou, podria enviar correu no desitjat, pot eliminar tots els arxius 1011 00:50:43,610 --> 00:50:44,500 en el seu disc dur. 1012 00:50:44,500 --> 00:50:48,740 Però això és el veritablement un desbordament de pila és, o una saturació de la memòria intermèdia, o un 1013 00:50:48,740 --> 00:50:51,060 atac de desbordament de la memòria intermèdia. 1014 00:50:51,060 --> 00:50:54,400 >> I és molt, molt comú a aquest dia amb programes escrits en 1015 00:50:54,400 --> 00:50:58,220 C, C + +, i fins i tot alguns altres idiomes. 1016 00:50:58,220 --> 00:51:02,275 En aquest sentit por, anem a acabar amb una broma. 1017 00:51:02,275 --> 00:51:03,230 >> [El] 1018 00:51:03,230 --> 00:51:04,550 >> Ens veiem dimecres. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 En la següent CS50 - 1021 00:51:10,310 --> 00:51:15,920 Així que m'he quedat sense llums de disc actual, però espera, sense greix llet, mitja el telèfon 1022 00:51:15,920 --> 00:51:17,850 llibre, el suc de taronja que vaig beure avui. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Cable USB, una clau anglesa. 1025 00:51:22,780 --> 00:51:24,800 >> [Reproducció de música]