1 00:00:00,000 --> 00:00:11,242 >> [Música tocando] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. Malan: Todo ben que é CS50 e este é o inicio da semana, cinco. 3 00:00:16,630 --> 00:00:21,480 Entón, hoxe, debaixo dos seus asentos, non vai atopar nada. 4 00:00:21,480 --> 00:00:24,790 Pero, por riba, ten que atopalos, un pequeno sinal de nosa gratitude por 5 00:00:24,790 --> 00:00:26,970 todo o traballo que puxo o Partido dos Quince. 6 00:00:26,970 --> 00:00:30,290 Só ten que retirar o pequeno círculo no abaixo para comezar a xogar ao 7 00:00:30,290 --> 00:00:31,680 resto da clase. 8 00:00:31,680 --> 00:00:38,930 >> Entón, lembro que, ou saber que problema definido catro, que saíu este fin de semana, 9 00:00:38,930 --> 00:00:40,340 implica a escrita de outro partido. 10 00:00:40,340 --> 00:00:43,740 Pero esta vez, implica a utilización dun interface gráfica de usuario real, e non un 11 00:00:43,740 --> 00:00:46,310 Interface textual como Xogo dos Quince era. 12 00:00:46,310 --> 00:00:50,210 E o partido que está á fronte de ti, Se aínda non viu esta próxima, 13 00:00:50,210 --> 00:00:52,310 parece un pouco algo así. 14 00:00:52,310 --> 00:00:55,170 Eu estou indo a ir no meu terminal fiestra aquí en GDB. 15 00:00:55,170 --> 00:00:58,600 E eu estou indo a ir adiante e executar o solución persoal, que pode acceder 16 00:00:58,600 --> 00:01:01,010 tras a execución de actualización de 50 como de costume. 17 00:01:01,010 --> 00:01:04,090 >> Pero eu vou poñelas un pouco xeito secreto, un pequeno ovo de Pascua, 18 00:01:04,090 --> 00:01:08,480 o chamado modo de Deus, por poñendo Deus en argv1. 19 00:01:08,480 --> 00:01:12,920 E eu teño que seguir os meus propios sentidos, executa-lo na miña propia 20 00:01:12,920 --> 00:01:14,220 problema de establecer o directorio. 21 00:01:14,220 --> 00:01:19,190 Entón agora ve unha versión completa do xogo de Breakout. 22 00:01:19,190 --> 00:01:21,090 En realidade, este é o modo de non-man. 23 00:01:21,090 --> 00:01:24,850 Polo tanto, é de feito - 24 00:01:24,850 --> 00:01:26,470 empolgou que pode ser - 25 00:01:26,470 --> 00:01:30,850 ben sinxelo de se aplicar o modo Deus no Breakout, a diferenza do xogo dos Quince, 26 00:01:30,850 --> 00:01:33,590 que algúns de vostedes poden ter abordado para a edición de hacker. 27 00:01:33,590 --> 00:01:37,890 >> En Breakout só en Deus xeito de simplemente facer o que, 28 00:01:37,890 --> 00:01:41,220 intuitivamente coa pa? 29 00:01:41,220 --> 00:01:45,630 Só facelo igual a calquera que sexa o posición horizontal é de balón. 30 00:01:45,630 --> 00:01:49,220 E, sempre que faga iso acorde co balón en movemento este xogo vai 31 00:01:49,220 --> 00:01:53,100 nunca, nunca, nunca perder o balón e vai gañar cada vez. 32 00:01:53,100 --> 00:01:55,430 >> Pero, na edición de hackers esta semana hai máis que o modo de Deus. 33 00:01:55,430 --> 00:01:56,720 Hai unha serie de outras características. 34 00:01:56,720 --> 00:01:58,140 Entre eles, os láseres. 35 00:01:58,140 --> 00:02:01,070 Así que se o estar impaciente lle Pode comezar a derrubar os ladrillos 36 00:02:01,070 --> 00:02:02,120 e algúns outros. 37 00:02:02,120 --> 00:02:04,560 E para aqueles de vostedes que quere calibrar estándar contra hackers 38 00:02:04,560 --> 00:02:08,750 edición, podo ver que esta semana edición hackers deliberadamente é un 39 00:02:08,750 --> 00:02:12,830 algo máis factible, por exemplo, que a Deus xeito foi con Game of Quince. 40 00:02:12,830 --> 00:02:15,300 >> Entón, se está a buscar un fragmento e está a buscar un pouco de diversión adicional 41 00:02:15,300 --> 00:02:18,400 características fan do mergullo en caso de interese. 42 00:02:18,400 --> 00:02:21,280 Agora, máis práctico, déixeme ligar fora unha cousa así. 43 00:02:21,280 --> 00:02:24,780 GDB, que algúns de vostedes poden non ter aínda tocou persoalmente, o que é bo. 44 00:02:24,780 --> 00:02:28,530 Pero agora é realmente o tempo para acostumar esta e cómodo con esta ferramenta 45 00:02:28,530 --> 00:02:31,510 porque vai facer a súa vida moito máis doado, realmente. 46 00:02:31,510 --> 00:02:34,900 >> Por charla de Rob en GDB unha parella de semanas, lembre-se 47 00:02:34,900 --> 00:02:36,810 que GDB é un depurador. 48 00:02:36,810 --> 00:02:41,230 É unha ferramenta que permite que executa o seu programa, pero executa-lo paso a paso, liña 49 00:02:41,230 --> 00:02:45,680 por liña, de modo que pode picar arredor, de xeito que ve as cousas a suceder, entón 50 00:02:45,680 --> 00:02:47,310 que pode imprimir Os valores das variables. 51 00:02:47,310 --> 00:02:50,580 En suma, dálle moito máis enerxía que printDef fai. 52 00:02:50,580 --> 00:02:52,900 >> Agora é certo, a interfaz é moi misterioso. 53 00:02:52,900 --> 00:02:55,180 Interface textual branco e negro na súa maior parte. 54 00:02:55,180 --> 00:02:57,400 As ordes son un pouco difícil recordar en primeiro lugar. 55 00:02:57,400 --> 00:03:01,230 Pero aínda que isto pode levar a metade unha hora, unha hora, para poñer ese adiantado 56 00:03:01,230 --> 00:03:02,940 investimento de tempo para el, confíe en min. 57 00:03:02,940 --> 00:03:06,440 Seguramente ata o final do semestre vai aforrar unha orde de magnitude máis 58 00:03:06,440 --> 00:03:07,600 tempo. 59 00:03:07,600 --> 00:03:09,200 >> Entón, a comezos da semana mergullar dentro 60 00:03:09,200 --> 00:03:13,200 E en termos de Breakout, sabe que pode facelo, sempre que ten 61 00:03:13,200 --> 00:03:18,230 o código de distribución ou de seu propio código en marcha no seu directorio Pst4. 62 00:03:18,230 --> 00:03:21,680 Saber que pode realizar o gdb. / Fuga. 63 00:03:21,680 --> 00:03:23,490 >> Isto abrirá unha fiestra como esta. 64 00:03:23,490 --> 00:03:25,530 Deixe-me dar-me máis dunha fiestra de terminal. 65 00:03:25,530 --> 00:03:27,770 E entón o que eu estou indo a ir adiante e facer, non é só executalo. 66 00:03:27,770 --> 00:03:30,690 Vou primeiro definir un punto de ruptura recordo, o que permite que pause 67 00:03:30,690 --> 00:03:32,500 execución nun lugar particular. 68 00:03:32,500 --> 00:03:35,750 >> Só para manter as cousas simples que eu vou para romper a liña dun só escribindo 69 00:03:35,750 --> 00:03:37,000 o número un. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Permítanme, en realidade, re-abrir esta xanela porque está quedando un 72 00:03:43,250 --> 00:03:45,700 pouco pequeno alí. 73 00:03:45,700 --> 00:03:53,270 Entón o que eu estou indo agora para facer aquí é se eu abrir a miña fiestra terminal. 74 00:03:53,270 --> 00:03:53,910 Imos, alí imos nós. 75 00:03:53,910 --> 00:03:59,850 >> Polo tanto, agora se eu volver a Dropbox, Pst4 e executa gdb. / fuga entrar, teña en conta 76 00:03:59,850 --> 00:04:02,600 Vou romper un para axustar un punto de ruptura na liña un. 77 00:04:02,600 --> 00:04:04,840 E agora estou indo a ir adiante e tipo de correr. 78 00:04:04,840 --> 00:04:07,370 E cando o fago, notar nada parece pasar. 79 00:04:07,370 --> 00:04:08,120 >> Non hai emerxente. 80 00:04:08,120 --> 00:04:09,790 Non hai vídeo interface co usuario aínda. 81 00:04:09,790 --> 00:04:13,340 Pero iso é comprensible, porque eu son literalmente na liña un no meu programa. 82 00:04:13,340 --> 00:04:17,110 E noten que eu axiña encamiñados, especialmente agora a 62, porque todos 83 00:04:17,110 --> 00:04:20,600 as cousas na parte superior deste arquivo é cousas como comentarios e constantes e 84 00:04:20,600 --> 00:04:22,460 desinteressante cousas por agora. 85 00:04:22,460 --> 00:04:25,840 >> Entón agora eu estou no inicio, ao parecer, na liña 62. 86 00:04:25,840 --> 00:04:27,960 E esta é só a distribución código, recall. 87 00:04:27,960 --> 00:04:33,810 Se eu abrir tanto, indo, do mesmo xeito, no meu directorio caixa de correo en Pst4, 88 00:04:33,810 --> 00:04:35,450 en breakout.c. 89 00:04:35,450 --> 00:04:40,670 E se eu rolar para abaixo e para abaixo e para abaixo, e deixe-me ir adiante e chamar 90 00:04:40,670 --> 00:04:44,990 os meus números de liña. 91 00:04:44,990 --> 00:04:50,300 >> O que eu vou ver se eu rolar para abaixo para liña 62, é exactamente a liña que 92 00:04:50,300 --> 00:04:50,910 nós xa parou diante. 93 00:04:50,910 --> 00:04:53,720 Polo tanto, esta liña aquí, 62 anos, é onde estamos a piques de ser. 94 00:04:53,720 --> 00:04:57,470 Entón, agora en GDB, se eu ir adiante e escribir agora seguinte, entrar vai 95 00:04:57,470 --> 00:04:58,450 executar esta liña. 96 00:04:58,450 --> 00:05:00,610 E listo, temos a chamado xanela g. 97 00:05:00,610 --> 00:05:02,800 Se non está familiarizado co que un GWindow é, non se preocupe. 98 00:05:02,800 --> 00:05:05,740 A especificación ha presenta-lo a el, como así como un número de vídeos paso a paso 99 00:05:05,740 --> 00:05:06,830 incorporado na especificación. 100 00:05:06,830 --> 00:05:08,610 >> Pero agora imos facer este un pouco máis interesante. 101 00:05:08,610 --> 00:05:10,960 Déixeme pasar esta fiestra sobre ao lado un pouco. 102 00:05:10,960 --> 00:05:13,480 Deixe-me facer a xanela un pouco grande para que eu poida ver máis. 103 00:05:13,480 --> 00:05:16,140 >> E agora déixeme ir adiante e facer logo de novo. 104 00:05:16,140 --> 00:05:17,550 E alí están os meus ladrillos. 105 00:05:17,550 --> 00:05:20,490 Se eu escribir xunto de novo agora vexo o balón. 106 00:05:20,490 --> 00:05:23,520 E se eu escribir logo de novo agora vexo o remo. 107 00:05:23,520 --> 00:05:26,690 >> E, por sorte, iso non é gedit realmente cooperando por me amosar 108 00:05:26,690 --> 00:05:27,660 todo o que quero. 109 00:05:27,660 --> 00:05:30,820 Pero agora, se eu fai a próxima vez, próxima vez, eu son só 110 00:05:30,820 --> 00:05:32,260 declarar algunhas variables. 111 00:05:32,260 --> 00:05:34,750 E podo imprimir calquera deses caras. 112 00:05:34,750 --> 00:05:37,170 Imprimir ladrillos, gravados vidas. 113 00:05:37,170 --> 00:05:39,910 >> E agora, se eu continuar a facer Logo, teña en conta que eu vou ser 114 00:05:39,910 --> 00:05:40,870 dentro dese circuíto. 115 00:05:40,870 --> 00:05:43,380 Que o código vai realizar exactamente como eu esperaba. 116 00:05:43,380 --> 00:05:45,810 Entón, cando bati esta función, Espera para Preme, que fará 117 00:05:45,810 --> 00:05:46,830 literalmente iso. 118 00:05:46,830 --> 00:05:48,870 Entón, eu parecía perder o control sobre o programa. 119 00:05:48,870 --> 00:05:50,480 >> GDB non está me dando outra ventá. 120 00:05:50,480 --> 00:05:51,500 Pero non se preocupe. 121 00:05:51,500 --> 00:05:53,720 Ir o meu xogo, preme en algún lugar. 122 00:05:53,720 --> 00:05:56,270 >> E listo, agora pasa a liña 86. 123 00:05:56,270 --> 00:05:59,460 Entón, de novo, é de valor inestimable, en última instancia, a problemas de depuración. 124 00:05:59,460 --> 00:06:03,050 Porque pode, literalmente, percorrer o seu código, as cousas imprimir e moito, 125 00:06:03,050 --> 00:06:03,640 moito, moito máis. 126 00:06:03,640 --> 00:06:07,210 Pero de momento, estas ferramentas só deberá facelo moi lonxe. 127 00:06:07,210 --> 00:06:10,050 >> Entón, nós estamos, por suposto, un ollo en gráficos, agora, de súpeto. 128 00:06:10,050 --> 00:06:12,350 E agora o noso mundo está un pouco máis interesante. 129 00:06:12,350 --> 00:06:15,680 E vostede sabe, se cadra, de algúns dos vídeos en liña que temos estes 130 00:06:15,680 --> 00:06:18,280 bermuda que foi asistir como parte de conxuntos de problemas. 131 00:06:18,280 --> 00:06:20,460 >> E eles foron tiroteados, deliberadamente, contra un fondo branco. 132 00:06:20,460 --> 00:06:23,380 E algúns deles teñen o ensino Fellows deseño algún texto en 133 00:06:23,380 --> 00:06:25,490 pantalla que é sobreposto no lado deles. 134 00:06:25,490 --> 00:06:27,760 Pero, claro, isto non é todo o que interesante no mundo real. 135 00:06:27,760 --> 00:06:30,520 Esta é só unha clase cun gran pantalla branca e un pano de fondo. 136 00:06:30,520 --> 00:06:33,330 E a nosa incrible equipo de produción tipo de fai todo parecer bonito 137 00:06:33,330 --> 00:06:36,620 despois do feito cortando fóra ou superposición de calquera cousa 138 00:06:36,620 --> 00:06:37,840 o que facemos ou non quere. 139 00:06:37,840 --> 00:06:41,560 >> Agora é só para motivar esta semana e realmente, onde pode ir, en última instancia, 140 00:06:41,560 --> 00:06:42,560 coa ciencia da computación. 141 00:06:42,560 --> 00:06:44,260 Non só despois problema establecer catro. 142 00:06:44,260 --> 00:06:48,240 Pero despois de outro curso ou conxunto currículo é impresionante o que pode 143 00:06:48,240 --> 00:06:51,090 facer a día de hoxe en termos de gráficos, en particular. 144 00:06:51,090 --> 00:06:53,440 >> Algúns de vostedes poden ter visto iso flúe arredor liña. 145 00:06:53,440 --> 00:06:56,240 Pero eu penso que eu ía mostrar, por só un uns minutos, un reflexo do que 146 00:06:56,240 --> 00:07:01,890 informática e que CGI, computación gráfica pode facer a día de hoxe 147 00:07:01,890 --> 00:07:04,510 cunha canción familiar e quizais a película. 148 00:07:04,510 --> 00:07:05,760 >> [Music - La DEL RAY, "Novo e bonito] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> COLUMNA 1: É un pouco sorprendente, quizais, o no; 151 00:10:52,470 --> 00:10:52,857 omnipresente - 152 00:10:52,857 --> 00:10:57,040 >> [Aplausos] 153 00:10:57,040 --> 00:10:59,230 >> COLUMNA 1: Eu só baixei. 154 00:10:59,230 --> 00:11:02,920 Pero é realmente incrible, eu creo, só como o software omnipresente e código e 155 00:11:02,920 --> 00:11:04,230 ferramentas como esta son realmente. 156 00:11:04,230 --> 00:11:07,685 Entón, iso é un gusto da dirección en que pode ir. 157 00:11:07,685 --> 00:11:10,620 Oh, non máis Appliance hoxe. 158 00:11:10,620 --> 00:11:14,640 Ben, iso é tempo realmente tráxico dado o momento que eu só tente facer. 159 00:11:14,640 --> 00:11:18,670 >> Todo ben, entón imos publicar Fusión de novo. 160 00:11:18,670 --> 00:11:20,800 Lembre me máis tarde. 161 00:11:20,800 --> 00:11:24,190 Todo ben, e ten que conseguir un enviar correo-e como un aparte, se non obter un 162 00:11:24,190 --> 00:11:25,460 entender como ese. 163 00:11:25,460 --> 00:11:29,940 Todo ben, entón lembrar que a semana pasada comezamos a pelar este 164 00:11:29,940 --> 00:11:31,380 máis tarde coñecido como cadea. 165 00:11:31,380 --> 00:11:34,700 >> cadea lembra un tipo de datos que se declarados na biblioteca CS50. 166 00:11:34,700 --> 00:11:37,740 E é parte das Rodas pequenas que agora vai comezar a despegar. 167 00:11:37,740 --> 00:11:41,280 Era un concepto útil no inicio. 168 00:11:41,280 --> 00:11:43,750 Pero agora se ve máis interesante e máis potente para 169 00:11:43,750 --> 00:11:48,330 realmente ver que debaixo do capó, unha cadea é só o que, non podemos dicir? 170 00:11:48,330 --> 00:11:50,500 >> Si, por iso é un chamado char *. 171 00:11:50,500 --> 00:11:53,860 E o * non denota que non hai algún tipo de enderezo implicados. 172 00:11:53,860 --> 00:11:58,690 E así, cando di char * que acaba de dicir unha variable cuxo tipo de datos é un 173 00:11:58,690 --> 00:11:59,290 punteiro agora. 174 00:11:59,290 --> 00:12:01,770 O feito de que hai a estrela alí Significa só que está declarando unha 175 00:12:01,770 --> 00:12:03,020 así chamado punteiro. 176 00:12:03,020 --> 00:12:06,220 E ese punteiro vai parecer almacenar a dirección, de 177 00:12:06,220 --> 00:12:07,810 Por suposto, un char. 178 00:12:07,810 --> 00:12:08,960 >> Agora, por que isto ten sentido? 179 00:12:08,960 --> 00:12:11,200 Ben, o que é unha cadea debaixo do capo? 180 00:12:11,200 --> 00:12:15,130 Ben, hai tempo que veño dicindo que unha corda debaixo do capó é 181 00:12:15,130 --> 00:12:18,460 só h-p-l-l-o, por exemplo. 182 00:12:18,460 --> 00:12:21,585 >> Pero nós xa falamos sobre isto como ser, esencialmente, unha matriz. 183 00:12:21,585 --> 00:12:25,410 E unha matriz, entón, mirar un pouco máis como este, con cada un destes 184 00:12:25,410 --> 00:12:26,460 ocupando unha mordida. 185 00:12:26,460 --> 00:12:28,710 E entón nós dixemos que non hai algo especial para acá, o 186 00:12:28,710 --> 00:12:31,270 barra invertida 0, ou terminador nulo. 187 00:12:31,270 --> 00:12:35,230 >> Entón todo este tempo, que aquí foi unha cadea. 188 00:12:35,230 --> 00:12:38,320 Pero, en realidade, unha cadea é en realidade, un enderezo. 189 00:12:38,320 --> 00:12:43,210 Enderezos, como veremos, moitas veces son prefixado con 0x por convención. 190 00:12:43,210 --> 00:12:44,540 Que 0x denotar? 191 00:12:44,540 --> 00:12:45,970 Alguén sabe? 192 00:12:45,970 --> 00:12:47,320 >> Entón, iso significa só hexadecimal. 193 00:12:47,320 --> 00:12:52,360 Entón, ten que lembrar, en realidade, a partir de PST 1, eu creo, unha das warm-up 194 00:12:52,360 --> 00:12:55,740 cuestións realmente lle preguntou notación hexadecimal ademais 195 00:12:55,740 --> 00:12:57,100 binario e decimal. 196 00:12:57,100 --> 00:13:00,460 E o que é aquí motivación con hexadecimal ten 16 197 00:13:00,460 --> 00:13:01,770 díxitos á súa disposición. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, seguida por a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> E se contar todos aqueles por riba, recibe un total de 16. 200 00:13:10,430 --> 00:13:13,200 Así, isto está en contraste coa decimal, onde temos 10 201 00:13:13,200 --> 00:13:14,690 díxitos, 0 a nove. 202 00:13:14,690 --> 00:13:17,750 É, en contraste co binario onde temos só 0 e 1. 203 00:13:17,750 --> 00:13:21,450 >> Pero ao final do día, pode só representan os mesmos números, pero 204 00:13:21,450 --> 00:13:22,500 un pouco diferente. 205 00:13:22,500 --> 00:13:25,840 E hexadecimal é común porque, como acontece que - e imos ver iso 206 00:13:25,840 --> 00:13:28,790 máis tarde no curso - mesmo cando chegamos a programación web no contexto da 207 00:13:28,790 --> 00:13:32,100 HTML e código de cores, hexadecimal é bo. 208 00:13:32,100 --> 00:13:36,390 Como cada díxito, botan, representa catro bits perfectamente. 209 00:13:36,390 --> 00:13:39,280 Por iso, só unha especie de liñas ata ben como imos finalmente ver. 210 00:13:39,280 --> 00:13:44,720 Entón, isto pode ser Ox123 ou algo así, denotando dirección 123 211 00:13:44,720 --> 00:13:47,050 nalgún lugar dentro do meu memoria do ordenador. 212 00:13:47,050 --> 00:13:50,600 >> Pero, por suposto, xorden algúns problemas debido a esta subxacente 213 00:13:50,600 --> 00:13:51,520 implementación. 214 00:13:51,520 --> 00:13:55,930 E lembro que eu levei unha facada implementación dunha función como esta - 215 00:13:55,930 --> 00:14:00,260 comparar trazo 0 punto c a semana pasada, que aínda que parecía que era 216 00:14:00,260 --> 00:14:04,270 dereito, el simplemente non comparar dúas cordas correctamente. 217 00:14:04,270 --> 00:14:07,470 >> Eu xoguei fóra principal, e eu xoguei aínda que os comentarios só para concentrarse en 218 00:14:07,470 --> 00:14:08,970 o código que é de interese aquí. 219 00:14:08,970 --> 00:14:10,660 E é en vermello porque é buggy. 220 00:14:10,660 --> 00:14:11,670 Por que? 221 00:14:11,670 --> 00:14:15,890 >> Así, na parte superior alí cando eu declarei unha corda, o que realmente estaba a suceder 222 00:14:15,890 --> 00:14:17,260 debaixo do capo? 223 00:14:17,260 --> 00:14:19,530 Ben, deixe-me ir ao pantalla aquí e chamar a iso. 224 00:14:19,530 --> 00:14:23,230 Entón eu dixo, unha vez máis, GetString cadea s. 225 00:14:23,230 --> 00:14:26,640 >> Entón, eu estou indo a ir adiante agora e deseñar s para o que realmente é. 226 00:14:26,640 --> 00:14:28,590 Vai ser unha praza aquí. 227 00:14:28,590 --> 00:14:30,490 E eu vou reclamar que isto é 32 bits. 228 00:14:30,490 --> 00:14:32,890 Polo menos é xeralmente, polo menos na CS50 229 00:14:32,890 --> 00:14:34,520 aparello en unha morea de ordenadores. 230 00:14:34,520 --> 00:14:35,980 Vou chamalo s. 231 00:14:35,980 --> 00:14:39,070 >> Pero, agora, recordar que nos chamado GetString. 232 00:14:39,070 --> 00:14:41,430 Retorno Entón GetString, suposto, unha cadea. 233 00:14:41,430 --> 00:14:45,790 O usuario escribe h-e-l-l-o entrar a cadea Ola será devolto. 234 00:14:45,790 --> 00:14:51,010 E esa cadea, como acabamos de dicir, remata nalgún lugar na memoria do seu ordenador 235 00:14:51,010 --> 00:14:53,240 0 cunha barra invertida ao final. 236 00:14:53,240 --> 00:14:56,650 Vou tomar isto como a matriz - ou bloque contiguo de personaxes - 237 00:14:56,650 --> 00:14:58,330 que realmente é. 238 00:14:58,330 --> 00:15:01,790 >> E agora, o que é GetString realmente volvendo? 239 00:15:01,790 --> 00:15:04,340 Cal foi getString volver todo este tempo? 240 00:15:04,340 --> 00:15:07,520 Así, podemos dicir, a semana anterior, el retorna un cadea. 241 00:15:07,520 --> 00:15:10,250 Pero, máis tecnicamente, o que fai GetString retorno parecer? 242 00:15:10,250 --> 00:15:11,610 >> Audiencia: un enderezo. 243 00:15:11,610 --> 00:15:12,600 >> COLUMNA 1: Un enderezo. 244 00:15:12,600 --> 00:15:16,630 En concreto, el retorna o enderezo de a primeira mordida, sexa cal sexa. 245 00:15:16,630 --> 00:15:18,830 Eu segue a usar un, dous, tres por que é cómodo. 246 00:15:18,830 --> 00:15:21,380 >> Devolve o enderezo do primeiro carácter na secuencia. 247 00:15:21,380 --> 00:15:23,510 E nós dixemos a semana pasada que que é suficiente. 248 00:15:23,510 --> 00:15:26,710 Porque sempre podemos descubrir que o fin da cadea só por 249 00:15:26,710 --> 00:15:30,150 iteración sobre iso, quizais, coa loop ou un loop while ou algo así 250 00:15:30,150 --> 00:15:34,990 que, só de ollar para "barra invertida 0", o carácter sentinela especial. 251 00:15:34,990 --> 00:15:37,220 >> E entón sabemos que a cadea pasa a ser de lonxitude - 252 00:15:37,220 --> 00:15:37,980 neste caso - 253 00:15:37,980 --> 00:15:38,670 cinco. 254 00:15:38,670 --> 00:15:43,800 Entón, tecnicamente o que fai GetString é el retorna Ox123 neste caso. 255 00:15:43,800 --> 00:15:53,670 E tecnicamente o que pasa entón é que nos gardamos, dentro s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Ao final do día, aínda que esta é concepto novo, punteiros, son 257 00:15:56,460 --> 00:15:57,350 só variables. 258 00:15:57,350 --> 00:16:00,440 Pero eles acontecen para almacenar bits que colectivamente representan un enderezo. 259 00:16:00,440 --> 00:16:03,700 Entón, tecnicamente todo o que queda almacenado s é Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Pero nós, como seres humanos - 261 00:16:04,680 --> 00:16:06,020 ata hoxe en diante - 262 00:16:06,020 --> 00:16:09,290 son realmente non vai importar, normalmente, cal é o enderezo real é 263 00:16:09,290 --> 00:16:10,520 dalgún anaco de memoria. 264 00:16:10,520 --> 00:16:14,040 É só a baixo nivel de detalle para ser intelectualmente interesante. 265 00:16:14,040 --> 00:16:15,440 Entón, eu estou indo a desfacer iso. 266 00:16:15,440 --> 00:16:19,810 E, ao contrario, máis alto nivel, só tes que dicir que cando estamos a falar de punteiros 267 00:16:19,810 --> 00:16:22,170 Vou só chamar máis frecha amigable que transmite a 268 00:16:22,170 --> 00:16:26,060 mesma idea e abstrai os indicación de que o real 269 00:16:26,060 --> 00:16:27,700 enderezo subxacente. 270 00:16:27,700 --> 00:16:33,290 >> Agora, se volver para o código, o que sucedeu a semana pasada, se temos corda t 271 00:16:33,290 --> 00:16:34,510 igual GetString? 272 00:16:34,510 --> 00:16:38,630 Ben, se eu de novo, escriba Ola esta vez eu vou conseguir 273 00:16:38,630 --> 00:16:40,460 outro anaco de memoria. 274 00:16:40,460 --> 00:16:44,820 h-p-l-l-o invertida 0. 275 00:16:44,820 --> 00:16:48,320 >> Pero por que eu chamei GetString por segunda vez - 276 00:16:48,320 --> 00:16:51,100 e sei que isto de mirar o fonte para GetString - aínda 277 00:16:51,100 --> 00:16:54,350 pero é coincidencia que Ola foi ingresaran dúas veces, GetString non é 278 00:16:54,350 --> 00:16:55,890 tratará de optimizar e ser intelixente. 279 00:16:55,890 --> 00:16:58,550 El só vai pegar outro anaco de a memoria do ordenador, que está 280 00:16:58,550 --> 00:16:59,640 será noutro enderezo. 281 00:16:59,640 --> 00:17:02,330 Nós só dicir arbitrariamente 456. 282 00:17:02,330 --> 00:17:04,079 >> E entón o que é o que vai volver? 283 00:17:04,079 --> 00:17:08,030 Volverá 456 e almacena-lo en t. 284 00:17:08,030 --> 00:17:12,010 Entón, o que realmente está a suceder, sobre o á esquerda, é que eu teño un outro anaco 285 00:17:12,010 --> 00:17:14,260 de memoria de 32 bits normalmente. 286 00:17:14,260 --> 00:17:16,720 E alí está a ir Ox456. 287 00:17:16,720 --> 00:17:20,140 Pero, de novo, eu non estou interesado nestes números específicos tecleamos máis. 288 00:17:20,140 --> 00:17:23,069 Eu só vou abstractamente deseña-lo como unha frecha. 289 00:17:23,069 --> 00:17:25,202 >> Polo tanto, esta é agora unha nova explicación. 290 00:17:25,202 --> 00:17:28,735 Pero é exactamente a mesma idea que se ven a suceder todo este tempo. 291 00:17:28,735 --> 00:17:33,150 E así, a razón, entón, que esta primeira versión de comparación foi buggy 292 00:17:33,150 --> 00:17:34,480 a semana pasada, e por que? 293 00:17:34,480 --> 00:17:38,000 Cando se s é igual a igual t O que está verdadeiramente 294 00:17:38,000 --> 00:17:40,550 debaixo do capó comparando? 295 00:17:40,550 --> 00:17:41,910 >> Está comparando os enderezos. 296 00:17:41,910 --> 00:17:47,950 E, así, intuitivamente, claramente, Ox123 non vai igual Ox456. 297 00:17:47,950 --> 00:17:49,380 Eses números, eses bits son só diferentes. 298 00:17:49,380 --> 00:17:53,220 >> E así, de forma consistente, a semana pasada, el dixo escribe cousas distintas, aínda que a 299 00:17:53,220 --> 00:17:55,360 palabras foron literalmente o mesmo. 300 00:17:55,360 --> 00:17:58,770 Entón imos solucionar isto. 301 00:17:58,770 --> 00:18:00,120 En termos leigos, o que era a corrección? 302 00:18:00,120 --> 00:18:02,110 >> Audiencia: Use unha función. 303 00:18:02,110 --> 00:18:02,870 >> COLUMNA 1: Usar unha función. 304 00:18:02,870 --> 00:18:05,190 Ou estrelas están sempre implicados, pero usar unha función para facer o que? 305 00:18:05,190 --> 00:18:05,962 >> Audiencia: Para comparar as cordas. 306 00:18:05,962 --> 00:18:07,390 >> COLUMNA 1: Para comparar as cordas. 307 00:18:07,390 --> 00:18:11,030 Así, o problema fundamental aquí foi que eu estaba só tendo en conta a 308 00:18:11,030 --> 00:18:15,870 calidade de corda a ser definido pola comparación dos seus enderezos. 309 00:18:15,870 --> 00:18:18,540 E, por suposto, iso é só mudo agora xa Entende o que está pasando 310 00:18:18,540 --> 00:18:19,510 debaixo do capó. 311 00:18:19,510 --> 00:18:23,270 Para comparar verdadeiramente cordas a ver se son iguais na forma que un ser humano 312 00:18:23,270 --> 00:18:26,680 consideraría dúas cordas para ser igual hai que comparalos-los carácter para 313 00:18:26,680 --> 00:18:28,070 personaxe para personaxe. 314 00:18:28,070 --> 00:18:30,020 >> Agora eu podería ter feito esta moi tedioso. 315 00:18:30,020 --> 00:18:32,240 Pero familiarmente, estamos usando un loop for. 316 00:18:32,240 --> 00:18:36,050 E basta comparar s soporte i contra t soporte i. 317 00:18:36,050 --> 00:18:39,590 s soporte de i + 1 contra t soporte i + 1, e así por diante, para dentro 318 00:18:39,590 --> 00:18:40,580 unha especie de loop. 319 00:18:40,580 --> 00:18:44,950 E se eu detectar calquera dous personaxes que diferentes, ou se eu entender que ooh, s é 320 00:18:44,950 --> 00:18:48,410 máis curta do que te ou máis que te Podo dicir inmediatamente falso, 321 00:18:48,410 --> 00:18:49,390 eles non son o mesmo. 322 00:18:49,390 --> 00:18:55,370 >> Pero se eu pasar s e t e dicir mesmo, mesmo, mesmo, mesmo, mesmo, a fin de 323 00:18:55,370 --> 00:18:58,520 ambas as cordas, o que podo dicir realidade, son iguais. 324 00:18:58,520 --> 00:19:01,040 Ben, por sorte, anos atrás, alguén escribiu que o código para nós. 325 00:19:01,040 --> 00:19:03,790 >> E eles chamaban tanto SeqComp a cadea de comparar. 326 00:19:03,790 --> 00:19:11,900 E aínda que sexa un pouco contra intuitivo, StrComp retorna 0 se os 327 00:19:11,900 --> 00:19:14,520 dúas cadeas, s e t son o mesmo. 328 00:19:14,520 --> 00:19:18,090 Pero el retorna valor negativo se s debe vir antes de t en orde alfabética ou 329 00:19:18,090 --> 00:19:20,610 valor positivo se debe vir despois de t en orde alfabética. 330 00:19:20,610 --> 00:19:24,030 >> Entón, se quere resolver algo, verifícase que SeqComp é útil. 331 00:19:24,030 --> 00:19:26,660 ¿Por que non basta dicir si ou non, iguais ou non. 332 00:19:26,660 --> 00:19:30,440 El lle dá un sentido de ordenación como unha forza dicionario. 333 00:19:30,440 --> 00:19:33,770 Entón SeqComp, s coma t é igual a é igual a 0 significa que o 334 00:19:33,770 --> 00:19:35,200 cordas son verdadeiramente iguais. 335 00:19:35,200 --> 00:19:38,680 Porque quen escribiu esta función anos, presuntamente usado un loop 336 00:19:38,680 --> 00:19:42,840 ou un loop while ou algo así para integrar máis os personaxes de novo 337 00:19:42,840 --> 00:19:45,270 e de novo e de novo. 338 00:19:45,270 --> 00:19:47,300 >> Pero dous problemas xurdiron aquí. 339 00:19:47,300 --> 00:19:48,750 Este foi copy0.c. 340 00:19:48,750 --> 00:19:51,680 E os dous está en vermello por que é fallo. 341 00:19:51,680 --> 00:19:52,800 E o que facemos aquí? 342 00:19:52,800 --> 00:19:54,310 Ben, primeiro eu chamei GetString. 343 00:19:54,310 --> 00:19:56,255 E eu gardei o valor de retorno en s. 344 00:19:56,255 --> 00:20:00,260 Entón, iso é practicamente o mesmo que esta parte superior da imaxe. 345 00:20:00,260 --> 00:20:01,490 >> Pero o que vén despois diso? 346 00:20:01,490 --> 00:20:04,980 Ben, deixe-me ir adiante e librarse unha morea de presente. 347 00:20:04,980 --> 00:20:09,650 Imos volver o tempo para onde nós só ten s, que agora é consistente coa 348 00:20:09,650 --> 00:20:10,940 unha liña alí enriba. 349 00:20:10,940 --> 00:20:11,400 >> Eu verifico. 350 00:20:11,400 --> 00:20:13,450 Si s é igual é igual a 0. 351 00:20:13,450 --> 00:20:18,670 Agora, unha nota lateral rápido cando GetString pode devolver 0? 352 00:20:18,670 --> 00:20:19,580 Non hai memoria suficiente. 353 00:20:19,580 --> 00:20:19,880 Non? 354 00:20:19,880 --> 00:20:22,310 >> É raro que iso vai ocorrer, seguramente nun ordenador que está 355 00:20:22,310 --> 00:20:24,740 ten centos de megas ou mesmo GB de RAM. 356 00:20:24,740 --> 00:20:27,080 Pero podería, en teoría, o regreso 0, sobre todo se o 357 00:20:27,080 --> 00:20:28,080 usuario non cooperar. 358 00:20:28,080 --> 00:20:31,640 Hai formas de finxir que non ten algo escritas e truco 359 00:20:31,640 --> 00:20:34,100 GetString en voltar 0 eficaz. 360 00:20:34,100 --> 00:20:35,470 >> Entón vai para buscar iso. 361 00:20:35,470 --> 00:20:39,430 Porque se algún de vós xa comezaron a se, xa, fallos de segmentación - 362 00:20:39,430 --> 00:20:42,280 que probablemente foi unha fonte dalgunha frustración - 363 00:20:42,280 --> 00:20:46,150 estes son case sempre o resultado de erro relacionado coa memoria. 364 00:20:46,150 --> 00:20:50,440 Dalgunha forma, romper todo no que se refire a un punteiro, mesmo se non entender 365 00:20:50,440 --> 00:20:51,530 houbo un punteiro. 366 00:20:51,530 --> 00:20:55,260 Entón vostede pode ter inducido a segmentación defectos tan cedo como unha semana a usar 367 00:20:55,260 --> 00:21:02,100 algo así como un loop ou un tempo loop e unha matriz por ir lonxe de máis 368 00:21:02,100 --> 00:21:05,900 alén dos límites da matriz que algúns vostede declarou, en dúas semanas, en 369 00:21:05,900 --> 00:21:06,690 particular. 370 00:21:06,690 --> 00:21:09,220 >> Pode ter feito isto mesmo problema establecer catro con Breakout. 371 00:21:09,220 --> 00:21:12,910 Aínda que probablemente non viu ningunha estrela no código de distribución para 372 00:21:12,910 --> 00:21:17,410 Breakout, verifícase que os GRect e Goval e outras cousas que tales, 373 00:21:17,410 --> 00:21:19,650 estes son realmente os punteiros debaixo do capó. 374 00:21:19,650 --> 00:21:23,430 >> Pero Stanford, coma nós, tipo de pel este detalle, polo menos para as bibliotecas 375 00:21:23,430 --> 00:21:26,540 propósitos, moi parecido ao que facemos a cadea e char *. 376 00:21:26,540 --> 00:21:30,060 Pero GRect e Goval e de todos aqueles cousas que están ou estarán a usar 377 00:21:30,060 --> 00:21:32,630 esta semana son en definitiva, enderezos de memoria. 378 00:21:32,630 --> 00:21:33,650 Vostede simplemente non sabe. 379 00:21:33,650 --> 00:21:37,240 >> Polo tanto, non é sorprendente, entón, se cadra, que se pode tropezar nalgún 380 00:21:37,240 --> 00:21:38,580 fallos de segmentación. 381 00:21:38,580 --> 00:21:41,290 Pero o que é interesante aquí agora, Se despois de comprobar 0 que facemos 382 00:21:41,290 --> 00:21:43,460 corda t queda s. 383 00:21:43,460 --> 00:21:44,690 Ben, déixeme declarar t. 384 00:21:44,690 --> 00:21:47,730 Vou deséñase como un cadrado, 32 bits, chamalo de t. 385 00:21:47,730 --> 00:21:49,740 E entón eu vou facer se s. 386 00:21:49,740 --> 00:21:51,130 >> Ben, o que significa isto? 387 00:21:51,130 --> 00:21:53,280 Ben, é algo difícil pensar niso imaxinar sabio. 388 00:21:53,280 --> 00:21:55,025 Pero imos pensar sobre o que está dentro de x? 389 00:21:55,025 --> 00:21:59,430 Que é, literalmente, dentro desa variable? 390 00:21:59,430 --> 00:22:01,500 O valor Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Polo tanto, cando digo corda t queda s, que literalmente significa ter o número 392 00:22:05,815 --> 00:22:10,070 en s, que é Ox123 e poñelas Ox123. 393 00:22:10,070 --> 00:22:13,740 Ou pictoricamente, se eu tipo de abstracto lonxe dese detalle ten o 394 00:22:13,740 --> 00:22:16,600 efecto de literalmente facer iso tamén. 395 00:22:16,600 --> 00:22:22,110 >> Entón, agora, creo que volta a semana pasada, cando procedeuse se capitalista T. I 396 00:22:22,110 --> 00:22:23,800 fixo T soporte 0. 397 00:22:23,800 --> 00:22:27,150 Ben, T apoio 0, aínda que sexa un punteiro, pode trata-lo como se 398 00:22:27,150 --> 00:22:29,220 é unha matriz, cun cadrado notación soporte. 399 00:22:29,220 --> 00:22:31,550 >> Entón, onde está T soporte 0? 400 00:22:31,550 --> 00:22:32,990 Ben, é o h. 401 00:22:32,990 --> 00:22:36,800 E así, cando usamos esta liña de código, dous máis, que está en que c type.h 402 00:22:36,800 --> 00:22:38,460 ficheiro de cabeceira, que é onde é declarado. 403 00:22:38,460 --> 00:22:44,410 Está capitalizando este H. Pero, Por suposto, iso é exactamente o mesmo que h é 404 00:22:44,410 --> 00:22:46,540 s no interior, por así dicir. 405 00:22:46,540 --> 00:22:51,930 E agora cambiou ou capitalizar tanto o orixinal eo 406 00:22:51,930 --> 00:22:53,120 chamado copia. 407 00:22:53,120 --> 00:22:56,620 Porque non fai unha copia na forma que un ser humano quere que sexa. 408 00:22:56,620 --> 00:22:59,710 >> Entón, cal foi a corrección aquí, en copy1.c a semana pasada? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funcións, para que poidamos realmente copiar o cadea. 411 00:23:05,580 --> 00:23:08,700 E, fundamentalmente, o que necesitamos facer a copia a secuencia? 412 00:23:08,700 --> 00:23:12,070 >> Pois ben, nesta versión verde aquí estou vai facelo moi baixo nivel. 413 00:23:12,070 --> 00:23:14,260 En realidade, hai funcións poderían axudar con iso. 414 00:23:14,260 --> 00:23:17,710 Pero o máis básico eo máis un familiar, polo menos, en breve será 415 00:23:17,710 --> 00:23:19,600 familiar para nós, é o seguinte - 416 00:23:19,600 --> 00:23:21,910 así un na primeira liña do código en verde agora. 417 00:23:21,910 --> 00:23:23,970 >> Só reescreveu s como char *. 418 00:23:23,970 --> 00:23:25,250 Non hai ningún funcional diferenza alí. 419 00:23:25,250 --> 00:23:28,790 Eu só xoguei fóra a biblioteca e CS50 Estou chamando-o que é, un char *. 420 00:23:28,790 --> 00:23:31,640 >> Agora, punto, punto, punto, porque non había comprobación de erros que non é 421 00:23:31,640 --> 00:23:33,200 interesante para falar de novo. 422 00:23:33,200 --> 00:23:34,710 Entón, agora t é declarada. 423 00:23:34,710 --> 00:23:35,780 El tamén é un char *. 424 00:23:35,780 --> 00:23:38,280 Entón eu deseño dunha pequena praza en a pantalla como antes. 425 00:23:38,280 --> 00:23:41,870 >> Pero, no lado dereito, malloc, dixemos é reservar memoria. 426 00:23:41,870 --> 00:23:44,130 Entón reservar algún anaco de memoria. 427 00:23:44,130 --> 00:23:48,830 E cantos bytes é que imos realmente desexa asignar, non parece? 428 00:23:48,830 --> 00:23:50,340 >> Así, a lonxitude da cadea de s. 429 00:23:50,340 --> 00:23:52,310 Entón, se é que é Ola será cinco. 430 00:23:52,310 --> 00:23:53,950 Digamos h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Así, cinco bytes. 432 00:23:55,090 --> 00:23:57,960 >> Pero, entón, unha, por 1? 433 00:23:57,960 --> 00:23:58,830 O 0 personaxe. 434 00:23:58,830 --> 00:24:03,640 Se non deixar espazo para este cara que accidentalmente pode crear unha situación 435 00:24:03,640 --> 00:24:05,600 onde a corda é h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 E, a continuación, a próxima vez é GetString chamou e eu escribir, por exemplo, 437 00:24:08,470 --> 00:24:14,020 David, D - v-i-d, o ordenador vai pensar que s é realmente 438 00:24:14,020 --> 00:24:18,900 h-p-l-l-o-d-a-v-i-d, porque hai sen pausa entre as palabras. 439 00:24:18,900 --> 00:24:19,810 >> Por iso, necesitamos que pausa. 440 00:24:19,810 --> 00:24:20,720 Entón, non queremos que cinco. 441 00:24:20,720 --> 00:24:22,100 Queremos seis bytes. 442 00:24:22,100 --> 00:24:23,110 >> E bytes que digo. 443 00:24:23,110 --> 00:24:25,220 Pero é o tamaño realmente o tempo do char. 444 00:24:25,220 --> 00:24:28,040 Tecnicamente char é case sempre un byte. 445 00:24:28,040 --> 00:24:31,030 >> Pero só para facer o noso código portátil, por así dicir, de xeito que funciona en 446 00:24:31,030 --> 00:24:33,750 ordenadores diferentes, aínda se poden ser un pouco diferente por baixo do 447 00:24:33,750 --> 00:24:36,590 capa, vou xenericamente dicir o tamaño do char para que 448 00:24:36,590 --> 00:24:37,660 meu código sempre funciona. 449 00:24:37,660 --> 00:24:40,610 E eu non teño que recompilar só por que eu actualizar meu ordenador ou utilizar 450 00:24:40,610 --> 00:24:42,140 unha plataforma diferente. 451 00:24:42,140 --> 00:24:45,300 >> Entón eu teño seis veces o tamaño da un char, que pasa a ser 1. 452 00:24:45,300 --> 00:24:47,440 Entón iso significa que malloc podería me dea seis bytes. 453 00:24:47,440 --> 00:24:49,140 Que realmente está facendo? 454 00:24:49,140 --> 00:24:52,810 Ben, deixe-me retroceder o tempo aquí onde estamos na historia. 455 00:24:52,810 --> 00:24:57,620 >> Entón, se eu volver aquí, eu xa declarou un char * chamado t. 456 00:24:57,620 --> 00:25:00,280 Eu xa chama malloc por seis bytes. 457 00:25:00,280 --> 00:25:06,400 E agora eu vou chamar os seis bytes así como a matriz anterior. 458 00:25:06,400 --> 00:25:10,570 Pero eu realmente non sei o que é dentro desa matriz. 459 00:25:10,570 --> 00:25:14,640 >> Se reservar memoria verifícase que non se pode confiar en que hai algún 460 00:25:14,640 --> 00:25:15,810 valor coñecido alí. 461 00:25:15,810 --> 00:25:18,400 Podía ser utilizado por algo outro, outra función, outra 462 00:25:18,400 --> 00:25:19,630 liña de código que escribiu. 463 00:25:19,630 --> 00:25:22,870 Entón, imos chamar estes xeralmente lixo valores e deseña-los, se cadra, como 464 00:25:22,870 --> 00:25:26,170 puntos de interrogación, indicando só que non sei o que está realmente alí. 465 00:25:26,170 --> 00:25:30,390 E iso non é gran cousa con tal de que son intelixentes o suficiente para substituír os 466 00:25:30,390 --> 00:25:34,550 valores de lixo con números ou caracteres que se preocupan. 467 00:25:34,550 --> 00:25:36,340 >> Polo tanto, neste caso o que vou facer? 468 00:25:36,340 --> 00:25:38,670 Ben, a miña liña de código seguinte, eu teño catro. 469 00:25:38,670 --> 00:25:41,350 int i obter 0, n recibe o lonxitude da corda de s. 470 00:25:41,350 --> 00:25:42,750 Así, un familiar ao loop. 471 00:25:42,750 --> 00:25:45,875 I é menor ou igual a n, que é xeralmente enriba. 472 00:25:45,875 --> 00:25:47,500 >> Pero esta vez é deliberada. 473 00:25:47,500 --> 00:25:51,890 I + +, e entón eu simplemente facer t soporte i queda s. 474 00:25:51,890 --> 00:25:56,320 Porque a miña imaxe se parece iso a Neste momento, almacenado en que t é o 475 00:25:56,320 --> 00:25:59,530 dirección desta peza aleatorio de memoria cuxos valores son descoñecidos. 476 00:25:59,530 --> 00:26:03,030 Pero así que fago t soporte 0 que me pon aquí. 477 00:26:03,030 --> 00:26:07,430 >> E o que acaba sendo atraídos para alí? 478 00:26:07,430 --> 00:26:08,740 Nós acaban poñendo h. 479 00:26:08,740 --> 00:26:11,170 Porque iso é o que está en s soporte 0. 480 00:26:11,170 --> 00:26:14,300 E, a continuación, o mesmo para e e, l, l, e o. 481 00:26:14,300 --> 00:26:17,930 >> n, polo que vou cara arriba a través igual a n? 482 00:26:17,930 --> 00:26:19,200 Debido ao seu carácter 0. 483 00:26:19,200 --> 00:26:23,580 Entón, só para quedar claro, entón, se realmente borrará todo o que estes lixo 484 00:26:23,580 --> 00:26:28,870 valores e entón realmente atraer o que eu espero, é s pista 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, ademais de que é á dereita novo personaxe. 486 00:26:32,440 --> 00:26:36,080 >> E agora si continuássemos pasado do punto, punto, punto nesta versión correcta 487 00:26:36,080 --> 00:26:41,930 e capitalizar t soporte 0 eu ía, de Por suposto, se aproveitando só iso 488 00:26:41,930 --> 00:26:47,050 cara aquí e que, conceptualmente, resultou ser a meta. 489 00:26:47,050 --> 00:26:48,040 Entón, iso é todo o punteiro está. 490 00:26:48,040 --> 00:26:51,430 >> E ten de usalos por semanas Agora, no contexto de cadeas. 491 00:26:51,430 --> 00:26:53,530 Pero debaixo do capó son un pouco máis complexa. 492 00:26:53,530 --> 00:26:57,520 Pero se pensar sobre eles neste forma pictórica propoño que son 493 00:26:57,520 --> 00:27:01,720 probablemente non é tan asustado como primeiro pode parecer a primeira vista, 494 00:27:01,720 --> 00:27:04,730 particularmente con esa nova sintaxe. 495 00:27:04,730 --> 00:27:07,290 Calquera dúbida sobre punteiros, cordas, ou chars? 496 00:27:07,290 --> 00:27:07,580 Si? 497 00:27:07,580 --> 00:27:09,252 >> Audiencia: Pode volver a [inaudível]? 498 00:27:09,252 --> 00:27:10,502 >> COLUMNA 1: Claro. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> Audiencia: Entón como é que na súa última liña, non ten unha liña de t * 501 00:27:19,525 --> 00:27:21,513 e * s en liña? 502 00:27:21,513 --> 00:27:23,004 Non ten a referencia ao - 503 00:27:23,004 --> 00:27:24,640 >> COLUMNA 1: Ah, unha pregunta moi boa. 504 00:27:24,640 --> 00:27:26,800 Por que eu non teño a * t * e unha s? 505 00:27:26,800 --> 00:27:30,340 Por un intre, a semana pasada, como no noso función de cambiar, eu dixen que cando 506 00:27:30,340 --> 00:27:33,350 ten un punteiro o medio polo que vai alí, como fixemos 507 00:27:33,350 --> 00:27:36,590 fisicamente o escenario, era, en realidade, usar o operador estrela. 508 00:27:36,590 --> 00:27:40,570 >> Acontece que esta de corchetes notación é a que imos chamar sintática 509 00:27:40,570 --> 00:27:44,190 azucre, que é só un xeito sexy de dicindo que é notación abreviada para 510 00:27:44,190 --> 00:27:45,950 exactamente o que está describindo. 511 00:27:45,950 --> 00:27:49,385 Pero é un pouco máis intuitivo. 512 00:27:49,385 --> 00:27:53,510 E correndo o risco de facelo parecer máis complicado do que ten que ser, 513 00:27:53,510 --> 00:27:56,990 o que realmente está a suceder aquí é o seguinte - 514 00:27:56,990 --> 00:28:01,450 Se eu digo * t que significa ir a dirección almacenado en t. 515 00:28:01,450 --> 00:28:04,350 >> Entón, literalmente, se t está almacenando a dirección desa h 516 00:28:04,350 --> 00:28:07,300 Inicialmente, a * t medio aquí. 517 00:28:07,300 --> 00:28:10,730 Agora o que te soporte 0 significa? 518 00:28:10,730 --> 00:28:11,560 Mesmo. 519 00:28:11,560 --> 00:28:13,510 É só algo máis user agradable para escribir. 520 00:28:13,510 --> 00:28:14,430 >> Pero eu non estou preparado aínda. 521 00:28:14,430 --> 00:28:17,800 Non podo simplemente dicir * t * s queda. 522 00:28:17,800 --> 00:28:19,440 Porque o que eu estaría facendo entón? 523 00:28:19,440 --> 00:28:22,950 Eu estaría poñendo h, h, h, h, h toda a cousa toda. 524 00:28:22,950 --> 00:28:22,995 Non? 525 00:28:22,995 --> 00:28:26,020 >> Por * t é ir ao enderezo en t. 526 00:28:26,020 --> 00:28:27,580 Pero estamos dentro dun loop. 527 00:28:27,580 --> 00:28:32,150 E cal é o valor que eu estou incrementando, suposto, en cada iteración? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Pero hai unha oportunidade aquí, non? 530 00:28:34,590 --> 00:28:37,870 Aínda que iso parece que está quedando algo máis sofisticadas 531 00:28:37,870 --> 00:28:40,730 que a notación de corchetes temos usado por algún tempo - 532 00:28:40,730 --> 00:28:43,840 déixeme desfacer a miña cambio de h alí - 533 00:28:43,840 --> 00:28:48,870 aínda que iso agora está quedando un pouco extravagante, a idea básica, se * t 534 00:28:48,870 --> 00:28:53,630 significa aquí e * t é só ir ao enderezo de t. 535 00:28:53,630 --> 00:28:54,990 >> Pero cal era o enderezo no t? 536 00:28:54,990 --> 00:28:56,850 O número que seguir a usar? 537 00:28:56,850 --> 00:29:00,540 Como Ox456, imos traer iso de volta só por unha cuestión de debate. 538 00:29:00,540 --> 00:29:05,380 Ben, se eu queira chegar ao e en t cadea, eu só quero ir, 539 00:29:05,380 --> 00:29:06,460 esencialmente, 456. 540 00:29:06,460 --> 00:29:09,230 >> Ou mellor, 457. 541 00:29:09,230 --> 00:29:10,590 Eu só teño engadir unha. 542 00:29:10,590 --> 00:29:11,790 Pero eu podo facelo, non? 543 00:29:11,790 --> 00:29:14,680 Porque t, a pesar de eu manter deseño agora como unha frecha, é só un 544 00:29:14,680 --> 00:29:16,570 número, Ox456. 545 00:29:16,570 --> 00:29:21,400 E se eu engadir un para iso, ou máis xeralmente, se eu engadir I para que eu poida 546 00:29:21,400 --> 00:29:24,350 realmente chegar exactamente onde quero. 547 00:29:24,350 --> 00:29:26,260 Entón, se eu realmente facer iso - 548 00:29:26,260 --> 00:29:28,970 e iso é o que se chama agora punteiro aritmética - 549 00:29:28,970 --> 00:29:30,375 Podo eliminar esta liña. 550 00:29:30,375 --> 00:29:33,550 Cal é, francamente, creo que máis clara e un pouco máis agradable para ler. 551 00:29:33,550 --> 00:29:35,970 Pero isto non é menos correcto. 552 00:29:35,970 --> 00:29:38,570 >> Esta liña de código está a usar agora aritmética de punteiro. 553 00:29:38,570 --> 00:29:40,920 Está dicindo que ir ao seguinte enderezo - 554 00:29:40,920 --> 00:29:44,670 calquera que sexa o inicio do t, que t é máis i, que inicialmente 555 00:29:44,670 --> 00:29:45,730 é 0, o que é óptimo. 556 00:29:45,730 --> 00:29:49,280 Porque o que supón o inicio do t máis 1, máis 2, máis 3, e así por diante. 557 00:29:49,280 --> 00:29:51,030 E o mesmo con s. 558 00:29:51,030 --> 00:29:52,750 >> Entón azucre sintático para iso. 559 00:29:52,750 --> 00:29:55,900 Pero a comprensión do que realmente está a suceder debaixo do capó, eu diría, 560 00:29:55,900 --> 00:29:57,410 é realmente útil en si mesmo. 561 00:29:57,410 --> 00:30:00,620 Porque iso significa que agora non hai moito máis maxia suceder 562 00:30:00,620 --> 00:30:01,620 debaixo do capó. 563 00:30:01,620 --> 00:30:03,920 Non van ser moitos máis capas que podemos descascada para ti. 564 00:30:03,920 --> 00:30:04,810 Este é c. 565 00:30:04,810 --> 00:30:06,410 E esta é a programación. 566 00:30:06,410 --> 00:30:08,002 Pregunta moi boa. 567 00:30:08,002 --> 00:30:11,570 >> Todo ben, entón iso foi que de buggy programa que eu estaba me referindo anteriormente. 568 00:30:11,570 --> 00:30:12,650 troco foi fallo. 569 00:30:12,650 --> 00:30:14,070 Se parecía funcionar. 570 00:30:14,070 --> 00:30:17,390 Lembre que, como con leite e o zume de laranxa - que comece a 571 00:30:17,390 --> 00:30:18,660 dí manifestación de hoxe. 572 00:30:18,660 --> 00:30:22,220 Así como co zume de laranxa e o leite, que tivo que usar unha 573 00:30:22,220 --> 00:30:26,200 variable temporal, tmp, para realizar unha temporalmente, para que puidésemos entón 574 00:30:26,200 --> 00:30:28,820 modificar o seu valor e, a continuación, actualizar b. 575 00:30:28,820 --> 00:30:32,870 >> Pero esta función, como dixemos, é esta programa no que esta función é 576 00:30:32,870 --> 00:30:35,670 escrito estaba mal e fallo, por que? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Si? 579 00:30:39,090 --> 00:30:42,471 >> Audiencia: [inaudível]. 580 00:30:42,471 --> 00:30:44,940 >> COLUMNA 1: Exactamente cando vostedes chaman de intercambio - 581 00:30:44,940 --> 00:30:47,820 ou, máis xeralmente, cando chamar máis calquera función - 582 00:30:47,820 --> 00:30:51,210 os argumentos para esa función son primitivas, por así dicir, ints e chars 583 00:30:51,210 --> 00:30:56,740 e dobres e Carrozas, as cousas sen estrelas, está pasando unha copia do 584 00:30:56,740 --> 00:30:57,540 o argumento. 585 00:30:57,540 --> 00:31:01,580 Polo tanto, se x e y era unha era de 2, un vai sendo 1 eb será 2. 586 00:31:01,580 --> 00:31:05,250 Pero eles van ser diferentes anacos de bits, diferentes bloques de 587 00:31:05,250 --> 00:31:07,540 memoria que veñan a ser almacenando valores idénticos. 588 00:31:07,540 --> 00:31:12,160 >> Polo tanto, este código é super perfecto a cambio de a e b. 589 00:31:12,160 --> 00:31:13,850 Iso non é bo en cambio - 590 00:31:13,850 --> 00:31:15,290 no exemplo da semana pasada - 591 00:31:15,290 --> 00:31:16,390 xe y. 592 00:31:16,390 --> 00:31:18,780 Porque unha vez máis, son no ámbito incorrecto. 593 00:31:18,780 --> 00:31:21,310 >> Agora, como é que nós imos sobre a fixación iso? 594 00:31:21,310 --> 00:31:23,140 Tivemos que facer a función mirar un pouco máis feo. 595 00:31:23,140 --> 00:31:25,250 Pero, de novo, considerar o que isto significa só. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> E, de feito, deixe-me, por coherencia, cambiar unha cousa así que é o mesmo que o 598 00:31:31,500 --> 00:31:33,200 o que nós fixemos. 599 00:31:33,200 --> 00:31:35,690 Cómo mencionen a semana pasada, el non importa a onde vai. 600 00:31:35,690 --> 00:31:38,120 De feito, normalmente ía poñer o estrela á beira do nome da variable. 601 00:31:38,120 --> 00:31:40,750 Pero eu creo que sería un pouco máis fácil considerar a * xunto da 602 00:31:40,750 --> 00:31:44,910 tipo de datos que quere dicir que é un punteiro para un int neste caso. 603 00:31:44,910 --> 00:31:46,270 >> Entón, o que eu estou facendo aquí? 604 00:31:46,270 --> 00:31:49,590 Eu digo que non me dea un int seguido por outro int 605 00:31:49,590 --> 00:31:50,810 chamando-os de a e b. 606 00:31:50,810 --> 00:31:52,460 Dáme o enderezo dun int. 607 00:31:52,460 --> 00:31:53,960 Dáme a dirección doutro int. 608 00:31:53,960 --> 00:31:56,330 Chama quen aborda a e b. 609 00:31:56,330 --> 00:32:00,860 >> E, a continuación, usando a notación * abaixo a continuación, vai a cada un destes enderezos 610 00:32:00,860 --> 00:32:05,290 sexa necesario para obter calquera ou establecer o seu valor. 611 00:32:05,290 --> 00:32:07,400 Pero hai unha excepción aquí. 612 00:32:07,400 --> 00:32:11,130 Por que eu non teño un * xunto tmp? 613 00:32:11,130 --> 00:32:15,070 Por que eu non fago iso, por exemplo? 614 00:32:15,070 --> 00:32:19,370 Parece que eu debería ir todos fóra e corrixir a cousa toda. 615 00:32:19,370 --> 00:32:19,752 Si? 616 00:32:19,752 --> 00:32:21,002 >> Audiencia: [inaudível]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> COLUMNA 1: non declarei tmp como unha cadea. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Polo tanto, este debe establecer, neste caso, un tmp para ser o enderezo dun int. 621 00:32:34,950 --> 00:32:37,380 Pero isto non é así o que quero, por un par de razóns. 622 00:32:37,380 --> 00:32:38,616 >> Audiencia: Non quere trocalos. 623 00:32:38,616 --> 00:32:41,800 >> COLUMNA 1: Exactamente, eu non quero cambiar nada con tmp. tmp é só 624 00:32:41,800 --> 00:32:42,790 De semana unha cousa. 625 00:32:42,790 --> 00:32:45,150 Todo o que quero é unha variable para almacenar un número. 626 00:32:45,150 --> 00:32:47,330 Eu non me importa sobre enderezos neste momento. 627 00:32:47,330 --> 00:32:50,530 >> Eu só teño de 32 bits ou para almacenar un int. 628 00:32:50,530 --> 00:32:56,690 E quero poñer nestes 32 bits todo o que non está nunha, por así dicir, pero 629 00:32:56,690 --> 00:33:01,260 o que está en un, só para ser máis preciso. 630 00:33:01,260 --> 00:33:06,420 Porque se un é un enderezo *, un medio ir alí e obter o valor 1. 631 00:33:06,420 --> 00:33:10,560 Por exemplo, o exemplo da semana pasada ou no caso de b, obter o valor de 2. 632 00:33:10,560 --> 00:33:11,750 >> Entón, o que está realmente a suceder? 633 00:33:11,750 --> 00:33:15,070 Déixeme aproveitar unha foto aquí que vai só desmembrar parte hoxe. 634 00:33:15,070 --> 00:33:18,580 Pero isto vai continuar a aparecer por algún tempo. 635 00:33:18,580 --> 00:33:22,430 >> Iso, eu afirmo, é o do seu ordenador memoria parece que cando realizar un 636 00:33:22,430 --> 00:33:24,060 programa, calquera programa. 637 00:33:24,060 --> 00:33:28,340 Cando fai un programa na parte superior de memoria RAM do seu ordenador - para pensar 638 00:33:28,340 --> 00:33:33,530 este rectángulo, verdadeiramente, como o seu RAM ou a memoria do ordenador, as 101 639 00:33:33,530 --> 00:33:36,920 mil millóns de bytes dela, todos de dous millóns de bytes, as dous gigabytes de que, 640 00:33:36,920 --> 00:33:39,910 calquera que sexa a cantidade que ten é, imos deséñase la como un rectángulo. 641 00:33:39,910 --> 00:33:43,260 E eu afirmo que cando executar un programa como Microsoft Word ou Chrome 642 00:33:43,260 --> 00:33:49,220 ou algo así, os bits que Microsoft ou Google que escribiu - 643 00:33:49,220 --> 00:33:50,910 nos casos dos devanditos programas - 644 00:33:50,910 --> 00:33:54,490 son cargados na memoria do seu ordenador onde poden ser executados máis 645 00:33:54,490 --> 00:33:57,520 rápido e alimentados na CPU, o que é o cerebro do ordenador. 646 00:33:57,520 --> 00:34:00,940 >> E na TAM están almacenados no propio parte superior do seu programa, por así dicir. 647 00:34:00,940 --> 00:34:03,300 Noutras palabras, se este é un anaco de memoria, cando fai clic dúas veces sobre 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, os bits chegar fóra do disco duro. 649 00:34:05,740 --> 00:34:06,680 Son cargados na memoria RAM. 650 00:34:06,680 --> 00:34:10,330 E nós imos empurra-los cara arriba na parte superior dese rectángulo conceptualmente. 651 00:34:10,330 --> 00:34:13,010 >> Ben, o resto da súa memoria é usado para cousas distintas. 652 00:34:13,010 --> 00:34:16,460 Na parte superior ve arrincar datos e uninitialize datos. 653 00:34:16,460 --> 00:34:20,500 Isto ten que ver, en gran parte, coa constantes ou variables globais 654 00:34:20,500 --> 00:34:21,340 que teñen valores. 655 00:34:21,340 --> 00:34:22,980 Pero máis sobre quen outra vez. 656 00:34:22,980 --> 00:34:25,150 >> Así que ten a pila, que imos volver. 657 00:34:25,150 --> 00:34:28,420 Pero no fondo é a parte que se particularmente pertinente neste momento. 658 00:34:28,420 --> 00:34:30,210 É o chamado pila. 659 00:34:30,210 --> 00:34:33,850 Así como en máis ningunha sala D aquí en campus, ten aquelas bandexas que 660 00:34:33,850 --> 00:34:37,210 só apilar uns sobre os outros en que pode pór alimentos e outros enfeites. 661 00:34:37,210 --> 00:34:40,139 A pila nun sistema informático é moi semellante. 662 00:34:40,139 --> 00:34:42,679 Excepto mentres a bandexa, como usan en o comedor, claro, enténdese 663 00:34:42,679 --> 00:34:45,710 para levar as cousas as bandexas ou os cadros - 664 00:34:45,710 --> 00:34:49,469 como imos chamalos - nun ordenador de memoria é usado para almacenar 665 00:34:49,469 --> 00:34:51,610 variables e valores. 666 00:34:51,610 --> 00:34:53,929 >> Entón, o que realmente pasa debaixo do capo? 667 00:34:53,929 --> 00:34:55,820 Ben, deixe-me virar á pantalla aquí. 668 00:34:55,820 --> 00:34:58,370 E imos concentrar só no parte inferior por un momento. 669 00:34:58,370 --> 00:35:02,770 Se isto é a porción inferior da miña memoria do ordenador ocorre cando 670 00:35:02,770 --> 00:35:05,350 chamar a función principal - que pasa, a verdade, 671 00:35:05,350 --> 00:35:06,950 automaticamente para min - 672 00:35:06,950 --> 00:35:10,510 Recibe un bloque de memoria no fondo da miña memoria RAM por así dicir. 673 00:35:10,510 --> 00:35:13,390 E é aí principal variables locais ir. 674 00:35:13,390 --> 00:35:16,770 É onde argc e argv quizais ir, e todas as variables I 675 00:35:16,770 --> 00:35:18,170 declarar no inicio. 676 00:35:18,170 --> 00:35:20,260 Eles acaban no fondo RAM do meu ordenador. 677 00:35:20,260 --> 00:35:25,040 >> Agora, supoña que o principal chama unha función como intercambio, como fixo a semana pasada? 678 00:35:25,040 --> 00:35:30,620 Ben, esencialmente, poñer un novo taboleiro, un novo marco, no meu anaco de memoria. 679 00:35:30,620 --> 00:35:34,160 E eu vou describir isto como pertencentes á función intercambio. 680 00:35:34,160 --> 00:35:35,770 >> Agora, o que está dentro de intercambio? 681 00:35:35,770 --> 00:35:39,240 Así, con base no programa da semana pasada e o que acabamos de ver un fragmento, 682 00:35:39,240 --> 00:35:46,590 dentro da estrutura de intercambio ou troco bandexa, o que son variables? 683 00:35:46,590 --> 00:35:47,970 Ben, a e b. 684 00:35:47,970 --> 00:35:51,850 Porque aqueles eran os seus argumentos locais, ademais dun terzo, tmp. 685 00:35:51,850 --> 00:35:54,470 Entón, en realidade, eu podería debuxar ese un pouco máis limpa. 686 00:35:54,470 --> 00:35:56,680 Déixeme ir adiante e desfacer o rótulo. 687 00:35:56,680 --> 00:35:58,520 E deixe-me dicir que vostede sabe o que? 688 00:35:58,520 --> 00:36:00,560 >> un probablemente vai acabar aquí. 689 00:36:00,560 --> 00:36:02,160 B vai acabar aquí. 690 00:36:02,160 --> 00:36:03,810 E tmp vai acabar aquí. 691 00:36:03,810 --> 00:36:05,160 Agora, a orde pode ser un pouco diferente. 692 00:36:05,160 --> 00:36:06,840 Pero conceptualmente esa é a idea. 693 00:36:06,840 --> 00:36:11,490 >> E só colectivamente, isto é o que imos chama-estrutura de intercambio, ou 694 00:36:11,490 --> 00:36:12,136 bandexa de comedor. 695 00:36:12,136 --> 00:36:13,150 E o mesmo co principal. 696 00:36:13,150 --> 00:36:14,040 Pero eu non vou redeseñar iso. 697 00:36:14,040 --> 00:36:17,810 Pero é aí onde argc e argv e calquera das súas variables locais, como x e y 698 00:36:17,810 --> 00:36:18,940 Pode ser así. 699 00:36:18,940 --> 00:36:22,170 >> Entón agora considerar o que realmente está a suceder cando chama intercambio. 700 00:36:22,170 --> 00:36:26,370 Cando chama intercambio, o código executado como tanto, está pasando, o 701 00:36:26,370 --> 00:36:30,670 versión con erros, a e b como unha copia de xe y. 702 00:36:30,670 --> 00:36:34,300 Entón, se fago agora deseñar ese na pantalla - 703 00:36:34,300 --> 00:36:36,700 ten que ir mellor con iso - 704 00:36:36,700 --> 00:36:40,850 así a historia que eu estaba dicindo para min mesmo Nesta versión con Bugs, cando 705 00:36:40,850 --> 00:36:46,130 chamar intercambiar pasando literalmente a eb como enteiros, o que está realmente a suceder? 706 00:36:46,130 --> 00:36:48,250 >> Ben, o que está realmente a suceder é iso. 707 00:36:48,250 --> 00:36:52,850 Déixeme ir adiante e desfacerse só para borrar un espazo aquí. 708 00:36:52,850 --> 00:36:54,720 Polo tanto, esta é a memoria do meu ordenador. 709 00:36:54,720 --> 00:36:57,510 >> Entón, se eu tivera, por exemplo - 710 00:36:57,510 --> 00:36:58,910 de feito, imos facelo deste xeito - 711 00:36:58,910 --> 00:37:02,690 se eu afirmar que esta é x, almacenando o valor 1, así como a semana pasada. 712 00:37:02,690 --> 00:37:05,930 E dicir y, almacenando o valor 2 así como na semana pasada. 713 00:37:05,930 --> 00:37:11,370 E isto é o principal, cando eu chamo intercambio, dándome, así, o acceso a un e 714 00:37:11,370 --> 00:37:15,150 b e tmp, vou afirmar que este é un e este é un. 715 00:37:15,150 --> 00:37:16,080 >> Este é b. 716 00:37:16,080 --> 00:37:17,010 Esta é 2. 717 00:37:17,010 --> 00:37:18,370 Isto chámase tmp. 718 00:37:18,370 --> 00:37:23,360 >> E, inicialmente, ten algún valor lixo ata que realmente gardar nel un, 719 00:37:23,360 --> 00:37:24,450 que é 1. 720 00:37:24,450 --> 00:37:28,320 Entón eu vou adiante e cambiar sendo o que? 721 00:37:28,320 --> 00:37:29,720 Valor de B. 722 00:37:29,720 --> 00:37:31,980 >> E agora eu teño dous aquí. 723 00:37:31,980 --> 00:37:34,050 E entón nós dixemos b queda tmp. 724 00:37:34,050 --> 00:37:37,670 Unha vez máis, así como unha comprobación de sanidade, a terceira liña de código aquí é simplemente isto 725 00:37:37,670 --> 00:37:39,440 a, b queda tmp. 726 00:37:39,440 --> 00:37:41,730 >> E así, por fin, o que fago? 727 00:37:41,730 --> 00:37:46,800 Eu vou adiante e cambiar b para ser o que o valor de tmp é, o que é un. 728 00:37:46,800 --> 00:37:48,390 Non toco tmp novo. 729 00:37:48,390 --> 00:37:54,100 >> Pero agora, o problema é que así como intercambio volve, porque non está entregando 730 00:37:54,100 --> 00:37:57,540 volver algún valor, non hai volta instrución explicitamente nela. 731 00:37:57,540 --> 00:37:59,080 O que está realmente a suceder? 732 00:37:59,080 --> 00:38:03,480 Ben, esencialmente, todo isto de memoria - 733 00:38:03,480 --> 00:38:07,410 OK, ao parecer, a goma gusta só un dedo de cada vez - 734 00:38:07,410 --> 00:38:08,180 simplemente desaparece. 735 00:38:08,180 --> 00:38:10,070 >> Agora, en realidade, non é vai a sitio ningún. 736 00:38:10,070 --> 00:38:11,810 Pero pode pensar niso agora, como puntos de interrogação. 737 00:38:11,810 --> 00:38:14,040 Porque non é máis realmente en uso. 738 00:38:14,040 --> 00:38:17,470 E nada é feito con eses valores. 739 00:38:17,470 --> 00:38:21,920 >> Así, no caso da versión verde este código, que está a ser, en vez 740 00:38:21,920 --> 00:38:24,640 pasou para intercambio? 741 00:38:24,640 --> 00:38:25,770 Entón resolve. 742 00:38:25,770 --> 00:38:28,520 Así, o seu enderezo de xe o enderezo do y. 743 00:38:28,520 --> 00:38:35,790 Entón, se nos re-contar a historia dun pasado tempo, e eu realmente chamar o intercambio de novo, 744 00:38:35,790 --> 00:38:44,620 pero con punteiros, sendo este un, é dicir sendo b, e sendo esta tmp, o que é 745 00:38:44,620 --> 00:38:49,080 realmente almacenados nun nesta verde versión do meu código onde estou pasando 746 00:38:49,080 --> 00:38:52,110 en enderezos? 747 00:38:52,110 --> 00:38:53,780 >> Será un punteiro para x. 748 00:38:53,780 --> 00:38:54,890 Entón, eu podería debuxar unha frecha. 749 00:38:54,890 --> 00:38:57,310 Pero imos empregar o mesmo arbitraria exemplo, como antes. 750 00:38:57,310 --> 00:39:01,220 Digamos que se trata algo así como Ox123. 751 00:39:01,220 --> 00:39:04,970 E iso será Ox127 porque é catro bytes para lonxe, porque é unha 752 00:39:04,970 --> 00:39:07,370 Cont, tan Ox127. 753 00:39:07,370 --> 00:39:09,080 >> E de novo, eu estou tomando algunhas liberdades cos números. 754 00:39:09,080 --> 00:39:11,430 Son moito menores do que sería e, de feito, ser nunha orde diferente. 755 00:39:11,430 --> 00:39:14,350 Pero é así que a imaxe agora é diferente. 756 00:39:14,350 --> 00:39:19,060 >> Pero cando eu uso este código verde e eu int tmp conseguir * a. 757 00:39:19,060 --> 00:39:25,010 * Un medio para facer o seguinte, tome a resolver iso nun e ir a el, 758 00:39:25,010 --> 00:39:26,190 que é 1. 759 00:39:26,190 --> 00:39:28,480 E iso é o que eu, logo poñer en tmp. 760 00:39:28,480 --> 00:39:32,480 Mentres tanto, na seguinte liña de código aquí, * a recibe b, o que significa isto? 761 00:39:32,480 --> 00:39:36,910 >> Ben, * a, polo que aquí queda * b, o que significa ir máis alá. 762 00:39:36,910 --> 00:39:39,310 E isto significa poñer o valor alí. 763 00:39:39,310 --> 00:39:43,670 Finalmente, a última liña de código dixo simplemente * b recibe tmp. 764 00:39:43,670 --> 00:39:48,900 >> Entón b di para ir alí e substituílo con tmp que, neste caso, vai 765 00:39:48,900 --> 00:39:51,520 a ser, de novo, 1. 766 00:39:51,520 --> 00:39:54,920 E é por iso que a versión verde de nosas obras de código, mentres que o vermello 767 00:39:54,920 --> 00:39:56,010 versión nunca fixo. 768 00:39:56,010 --> 00:39:59,020 Todo isto só se reduce á forma como o memoria é xestionada e onde se 769 00:39:59,020 --> 00:40:02,580 realmente colocado no seu RAM do ordenador. 770 00:40:02,580 --> 00:40:07,270 E, polo de agora, iso é unha das cousas que a pila está a ser utilizado. 771 00:40:07,270 --> 00:40:09,225 >> Preguntas sobre o esquema? 772 00:40:09,225 --> 00:40:10,380 En punteiros? 773 00:40:10,380 --> 00:40:11,630 Ou no intercambio? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Todo ben, entón malloc, aviso, fixo algo parecido a isto. 776 00:40:17,043 --> 00:40:18,260 Este foi un super exemplo simple. 777 00:40:18,260 --> 00:40:20,550 E iso foi o que Binky nos presentou, aínda que moi 778 00:40:20,550 --> 00:40:21,870 axiña, ao final da clase. 779 00:40:21,870 --> 00:40:24,480 Drogas, alí imos nós de novo. 780 00:40:24,480 --> 00:40:28,780 >> Entón, lembrar que este foi o exemplo que Binky nos presentou, aínda 781 00:40:28,780 --> 00:40:30,360 un tanto rapidamente ao final da clase. 782 00:40:30,360 --> 00:40:33,640 E aquí usamos malloc realmente , Por segunda vez. 783 00:40:33,640 --> 00:40:37,330 Porque a primeira vez que se usa para crear RAM suficiente, reservar memoria RAM suficiente 784 00:40:37,330 --> 00:40:38,340 para almacenar unha cadea. 785 00:40:38,340 --> 00:40:40,250 >> Esta vez Binky mantivo simple. 786 00:40:40,250 --> 00:40:42,465 Entón é para gardar só un int, aparentemente. 787 00:40:42,465 --> 00:40:43,510 E iso é totalmente bo. 788 00:40:43,510 --> 00:40:46,560 É un pouco raro, a verdade, a empregar malloc para reservar un int. 789 00:40:46,560 --> 00:40:50,650 Pero o punto de claymation do Nick foi realmente só contar a historia do que 790 00:40:50,650 --> 00:40:53,830 ocorre ou non pasa cando vostede maltratar memoria. 791 00:40:53,830 --> 00:40:56,520 >> Polo tanto, neste caso, este programa fixen algunhas cousas. 792 00:40:56,520 --> 00:41:01,580 No primeiro caso, aquí, que declara un punteiro chamado x para un int. 793 00:41:01,580 --> 00:41:04,480 A continuación, el declara un punteiro chamado y para un int. 794 00:41:04,480 --> 00:41:06,150 Logo almacena en x, o que? 795 00:41:06,150 --> 00:41:07,110 Alguén agora. 796 00:41:07,110 --> 00:41:09,685 O que queda almacenado en x de acordo coa a terceira liña deste programa? 797 00:41:09,685 --> 00:41:12,380 >> Audiencia: [inaudível]. 798 00:41:12,380 --> 00:41:14,130 >> COLUMNA 1: Ben, non exactamente bytes, por así dicir. 799 00:41:14,130 --> 00:41:16,760 Ser máis preciso momento. 800 00:41:16,760 --> 00:41:18,325 O que queda almacenado x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Un enderezo, creo que oín-lo. 803 00:41:22,060 --> 00:41:23,570 >> Entón, o que malloc voltar? 804 00:41:23,570 --> 00:41:26,030 malloc aloca comportamentalmente unha peza de memoria. 805 00:41:26,030 --> 00:41:27,850 Pero como iso dálle acceso a el? 806 00:41:27,850 --> 00:41:29,460 El retorna o que? 807 00:41:29,460 --> 00:41:32,000 O enderezo do primeiro byte no anaco de memoria. 808 00:41:32,000 --> 00:41:33,020 >> Agora, iso é super sinxelo. 809 00:41:33,020 --> 00:41:35,380 É só un byte, o que significa que o abordar estamos quedando atrás é o 810 00:41:35,380 --> 00:41:37,300 enderezo da cousa toda. 811 00:41:37,300 --> 00:41:42,070 Entón almacenado en x, entón, é o enderezo dese anaco de memoria. 812 00:41:42,070 --> 00:41:43,400 Mentres tanto, o que pasa? 813 00:41:43,400 --> 00:41:45,890 Entón, en realidade, imos adiante e chamar iso moi rápido. 814 00:41:45,890 --> 00:41:52,490 >> Entón, se pasar á pantalla aquí e imos xogar tanto int * xe y int * 815 00:41:52,490 --> 00:41:53,740 vai facer o que para min? 816 00:41:53,740 --> 00:41:58,280 Eu afirmo que el só vai facer algo como isto e chamalo de x, e 817 00:41:58,280 --> 00:42:00,010 isto e chamalo de y. 818 00:42:00,010 --> 00:42:03,110 Mentres tanto, a terceira liña de código é vai afectar o tamaño dun int 819 00:42:03,110 --> 00:42:06,160 que pasa a ser - desculpe se eu dixese un antes de que eu quería dicir un int - 820 00:42:06,160 --> 00:42:08,280 catro bytes nun ordenador típico. 821 00:42:08,280 --> 00:42:09,720 Polo menos co aparello CS50. 822 00:42:09,720 --> 00:42:11,490 >> Entón, que vai reservar , Quen sabe? 823 00:42:11,490 --> 00:42:12,800 Nalgún lugar por aquí. 824 00:42:12,800 --> 00:42:15,780 E esta é almacenada nalgún enderezo de Boi, quen sabe? 825 00:42:15,780 --> 00:42:18,330 Pero o que está a suceder para volveuse é ese enderezo. 826 00:42:18,330 --> 00:42:22,270 Pero imos sacar isto pictoricamente só como unha frecha así. 827 00:42:22,270 --> 00:42:25,430 >> Agora, na seguinte liña * x recibe 42. 828 00:42:25,430 --> 00:42:29,400 Que * x significa en termos laicos? 829 00:42:29,400 --> 00:42:30,040 Só tes que ir alí. 830 00:42:30,040 --> 00:42:30,960 Ir a este enderezo. 831 00:42:30,960 --> 00:42:35,900 Ou, por outras palabras, a continuación frecha e poñer 42 alí. 832 00:42:35,900 --> 00:42:38,140 Pero entón algo de malo aconteceu a Binky, non? 833 00:42:38,140 --> 00:42:43,950 >> Lembre-se de que a liña de cinco aquí, * y recibe 13, en realidade unha serie de azar, 834 00:42:43,950 --> 00:42:44,760 fixo o que para nós? 835 00:42:44,760 --> 00:42:47,320 Ben, * y significa ir ata alí. 836 00:42:47,320 --> 00:42:50,460 Ben, este non foi dada aínda un valor, non? 837 00:42:50,460 --> 00:42:54,090 O código non ten y sendo inicializar para nada. 838 00:42:54,090 --> 00:42:56,120 Tiñamos x ser inicializar a un enderezo. 839 00:42:56,120 --> 00:42:57,640 Pero y foi declarado enriba. 840 00:42:57,640 --> 00:43:00,250 Pero, entón, un punto e coma, sen valor foi realmente poñer sobre el. 841 00:43:00,250 --> 00:43:02,330 Polo tanto, é xusto chamar esta un valor de lixo. 842 00:43:02,330 --> 00:43:03,430 Quen sabe o que é? 843 00:43:03,430 --> 00:43:07,160 Son os restos de bits que foron utilizados por algunha liña de código anterior en 844 00:43:07,160 --> 00:43:08,300 meu programa. 845 00:43:08,300 --> 00:43:13,250 >> Entón, se eu digo que ir alí, iso é como, Eu non teño ningunha idea de onde esa frecha é 846 00:43:13,250 --> 00:43:14,490 vai acabar. 847 00:43:14,490 --> 00:43:17,720 E é aí que normalmente obter un fallo de segmento. 848 00:43:17,720 --> 00:43:22,430 Se accidentalmente desreferenciava, por así falar, ou ir a un enderezo que non é 849 00:43:22,430 --> 00:43:25,400 en realidade, un enderezo lexítimo, cousas malas suceden. 850 00:43:25,400 --> 00:43:27,550 >> E iso é o que pasou pensar Binky. 851 00:43:27,550 --> 00:43:31,060 Entón, lembrar que a historia de que Nick era dicindo aquí foi a mesma idea que o 852 00:43:31,060 --> 00:43:34,050 Eu deseño coa ilusión giz no cadro alí. 853 00:43:34,050 --> 00:43:35,960 X e Y son declarados. 854 00:43:35,960 --> 00:43:39,690 >> Logo asignado ao tamaño dos un int e almacenado en x. 855 00:43:39,690 --> 00:43:42,130 A continuación, a seguinte liña que fixemos * x. 856 00:43:42,130 --> 00:43:46,070 Esta foi a vara máxica de Nick de dereferencing. 857 00:43:46,070 --> 00:43:49,780 Que puxo 42 na memoria apuntado por x. 858 00:43:49,780 --> 00:43:51,600 >> Pero este é o lugar onde as cousas deu terrible mal. 859 00:43:51,600 --> 00:43:51,820 Non? 860 00:43:51,820 --> 00:43:53,550 Tratamos desreferenciava y. 861 00:43:53,550 --> 00:43:55,620 Pero y tiña un valor falso, non? 862 00:43:55,620 --> 00:43:57,720 >> Que a frecha no ángulo inferior esquerdo canto, non é 863 00:43:57,720 --> 00:43:58,950 en realidade, a apuntar cara algo. 864 00:43:58,950 --> 00:44:01,520 É unha especie de facer o que eu fixen aquí no consello. 865 00:44:01,520 --> 00:44:05,900 Entón, as cousas malas suceden, a segmentación fallo ou avaría chupete, neste caso. 866 00:44:05,900 --> 00:44:10,800 >> Pero se, a continuación, corrixir isto, facendo x fica y como é que o cambio de historia? 867 00:44:10,800 --> 00:44:15,760 Ben, se eu fai x recibe y, que é efectivamente o mesmo que dicir 868 00:44:15,760 --> 00:44:19,235 o que é iso, Ox-algo será o mesmo aquí, 869 00:44:19,235 --> 00:44:20,080 Ox-algo. 870 00:44:20,080 --> 00:44:22,970 Ou pictoricamente imos debuxar unha frecha. 871 00:44:22,970 --> 00:44:25,530 >> Entón, aquí en placa con Binky, coa seguinte liña de 872 00:44:25,530 --> 00:44:28,350 código, * y significa ir ata alí. 873 00:44:28,350 --> 00:44:29,400 Onde é que hai? 874 00:44:29,400 --> 00:44:30,820 Significa aquí. 875 00:44:30,820 --> 00:44:36,050 >> E cando nós actualizamos que ser 13 que implica só indo e 876 00:44:36,050 --> 00:44:39,470 13 escribir aquí agora. 877 00:44:39,470 --> 00:44:44,130 Por iso, é posible que non totalmente simple a primeira vista. 878 00:44:44,130 --> 00:44:47,740 Pero para recapitular e utilizar a mesma xerga que Binky estaba usando aquí, entón 879 00:44:47,740 --> 00:44:50,485 os dous primeiros reservar os punteiros, x e y, pero non os pointees. 880 00:44:50,485 --> 00:44:54,750 E pointees non fai xeralmente utilizado prazo. 881 00:44:54,750 --> 00:44:56,120 Pero é absolutamente punteiro. 882 00:44:56,120 --> 00:44:59,200 Pero é o que está a ser apuntado no da nomenclatura de Binky. 883 00:44:59,200 --> 00:45:01,660 >> Esta liña seguinte, claro, aloca un pointee int. 884 00:45:01,660 --> 00:45:04,840 Así, unha peza de memoria - como atraeu máis en o lado dereito alí - e un conxunto 885 00:45:04,840 --> 00:45:06,470 x igual a apuntar cara a el. 886 00:45:06,470 --> 00:45:11,350 Este desreferencia x para almacenar 42 en a memoria que está a apuntar. 887 00:45:11,350 --> 00:45:13,380 E despois diso, está claro, era unha cousa mala. 888 00:45:13,380 --> 00:45:15,600 Porque y non estaba apuntando en nada aínda. 889 00:45:15,600 --> 00:45:16,530 Isto resolve o problema. 890 00:45:16,530 --> 00:45:18,240 Polo tanto, este aínda é o programa de buggy. 891 00:45:18,240 --> 00:45:21,580 Só porque estamos golpe a través do código liña por liña e dicir: oh ben, 892 00:45:21,580 --> 00:45:22,690 deixar caer alí. 893 00:45:22,690 --> 00:45:23,420 Iso é unha cousa mala. 894 00:45:23,420 --> 00:45:26,790 As probabilidades son que o programa só vai deter por completo a esta liña. 895 00:45:26,790 --> 00:45:30,550 Pero se fose para eliminar o accidente de liña e substituílo con os dous últimos 896 00:45:30,550 --> 00:45:32,470 liñas alí atribúe - 897 00:45:32,470 --> 00:45:35,310 coa asignación de punteiro - y para ligar a x como punto de t. 898 00:45:35,310 --> 00:45:39,280 E entón desreferenciava y dun xeito moi segura. 899 00:45:39,280 --> 00:45:41,520 >> Entón onde é que isto nos deixa? 900 00:45:41,520 --> 00:45:45,350 Pois ben, resulta que debaixo do capó na biblioteca CS50, os punteiros son 901 00:45:45,350 --> 00:45:46,320 utilizado ao longo. 902 00:45:46,320 --> 00:45:48,910 E nós imos realmente comezar a pelar de volta a capa antes de tempo. 903 00:45:48,910 --> 00:45:51,740 Pero acontece tamén, unha expresión que algúns de vostedes poden estar familiarizado con, 904 00:45:51,740 --> 00:45:54,580 particularmente aqueles máis cómodo, que é en realidade dunha moi popular 905 00:45:54,580 --> 00:45:56,390 web, ou estourido de pila, nos días de hoxe. 906 00:45:56,390 --> 00:45:58,720 >> Pero iso realmente non ten moito significado técnico. 907 00:45:58,720 --> 00:46:00,160 Sabemos agora que a pila é. 908 00:46:00,160 --> 00:46:02,550 É como unha pila de bandexas dentro dunha comedor. 909 00:46:02,550 --> 00:46:05,140 >> Ou dentro do seu ordenador de memoria its os cadros 910 00:46:05,140 --> 00:46:06,900 que son utilizados por funcións. 911 00:46:06,900 --> 00:46:10,760 Pois ben, resulta que por causa diso moi sinxelo implementación 912 00:46:10,760 --> 00:46:14,970 memoria e dos cadros na chamada apilar, pode realmente asumir o control 913 00:46:14,970 --> 00:46:17,050 dun sistema informático con bastante facilidade. 914 00:46:17,050 --> 00:46:22,180 Pode invadir un sistema, se a xente como non escribimos o noso código 915 00:46:22,180 --> 00:46:23,300 particularmente ben. 916 00:46:23,300 --> 00:46:26,670 >> Se persoas como usamos anacos de memoria ou usar matrices - 917 00:46:26,670 --> 00:46:27,810 aínda máis comunmente - 918 00:46:27,810 --> 00:46:31,800 pero ás veces se esqueza comprobar a límites de nosa matriz como pode 919 00:46:31,800 --> 00:46:38,470 ten-se, por veces, e reiterou moi lonxe tras o final dun array. 920 00:46:38,470 --> 00:46:40,520 No mellor dos casos, o seu programa só podería fallar. 921 00:46:40,520 --> 00:46:42,280 Fallo de segmento, tipo constrangedor. 922 00:46:42,280 --> 00:46:45,480 Non é gran, pero non é necesariamente algo moi malo. 923 00:46:45,480 --> 00:46:49,480 >> Pero se o seu programa é realmente a verdadeira ordenadores dos usuarios, se funciona 924 00:46:49,480 --> 00:46:53,070 nun sitio que a xente aleatorias reais en Internet están batendo, deixando 925 00:46:53,070 --> 00:46:56,690 persoas inducir cousas malas no seu código é xeralmente non é unha cousa boa, porque 926 00:46:56,690 --> 00:46:59,930 isto supón unha oportunidade para tomar o control do computador. 927 00:46:59,930 --> 00:47:01,350 E iso se ve algo enigmática. 928 00:47:01,350 --> 00:47:04,570 Pero eu penso que eu ía asustalos lo con Neste último exemplo aquí. 929 00:47:04,570 --> 00:47:05,650 >> Aquí está un exemplo de código. 930 00:47:05,650 --> 00:47:07,370 E hai unha boa Wikipedia artigo que percorre 931 00:47:07,370 --> 00:47:08,530 isto con máis detalle. 932 00:47:08,530 --> 00:47:13,890 Teño principal no chamado fondo foo, pasando argv de 1. 933 00:47:13,890 --> 00:47:15,750 E iso é só para que poida executar o programa e pasar 934 00:47:15,750 --> 00:47:17,080 unha entrada arbitraria. 935 00:47:17,080 --> 00:47:20,180 >> E entón foo é declarado enriba como aceptar unha cadea, ou máis 936 00:47:20,180 --> 00:47:21,700 precisamente, un char *. 937 00:47:21,700 --> 00:47:23,860 A continuación, el declara unha matriz de caracteres. 938 00:47:23,860 --> 00:47:27,130 Chamalo de un buffer, de xeito máis xeral, de tamaño 12. 939 00:47:27,130 --> 00:47:30,900 Entón, 12 caracteres pode caber dentro deste array chamado c. 940 00:47:30,900 --> 00:47:33,510 >> E entón el usa esta nova función, que é novo, pero non é difícil 941 00:47:33,510 --> 00:47:34,930 entender, copia de memoria. 942 00:47:34,930 --> 00:47:39,290 El copia a memoria do bar, que era pasado variable n, calquera que sexa o 943 00:47:39,290 --> 00:47:42,080 usuario escribiu nunha argv en c. 944 00:47:42,080 --> 00:47:43,090 Cantos bytes? 945 00:47:43,090 --> 00:47:44,260 A lonxitude da corda de bar. 946 00:47:44,260 --> 00:47:48,380 >> Polo tanto, noutras palabras, se o usuario escribe en h-e-l-l-o Intro, a lonxitude da corda 947 00:47:48,380 --> 00:47:49,260 Ola é de cinco anos. 948 00:47:49,260 --> 00:47:52,790 Entón, cinco deses bytes se ve copiado ao array chamado C, que 949 00:47:52,790 --> 00:47:54,110 é de tamaño 12. 950 00:47:54,110 --> 00:47:58,710 Pero o que o usuario escribe nun tempo moito máis palabra que é de 13 caracteres ou 14 951 00:47:58,710 --> 00:48:01,250 caracteres ou 100 carácteres ou máis? 952 00:48:01,250 --> 00:48:02,660 >> Onde se están indo? 953 00:48:02,660 --> 00:48:06,090 Ben, ese cadro, que a bandexa na pila de comedor, 954 00:48:06,090 --> 00:48:06,930 eles están indo para alí. 955 00:48:06,930 --> 00:48:10,080 E iso só vai comezar a substituír outras cousas que xa está 956 00:48:10,080 --> 00:48:12,880 nesa pila, rebordando do conxunto, por así dicir. 957 00:48:12,880 --> 00:48:14,780 >> Entón, pictoricamente, pense nisto deste xeito. 958 00:48:14,780 --> 00:48:17,970 Esta é só unha versión en cor de a imaxe que estamos deseñando. 959 00:48:17,970 --> 00:48:20,060 Na parte inferior, por exemplo, é o principal. 960 00:48:20,060 --> 00:48:24,690 E na parte superior, o que está a ver agora é o cadro, codificados por cores agora, por unha 961 00:48:24,690 --> 00:48:26,090 función chamada foo. 962 00:48:26,090 --> 00:48:30,170 Pero o que é interesante aquí sobre foo é que aquí é o seu cadro. 963 00:48:30,170 --> 00:48:32,860 Entón, el está deseñado como eu fixo, pero en azul claro. 964 00:48:32,860 --> 00:48:35,220 E agora este é o lugar onde c soporte 0 vai. 965 00:48:35,220 --> 00:48:37,410 E é aí onde c soporte 11 vai acabar. 966 00:48:37,410 --> 00:48:39,670 >> Noutras palabras, isto ocorre ser representado como un cadrado. 967 00:48:39,670 --> 00:48:42,320 Pero se só manter estatelando bytes abaixo - ou caracteres - van acabar 968 00:48:42,320 --> 00:48:46,070 na posición 0 todo o camiño ata o 11 por que é 0 indexado. 969 00:48:46,070 --> 00:48:49,170 >> Pero onde está o carácter 13 vai acabar? 970 00:48:49,170 --> 00:48:50,310 Cadê o 14? 971 00:48:50,310 --> 00:48:52,430 Onde está o carácter 50 vai acabar? 972 00:48:52,430 --> 00:48:54,070 >> El seguirá a descender. 973 00:48:54,070 --> 00:48:57,350 Porque aínda que teña deseñado o imaxe coa pila crecendo, o 974 00:48:57,350 --> 00:48:59,920 enderezos, verifícase, ir de pequenas enderezos, pequenas 975 00:48:59,920 --> 00:49:01,830 punteiros, para grandes enderezos. 976 00:49:01,830 --> 00:49:03,540 Entón, simplemente continúa indo a arriba e cara arriba. 977 00:49:03,540 --> 00:49:05,660 >> Polo tanto, se o usuario escribe en Ola, iso é gran. 978 00:49:05,660 --> 00:49:08,650 O erro, non hai problema, seguro de todos. 979 00:49:08,650 --> 00:49:11,940 Pero se o usuario escribe en que imos chamar o código do contraditorio, representado 980 00:49:11,940 --> 00:49:16,040 xenericamente como, ataque, ataque, ataque, ataque, o que pode ocorrer? 981 00:49:16,040 --> 00:49:19,760 >> Agora ben, se toda a entrada que o usuario ingresaran non é só un amigable 982 00:49:19,760 --> 00:49:21,540 ou cadea ofensiva de caracteres. 983 00:49:21,540 --> 00:49:24,050 É, en realidade, unha secuencia de carácteres que se compilou, 984 00:49:24,050 --> 00:49:26,050 realmente é un código. 985 00:49:26,050 --> 00:49:29,570 Quizais sexa o código que exclúe toda arquivos no seu disco duro ou envía spam 986 00:49:29,570 --> 00:49:30,810 ou algo así. 987 00:49:30,810 --> 00:49:35,110 Teña en conta que o que é importante aquí é que O bandido tivo sorte o suficiente para 988 00:49:35,110 --> 00:49:37,830 substituír o anaco vermello de memoria - 989 00:49:37,830 --> 00:49:41,080 que eu non deseñei na miña imaxe, pero esta foto Wikipedia aquí ten - 990 00:49:41,080 --> 00:49:42,890 seu chamado enderezo de retorno. 991 00:49:42,890 --> 00:49:47,470 >> Cando regresa de alimentos, cando retorna de intercambio, Como o ordenador sabe que ir de 992 00:49:47,470 --> 00:49:49,790 aquí enriba até aquí abaixo? 993 00:49:49,790 --> 00:49:52,920 Ou no segmento de tecnoloxía enriba, como el sabe que van desde o intercambio de 994 00:49:52,920 --> 00:49:54,870 código - o 0 e 1 do que compoñen intercambio - 995 00:49:54,870 --> 00:49:56,020 de volta ao inicio? 996 00:49:56,020 --> 00:50:00,450 Hai un chamado enderezo de retorno almacenado no mesmo cadro de pila, en 997 00:50:00,450 --> 00:50:02,140 mesma bandexa cafetería. 998 00:50:02,140 --> 00:50:06,080 >> Entón, se o bandido é intelixente dabondo para poñer un código de ataque, un código de ataque, ataque 999 00:50:06,080 --> 00:50:07,960 código, e ter sorte o suficiente - 1000 00:50:07,960 --> 00:50:11,630 moitas veces a través de intento e erro - a sobrescribir o enderezo de retorno vermello, 1001 00:50:11,630 --> 00:50:14,360 co enderezo eo aviso arriba. 1002 00:50:14,360 --> 00:50:16,830 Observe 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Está escrito atrás encima razóns que imos quizais revisitar. 1004 00:50:20,650 --> 00:50:22,050 Este número é o que. 1005 00:50:22,050 --> 00:50:25,790 >> Entón, se o bandido ten sorte o suficiente ou é intelixente o suficiente para substituír o vermello 1006 00:50:25,790 --> 00:50:29,480 tira de memoria co enderezo de código que el ou ela ten de algunha maneira 1007 00:50:29,480 --> 00:50:34,980 inxectado no seu computador, penso que quen código será devolto 1008 00:50:34,980 --> 00:50:38,260 así foo está feito de execución? 1009 00:50:38,260 --> 00:50:39,440 >> Código do bandido. 1010 00:50:39,440 --> 00:50:43,610 Polo tanto, este código de ataque, AAA, unha vez máis, poder enviar spam, pode borrar todos os ficheiros 1011 00:50:43,610 --> 00:50:44,500 no seu disco duro. 1012 00:50:44,500 --> 00:50:48,740 Pero iso é o que realmente un estourido de pila é, ou un estourido de buffer, ou un 1013 00:50:48,740 --> 00:50:51,060 ataque de estourido de buffer. 1014 00:50:51,060 --> 00:50:54,400 >> E é incrible, incrible común para este día cos programas escritos en 1015 00:50:54,400 --> 00:50:58,220 C, C + +, e mesmo algunhas outras linguas. 1016 00:50:58,220 --> 00:51:02,275 Na mesma nota asustado, imos termina cunha broma. 1017 00:51:02,275 --> 00:51:03,230 >> [Risas] 1018 00:51:03,230 --> 00:51:04,550 >> Vexo vostede na Mércores. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Na seguinte CS50 - 1021 00:51:10,310 --> 00:51:15,920 Entón, eu estou fóra de lámpadas disco hoxe, pero esperar, libre de graxa do leite, a metade do teléfono 1022 00:51:15,920 --> 00:51:17,850 libro, o zume de laranxa que eu bebín hoxe. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Cable USB, unha chave inglesa. 1025 00:51:22,780 --> 00:51:24,800 >> [Música tocando]