1 00:00:00,000 --> 00:00:11,242 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN: Bueno este es CS50 y este es el comienzo de la quinta semana. 3 00:00:16,630 --> 00:00:21,480 Así que hoy, por debajo de los cojines de los asientos, no vas a encontrar nada. 4 00:00:21,480 --> 00:00:24,790 Pero antes, usted debe encontrar estos, un pequeña muestra de nuestro agradecimiento por 5 00:00:24,790 --> 00:00:26,970 todo el trabajo que se pone en el Juego de los Quince. 6 00:00:26,970 --> 00:00:30,290 Simplemente quite el pequeño círculo en el abajo para empezar a jugar para el 7 00:00:30,290 --> 00:00:31,680 resto de la clase. 8 00:00:31,680 --> 00:00:38,930 >> Así que recordar que, o saber que problema planteado cuatro, que salió este fin de semana, 9 00:00:38,930 --> 00:00:40,340 implica escribir otro juego. 10 00:00:40,340 --> 00:00:43,740 Pero esta vez se trata de utilizar un interfaz gráfica de usuario real, no una 11 00:00:43,740 --> 00:00:46,310 interfaz textual como Juego de los Quince era. 12 00:00:46,310 --> 00:00:50,210 Y el juego que está por delante de ti, si todavía no has visto esta próxima, 13 00:00:50,210 --> 00:00:52,310 se ve un poco de algo como esto. 14 00:00:52,310 --> 00:00:55,170 Voy a entrar en mi terminal ventana de aquí en GDB. 15 00:00:55,170 --> 00:00:58,600 Y yo voy a seguir adelante y ejecutar el necesidad de personal, que se puede acceder 16 00:00:58,600 --> 00:01:01,010 después de ejecutar la actualización de 50 como de costumbre. 17 00:01:01,010 --> 00:01:04,090 >> Pero me voy a poner en un poco modo secreto, un pequeño huevo de Pascua, 18 00:01:04,090 --> 00:01:08,480 llamado modo de Dios, por poner a Dios en argv1. 19 00:01:08,480 --> 00:01:12,920 Y tengo que seguir mis propias direcciones, ejecutarlo en mi propia 20 00:01:12,920 --> 00:01:14,220 problema establecido directorio. 21 00:01:14,220 --> 00:01:19,190 Así que ya lo ves una versión completa del juego de Breakout. 22 00:01:19,190 --> 00:01:21,090 De hecho, este es el modo sin manos. 23 00:01:21,090 --> 00:01:24,850 Así que en realidad es - 24 00:01:24,850 --> 00:01:26,470 cautivó a pesar de que podría ser - 25 00:01:26,470 --> 00:01:30,850 bastante trivial para implementar el modo Dios en Breakout, a diferencia del juego de los Quince, 26 00:01:30,850 --> 00:01:33,590 que algunos de ustedes podrían haber abordado para la edición de los piratas cibernéticos. 27 00:01:33,590 --> 00:01:37,890 >> En Breakout es suficiente en Dios el modo con que se haga lo que, 28 00:01:37,890 --> 00:01:41,220 intuitivamente con la pala? 29 00:01:41,220 --> 00:01:45,630 Así que tenga la misma sea cual sea el posición horizontal es de la pelota. 30 00:01:45,630 --> 00:01:49,220 Y mientras lo hace al mismo ritmo con la pelota en movimiento el juego se 31 00:01:49,220 --> 00:01:53,100 Nunca, nunca, nunca te pierdas la pelota y que va a ganar cada vez. 32 00:01:53,100 --> 00:01:55,430 >> Pero en la edición de esta semana de hackers hay algo más que el modo de Dios. 33 00:01:55,430 --> 00:01:56,720 Hay un número de otras características. 34 00:01:56,720 --> 00:01:58,140 Entre ellos, los láseres. 35 00:01:58,140 --> 00:02:01,070 Así que si usted realmente consigue impaciente usted puede iniciar el derribo de los ladrillos 36 00:02:01,070 --> 00:02:02,120 y algunos otros. 37 00:02:02,120 --> 00:02:04,560 Y para aquellos de ustedes que le gustaría calibrar estándar frente a hackers 38 00:02:04,560 --> 00:02:08,750 edición, ya lo veo de esta semana edición pirata informático deliberadamente es una 39 00:02:08,750 --> 00:02:12,830 poco más factible, por ejemplo, que Dios modo estaba con Juego de los Quince. 40 00:02:12,830 --> 00:02:15,300 >> Así que si usted está buscando un estiramiento y usted está buscando un poco de diversión adicional 41 00:02:15,300 --> 00:02:18,400 características no bucean en caso de interés. 42 00:02:18,400 --> 00:02:21,280 Ahora más prácticamente, permítanme señalar a cabo una cosa así. 43 00:02:21,280 --> 00:02:24,780 GDB, que algunos de ustedes no tienen todavía tocado personalmente, lo cual está bien. 44 00:02:24,780 --> 00:02:28,530 Pero ahora es realmente el tiempo para acostumbrarse a esto y cómodo con esta herramienta 45 00:02:28,530 --> 00:02:31,510 ya que hará que sus vidas mucho más fácil, realmente. 46 00:02:31,510 --> 00:02:34,900 >> La conferencia de Per Rob en GDB un par de hace semanas, el recuerdo 47 00:02:34,900 --> 00:02:36,810 que GDB es un depurador. 48 00:02:36,810 --> 00:02:41,230 Es una herramienta que le permite ejecutar su programa, sino ejecutar paso a paso, la línea 49 00:02:41,230 --> 00:02:45,680 por línea, para que pueda hurgar, para que veas las cosas que suceden, por lo 50 00:02:45,680 --> 00:02:47,310 que se puede imprimir valores de las variables. 51 00:02:47,310 --> 00:02:50,580 En pocas palabras, le da mucho más energía que printDef hace. 52 00:02:50,580 --> 00:02:52,900 >> Ahora es cierto, la interfaz es bastante arcano. 53 00:02:52,900 --> 00:02:55,180 Blanco y Negro interfaz textual en su mayor parte. 54 00:02:55,180 --> 00:02:57,400 Los comandos son un poco difíciles recordar al principio. 55 00:02:57,400 --> 00:03:01,230 Pero a pesar de que podría tener que media una hora, una hora, para poner esa adelantado 56 00:03:01,230 --> 00:03:02,940 inversión de tiempo en él, confía en mí. 57 00:03:02,940 --> 00:03:06,440 Ciertamente, para el final del semestre que le ahorrará que un orden de magnitud más 58 00:03:06,440 --> 00:03:07,600 tiempo que eso. 59 00:03:07,600 --> 00:03:09,200 >> Así que a principios de la semana zambullirse 60 00:03:09,200 --> 00:03:13,200 Y en términos de Breakout, sabe que puede hacerlo siempre y cuando usted tiene 61 00:03:13,200 --> 00:03:18,230 el código de distribución o en su propio código en curso en el directorio Pst4. 62 00:03:18,230 --> 00:03:21,680 Sepa que usted puede ejecutar gdb. / Ruptura. 63 00:03:21,680 --> 00:03:23,490 >> Esto va a abrir una ventana como esta. 64 00:03:23,490 --> 00:03:25,530 Déjeme me entrego más de una ventana de terminal. 65 00:03:25,530 --> 00:03:27,770 Y entonces lo que voy a seguir adelante y no, no es sólo ejecutarlo. 66 00:03:27,770 --> 00:03:30,690 Voy a establecer primero un punto de quiebre recuerdo, que permite pausar 67 00:03:30,690 --> 00:03:32,500 ejecución en un lugar determinado. 68 00:03:32,500 --> 00:03:35,750 >> Sólo para mantener las cosas simples que voy a romperse en la línea uno con tan sólo escribir 69 00:03:35,750 --> 00:03:37,000 el número uno. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Déjame volver a abrir esta ventana en realidad porque se está haciendo un 72 00:03:43,250 --> 00:03:45,700 poco pequeño allí. 73 00:03:45,700 --> 00:03:53,270 Así que lo que ahora voy a hacer aquí es si abro mi ventana de terminal. 74 00:03:53,270 --> 00:03:53,910 Vamos, ahí vamos. 75 00:03:53,910 --> 00:03:59,850 >> Así que ahora si vuelvo a selección, Pst4 y ejecutar gdb. / breakout entrar, previo aviso 76 00:03:59,850 --> 00:04:02,600 Voy a romper uno para ajustar un punto de quiebre en la línea uno. 77 00:04:02,600 --> 00:04:04,840 Y ahora me voy a ir por delante y el tipo de ejecución. 78 00:04:04,840 --> 00:04:07,370 Y cuando lo haga, observe nada parece suceder. 79 00:04:07,370 --> 00:04:08,120 >> No hay pop-up. 80 00:04:08,120 --> 00:04:09,790 No hay gráfica interfaz de usuario. 81 00:04:09,790 --> 00:04:13,340 Pero eso es comprensible porque estoy literalmente en la línea uno en mi programa. 82 00:04:13,340 --> 00:04:17,110 Y noto que he avanza rápidamente, específicamente ahora a 62, porque todos 83 00:04:17,110 --> 00:04:20,600 las cosas en la parte superior de este archivo es cosas como los comentarios y las constantes y 84 00:04:20,600 --> 00:04:22,460 cosas poco interesantes por ahora. 85 00:04:22,460 --> 00:04:25,840 >> Así que ahora que estoy dentro del principal, al parecer, en la línea 62. 86 00:04:25,840 --> 00:04:27,960 Y esto es sólo la distribución código, el recuerdo. 87 00:04:27,960 --> 00:04:33,810 Si abro esta por ir, de manera similar, en mi directorio cuadro desplegable en Pst4, 88 00:04:33,810 --> 00:04:35,450 en breakout.c. 89 00:04:35,450 --> 00:04:40,670 Y si me desplazo hacia abajo y abajo y abajo, y déjame ir adelante y enciendo 90 00:04:40,670 --> 00:04:44,990 mis números de línea. 91 00:04:44,990 --> 00:04:50,300 >> Lo que voy a ver, si me desplazo hasta línea 62, es exactamente la línea que 92 00:04:50,300 --> 00:04:50,910 hemos detuvimos en. 93 00:04:50,910 --> 00:04:53,720 Así que esta línea de aquí, 62 años, es donde estamos a punto de serlo. 94 00:04:53,720 --> 00:04:57,470 Así que ahora en GDB, si sigo adelante y tipo ahora A continuación, escriba que va a 95 00:04:57,470 --> 00:04:58,450 ejecutar esa línea. 96 00:04:58,450 --> 00:05:00,610 Y voilá, tenemos la llamado g ventana. 97 00:05:00,610 --> 00:05:02,800 Si no están familiarizados con lo que un GWindow es decir, que no se preocupara. 98 00:05:02,800 --> 00:05:05,740 La especificación le dará a conocer a la misma, como así como una serie de videos de tutorial 99 00:05:05,740 --> 00:05:06,830 incrustado en la especificación. 100 00:05:06,830 --> 00:05:08,610 >> Pero ahora vamos a hacer de este un poco más interesante. 101 00:05:08,610 --> 00:05:10,960 Permítanme pasar esta ventana sobre a un lado un poco. 102 00:05:10,960 --> 00:05:13,480 Permítanme hacer un poco la ventana grande para que pueda ver más. 103 00:05:13,480 --> 00:05:16,140 >> Y ahora déjame ir por delante y hacer la próxima vez. 104 00:05:16,140 --> 00:05:17,550 Y no son mis ladrillos. 105 00:05:17,550 --> 00:05:20,490 Si escribo la próxima vez ahora veo la pelota. 106 00:05:20,490 --> 00:05:23,520 Y si escribo la próxima vez ahora veo la paleta. 107 00:05:23,520 --> 00:05:26,690 >> Y afortunadamente esto no es gedit realmente cooperar mostrándome 108 00:05:26,690 --> 00:05:27,660 todo lo que quiero. 109 00:05:27,660 --> 00:05:30,820 Pero ahora si lo hago al lado de nuevo, siguiente otra vez, estoy 110 00:05:30,820 --> 00:05:32,260 declarar algunas variables. 111 00:05:32,260 --> 00:05:34,750 Y puedo imprimir cualquiera de estos chicos. 112 00:05:34,750 --> 00:05:37,170 Ladrillos de impresión, impresiones de vidas. 113 00:05:37,170 --> 00:05:39,910 >> Y ahora, si sigo haciendo siguiente, noto que voy a ser 114 00:05:39,910 --> 00:05:40,870 dentro de ese bucle. 115 00:05:40,870 --> 00:05:43,380 Pero el código se va a ejecutar exactamente lo que yo esperaba. 116 00:05:43,380 --> 00:05:45,810 Así que cuando llegué a esta función, Esperar por Click, que va a hacer 117 00:05:45,810 --> 00:05:46,830 literalmente eso. 118 00:05:46,830 --> 00:05:48,870 Así que me parecía haber perdido el control sobre el programa. 119 00:05:48,870 --> 00:05:50,480 >> BGF no me da otro aviso. 120 00:05:50,480 --> 00:05:51,500 Pero no se preocupe. 121 00:05:51,500 --> 00:05:53,720 Vaya a mi juego, haga clic en alguna parte. 122 00:05:53,720 --> 00:05:56,270 >> Y listo, ahora se procede a la línea 86. 123 00:05:56,270 --> 00:05:59,460 Así que de nuevo, es muy valiosa, en última instancia, para los problemas de depuración. 124 00:05:59,460 --> 00:06:03,050 Debido a que, literalmente, puede recorrer su código, imprimir cosas fuera y mucho, 125 00:06:03,050 --> 00:06:03,640 mucho, más. 126 00:06:03,640 --> 00:06:07,210 Pero por ahora, las herramientas por sí solas debe te ofrece mucho más. 127 00:06:07,210 --> 00:06:10,050 >> Así que estamos, por supuesto, echar un vistazo en Gráficas ahora, de repente. 128 00:06:10,050 --> 00:06:12,350 Y ahora nuestro mundo se vuelve un poco más interesante. 129 00:06:12,350 --> 00:06:15,680 Y usted sabe, tal vez, de algunos de los videos online que tenemos estos 130 00:06:15,680 --> 00:06:18,280 pantalones cortos que has estado viendo como parte de los boletines de problemas. 131 00:06:18,280 --> 00:06:20,460 >> Y han sido fusilados, deliberadamente, contra un telón de fondo blanco. 132 00:06:20,460 --> 00:06:23,380 Y algunos de ellos tienen la enseñanza Fellows dibujo poco de texto en el 133 00:06:23,380 --> 00:06:25,490 pantalla que se superpone en el lado de ellos. 134 00:06:25,490 --> 00:06:27,760 Pero por supuesto, esto no es lo único que interesante en el mundo real. 135 00:06:27,760 --> 00:06:30,520 Esto es sólo una sala de conferencias con una pantalla grande de color blanco y un telón de fondo. 136 00:06:30,520 --> 00:06:33,330 Y nuestro equipo de producción increíble especie de hace que todo parezca bonito 137 00:06:33,330 --> 00:06:36,620 después de los hechos por los que afloran o superposición de nada 138 00:06:36,620 --> 00:06:37,840 que hacemos o no queremos. 139 00:06:37,840 --> 00:06:41,560 >> Ahora sólo tienes que motivar esta semana y realmente, donde se puede ir, en última instancia, 140 00:06:41,560 --> 00:06:42,560 con la informática. 141 00:06:42,560 --> 00:06:44,260 No sólo después de un problema en cuatro sets. 142 00:06:44,260 --> 00:06:48,240 Pero después de otro curso o un entero currículo es increíble lo que se puede 143 00:06:48,240 --> 00:06:51,090 hacer en estos días, en términos de gráficos en particular. 144 00:06:51,090 --> 00:06:53,440 >> Algunos de ustedes han visto este fluye alrededor en línea. 145 00:06:53,440 --> 00:06:56,240 Pero pensé que te iba a presentar, por tan sólo un par de minutos, un vistazo de lo que 146 00:06:56,240 --> 00:07:01,890 tecnología informática y lo que CGI, gráficos por ordenador se pueden hacer en estos días 147 00:07:01,890 --> 00:07:04,510 con una canción conocida y tal vez la película. 148 00:07:04,510 --> 00:07:05,760 >> [MÚSICA - Lana Del Ray, "JOVEN Y HERMOSA] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> ALTAVOZ 1: Es sólo un poco increíble, tal vez, lo 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 >> ALTAVOZ 1: Acabo de descargar él. 154 00:10:59,230 --> 00:11:02,920 Pero es realmente increíble, creo que, al igual cómo el software y el código omnipresente y 155 00:11:02,920 --> 00:11:04,230 herramientas como esta realidad. 156 00:11:04,230 --> 00:11:07,685 Así que eso es una muestra de la dirección en el que se puede ir. 157 00:11:07,685 --> 00:11:10,620 Oh, no más Appliance hoy. 158 00:11:10,620 --> 00:11:14,640 Bueno, eso es realmente trágico momento dado el punto Sólo traté de hacer. 159 00:11:14,640 --> 00:11:18,670 >> Muy bien, así que vamos lanzamiento Fusión de nuevo. 160 00:11:18,670 --> 00:11:20,800 Recordar más tarde. 161 00:11:20,800 --> 00:11:24,190 Muy bien, y que debería haber conseguido una enviar por correo electrónico como un aparte si usted recibió un 162 00:11:24,190 --> 00:11:25,460 cuenta así. 163 00:11:25,460 --> 00:11:29,940 Muy bien, así que recuerda que la semana pasada empezamos a pelar este 164 00:11:29,940 --> 00:11:31,380 más tarde conocida como cadena. 165 00:11:31,380 --> 00:11:34,700 >> cadena recuerda un tipo de datos que es declarado en la biblioteca CS50. 166 00:11:34,700 --> 00:11:37,740 Y es parte de las ruedas de entrenamiento que ahora comenzarán a despegar. 167 00:11:37,740 --> 00:11:41,280 Era un concepto útil desde el principio. 168 00:11:41,280 --> 00:11:43,750 Pero ahora se va a poner más interesante y más poderosa para 169 00:11:43,750 --> 00:11:48,330 de hecho ver que debajo de la capilla, una cadena es sólo lo que, se nos dijo? 170 00:11:48,330 --> 00:11:50,500 >> Sí, así que es una llamada char *. 171 00:11:50,500 --> 00:11:53,860 Y el * no denota que hay algún tipo de dirección de los involucrados. 172 00:11:53,860 --> 00:11:58,690 Y así, cuando usted dice char * que acaba de decir una variable cuyo tipo de datos es un 173 00:11:58,690 --> 00:11:59,290 puntero ahora. 174 00:11:59,290 --> 00:12:01,770 El hecho de que no es la estrella que hay simplemente significa que usted está declarando una 175 00:12:01,770 --> 00:12:03,020 llamado puntero. 176 00:12:03,020 --> 00:12:06,220 Y ese puntero va a parecer almacenar la dirección de, por 177 00:12:06,220 --> 00:12:07,810 Por supuesto, un char. 178 00:12:07,810 --> 00:12:08,960 >> Ahora ¿por qué este sentido? 179 00:12:08,960 --> 00:12:11,200 Bueno, lo que es una cadena debajo de la capucha? 180 00:12:11,200 --> 00:12:15,130 Bueno, desde hace algún tiempo que hemos estado diciendo que una cadena debajo de la campana es 181 00:12:15,130 --> 00:12:18,460 sólo h-E-L-L-O, por ejemplo. 182 00:12:18,460 --> 00:12:21,585 >> Pero ya hemos hablado de esto como siendo, en esencia, una matriz. 183 00:12:21,585 --> 00:12:25,410 Y un conjunto entonces mirar un poco de la misma familia, con cada uno de estos 184 00:12:25,410 --> 00:12:26,460 tomar un bocado. 185 00:12:26,460 --> 00:12:28,710 Y luego hemos dicho que hay algo especial volver aquí, el 186 00:12:28,710 --> 00:12:31,270 barra invertida 0 o nulo terminador. 187 00:12:31,270 --> 00:12:35,230 >> Así que todo este tiempo, esta aquí ha sido una cadena. 188 00:12:35,230 --> 00:12:38,320 Pero, en realidad, una cadena es en realidad una dirección. 189 00:12:38,320 --> 00:12:43,210 Y las direcciones, como veremos, son a menudo con el prefijo 0x por convención. 190 00:12:43,210 --> 00:12:44,540 ¿Qué 0x denotan? 191 00:12:44,540 --> 00:12:45,970 ¿Alguien lo sabe? 192 00:12:45,970 --> 00:12:47,320 >> Así que sólo significa hexadecimal. 193 00:12:47,320 --> 00:12:52,360 Así que se puede recordar, en realidad, desde Pst 1, según creo, una de las de calentamiento 194 00:12:52,360 --> 00:12:55,740 cuestiones de hecho planteadas acerca notación hexadecimal además de 195 00:12:55,740 --> 00:12:57,100 binario y decimal. 196 00:12:57,100 --> 00:13:00,460 Y la motivación aquí es que con hexadecimal que tiene 16 197 00:13:00,460 --> 00:13:01,770 los dígitos a su disposición. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, seguido por a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> Y si se cuentan todos los de arriba, se obtiene un total de 16. 200 00:13:10,430 --> 00:13:13,200 Así que este es en contraste con decimal, donde tenemos 10 201 00:13:13,200 --> 00:13:14,690 dígitos, del 0 al nueve. 202 00:13:14,690 --> 00:13:17,750 Está en contraste con el binario donde sólo tenemos 0 y 1. 203 00:13:17,750 --> 00:13:21,450 >> Pero al final del día usted puede simplemente representar los mismos números, pero 204 00:13:21,450 --> 00:13:22,500 de manera algo diferente. 205 00:13:22,500 --> 00:13:25,840 Y hexadecimal es común porque como resulta que - y vamos a ver esta 206 00:13:25,840 --> 00:13:28,790 más tarde en el curso - incluso cuando lleguemos a la programación de web en el contexto de 207 00:13:28,790 --> 00:13:32,100 HTML y códigos de color, hexadecimal es agradable. 208 00:13:32,100 --> 00:13:36,390 Debido a que cada dígito, resulta, representa cuatro bits perfectamente. 209 00:13:36,390 --> 00:13:39,280 Por lo tanto, sólo un poco de líneas muy bien como veremos con el tiempo vemos. 210 00:13:39,280 --> 00:13:44,720 Así que esto podría ser Ox123 o algo así, la dirección que indica 123 211 00:13:44,720 --> 00:13:47,050 en algún lugar dentro de mi la memoria del ordenador. 212 00:13:47,050 --> 00:13:50,600 >> Pero, por supuesto, surgen algunos problemas Debido a esto subyacente 213 00:13:50,600 --> 00:13:51,520 aplicación. 214 00:13:51,520 --> 00:13:55,930 Y recuerdo que tomé una puñalada en la implementación de una función como esta - 215 00:13:55,930 --> 00:14:00,260 comparar tablero 0 puntos c la semana pasada, que a pesar de que parecía que era 216 00:14:00,260 --> 00:14:04,270 derecho, sino que simplemente no se puede comparar dos cuerdas correctamente. 217 00:14:04,270 --> 00:14:07,470 >> He tirado principal, y me he lanzado lejos los comentarios sólo se centren en el 218 00:14:07,470 --> 00:14:08,970 el código que es de interés aquí. 219 00:14:08,970 --> 00:14:10,660 Y es en rojo porque es buggy. 220 00:14:10,660 --> 00:14:11,670 ¿Por qué motivo? 221 00:14:11,670 --> 00:14:15,890 >> Bueno, en la parte superior existe cuando declaré una cadena, lo que realmente estaba pasando 222 00:14:15,890 --> 00:14:17,260 debajo de la capucha? 223 00:14:17,260 --> 00:14:19,530 Bueno, déjame ir a la Aquí la pantalla y dibujar eso. 224 00:14:19,530 --> 00:14:23,230 Así que yo declaré, de nuevo, GetString cadena s. 225 00:14:23,230 --> 00:14:26,640 >> Así que voy a seguir adelante y ahora dibujar s como lo que realmente es. 226 00:14:26,640 --> 00:14:28,590 Va a ser una plaza aquí. 227 00:14:28,590 --> 00:14:30,490 Y yo voy a la reivindicación que eso es 32 bits. 228 00:14:30,490 --> 00:14:32,890 Al menos por lo general es, al menos en el CS50 229 00:14:32,890 --> 00:14:34,520 aparato en una gran cantidad de computadoras. 230 00:14:34,520 --> 00:14:35,980 Voy a llamarlo milagrosamente. 231 00:14:35,980 --> 00:14:39,070 >> Pero ahora recordar que llamado GetString. 232 00:14:39,070 --> 00:14:41,430 Así GetString devoluciones, por supuesto, una cadena. 233 00:14:41,430 --> 00:14:45,790 Si el usuario escribe en h-e-l-l-o entran hola la cadena se devuelve. 234 00:14:45,790 --> 00:14:51,010 Y esa cadena, como acabamos de decir, extremos en algún lugar de la memoria del equipo 235 00:14:51,010 --> 00:14:53,240 con una barra invertida 0 al final. 236 00:14:53,240 --> 00:14:56,650 Voy a llamar esta como la matriz - o bloque contiguo de caracteres - 237 00:14:56,650 --> 00:14:58,330 que en realidad es. 238 00:14:58,330 --> 00:15:01,790 >> Y ahora, ¿qué es getString realmente volver? 239 00:15:01,790 --> 00:15:04,340 ¿Qué ha estado volviendo GetString todo este tiempo? 240 00:15:04,340 --> 00:15:07,520 Bueno, nosotros decimos, en semanas anteriores, devuelve una cadena. 241 00:15:07,520 --> 00:15:10,250 Pero más técnicamente, lo que hace GetString volver parecer? 242 00:15:10,250 --> 00:15:11,610 >> AUDIENCIA: Una dirección. 243 00:15:11,610 --> 00:15:12,600 >> ALTAVOZ 1: Una dirección. 244 00:15:12,600 --> 00:15:16,630 Concretamente se devuelve la dirección de el primer bocado, lo que sea. 245 00:15:16,630 --> 00:15:18,830 Sigo usando uno, dos, tres porque es conveniente. 246 00:15:18,830 --> 00:15:21,380 >> Devuelve la dirección de la primera carácter en la cadena. 247 00:15:21,380 --> 00:15:23,510 Y dijimos la semana pasada que que es suficiente. 248 00:15:23,510 --> 00:15:26,710 Porque siempre podemos averiguar dónde el final de la cadena con sólo 249 00:15:26,710 --> 00:15:30,150 iterar sobre ella, tal vez, con una de lazo o un bucle while o algo así 250 00:15:30,150 --> 00:15:34,990 que, sólo en busca de "barra invertida 0", el carácter especial centinela. 251 00:15:34,990 --> 00:15:37,220 >> Y entonces sabemos que la cadena que pasa a ser de longitud - 252 00:15:37,220 --> 00:15:37,980 en este caso - 253 00:15:37,980 --> 00:15:38,670 cinco. 254 00:15:38,670 --> 00:15:43,800 Así que técnicamente lo que hace GetString es devuelve Ox123 en este caso. 255 00:15:43,800 --> 00:15:53,670 Y técnicamente lo que sucede entonces es que almacenamos, en el interior de s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Al final del día, a pesar de que este Es nuevo concepto, los punteros, son 257 00:15:56,460 --> 00:15:57,350 sólo variables. 258 00:15:57,350 --> 00:16:00,440 Pero, por casualidad, almacenar bits que colectivamente representan una dirección. 259 00:16:00,440 --> 00:16:03,700 Así que técnicamente todo lo que obtiene almacenado en s es Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Pero nosotros, como seres humanos - 261 00:16:04,680 --> 00:16:06,020 incluyendo hoy en adelante - 262 00:16:06,020 --> 00:16:09,290 están en realidad no va a importar, por lo general, cuál es la dirección real es 263 00:16:09,290 --> 00:16:10,520 de algún trozo de memoria. 264 00:16:10,520 --> 00:16:14,040 Es sólo a menor nivel de detalle que ser intelectualmente interesante. 265 00:16:14,040 --> 00:16:15,440 Así que me voy a deshacer esto. 266 00:16:15,440 --> 00:16:19,810 Y en cambio, más alto nivel, simplemente decir que cuando estamos hablando de punteros 267 00:16:19,810 --> 00:16:22,170 Voy a llamar más justo arrow fácil de usar que transmite la 268 00:16:22,170 --> 00:16:26,060 misma idea y resúmenes de distancia del pormenores de lo que el real 269 00:16:26,060 --> 00:16:27,700 Dirección subyacente es. 270 00:16:27,700 --> 00:16:33,290 >> Ahora bien, si nos remontamos al código, lo que sucedió la semana pasada si tenemos cadena t 271 00:16:33,290 --> 00:16:34,510 es igual a GetString? 272 00:16:34,510 --> 00:16:38,630 Bueno, si yo de nuevo, escribo en hola esta vez lo voy a conseguir 273 00:16:38,630 --> 00:16:40,460 otro trozo de memoria. 274 00:16:40,460 --> 00:16:44,820 h-E-l-l-o barra invertida 0. 275 00:16:44,820 --> 00:16:48,320 >> Pero porque llamé GetString por segunda vez - 276 00:16:48,320 --> 00:16:51,100 y sé que esto de mirar el código fuente para GetString - incluso 277 00:16:51,100 --> 00:16:54,350 aunque es una coincidencia que hola era escrito en dos ocasiones, GetString no es 278 00:16:54,350 --> 00:16:55,890 va a tratar de optimizar y ser inteligente. 279 00:16:55,890 --> 00:16:58,550 Sólo va a conseguir otro trozo de memoria de la computadora, que es 280 00:16:58,550 --> 00:16:59,640 va a ser en otro domicilio. 281 00:16:59,640 --> 00:17:02,330 Vamos arbitrariamente a decir 456. 282 00:17:02,330 --> 00:17:04,079 >> Y entonces, ¿qué se va a volver? 283 00:17:04,079 --> 00:17:08,030 Se va a devolver 456 y guárdelo en t. 284 00:17:08,030 --> 00:17:12,010 Entonces, ¿qué está pasando en realidad, en el lado izquierdo es que tengo otro pedazo 285 00:17:12,010 --> 00:17:14,260 de memoria, típicamente 32 bits. 286 00:17:14,260 --> 00:17:16,720 Y ahí va a ir Ox456. 287 00:17:16,720 --> 00:17:20,140 Pero, de nuevo, no estoy interesado en estos números particulares más. 288 00:17:20,140 --> 00:17:23,069 Yo sólo voy a abstractamente dibujarla como una flecha. 289 00:17:23,069 --> 00:17:25,202 >> Así que esta es ahora una nueva explicación. 290 00:17:25,202 --> 00:17:28,735 Pero es la misma idea exacta que es estado sucediendo todo este tiempo. 291 00:17:28,735 --> 00:17:33,150 Y así, la razón, entonces, que esta primera versión de comparación era con errores 292 00:17:33,150 --> 00:17:34,480 la semana pasada es la razón? 293 00:17:34,480 --> 00:17:38,000 Cuando lo hagas, si s es igual a los iguales t ¿qué eres realmente 294 00:17:38,000 --> 00:17:40,550 debajo de la capucha comparando? 295 00:17:40,550 --> 00:17:41,910 >> Usted está comparando las direcciones. 296 00:17:41,910 --> 00:17:47,950 Y sólo intuitivamente, claramente, Ox123 no va a ser igual Ox456. 297 00:17:47,950 --> 00:17:49,380 Esos números, esos bits son sólo diferentes. 298 00:17:49,380 --> 00:17:53,220 >> Y así constantemente, la semana pasada, dijo que escribe cosas diferentes, incluso si el 299 00:17:53,220 --> 00:17:55,360 palabras fueron textualmente la misma. 300 00:17:55,360 --> 00:17:58,770 Así que podemos solucionar este problema. 301 00:17:58,770 --> 00:18:00,120 En términos sencillos, ¿cuál fue la solución? 302 00:18:00,120 --> 00:18:02,110 >> AUDIENCIA: Utilice una función. 303 00:18:02,110 --> 00:18:02,870 >> ALTAVOZ 1: Utilice una función. 304 00:18:02,870 --> 00:18:05,190 O las estrellas están definitivamente involucrados, pero el uso de una función para hacer qué? 305 00:18:05,190 --> 00:18:05,962 >> AUDIENCIA: Comparar las cuerdas. 306 00:18:05,962 --> 00:18:07,390 >> ALTAVOZ 1: Comparar las cuerdas. 307 00:18:07,390 --> 00:18:11,030 Así que el problema fundamental era que sólo estaba pensando en la 308 00:18:11,030 --> 00:18:15,870 calidad de las cuerdas que deberá definir comparación de sus direcciones. 309 00:18:15,870 --> 00:18:18,540 Y, obviamente, eso es simplemente tonto ahora, una vez usted entiende lo que está pasando 310 00:18:18,540 --> 00:18:19,510 debajo de la capucha. 311 00:18:19,510 --> 00:18:23,270 Para comparar realmente las cadenas para ver si que son iguales en la forma en que un ser humano 312 00:18:23,270 --> 00:18:26,680 consideraría que dos cadenas son iguales necesitamos compararlas caracteres para 313 00:18:26,680 --> 00:18:28,070 carácter a carácter. 314 00:18:28,070 --> 00:18:30,020 >> Ahora yo podría haber hecho esta muy prolijamente. 315 00:18:30,020 --> 00:18:32,240 Pero familiarmente, estamos utilizando un bucle. 316 00:18:32,240 --> 00:18:36,050 Y justo comparar s abrazadera i contra t i soporte. 317 00:18:36,050 --> 00:18:39,590 s soporte de i + 1 contra t soporte I más 1, y así sucesivamente, en el interior 318 00:18:39,590 --> 00:18:40,580 algún tipo de bucle. 319 00:18:40,580 --> 00:18:44,950 Y si veo a dos personajes que diferentes, o si me doy cuenta de que ooh, s es 320 00:18:44,950 --> 00:18:48,410 más corto que t o más largo que t Lo que puedo decir de inmediato falsa, 321 00:18:48,410 --> 00:18:49,390 no son lo mismo. 322 00:18:49,390 --> 00:18:55,370 >> Pero si me pongo a través de s y t y decir mismo, mismo, mismo, mismo, mismo, final de 323 00:18:55,370 --> 00:18:58,520 ambas cadenas, puedo decir verdad, ellos son iguales. 324 00:18:58,520 --> 00:19:01,040 Bueno, por suerte, hace años alguien escribió ese código por nosotros. 325 00:19:01,040 --> 00:19:03,790 >> Y lo llamaron StrComp para la cadena de comparar. 326 00:19:03,790 --> 00:19:11,900 Y a pesar de que se trata de un pequeño mostrador intuitivo, StrComp devuelve 0 si los 327 00:19:11,900 --> 00:19:14,520 dos cadenas, s y t son los mismos. 328 00:19:14,520 --> 00:19:18,090 Pero devuelve valor negativo si s debe venir antes de t alfabéticamente o 329 00:19:18,090 --> 00:19:20,610 valor positivo si debe venir después de t alfabéticamente. 330 00:19:20,610 --> 00:19:24,030 >> Así que si alguna vez desea ordenar algo, resulta que StrComp es útil. 331 00:19:24,030 --> 00:19:26,660 Debido a que no se limita a decir sí o no, iguales o no. 332 00:19:26,660 --> 00:19:30,440 Le da un sentido de la ordenación como lo haría un diccionario. 333 00:19:30,440 --> 00:19:33,770 Así StrComp, s coma t iguales es igual a 0 significa que el 334 00:19:33,770 --> 00:19:35,200 cadenas son realmente iguales. 335 00:19:35,200 --> 00:19:38,680 Porque quien escribió esta función Hace años, presumiblemente utilizado un bucle 336 00:19:38,680 --> 00:19:42,840 o un bucle while o algo así para integrar en los caracteres de nuevo 337 00:19:42,840 --> 00:19:45,270 y una y otra vez. 338 00:19:45,270 --> 00:19:47,300 >> Pero el problema de dos surgió aquí. 339 00:19:47,300 --> 00:19:48,750 Este fue copy0.c. 340 00:19:48,750 --> 00:19:51,680 Y los dos en rojo es porque está viciado. 341 00:19:51,680 --> 00:19:52,800 Y lo que hicimos aquí? 342 00:19:52,800 --> 00:19:54,310 Bueno, primero que llamé GetString. 343 00:19:54,310 --> 00:19:56,255 Y guardé el valor de retorno en s. 344 00:19:56,255 --> 00:20:00,260 Así que eso es más o menos lo mismo que esta parte superior de la imagen. 345 00:20:00,260 --> 00:20:01,490 >> Pero, ¿qué viene después? 346 00:20:01,490 --> 00:20:04,980 Bueno, déjame ir por delante y deshacerse de un manojo entero de esto. 347 00:20:04,980 --> 00:20:09,650 Vamos a rebobinar en el tiempo para el que sólo tener s, que ahora es consistente con 348 00:20:09,650 --> 00:20:10,940 una línea de arriba. 349 00:20:10,940 --> 00:20:11,400 >> Compruebo. 350 00:20:11,400 --> 00:20:13,450 Si s es igual a es igual a 0. 351 00:20:13,450 --> 00:20:18,670 Ahora, una nota lateral rápida, cuando podría GetString devolver 0? 352 00:20:18,670 --> 00:20:19,580 No hay suficiente memoria. 353 00:20:19,580 --> 00:20:19,880 ¿Cierto? 354 00:20:19,880 --> 00:20:22,310 >> Es raro que esto va a suceder, sin duda en un equipo que es 355 00:20:22,310 --> 00:20:24,740 tiene cientos de megas o incluso gigas de RAM. 356 00:20:24,740 --> 00:20:27,080 Pero podría, en teoría, el retorno 0, especialmente si el 357 00:20:27,080 --> 00:20:28,080 usuario no coopera. 358 00:20:28,080 --> 00:20:31,640 Hay maneras de hacer como que no tiene nada de entrada y la trampa 359 00:20:31,640 --> 00:20:34,100 GetString en regresar 0 eficazmente. 360 00:20:34,100 --> 00:20:35,470 >> Así que va a comprobar eso. 361 00:20:35,470 --> 00:20:39,430 Porque si alguno de ustedes han comenzado a get, ya, fallos de segmentación - 362 00:20:39,430 --> 00:20:42,280 que probablemente ha sido una fuente de cierta frustración - 363 00:20:42,280 --> 00:20:46,150 esos son casi siempre el resultado de error relacionado con la memoria. 364 00:20:46,150 --> 00:20:50,440 De alguna manera que en mal estado con respecto a un puntero, incluso si usted no se dio cuenta 365 00:20:50,440 --> 00:20:51,530 hubo un puntero. 366 00:20:51,530 --> 00:20:55,260 Segmentación Así que podría haber inducido fallas ya en la semana uno usando 367 00:20:55,260 --> 00:21:02,100 algo así como un bucle o un tiempo lazo y una matriz por ir demasiado lejos 368 00:21:02,100 --> 00:21:05,900 más allá de los límites de la matriz que algunos usted declaró, en la segunda semana de 369 00:21:05,900 --> 00:21:06,690 particular. 370 00:21:06,690 --> 00:21:09,220 >> Es posible que haya hecho que sea aún en el problema en cuatro sets con Breakout. 371 00:21:09,220 --> 00:21:12,910 A pesar de que probablemente no ha visto ninguna estrella en el código de distribución para 372 00:21:12,910 --> 00:21:17,410 Breakout, resulta que los GRect y GOVAL y otras cosas, 373 00:21:17,410 --> 00:21:19,650 esos son en realidad punteros debajo de la capucha. 374 00:21:19,650 --> 00:21:23,430 >> Pero Stanford, como nosotros, una especie de pieles que detalle al menos para las bibliotecas 375 00:21:23,430 --> 00:21:26,540 fines, al igual que lo hacemos de cuerda y char *. 376 00:21:26,540 --> 00:21:30,060 Pero GRect y GOVAL y todos aquellos cosas que ustedes están o van a utilizar 377 00:21:30,060 --> 00:21:32,630 esta semana son en última instancia, direcciones de memoria. 378 00:21:32,630 --> 00:21:33,650 Sólo que no lo sepa. 379 00:21:33,650 --> 00:21:37,240 >> Así que no es sorprendente, entonces, tal vez, que usted puede tropezar con alguna 380 00:21:37,240 --> 00:21:38,580 fallos de segmentación. 381 00:21:38,580 --> 00:21:41,290 Pero lo que es interesante aquí ahora, si después comprobamos por 0 hacemos 382 00:21:41,290 --> 00:21:43,460 cadena t consigue s. 383 00:21:43,460 --> 00:21:44,690 Bueno, déjame declaro t. 384 00:21:44,690 --> 00:21:47,730 Voy a dibujarlo como un cuadrado, 32 bits, lo llaman t. 385 00:21:47,730 --> 00:21:49,740 Y luego me voy a hacer se pone s. 386 00:21:49,740 --> 00:21:51,130 >> Bueno, ¿qué significa eso? 387 00:21:51,130 --> 00:21:53,280 Bueno, es un poco difícil pensar al respecto del cuadro sabio. 388 00:21:53,280 --> 00:21:55,025 Pero vamos a pensar en lo que hay dentro de x? 389 00:21:55,025 --> 00:21:59,430 Lo que es, literalmente, dentro de esta variable? 390 00:21:59,430 --> 00:22:01,500 El valor Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Así que cuando digo cadena t consigue s, que sólo literalmente significa tomar el número 392 00:22:05,815 --> 00:22:10,070 en s, que es Ox123 y ponerlo Ox123. 393 00:22:10,070 --> 00:22:13,740 O pictóricamente, si que tipo de resumen lejos de ese detalle que tiene la 394 00:22:13,740 --> 00:22:16,600 efecto de hacer literalmente esto también. 395 00:22:16,600 --> 00:22:22,110 >> Así que ahora, pensar en volver a la semana pasada cuando se procedió a la capitalista T. I 396 00:22:22,110 --> 00:22:23,800 lo hizo T bracket 0. 397 00:22:23,800 --> 00:22:27,150 Bueno, T bracket 0, a pesar de que se trata de un puntero, se puede tratar como si 398 00:22:27,150 --> 00:22:29,220 es una matriz, con un cuadrado notación de corchetes. 399 00:22:29,220 --> 00:22:31,550 >> Entonces, ¿dónde está el soporte T 0? 400 00:22:31,550 --> 00:22:32,990 Bueno, es la hora. 401 00:22:32,990 --> 00:22:36,800 Y así, cuando utilizamos esta línea de código, dos superior, que es en que c type.h 402 00:22:36,800 --> 00:22:38,460 archivo de cabecera, que es donde es declarada. 403 00:22:38,460 --> 00:22:44,410 Usted está capitalizando esta H. Pero, Por supuesto, esa es la misma h exacta que es 404 00:22:44,410 --> 00:22:46,540 interior de s, por así decirlo. 405 00:22:46,540 --> 00:22:51,930 Y por lo que ahora usted ha cambiado o capitalizado tanto el original como la 406 00:22:51,930 --> 00:22:53,120 así llamada copia. 407 00:22:53,120 --> 00:22:56,620 Debido a que usted no hizo una copia en el forma en que un ser humano querría que fuera. 408 00:22:56,620 --> 00:22:59,710 >> Entonces, ¿cuál era el punto de referencia aquí, en copy1.c la semana pasada? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funciones, así que en realidad podría copiar la cadena. 411 00:23:05,580 --> 00:23:08,700 Y fundamentalmente, ¿qué necesitamos para hacer con el fin de copiar la cadena? 412 00:23:08,700 --> 00:23:12,070 >> Bueno, en esta versión verde aquí estoy vamos a hacer un nivel bastante bajo. 413 00:23:12,070 --> 00:23:14,260 En realidad, hay funciones podrían ayudar con esto. 414 00:23:14,260 --> 00:23:17,710 Pero la más básica y la más uno familiarizado, al menos, pronto será 415 00:23:17,710 --> 00:23:19,600 familiar para nosotros, es el siguiente - 416 00:23:19,600 --> 00:23:21,910 por lo que uno en la primera línea de código en verde ahora. 417 00:23:21,910 --> 00:23:23,970 >> Yo sólo reescribió s como char *. 418 00:23:23,970 --> 00:23:25,250 No hay funcional diferencia allí. 419 00:23:25,250 --> 00:23:28,790 Me acaba de lanzar lejos la biblioteca y CS50 Voy a llamar a ser lo que es, un char *. 420 00:23:28,790 --> 00:23:31,640 >> Ahora punto, punto, punto, porque había comprobación de errores que no es 421 00:23:31,640 --> 00:23:33,200 interesante hablar de nuevo. 422 00:23:33,200 --> 00:23:34,710 Así que ahora t es declarada. 423 00:23:34,710 --> 00:23:35,780 También él es un char *. 424 00:23:35,780 --> 00:23:38,280 Así que dibujé una pequeña plaza en la pantalla como antes. 425 00:23:38,280 --> 00:23:41,870 >> Pero en el lado de la derecha, malloc, hemos dicho es la memoria asignar. 426 00:23:41,870 --> 00:23:44,130 Así que asignar parte trozo de memoria. 427 00:23:44,130 --> 00:23:48,830 ¿Y cuántos bytes es lo que realmente desee asignar, ¿le parece? 428 00:23:48,830 --> 00:23:50,340 >> Pues bien, la longitud de la cadena de s. 429 00:23:50,340 --> 00:23:52,310 Así que si es hola eso es va a ser cinco. 430 00:23:52,310 --> 00:23:53,950 Diremos h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Así que cinco bytes. 432 00:23:55,090 --> 00:23:57,960 >> Pero entonces, más 1, ¿por 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 dejamos espacio para este tipo que podría crear una situación accidental 435 00:24:03,640 --> 00:24:05,600 donde la cadena es h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 Y entonces el siguiente GetString tiempo es Llamé y me introduzco en, por ejemplo, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, la computadora va pensar que s es en realidad 438 00:24:14,020 --> 00:24:18,900 h-E-l-l-o-D-A-V-i-d porque hay sin romper entre esas palabras. 439 00:24:18,900 --> 00:24:19,810 >> Así que tenemos que romper. 440 00:24:19,810 --> 00:24:20,720 Así que no queremos cinco. 441 00:24:20,720 --> 00:24:22,100 Queremos seis bytes. 442 00:24:22,100 --> 00:24:23,110 >> Y me dicen bytes. 443 00:24:23,110 --> 00:24:25,220 Pero en realidad es el tamaño época del carbón. 444 00:24:25,220 --> 00:24:28,040 Técnicamente carbón es casi siempre un solo byte. 445 00:24:28,040 --> 00:24:31,030 >> Pero para hacer que nuestro código portable, por así decirlo, para que funcione en 446 00:24:31,030 --> 00:24:33,750 diferentes sistemas aunque podría ser algo diferente debajo de la 447 00:24:33,750 --> 00:24:36,590 campana, voy a genéricamente decir el tamaño de caracteres de manera que 448 00:24:36,590 --> 00:24:37,660 mi código siempre funciona. 449 00:24:37,660 --> 00:24:40,610 Y yo no tengo que volver a compilar sólo porque yo actualizo mi computadora o uso 450 00:24:40,610 --> 00:24:42,140 alguna plataforma diferente. 451 00:24:42,140 --> 00:24:45,300 >> Así que tengo 6 veces el tamaño de un char, que pasa a ser 1. 452 00:24:45,300 --> 00:24:47,440 Así que eso significa malloc podrían dame seis bytes. 453 00:24:47,440 --> 00:24:49,140 ¿Qué es eso en realidad haciendo? 454 00:24:49,140 --> 00:24:52,810 Bueno, déjame Hacer Retroceder en el tiempo aquí a dónde estamos en la historia. 455 00:24:52,810 --> 00:24:57,620 >> Así que si vuelvo aquí, he declarado char * llamada t. 456 00:24:57,620 --> 00:25:00,280 Yo ahora he llamado malloc durante seis bytes. 457 00:25:00,280 --> 00:25:06,400 Y ahora me voy a sacar los seis bytes al igual que la gama anterior. 458 00:25:06,400 --> 00:25:10,570 Pero yo realmente no sé lo que es dentro de esta matriz. 459 00:25:10,570 --> 00:25:14,640 >> Si se asigna memoria resulta que no se puede confiar en que hay un poco de 460 00:25:14,640 --> 00:25:15,810 valor conocido allí. 461 00:25:15,810 --> 00:25:18,400 Podría haber sido utilizado por algo otra cosa, alguna otra función, alguna otra 462 00:25:18,400 --> 00:25:19,630 línea de código que usted escribió. 463 00:25:19,630 --> 00:25:22,870 Así que en general, llamaremos a estos residuos valores y dibujarlos, tal vez, como 464 00:25:22,870 --> 00:25:26,170 signos de interrogación, sólo indican que no saben lo que está realmente allí. 465 00:25:26,170 --> 00:25:30,390 Y eso no es gran cosa, siempre y cuando nos son lo suficientemente inteligentes como para sobrescribir los 466 00:25:30,390 --> 00:25:34,550 valores de basura con números o caracteres que nos importan. 467 00:25:34,550 --> 00:25:36,340 >> Así que en este caso, ¿qué voy a hacer? 468 00:25:36,340 --> 00:25:38,670 Bueno, mi línea de código siguiente, tengo cuatro. 469 00:25:38,670 --> 00:25:41,350 int i obtener 0, n obtiene el longitud de la cadena de s. 470 00:25:41,350 --> 00:25:42,750 Así que un familiar para bucle. 471 00:25:42,750 --> 00:25:45,875 I es menor o igual a n, que por lo general está por encima. 472 00:25:45,875 --> 00:25:47,500 >> Pero esta vez es deliberada. 473 00:25:47,500 --> 00:25:51,890 I + +, y entonces yo simplemente hago t i soporte Obtiene s. 474 00:25:51,890 --> 00:25:56,320 Debido a que mi imagen se ve como esto en este momento, almacenada en t es el 475 00:25:56,320 --> 00:25:59,530 dirección de ese fragmento al azar de la memoria cuyos valores son desconocidos. 476 00:25:59,530 --> 00:26:03,030 Pero tan pronto como yo t soporte 0 que me pone aquí. 477 00:26:03,030 --> 00:26:07,430 >> Y lo que termina siendo atraído allí? 478 00:26:07,430 --> 00:26:08,740 Terminamos poniendo h. 479 00:26:08,740 --> 00:26:11,170 Porque eso es lo que está en el soporte s 0. 480 00:26:11,170 --> 00:26:14,300 Y luego lo mismo para E y L, y L, y o. 481 00:26:14,300 --> 00:26:17,930 >> n, ¿por qué me voy arriba a través de un igual al n? 482 00:26:17,930 --> 00:26:19,200 Debido al carácter 0. 483 00:26:19,200 --> 00:26:23,580 Así que para ser claros, entonces, si realmente borrar cualesquiera que éstas basura 484 00:26:23,580 --> 00:26:28,870 valores y luego en realidad se basan en lo que espero, esto es s soporte 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, además de eso se arrastra nuevo personaje. 486 00:26:32,440 --> 00:26:36,080 >> Y ahora si continuamos más allá del punto, punto, punto en esta versión correcta 487 00:26:36,080 --> 00:26:41,930 y capitalizado t bracket 0 Lo haría, de Por supuesto, se capitaliza sólo esta 488 00:26:41,930 --> 00:26:47,050 tipo aquí, que conceptualmente, era en última instancia la meta. 489 00:26:47,050 --> 00:26:48,040 Así que eso es todo el puntero se encuentra. 490 00:26:48,040 --> 00:26:51,430 >> Y usted ha estado usando durante semanas ahora en el contexto de cadenas. 491 00:26:51,430 --> 00:26:53,530 Pero debajo de la capucha son un poco más complejo. 492 00:26:53,530 --> 00:26:57,520 Pero si usted piensa acerca de ellos en este forma pictórica Propongo que son 493 00:26:57,520 --> 00:27:01,720 probablemente no todo lo que da miedo, ya que podría parecer a primera vista, a primera vista, 494 00:27:01,720 --> 00:27:04,730 particularmente con tal nueva sintaxis. 495 00:27:04,730 --> 00:27:07,290 ¿Tiene preguntas sobre los punteros, cadenas o caracteres? 496 00:27:07,290 --> 00:27:07,580 ¿Sí? 497 00:27:07,580 --> 00:27:09,252 >> AUDIENCIA: ¿Puede volver a la [inaudible]? 498 00:27:09,252 --> 00:27:10,502 >> ALTAVOZ 1: Por supuesto. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> AUDIENCIA: Así que ¿cómo es que en su último línea, usted no tiene una línea de t * 501 00:27:19,525 --> 00:27:21,513 y una * s en la línea? 502 00:27:21,513 --> 00:27:23,004 ¿No tienes la referencia a la - 503 00:27:23,004 --> 00:27:24,640 >> ALTAVOZ 1: Ah, una muy buena pregunta. 504 00:27:24,640 --> 00:27:26,800 ¿Por qué no tengo un t * ya * s? 505 00:27:26,800 --> 00:27:30,340 Debido brevemente, la semana pasada, al igual que en nuestro función de cambiar, he dicho que cuando 506 00:27:30,340 --> 00:27:33,350 tienes un puntero el medio por el que vas allí como lo hicimos 507 00:27:33,350 --> 00:27:36,590 físicamente en el escenario, era en realidad utilizar el operador estrella. 508 00:27:36,590 --> 00:27:40,570 >> Resulta que esta de corchetes notación es lo que llamaremos sintáctica 509 00:27:40,570 --> 00:27:44,190 azúcar, que es sólo una forma atractiva de diciendo que es la notación abreviada de 510 00:27:44,190 --> 00:27:45,950 exactamente lo que estás describiendo. 511 00:27:45,950 --> 00:27:49,385 Pero es un poco más intuitivo. 512 00:27:49,385 --> 00:27:53,510 Y a riesgo de hacer este parecer más complicado de lo que tiene que ser, 513 00:27:53,510 --> 00:27:56,990 lo que realmente está pasando aquí es la siguiente - 514 00:27:56,990 --> 00:28:01,450 Si digo * t que eso significa ir a la dirección almacenada en t. 515 00:28:01,450 --> 00:28:04,350 >> Así que, literalmente, si t es el almacenamiento de la dirección de ese h 516 00:28:04,350 --> 00:28:07,300 inicialmente, * t significa ir aquí. 517 00:28:07,300 --> 00:28:10,730 Ahora, ¿qué significa t bracket 0? 518 00:28:10,730 --> 00:28:11,560 Exactamente lo mismo. 519 00:28:11,560 --> 00:28:13,510 Es sólo un poco más de usuarios amigable para escribir. 520 00:28:13,510 --> 00:28:14,430 >> Pero no he terminado todavía. 521 00:28:14,430 --> 00:28:17,800 No puedo decir * t * s consigue. 522 00:28:17,800 --> 00:28:19,440 Porque lo que estaría haciendo entonces? 523 00:28:19,440 --> 00:28:22,950 Estaría poniendo h, h, h, h, h a lo largo de todo el asunto. 524 00:28:22,950 --> 00:28:22,995 ¿Cierto? 525 00:28:22,995 --> 00:28:26,020 >> Debido a * t es ir a la dirección en t. 526 00:28:26,020 --> 00:28:27,580 Pero estamos dentro de un bucle. 527 00:28:27,580 --> 00:28:32,150 ¿Y qué valor estoy incrementando, por supuesto, en cada iteración? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Pero hay una oportunidad aquí, ¿verdad? 530 00:28:34,590 --> 00:28:37,870 A pesar de que esto se siente como se está haciendo un poco más sofisticado 531 00:28:37,870 --> 00:28:40,730 que la notación de corchetes que hemos utilizado durante algún tiempo - 532 00:28:40,730 --> 00:28:43,840 déjame deshacer mi h cambio allí - 533 00:28:43,840 --> 00:28:48,870 a pesar de que esta es ahora conseguir un poco más elegante, la idea básica, si * t 534 00:28:48,870 --> 00:28:53,630 significa aquí y * t es sólo ir a la dirección en t. 535 00:28:53,630 --> 00:28:54,990 >> Pero ¿cuál era la dirección en t? 536 00:28:54,990 --> 00:28:56,850 El número seguimos usando? 537 00:28:56,850 --> 00:29:00,540 Como Ox456, vamos a traer esa vuelta sólo por el bien de la discusión. 538 00:29:00,540 --> 00:29:05,380 Bueno, si quiero llegar a la dirección en t cadena, sólo quiero ir, 539 00:29:05,380 --> 00:29:06,460 esencialmente, 456. 540 00:29:06,460 --> 00:29:09,230 >> O más bien, 457. 541 00:29:09,230 --> 00:29:10,590 Sólo tengo que añadir uno. 542 00:29:10,590 --> 00:29:11,790 Pero no puedo hacer eso, ¿verdad? 543 00:29:11,790 --> 00:29:14,680 Porque t, a pesar de que sigo dibujando ahora como una flecha, que es sólo una 544 00:29:14,680 --> 00:29:16,570 número, Ox456. 545 00:29:16,570 --> 00:29:21,400 Y si añado uno a eso, o más en general, si añado yo para que yo pueda 546 00:29:21,400 --> 00:29:24,350 realmente conseguir exactamente donde quiero. 547 00:29:24,350 --> 00:29:26,260 Así que si yo realmente hago esto - 548 00:29:26,260 --> 00:29:28,970 y esto es lo que se llama ahora Aritmética de punteros - 549 00:29:28,970 --> 00:29:30,375 Me puede quitar esta línea. 550 00:29:30,375 --> 00:29:33,550 Lo cual es, francamente, creo que más claro y un poco más fácil de usar para leer. 551 00:29:33,550 --> 00:29:35,970 Pero esto no es menos correcto. 552 00:29:35,970 --> 00:29:38,570 >> Esta línea de código ahora está utilizando aritmética de punteros. 553 00:29:38,570 --> 00:29:40,920 Es como decir ir a la siguiente dirección - 554 00:29:40,920 --> 00:29:44,670 cualquiera que sea el inicio de t es, que es t plus i, que inicialmente 555 00:29:44,670 --> 00:29:45,730 es 0, lo cual es genial. 556 00:29:45,730 --> 00:29:49,280 Porque eso significa el comienzo de t más 1, más 2, más 3, y así sucesivamente. 557 00:29:49,280 --> 00:29:51,030 Y el mismo acuerdo con s. 558 00:29:51,030 --> 00:29:52,750 >> Así azúcar sintáctica para esto. 559 00:29:52,750 --> 00:29:55,900 Pero la comprensión de lo que realmente está pasando debajo de la capucha, yo diría, 560 00:29:55,900 --> 00:29:57,410 es en realidad útil en y de sí mismo. 561 00:29:57,410 --> 00:30:00,620 Porque significa ahora que no hay mucho más la magia sucede 562 00:30:00,620 --> 00:30:01,620 debajo de la capucha. 563 00:30:01,620 --> 00:30:03,920 No va a haber muchos más capas que podemos pelar de nuevo para usted. 564 00:30:03,920 --> 00:30:04,810 Esta es c. 565 00:30:04,810 --> 00:30:06,410 Y esta es la programación. 566 00:30:06,410 --> 00:30:08,002 Muy buena pregunta. 567 00:30:08,002 --> 00:30:11,570 >> Muy bien, así que esto fue que con errores programa que me refería antes. 568 00:30:11,570 --> 00:30:12,650 permuta era defectuoso. 569 00:30:12,650 --> 00:30:14,070 Si parecen funcionar. 570 00:30:14,070 --> 00:30:17,390 Recordemos que al igual que con la leche y el jugo de naranja - que empecé 571 00:30:17,390 --> 00:30:18,660 beber la manifestación de hoy. 572 00:30:18,660 --> 00:30:22,220 Así que al igual que con el jugo de naranja y la leche, que tenía que usar un 573 00:30:22,220 --> 00:30:26,200 variable temporal, tmp, para celebrar una temporalmente para que pudiéramos entonces 574 00:30:26,200 --> 00:30:28,820 cambiar su valor y luego actualizar b. 575 00:30:28,820 --> 00:30:32,870 >> Pero esta función, decíamos, o esta programa en el que esta función era 576 00:30:32,870 --> 00:30:35,670 escrito que estaba mal y defectuoso, por 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 >> AUDIENCIA: [inaudible]. 580 00:30:42,471 --> 00:30:44,940 >> ALTAVOZ 1: Exactamente, cuando usted llama swap - 581 00:30:44,940 --> 00:30:47,820 o más en general, cuando se llamar a casi cualquier función - 582 00:30:47,820 --> 00:30:51,210 si los argumentos de esa función son primitivos, por así decirlo, enteros y caracteres 583 00:30:51,210 --> 00:30:56,740 y dobles y carrozas, cosas sin estrellas, está de paso en una copia de 584 00:30:56,740 --> 00:30:57,540 el argumento. 585 00:30:57,540 --> 00:31:01,580 Así que si x era 1 e y era 2, una va que es 1 y b va a ser 2. 586 00:31:01,580 --> 00:31:05,250 Pero ellos van a ser diferentes trozos de bits, diferentes trozos de 587 00:31:05,250 --> 00:31:07,540 memoria que resultan ser el almacenamiento de valores idénticos. 588 00:31:07,540 --> 00:31:12,160 >> Así que este código es super perfecta en el intercambio de a y b. 589 00:31:12,160 --> 00:31:13,850 No es bueno en el intercambio - 590 00:31:13,850 --> 00:31:15,290 en el ejemplo de la semana pasada - 591 00:31:15,290 --> 00:31:16,390 x e y. 592 00:31:16,390 --> 00:31:18,780 Porque de nuevo, son en el ámbito equivocado. 593 00:31:18,780 --> 00:31:21,310 >> Ahora, ¿cómo vamos a arreglar esto? 594 00:31:21,310 --> 00:31:23,140 Tuvimos que hacer la función mirar un poco más feo. 595 00:31:23,140 --> 00:31:25,250 Pero una vez más, tenga en cuenta lo esto sólo significa. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Y, de hecho, me dejó, por coherencia, cambiar una cosa por lo que es idéntico al 598 00:31:31,500 --> 00:31:33,200 lo que acabamos de hacer. 599 00:31:33,200 --> 00:31:35,690 Como mencioné la semana pasada, no lo hace importa a dónde va. 600 00:31:35,690 --> 00:31:38,120 De hecho, por lo general usted pondría la protagonizará junto al nombre de la variable. 601 00:31:38,120 --> 00:31:40,750 Pero creo que sería un poco más fácil a considerar el * al lado de la 602 00:31:40,750 --> 00:31:44,910 tipo de datos en el sentido de que es un puntero a un int en este caso. 603 00:31:44,910 --> 00:31:46,270 >> Entonces, ¿qué estoy haciendo aquí? 604 00:31:46,270 --> 00:31:49,590 Yo estoy diciendo que no me dan un int seguido de otro tipo int 605 00:31:49,590 --> 00:31:50,810 llamándolos a y b. 606 00:31:50,810 --> 00:31:52,460 Dame la dirección de un int. 607 00:31:52,460 --> 00:31:53,960 Dame la dirección de otro int. 608 00:31:53,960 --> 00:31:56,330 Llame a los direcciones a y b. 609 00:31:56,330 --> 00:32:00,860 >> Y a continuación, utilizando la notación abajo * a continuación, ir a cada una de esas direcciones 610 00:32:00,860 --> 00:32:05,290 según sea necesario para obtener ya sea o establecer su valor. 611 00:32:05,290 --> 00:32:07,400 Pero hay una excepción aquí. 612 00:32:07,400 --> 00:32:11,130 ¿Por qué no tengo un * junto al tmp? 613 00:32:11,130 --> 00:32:15,070 ¿Por qué no hago esto, por ejemplo? 614 00:32:15,070 --> 00:32:19,370 Se siente como si yo debería ir a por todas y corregir todo. 615 00:32:19,370 --> 00:32:19,752 ¿Sí? 616 00:32:19,752 --> 00:32:21,002 >> AUDIENCIA: [inaudible]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> ALTAVOZ 1: No he declarado tmp como una cadena. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Así que esto iba a declarar, en este caso, una tmp es la dirección de un int. 621 00:32:34,950 --> 00:32:37,380 Pero eso no es todo lo que quiero, por un par de razones. 622 00:32:37,380 --> 00:32:38,616 >> AUDIENCIA: Usted no quiere para intercambiarlas. 623 00:32:38,616 --> 00:32:41,800 >> ALTAVOZ 1: Exactamente, yo no quiero cambiar nada con tmp. tmp es sólo 624 00:32:41,800 --> 00:32:42,790 semana y un cosas. 625 00:32:42,790 --> 00:32:45,150 Todo lo que quiero es una variable para almacenar un número. 626 00:32:45,150 --> 00:32:47,330 Ni siquiera me preocupo por las direcciones en este momento. 627 00:32:47,330 --> 00:32:50,530 >> Sólo necesito 32 bits o por lo que para almacenar un int. 628 00:32:50,530 --> 00:32:56,690 Y quiero poner en esos 32 bits todo lo que no está en una, por así decirlo, pero 629 00:32:56,690 --> 00:33:01,260 lo que está en una, para ser más precisos. 630 00:33:01,260 --> 00:33:06,420 Porque si a es una dirección, * un medio ir allí y obtener el valor 1. 631 00:33:06,420 --> 00:33:10,560 Por ejemplo, en el ejemplo de la semana pasada o en el caso de b, obtener el valor de 2. 632 00:33:10,560 --> 00:33:11,750 >> Entonces, ¿qué está pasando realmente? 633 00:33:11,750 --> 00:33:15,070 Permítanme llamar una foto aquí donde se sólo desmenuzar parte de hoy. 634 00:33:15,070 --> 00:33:18,580 Pero esto va a seguir apareciendo desde hace bastante tiempo. 635 00:33:18,580 --> 00:33:22,430 >> Esto, afirmo, es lo que el equipo de la memoria se ve como cuando se ejecuta una 636 00:33:22,430 --> 00:33:24,060 programa, cualquier programa. 637 00:33:24,060 --> 00:33:28,340 Cuando se ejecuta un programa en la parte superior de memoria RAM de su computadora - así que pensar en 638 00:33:28,340 --> 00:33:33,530 este rectángulo, en verdad, ya que su RAM del ordenador o la memoria, todo 101 639 00:33:33,530 --> 00:33:36,920 mil millones de bytes de la misma, todos de dos mil millones bytes, todos dos gigabytes de la misma, 640 00:33:36,920 --> 00:33:39,910 cualquiera que sea la cantidad que se tiene es, dibujemos como un rectángulo. 641 00:33:39,910 --> 00:33:43,260 Y afirmo que cuando se ejecuta un programa de como Microsoft Word o Chrome 642 00:33:43,260 --> 00:33:49,220 ni nada de eso, los bits que Microsoft o Google que escribieron - 643 00:33:49,220 --> 00:33:50,910 en los casos de los programas - 644 00:33:50,910 --> 00:33:54,490 se cargan en la memoria del equipo donde pueden ser ejecutadas más 645 00:33:54,490 --> 00:33:57,520 rápidamente y se introduce en la CPU, lo cual es el cerebro de la computadora. 646 00:33:57,520 --> 00:34:00,940 >> Y en TAM están almacenados en el mismo la parte superior de su programa, por así decirlo. 647 00:34:00,940 --> 00:34:03,300 En otras palabras, si se trata de un trozo de memoria, cuando se hace doble clic en 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, los bits vienen fuera del disco duro. 649 00:34:05,740 --> 00:34:06,680 Ellos se cargan en la memoria RAM. 650 00:34:06,680 --> 00:34:10,330 Y nos empujamos hacia arriba en la parte superior de este rectángulo conceptualmente. 651 00:34:10,330 --> 00:34:13,010 >> Bueno, el resto de su memoria es utilizado para diferentes cosas. 652 00:34:13,010 --> 00:34:16,460 En la parte superior se ve inicializar los datos y los datos Uninitialize. 653 00:34:16,460 --> 00:34:20,500 Esto tiene que ver, en su mayor parte, con constantes o variables globales 654 00:34:20,500 --> 00:34:21,340 que tienen valores. 655 00:34:21,340 --> 00:34:22,980 Pero más sobre esto en otro momento. 656 00:34:22,980 --> 00:34:25,150 >> Entonces usted tiene el montón, que vamos a volver a. 657 00:34:25,150 --> 00:34:28,420 Pero en el fondo es la parte que es particularmente pertinente en estos momentos. 658 00:34:28,420 --> 00:34:30,210 Es la llamada pila. 659 00:34:30,210 --> 00:34:33,850 Así que al igual que en la mayoría de cualquier sala D aquí en campus, usted tiene esas bandejas que 660 00:34:33,850 --> 00:34:37,210 acaba de apilar en la parte superior de cada otra en la que usted puede poner la comida y otras cosas. 661 00:34:37,210 --> 00:34:40,139 La pila en un sistema informático es muy similar. 662 00:34:40,139 --> 00:34:42,679 Excepto mientras que la bandeja, ya que utilizamos en el comedor, por supuesto, se entiende 663 00:34:42,679 --> 00:34:45,710 para llevar las cosas de las bandejas o los marcos - 664 00:34:45,710 --> 00:34:49,469 como vamos a llamar a ellos - en un ordenador memoria se utiliza para mantener 665 00:34:49,469 --> 00:34:51,610 variables y valores. 666 00:34:51,610 --> 00:34:53,929 >> Así que lo que realmente sucede debajo de la capucha? 667 00:34:53,929 --> 00:34:55,820 Bueno, déjenme se voltea a la pantalla aquí. 668 00:34:55,820 --> 00:34:58,370 Y vamos a centrarnos sólo en la parte inferior por un momento. 669 00:34:58,370 --> 00:35:02,770 Si esta es la parte inferior de mi la memoria de la computadora resulta cuando 670 00:35:02,770 --> 00:35:05,350 llame a la función principal - lo que ocurre, francamente, 671 00:35:05,350 --> 00:35:06,950 automáticamente para mí - 672 00:35:06,950 --> 00:35:10,510 Me sale un trozo de memoria en el fondo de mi memoria RAM por así decirlo. 673 00:35:10,510 --> 00:35:13,390 Y aquí es donde los principales de variables locales van. 674 00:35:13,390 --> 00:35:16,770 Es el lugar donde argc y argv quizá ir, y cualquier variable que 675 00:35:16,770 --> 00:35:18,170 declarar dentro del principal. 676 00:35:18,170 --> 00:35:20,260 Terminan en la parte inferior de la memoria RAM del ordenador. 677 00:35:20,260 --> 00:35:25,040 >> Ahora supongamos que la principal llama a una función tales como el canje, al igual que lo hizo la semana pasada? 678 00:35:25,040 --> 00:35:30,620 Bueno, esencialmente ponemos una nueva bandeja, un nuevo marco, en mi trozo de memoria. 679 00:35:30,620 --> 00:35:34,160 Y yo voy a describir esto como pertenencia a la función de intercambio. 680 00:35:34,160 --> 00:35:35,770 >> Ahora lo que hay dentro de canje? 681 00:35:35,770 --> 00:35:39,240 Bueno, basado en el programa de la semana pasada y el que acabamos de ver un extracto del, 682 00:35:39,240 --> 00:35:46,590 dentro del marco del intercambio, o el intercambio de bandeja, son lo que las variables? 683 00:35:46,590 --> 00:35:47,970 Bueno, a y b. 684 00:35:47,970 --> 00:35:51,850 Debido a que esas eran sus argumentos locales, más una tercera, tmp. 685 00:35:51,850 --> 00:35:54,470 Así que en realidad, yo podría llegar a esta un poco más limpiamente. 686 00:35:54,470 --> 00:35:56,680 Déjame ir adelante y deshacer la etiqueta. 687 00:35:56,680 --> 00:35:58,520 Y permítanme pretendo que usted sabe lo que? 688 00:35:58,520 --> 00:36:00,560 >> una probablemente va a terminar aquí. 689 00:36:00,560 --> 00:36:02,160 B va a terminar aquí. 690 00:36:02,160 --> 00:36:03,810 Y tmp va a terminar aquí. 691 00:36:03,810 --> 00:36:05,160 Ahora, el orden podría ser un poco diferente. 692 00:36:05,160 --> 00:36:06,840 Pero conceptualmente esta es la idea. 693 00:36:06,840 --> 00:36:11,490 >> Y justo en conjunto, esto es lo que llamaremos marco de intercambio, o 694 00:36:11,490 --> 00:36:12,136 bandeja de comedor-sala. 695 00:36:12,136 --> 00:36:13,150 Y el mismo trato con principal. 696 00:36:13,150 --> 00:36:14,040 Pero no voy a volver a dibujar eso. 697 00:36:14,040 --> 00:36:17,810 Pero ahí es donde argc y argv y cualquier de sus variables locales como X e Y 698 00:36:17,810 --> 00:36:18,940 podría ser así. 699 00:36:18,940 --> 00:36:22,170 >> Así que ahora considerar lo que realmente está sucediendo cuando se llama intercambio. 700 00:36:22,170 --> 00:36:26,370 Cuando se llama a swap, la ejecución de código como esto, usted está pasando, en el 701 00:36:26,370 --> 00:36:30,670 versión con errores, a y b como copias de x e y. 702 00:36:30,670 --> 00:36:34,300 Así que si lo hago ahora extraigo esta en la pantalla - 703 00:36:34,300 --> 00:36:36,700 tiene que mejorar en esto - 704 00:36:36,700 --> 00:36:40,850 por lo que la historia que estaba contando a mí mismo se encontraba en esta versión con errores, cuando nos 705 00:36:40,850 --> 00:36:46,130 llamar permuta pasando literalmente a y b como enteros, ¿qué está pasando realmente? 706 00:36:46,130 --> 00:36:48,250 >> Bueno, lo que realmente está sucediendo es esto. 707 00:36:48,250 --> 00:36:52,850 Déjame ir adelante y deshacer simplemente para aclarar algo de espacio aquí. 708 00:36:52,850 --> 00:36:54,720 Así que esta es la memoria de mi ordenador. 709 00:36:54,720 --> 00:36:57,510 >> Así que si tengo, por ejemplo - 710 00:36:57,510 --> 00:36:58,910 En realidad vamos a hacerlo de esta manera - 711 00:36:58,910 --> 00:37:02,690 si afirmo que esto es x, el almacenamiento el valor 1 al igual que la semana pasada. 712 00:37:02,690 --> 00:37:05,930 Y esto es a, almacenar el valor 2 al igual que la semana pasada. 713 00:37:05,930 --> 00:37:11,370 Y esta es la principal, cuando llamo swap, por lo tanto a mí mismo que da acceso a una y 714 00:37:11,370 --> 00:37:15,150 b y tmp, que voy a afirmar que esta es una y esta es 1. 715 00:37:15,150 --> 00:37:16,080 >> Esta es la b. 716 00:37:16,080 --> 00:37:17,010 Esto es 2. 717 00:37:17,010 --> 00:37:18,370 Esto se llama tmp. 718 00:37:18,370 --> 00:37:23,360 >> E inicialmente, tiene algún valor basura hasta que lo almaceno en una, 719 00:37:23,360 --> 00:37:24,450 que es 1. 720 00:37:24,450 --> 00:37:28,320 Entonces yo voy a continuación y el cambio un ser qué? 721 00:37:28,320 --> 00:37:29,720 El valor de B. 722 00:37:29,720 --> 00:37:31,980 >> Y así que ahora tengo dos aquí. 723 00:37:31,980 --> 00:37:34,050 Y entonces dijimos b consigue tmp. 724 00:37:34,050 --> 00:37:37,670 Una vez más, al igual que una comprobación de validez, la tercera línea de código que aquí es simplemente esto 725 00:37:37,670 --> 00:37:39,440 uno, b consigue tmp. 726 00:37:39,440 --> 00:37:41,730 >> Y así, por último, ¿qué hago? 727 00:37:41,730 --> 00:37:46,800 Sigo adelante y B cambian para ser lo el valor de tmp es, que es 1. 728 00:37:46,800 --> 00:37:48,390 Yo no toco de nuevo tmp. 729 00:37:48,390 --> 00:37:54,100 >> Pero ahora, el problema es tan pronto como swap devuelve, porque no es la entrega 730 00:37:54,100 --> 00:37:57,540 volver algún valor, no hay retorno declaración explícita en ella. 731 00:37:57,540 --> 00:37:59,080 ¿Qué está sucediendo realmente? 732 00:37:59,080 --> 00:38:03,480 Bueno, básicamente todo esto de memoria - 733 00:38:03,480 --> 00:38:07,410 Aceptar, por lo visto el borrador le gusta sólo un dedo a la vez - 734 00:38:07,410 --> 00:38:08,180 simplemente desaparece. 735 00:38:08,180 --> 00:38:10,070 >> Ahora bien, en realidad no lo es ir a ninguna parte. 736 00:38:10,070 --> 00:38:11,810 Pero usted puede pensar en él ahora como signos de interrogación. 737 00:38:11,810 --> 00:38:14,040 Debido a que ya no es realmente en uso. 738 00:38:14,040 --> 00:38:17,470 Y no se hace nada con esos valores. 739 00:38:17,470 --> 00:38:21,920 >> Así en el caso de la versión verde de este código, lo que en su lugar está siendo 740 00:38:21,920 --> 00:38:24,640 pasado a la permuta? 741 00:38:24,640 --> 00:38:25,770 Así direcciones. 742 00:38:25,770 --> 00:38:28,520 Así que la dirección de xy la dirección de y. 743 00:38:28,520 --> 00:38:35,790 Así que si volvemos a contar esta historia una última tiempo, y yo en realidad dibujo de intercambio de nuevo, 744 00:38:35,790 --> 00:38:44,620 pero con punteros, siendo esta una, esta siendo b, y siendo tmp, lo que es 745 00:38:44,620 --> 00:38:49,080 efectivamente almacenada en una en este verde versión de mi código en la que estoy pasando 746 00:38:49,080 --> 00:38:52,110 en las direcciones? 747 00:38:52,110 --> 00:38:53,780 >> Va a ser un puntero a x. 748 00:38:53,780 --> 00:38:54,890 Así que podría dibujar una flecha. 749 00:38:54,890 --> 00:38:57,310 Pero vamos a usar la misma arbitraria ejemplo como antes. 750 00:38:57,310 --> 00:39:01,220 Digamos que se trata de algo así como Ox123. 751 00:39:01,220 --> 00:39:04,970 Y esto va a ser porque Ox127 es cuatro bytes de distancia porque es un 752 00:39:04,970 --> 00:39:07,370 int, por lo Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Y otra vez, estoy tomando algunas libertades con los números. 754 00:39:09,080 --> 00:39:11,430 Son mucho más pequeños de lo que sería ser en realidad y en un orden diferente. 755 00:39:11,430 --> 00:39:14,350 Pero así es como la imagen ahora es diferente. 756 00:39:14,350 --> 00:39:19,060 >> Pero cuando se utiliza este código verde y yo int tmp consigo * a. 757 00:39:19,060 --> 00:39:25,010 * Un medio para hacer lo siguiente, tome la electrónico que sea en un e ir a la misma, 758 00:39:25,010 --> 00:39:26,190 que es 1. 759 00:39:26,190 --> 00:39:28,480 Y eso es lo que luego puse en tmp. 760 00:39:28,480 --> 00:39:32,480 Mientras tanto, en la siguiente línea de código aquí, * a se b, ¿qué significa eso? 761 00:39:32,480 --> 00:39:36,910 >> Bueno, * a, así que ve aquí obtiene * b, lo que significa ir allí. 762 00:39:36,910 --> 00:39:39,310 Y eso significa poner el valor a allí. 763 00:39:39,310 --> 00:39:43,670 Finalmente, la última línea de código simplemente dijo * b consigue tmp. 764 00:39:43,670 --> 00:39:48,900 >> Así b dice ir allí y sobrescribir con tmp, que, en este caso, va 765 00:39:48,900 --> 00:39:51,520 ser, de nuevo, 1. 766 00:39:51,520 --> 00:39:54,920 Y esta es la razón por la versión verde de nuestro código funciona, mientras que el rojo 767 00:39:54,920 --> 00:39:56,010 versión nunca lo hizo. 768 00:39:56,010 --> 00:39:59,020 Todo simplemente se reduce a cómo el la memoria se gestiona y donde es 769 00:39:59,020 --> 00:40:02,580 efectivamente despachado a su la memoria RAM del ordenador. 770 00:40:02,580 --> 00:40:07,270 Y por ahora, eso es una de las cosas de que la pila se está utilizando para. 771 00:40:07,270 --> 00:40:09,225 >> Preguntas sobre el diseño? 772 00:40:09,225 --> 00:40:10,380 En los punteros? 773 00:40:10,380 --> 00:40:11,630 O el intercambio? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Muy bien, así que malloc, recordar, hizo algo como esto. 776 00:40:17,043 --> 00:40:18,260 Este fue un ejemplo muy simple. 777 00:40:18,260 --> 00:40:20,550 Y este fue el que Binky nos presentó a, aunque bastante 778 00:40:20,550 --> 00:40:21,870 rápidamente, al final de la clase. 779 00:40:21,870 --> 00:40:24,480 Maldita sea, aquí vamos de nuevo. 780 00:40:24,480 --> 00:40:28,780 >> Así que recuerda que este fue el ejemplo que Binky nos presentó, aunque 781 00:40:28,780 --> 00:40:30,360 algo rápidamente al final de la clase. 782 00:40:30,360 --> 00:40:33,640 Y aquí hemos utilizado malloc realmente para el segundo tiempo. 783 00:40:33,640 --> 00:40:37,330 Debido a que la primera vez que lo usamos para crear suficiente RAM, asignar suficiente memoria RAM 784 00:40:37,330 --> 00:40:38,340 para almacenar una cadena. 785 00:40:38,340 --> 00:40:40,250 >> Esta vez Binky mantuvo simple. 786 00:40:40,250 --> 00:40:42,465 Así que es sólo para almacenar un int, al parecer. 787 00:40:42,465 --> 00:40:43,510 Y eso es totalmente bien. 788 00:40:43,510 --> 00:40:46,560 Es un poco raro, francamente, a utilizar malloc para asignar un int. 789 00:40:46,560 --> 00:40:50,650 Pero el punto de animación con plastilina de Nick era realmente sólo contar la historia de lo que 790 00:40:50,650 --> 00:40:53,830 sucede o no sucede cuando maltratas memoria. 791 00:40:53,830 --> 00:40:56,520 >> Así que en este caso, este programa hizo un par de cosas. 792 00:40:56,520 --> 00:41:01,580 En el primer caso, aquí, declara un puntero llamado x para un int. 793 00:41:01,580 --> 00:41:04,480 A continuación, se declara un puntero llamada y de un int. 794 00:41:04,480 --> 00:41:06,150 A continuación, almacena en x, ¿qué? 795 00:41:06,150 --> 00:41:07,110 Otra persona ahora. 796 00:41:07,110 --> 00:41:09,685 Lo que se almacena en x de acuerdo con la tercera línea de este programa? 797 00:41:09,685 --> 00:41:12,380 >> AUDIENCIA: [inaudible]. 798 00:41:12,380 --> 00:41:14,130 >> ALTAVOZ 1: Bueno, no del todo bytes, por ejemplo. 799 00:41:14,130 --> 00:41:16,760 Sea más preciso ahora. 800 00:41:16,760 --> 00:41:18,325 Lo que se almacena en x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Una dirección, creo que lo escuché. 803 00:41:22,060 --> 00:41:23,570 >> Entonces, ¿qué volver malloc? 804 00:41:23,570 --> 00:41:26,030 malloc asigna conductualmente un trozo de memoria. 805 00:41:26,030 --> 00:41:27,850 Pero ¿cómo se dará acceso a ella? 806 00:41:27,850 --> 00:41:29,460 Devuelve qué? 807 00:41:29,460 --> 00:41:32,000 La dirección del primer byte en el bloque de memoria. 808 00:41:32,000 --> 00:41:33,020 >> Ahora, esto es muy simple. 809 00:41:33,020 --> 00:41:35,380 Es sólo un byte, es decir, la dirección que estamos recibiendo de vuelta es la 810 00:41:35,380 --> 00:41:37,300 dirección de todo el asunto. 811 00:41:37,300 --> 00:41:42,070 Así almacenado en x entonces, es la dirección de ese trozo de memoria. 812 00:41:42,070 --> 00:41:43,400 Mientras tanto, ¿qué pasa después? 813 00:41:43,400 --> 00:41:45,890 Así que en realidad, vamos a seguir adelante y alargar esto muy rápido. 814 00:41:45,890 --> 00:41:52,490 >> Así que si vamos a la pantalla aquí y jugamos esto int * x e int * y 815 00:41:52,490 --> 00:41:53,740 que va a hacer lo que para mí? 816 00:41:53,740 --> 00:41:58,280 Yo sostengo que sólo va a hacer algo como esto y llamarlo x, y 817 00:41:58,280 --> 00:42:00,010 esto y lo llaman y. 818 00:42:00,010 --> 00:42:03,110 Mientras tanto, la tercera línea de código es va a asignar el tamaño de un int, 819 00:42:03,110 --> 00:42:06,160 que pasa a ser - lo siento si dije uno antes me refería a uno int - 820 00:42:06,160 --> 00:42:08,280 cuatro bytes en un ordenador típico. 821 00:42:08,280 --> 00:42:09,720 Por lo menos con el aparato CS50. 822 00:42:09,720 --> 00:42:11,490 >> Así que esto va a asignar , ¿quién sabe? 823 00:42:11,490 --> 00:42:12,800 En algún lugar por aquí. 824 00:42:12,800 --> 00:42:15,780 Y esto se almacena en algún abordar buey, ¿quién sabe? 825 00:42:15,780 --> 00:42:18,330 Pero, ¿qué va a quedar vuelto es esa dirección. 826 00:42:18,330 --> 00:42:22,270 Pero vamos a dibujar este pictóricamente tan sólo una flecha así. 827 00:42:22,270 --> 00:42:25,430 >> Ahora, en la siguiente línea * x obtiene 42. 828 00:42:25,430 --> 00:42:29,400 ¿Qué * x significa en términos simples? 829 00:42:29,400 --> 00:42:30,040 Sólo tienes que ir allí. 830 00:42:30,040 --> 00:42:30,960 Ir a esa dirección. 831 00:42:30,960 --> 00:42:35,900 O en otras palabras, seguir la flecha y poner 42 allí. 832 00:42:35,900 --> 00:42:38,140 Pero entonces algo malo ha pasado a Binky, ¿verdad? 833 00:42:38,140 --> 00:42:43,950 >> Recordemos que la línea cinco aquí, * y consigue 13, de hecho, un número de mala suerte, 834 00:42:43,950 --> 00:42:44,760 hizo lo que para nosotros? 835 00:42:44,760 --> 00:42:47,320 Bueno, * y significa ir allí. 836 00:42:47,320 --> 00:42:50,460 Bueno, esto no se ha dado un valor todavía, ¿verdad? 837 00:42:50,460 --> 00:42:54,090 El código no tiene siendo y inicializado a nada. 838 00:42:54,090 --> 00:42:56,120 Habíamos x está inicializado a una dirección. 839 00:42:56,120 --> 00:42:57,640 Pero y fue declarado arriba. 840 00:42:57,640 --> 00:43:00,250 Pero entonces, un punto y coma, sin valor fue en realidad poner en él. 841 00:43:00,250 --> 00:43:02,330 Así que es justo decir que esta un valor basura. 842 00:43:02,330 --> 00:43:03,430 ¿Quién sabe lo que hay allí? 843 00:43:03,430 --> 00:43:07,160 Son los restos de los bits que se utilizaron por alguna línea de código anterior en 844 00:43:07,160 --> 00:43:08,300 mi programa. 845 00:43:08,300 --> 00:43:13,250 >> Así que si me dicen que vaya allí, esto es como, No tengo ni idea de donde esta flecha es 846 00:43:13,250 --> 00:43:14,490 va a terminar. 847 00:43:14,490 --> 00:43:17,720 Y ahí es cuando normalmente conseguir un fallo de segmentación. 848 00:43:17,720 --> 00:43:22,430 Si accidentalmente eliminar la referencia, por lo que hablar, o ir a una dirección que no es 849 00:43:22,430 --> 00:43:25,400 en realidad una dirección legítima, suceden cosas malas. 850 00:43:25,400 --> 00:43:27,550 >> Y eso es exactamente lo que sucedió pensar Binky. 851 00:43:27,550 --> 00:43:31,060 Así que recordar que la historia que Nick estaba diciendo aquí fue la misma idea que lo 852 00:43:31,060 --> 00:43:34,050 He dibujado con la ilusión de tiza en el tablero allí. 853 00:43:34,050 --> 00:43:35,960 X e Y se declaran. 854 00:43:35,960 --> 00:43:39,690 >> Entonces asignamos el tamaño de un int y almacenado en x. 855 00:43:39,690 --> 00:43:42,130 A continuación, la siguiente línea nos hizo * x. 856 00:43:42,130 --> 00:43:46,070 Esta fue la varita mágica de Nick de eliminación de referencias. 857 00:43:46,070 --> 00:43:49,780 Eso puso 42 en la memoria señalado por x. 858 00:43:49,780 --> 00:43:51,600 >> Pero aquí es donde las cosas salió horriblemente mal. 859 00:43:51,600 --> 00:43:51,820 ¿Cierto? 860 00:43:51,820 --> 00:43:53,550 Hemos tratado de eliminar la referencia y. 861 00:43:53,550 --> 00:43:55,620 Pero y tenía algún valor falso, ¿no? 862 00:43:55,620 --> 00:43:57,720 >> Esa flecha en la parte inferior izquierda esquina, no es 863 00:43:57,720 --> 00:43:58,950 en realidad apunta a nada. 864 00:43:58,950 --> 00:44:01,520 Es una especie de hacer lo que no aquí en el tablero. 865 00:44:01,520 --> 00:44:05,900 Así que las cosas malas le suceden, la segmentación criticar o culpa Binky, en este caso. 866 00:44:05,900 --> 00:44:10,800 >> Pero si nos fijamos entonces que al hacer x consigue y ¿Cómo cambia la historia? 867 00:44:10,800 --> 00:44:15,760 Bueno, si lo hago x consigue y, eso es efectivamente lo mismo que decir 868 00:44:15,760 --> 00:44:19,235 sea ​​lo que sea, Ox-algo va a ser lo mismo aquí, 869 00:44:19,235 --> 00:44:20,080 Ox-algo. 870 00:44:20,080 --> 00:44:22,970 O pictóricamente dibujaremos una flecha. 871 00:44:22,970 --> 00:44:25,530 >> Así que aquí en el tablero con Binky, con la siguiente línea de 872 00:44:25,530 --> 00:44:28,350 código, * y significa ir allí. 873 00:44:28,350 --> 00:44:29,400 ¿Dónde hay? 874 00:44:29,400 --> 00:44:30,820 Significa por aquí. 875 00:44:30,820 --> 00:44:36,050 >> Y cuando nos ponemos al día que para ser 13 sólo implica ir y 876 00:44:36,050 --> 00:44:39,470 escritura 13 aquí ahora. 877 00:44:39,470 --> 00:44:44,130 Así que tal vez no completamente sencillo a primera vista. 878 00:44:44,130 --> 00:44:47,740 Pero para resumir y utilizar la misma jerga Binky que se utiliza aquí, así 879 00:44:47,740 --> 00:44:50,485 los dos primeros asignan los punteros, X e Y, pero no los pointees. 880 00:44:50,485 --> 00:44:54,750 Y no es un pointees término que se utiliza generalmente. 881 00:44:54,750 --> 00:44:56,120 Pero puntero absoluto es. 882 00:44:56,120 --> 00:44:59,200 Pero es lo que se señaló en en la nomenclatura de Binky. 883 00:44:59,200 --> 00:45:01,660 >> Esta línea siguiente, por supuesto, asigna un int pointee. 884 00:45:01,660 --> 00:45:04,840 Así que un trozo de memoria - como dibujé sobre el el lado derecho allí - y establecer 885 00:45:04,840 --> 00:45:06,470 x igual a apuntar a la misma. 886 00:45:06,470 --> 00:45:11,350 Esto elimina referencia x para almacenar 42 en la memoria que se está apuntando a. 887 00:45:11,350 --> 00:45:13,380 Y a continuación, esto, por supuesto, era una cosa mala. 888 00:45:13,380 --> 00:45:15,600 Porque y no apuntaba en nada. 889 00:45:15,600 --> 00:45:16,530 Esto lo arregla. 890 00:45:16,530 --> 00:45:18,240 Así que esto es todavía programa defectuoso. 891 00:45:18,240 --> 00:45:21,580 El hecho de que estamos soplando a través de la código línea por línea y decir, bueno, 892 00:45:21,580 --> 00:45:22,690 deja que choque allí. 893 00:45:22,690 --> 00:45:23,420 Eso es una mala cosa. 894 00:45:23,420 --> 00:45:26,790 Las probabilidades son el programa sólo va a abortar por completo en esa línea. 895 00:45:26,790 --> 00:45:30,550 Pero si usted fuera a quitar el estrellado línea y sustituirla por los dos últimos 896 00:45:30,550 --> 00:45:32,470 líneas allí se asignan - 897 00:45:32,470 --> 00:45:35,310 mediante la asignación de puntero - y para que apunte a x como punto t. 898 00:45:35,310 --> 00:45:39,280 Y luego deja de hacer referencia Y de una manera muy segura. 899 00:45:39,280 --> 00:45:41,520 >> Entonces, ¿dónde nos deja esto? 900 00:45:41,520 --> 00:45:45,350 Bueno, resulta que debajo de la capucha en la biblioteca CS50, los punteros son 901 00:45:45,350 --> 00:45:46,320 utilizado a lo largo. 902 00:45:46,320 --> 00:45:48,910 Y que realmente comenzaremos a pelar copias de esa capa en poco tiempo. 903 00:45:48,910 --> 00:45:51,740 Pero resulta también, una expresión que algunos de ustedes podrían estar familiarizados con, 904 00:45:51,740 --> 00:45:54,580 en particular los más cómodo, es en realidad el de una muy popular 905 00:45:54,580 --> 00:45:56,390 sitio web, o de desbordamiento de pila, estos días. 906 00:45:56,390 --> 00:45:58,720 >> Pero esto en realidad tiene muy significado técnico. 907 00:45:58,720 --> 00:46:00,160 Ahora sabemos lo que una pila sea. 908 00:46:00,160 --> 00:46:02,550 Es como una pila de bandejas el interior de un comedor. 909 00:46:02,550 --> 00:46:05,140 >> O en el interior de su equipo de memoria sus dichos fotogramas 910 00:46:05,140 --> 00:46:06,900 que son utilizados por funciones. 911 00:46:06,900 --> 00:46:10,760 Bueno, resulta que, debido a que muy simple implementación de 912 00:46:10,760 --> 00:46:14,970 la memoria y los marcos en la llamada pila, usted puede tomar el control 913 00:46:14,970 --> 00:46:17,050 de un sistema informático con bastante facilidad. 914 00:46:17,050 --> 00:46:22,180 Usted puede cortar en un sistema si la gente como nosotros no hemos escrito nuestro código 915 00:46:22,180 --> 00:46:23,300 particularmente bien. 916 00:46:23,300 --> 00:46:26,670 >> Si la gente como nosotros utilizan trozos Memoria o el uso de matrices - 917 00:46:26,670 --> 00:46:27,810 incluso más comúnmente - 918 00:46:27,810 --> 00:46:31,800 pero a veces se olvide de comprobar la límites de nuestra gama como puede ser que 919 00:46:31,800 --> 00:46:38,470 tiene usted mismo a veces, y repetida demasiado lejos más allá del final de una matriz. 920 00:46:38,470 --> 00:46:40,520 En el mejor de los casos, el programa de sólo podría bloquearse. 921 00:46:40,520 --> 00:46:42,280 Fallo de segmentación, tipo vergonzoso. 922 00:46:42,280 --> 00:46:45,480 No es genial, pero no es necesariamente una enorme mala cosa. 923 00:46:45,480 --> 00:46:49,480 >> Pero si el programa es en realidad el verdadero equipos de los usuarios, si se está ejecutando 924 00:46:49,480 --> 00:46:53,070 en un sitio web que la gente al azar reales en el Internet están golpeando, dejando 925 00:46:53,070 --> 00:46:56,690 personas inducen cosas malas en su código es en general, no es una buena cosa porque 926 00:46:56,690 --> 00:46:59,930 que significa una oportunidad para tomar el control del equipo. 927 00:46:59,930 --> 00:47:01,350 Y esto se va a ver un poco críptico. 928 00:47:01,350 --> 00:47:04,570 Pero pensé que te gustaría asusto con este último ejemplo aquí. 929 00:47:04,570 --> 00:47:05,650 >> He aquí un ejemplo de código. 930 00:47:05,650 --> 00:47:07,370 Y hay una buena Wikipedia artículo que camina a través de 931 00:47:07,370 --> 00:47:08,530 esto con más detalle. 932 00:47:08,530 --> 00:47:13,890 Tengo principal en la parte inferior de llamada foo, pasando argv de 1. 933 00:47:13,890 --> 00:47:15,750 Y eso es sólo para que pueda ejecutar el programa y pasar 934 00:47:15,750 --> 00:47:17,080 una entrada arbitraria. 935 00:47:17,080 --> 00:47:20,180 >> Y entonces foo es declarado encima de la tapa como la aceptación de una cadena, o más 936 00:47:20,180 --> 00:47:21,700 precisamente, un char *. 937 00:47:21,700 --> 00:47:23,860 A continuación, declara una matriz de caracteres. 938 00:47:23,860 --> 00:47:27,130 Llame a un tampón, más en general, de tamaño 12. 939 00:47:27,130 --> 00:47:30,900 Así que 12 caracteres pueden caber dentro de esa matriz llamada c. 940 00:47:30,900 --> 00:47:33,510 >> Y a continuación, utiliza esta nueva función, que es nuevo, pero no es difícil de 941 00:47:33,510 --> 00:47:34,930 entender, copia de la memoria. 942 00:47:34,930 --> 00:47:39,290 Se copia la memoria del bar, que era el pasado n variables, sea cual sea el 943 00:47:39,290 --> 00:47:42,080 usuario escribió en argv 1 en c. 944 00:47:42,080 --> 00:47:43,090 ¿Cuántos 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 >> Así, en otras palabras, si el usuario escribe en h-e-l-l-o entrar, la longitud de la cadena 947 00:47:48,380 --> 00:47:49,260 hola es de cinco. 948 00:47:49,260 --> 00:47:52,790 Así que cinco de esos bytes se va a poner copia en la matriz llamada c, que 949 00:47:52,790 --> 00:47:54,110 es de tamaño 12. 950 00:47:54,110 --> 00:47:58,710 Pero lo que el usuario escribe en un mucho más tiempo palabra que es 13 caracteres o 14 951 00:47:58,710 --> 00:48:01,250 caracteres o 100 caracteres o más? 952 00:48:01,250 --> 00:48:02,660 >> ¿A dónde van a ir? 953 00:48:02,660 --> 00:48:06,090 Bueno, ese marco, dicha bandeja en la pila de comedor-sala, 954 00:48:06,090 --> 00:48:06,930 que van a ir allí. 955 00:48:06,930 --> 00:48:10,080 Y sólo va a empezar a sobrescribir otras cosas que ya está 956 00:48:10,080 --> 00:48:12,880 en la pila, desbordando la pila, por así decirlo. 957 00:48:12,880 --> 00:48:14,780 >> Así pictóricamente, creo que de esta manera. 958 00:48:14,780 --> 00:48:17,970 Esto es sólo una versión colorida de la imagen que hemos venido señalando. 959 00:48:17,970 --> 00:48:20,060 En la parte inferior, digamos, es principal. 960 00:48:20,060 --> 00:48:24,690 Y en la parte superior, lo que estamos viendo ahora es el marco, color codificados ahora, para un 961 00:48:24,690 --> 00:48:26,090 función llamada foo. 962 00:48:26,090 --> 00:48:30,170 Pero lo que es interesante aquí sobre foo es que aquí es su marco. 963 00:48:30,170 --> 00:48:32,860 Así se dibuja al igual que yo lo hizo, pero en color azul claro. 964 00:48:32,860 --> 00:48:35,220 Y ahora, este es el lugar donde c abrazadera 0 va. 965 00:48:35,220 --> 00:48:37,410 Y aquí es donde el soporte c 11 va a terminar. 966 00:48:37,410 --> 00:48:39,670 >> En otras palabras, se pasa a ser representado como un cuadrado. 967 00:48:39,670 --> 00:48:42,320 Pero si te quedas plopping bytes abajo - o caracteres - que van a terminar 968 00:48:42,320 --> 00:48:46,070 hasta en la ubicación 0 hasta el final hasta a 11 porque es 0 indexada. 969 00:48:46,070 --> 00:48:49,170 >> Pero ¿dónde está el carácter 13 va a terminar? 970 00:48:49,170 --> 00:48:50,310 ¿Dónde está el 14? 971 00:48:50,310 --> 00:48:52,430 ¿Dónde está el carácter número 50 va a terminar? 972 00:48:52,430 --> 00:48:54,070 >> Se va a seguir bajando. 973 00:48:54,070 --> 00:48:57,350 Porque a pesar de que hemos llamado la Imagen con la pila de crecer, la 974 00:48:57,350 --> 00:48:59,920 direcciones, resulta que van desde direcciones pequeñas, pequeñas 975 00:48:59,920 --> 00:49:01,830 punteros, a las direcciones de los grandes. 976 00:49:01,830 --> 00:49:03,540 Por lo tanto, sólo sigue subiendo y subiendo. 977 00:49:03,540 --> 00:49:05,660 >> Así que si el usuario teclea hola, eso es genial. 978 00:49:05,660 --> 00:49:08,650 No bug, no hay problema, todo el mundo está a salvo. 979 00:49:08,650 --> 00:49:11,940 Pero si el usuario escribe en lo que vamos a llamar a código acusatorio, representada 980 00:49:11,940 --> 00:49:16,040 genéricamente como, ataque, ataque, ataque, ataque, ¿qué puede pasar? 981 00:49:16,040 --> 00:49:19,760 >> Bueno, si todo de la entrada que el usuario tecleado no es sólo un amistoso 982 00:49:19,760 --> 00:49:21,540 o una cadena de caracteres ofensiva. 983 00:49:21,540 --> 00:49:24,050 En realidad es una secuencia de caracteres que si lo compiló, 984 00:49:24,050 --> 00:49:26,050 lo que realmente es el código. 985 00:49:26,050 --> 00:49:29,570 Tal vez es el código que se borren todos los archivos en su disco duro o envía correo no deseado 986 00:49:29,570 --> 00:49:30,810 o algo por el estilo. 987 00:49:30,810 --> 00:49:35,110 Tenga en cuenta que lo que es clave aquí es que si el malo de la película tiene la suerte de 988 00:49:35,110 --> 00:49:37,830 sobreescribir el trozo rojo de la memoria - 989 00:49:37,830 --> 00:49:41,080 lo que no me baso en mi imagen, pero esta foto Wikipedia tiene aquí - 990 00:49:41,080 --> 00:49:42,890 su llamada remite. 991 00:49:42,890 --> 00:49:47,470 >> Cuando vuelve la comida, cuando regrese el swap, ¿cómo sabe el ordenador para ir de 992 00:49:47,470 --> 00:49:49,790 aquí a aquí abajo? 993 00:49:49,790 --> 00:49:52,920 O en el segmento de tecnología por encima, ¿cómo Cómo sabe que ir a la permuta 994 00:49:52,920 --> 00:49:54,870 código - del 0 y el 1 de que canje de redacción - 995 00:49:54,870 --> 00:49:56,020 Regresar al Principal? 996 00:49:56,020 --> 00:50:00,450 Hay una llamada dirección de retorno almacenada en el mismo marco de pila, en 997 00:50:00,450 --> 00:50:02,140 la misma bandeja de cafetería. 998 00:50:02,140 --> 00:50:06,080 >> Así que si el malo de la película es lo suficientemente inteligente como para poner código de ataque, el código de ataque, ataque 999 00:50:06,080 --> 00:50:07,960 código, y obtener la suerte - 1000 00:50:07,960 --> 00:50:11,630 a menudo a través de ensayo y error - a sobrescribir ese remitente rojo, 1001 00:50:11,630 --> 00:50:14,360 con la dirección y el aviso la parte superior. 1002 00:50:14,360 --> 00:50:16,830 Observe 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Ha escrito al revés encima de la tapa para razones por las que van quizás vuelven a visitar. 1004 00:50:20,650 --> 00:50:22,050 Este es ese número. 1005 00:50:22,050 --> 00:50:25,790 >> Así que si el malo de la película se pone la suerte o es lo suficientemente inteligente como para sobrescribir el rojo 1006 00:50:25,790 --> 00:50:29,480 tira de memoria con la dirección de código que él o ella tiene de alguna manera 1007 00:50:29,480 --> 00:50:34,980 inyectado en su computadora, adivinar cuya código va a ser devuelto a 1008 00:50:34,980 --> 00:50:38,260 tan pronto como foo se realiza la ejecución? 1009 00:50:38,260 --> 00:50:39,440 >> Lo malo del código tipo. 1010 00:50:39,440 --> 00:50:43,610 Así que este código de ataque, AAA, de nuevo, podría enviar correo no deseado, podría eliminar todos los archivos 1011 00:50:43,610 --> 00:50:44,500 en su disco duro. 1012 00:50:44,500 --> 00:50:48,740 Pero eso es lo verdaderamente un desbordamiento de pila es, o un desbordamiento de búfer, o una 1013 00:50:48,740 --> 00:50:51,060 ataque de desbordamiento de búfer. 1014 00:50:51,060 --> 00:50:54,400 >> Y es muy, muy común a este día con programas escritos en 1015 00:50:54,400 --> 00:50:58,220 C, C + +, e incluso algunos otros idiomas. 1016 00:50:58,220 --> 00:51:02,275 En ese sentido miedo, vamos a terminar con una broma. 1017 00:51:02,275 --> 00:51:03,230 >> [Risas] 1018 00:51:03,230 --> 00:51:04,550 >> Nos vemos el miércoles. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 En la siguiente CS50 - 1021 00:51:10,310 --> 00:51:15,920 Así que me he quedado sin lámparas disco hoy, pero esperar, leche sin grasa, media el teléfono 1022 00:51:15,920 --> 00:51:17,850 libro, el jugo de naranja que bebí hoy. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Cable USB, una llave inglesa. 1025 00:51:22,780 --> 00:51:24,800 >> [REPRODUCCIÓN DE MÚSICA]