1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [REPRODUCCIÓN DE MÚSICA] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK por lo que una sugerencia antes de comenzar aquí. 5 00:00:07,940 --> 00:00:11,660 Si no has visto el video en Punteros es posible que desee hacerlo primero. 6 00:00:11,660 --> 00:00:15,860 Debido a que este es otro de vídeo forma de trabajar con punteros. 7 00:00:15,860 --> 00:00:17,574 >> Así que va a hablar sobre algunos conceptos 8 00:00:17,574 --> 00:00:19,490 que cubrimos en el punteros de vídeo, y estamos 9 00:00:19,490 --> 00:00:21,948 va a pasar por encima de ellos ahora, asumiendo que ya están 10 00:00:21,948 --> 00:00:23,090 tipo de entendido. 11 00:00:23,090 --> 00:00:25,440 Así que eso es sólo su advertencia justa que si usted está viendo este vídeo 12 00:00:25,440 --> 00:00:27,814 y no se ha visto el vídeo punteros, podría especie de 13 00:00:27,814 --> 00:00:29,610 volar sobre su cabeza un poco. 14 00:00:29,610 --> 00:00:32,080 Y por lo que podría ser mejor al verlo en ese orden. 15 00:00:32,080 --> 00:00:34,710 >> Así que ya hemos visto uno manera de trabajar con los punteros, 16 00:00:34,710 --> 00:00:37,810 que es declaramos un variables, y luego 17 00:00:37,810 --> 00:00:42,160 declarar otra variable, un puntero variable que apunta a la misma. 18 00:00:42,160 --> 00:00:44,870 Para ello hemos creado una variable con un nombre, tenemos 19 00:00:44,870 --> 00:00:48,480 creado una segunda variable con un nombre, y señalamos que la segunda variable 20 00:00:48,480 --> 00:00:50,220 en ese primero. 21 00:00:50,220 --> 00:00:52,370 Este tipo de cuenta con un problema, sin embargo, debido a que 22 00:00:52,370 --> 00:00:54,650 nos obliga a saber exactamente la cantidad de memoria que estamos 23 00:00:54,650 --> 00:00:57,600 va a necesitar el momento nuestro programa es compilado. 24 00:00:57,600 --> 00:00:58,220 >> ¿Porque es eso? 25 00:00:58,220 --> 00:01:03,338 Porque tenemos que ser capaces de nombrar o identificar todas las posibles variables 26 00:01:03,338 --> 00:01:04,129 podríamos encontrar. 27 00:01:04,129 --> 00:01:07,910 Puede ser que tengamos una serie que podría ser capaz de mantener una gran cantidad de información, 28 00:01:07,910 --> 00:01:10,110 pero todavía no es exactamente lo suficientemente preciso. 29 00:01:10,110 --> 00:01:12,640 ¿Qué pasa si no sabemos, ¿y si no tenemos ni idea 30 00:01:12,640 --> 00:01:14,370 cuánto vamos a necesitar en tiempo de compilación? 31 00:01:14,370 --> 00:01:17,020 ¿O qué si nuestro programa lo hará correr por un tiempo muy largo, 32 00:01:17,020 --> 00:01:19,810 aceptando varios usuarios de datos, y no podemos realmente 33 00:01:19,810 --> 00:01:23,170 Estimamos si somos va a necesitar 1.000 unidades? 34 00:01:23,170 --> 00:01:26,060 >> No es que podamos decir en la línea de comandos 35 00:01:26,060 --> 00:01:28,040 introducir el número de artículos usted piensa que usted necesita. 36 00:01:28,040 --> 00:01:31,100 Bueno, ¿y si esa suposición no es correcta? 37 00:01:31,100 --> 00:01:34,300 Asignación de memoria dinámica tipo de nos permite el camino 38 00:01:34,300 --> 00:01:36,867 para evitar este problema en particular. 39 00:01:36,867 --> 00:01:38,700 Y la forma en que lo hace es mediante el uso de punteros. 40 00:01:38,700 --> 00:01:42,140 >> Podemos utilizar punteros a obtener acceso a dinámicamente 41 00:01:42,140 --> 00:01:45,710 memoria asignada, la memoria que es asignado como su programa se está ejecutando. 42 00:01:45,710 --> 00:01:48,290 No es asignado en tiempo de compilación. 43 00:01:48,290 --> 00:01:51,570 Al asignar dinámicamente memoria se trata de una pila 44 00:01:51,570 --> 00:01:53,795 de la memoria conocido como el montón. 45 00:01:53,795 --> 00:01:56,420 Anteriormente toda la memoria que hemos estado trabajando con en el curso 46 00:01:56,420 --> 00:01:59,920 ha estado viniendo de una piscina de la memoria conocida como la pila. 47 00:01:59,920 --> 00:02:02,470 Una buena manera de general tener en mente-- y esta regla 48 00:02:02,470 --> 00:02:04,720 no siempre ser verdad, pero casi casi 49 00:02:04,720 --> 00:02:09,940 Siempre vale cierto-- es que cualquier vez que das un nombre de variable que 50 00:02:09,940 --> 00:02:12,090 probablemente vive en la pila. 51 00:02:12,090 --> 00:02:14,650 Y en cualquier momento que no lo hacen dar a una variable un nombre, 52 00:02:14,650 --> 00:02:19,160 que se puede ver con la memoria dinámica la asignación, que vive en el montón. 53 00:02:19,160 --> 00:02:22,190 >> Ahora estoy un poco de presentar esto como si hay estas dos piscinas de memoria. 54 00:02:22,190 --> 00:02:24,740 Pero es posible que haya visto este diagrama, que es generalmente 55 00:02:24,740 --> 00:02:27,290 una representación de lo que la memoria se parece, 56 00:02:27,290 --> 00:02:30,373 y no vamos a preocuparse por todo las cosas en la parte superior y la parte inferior. 57 00:02:30,373 --> 00:02:33,580 Lo que nos importa es esta parte de el medio aquí, pila y pila. 58 00:02:33,580 --> 00:02:35,570 Como se puede ver por mirando este diagrama, 59 00:02:35,570 --> 00:02:38,390 estos en realidad no son dos piscinas separadas de la memoria. 60 00:02:38,390 --> 00:02:42,757 Es una piscina compartida de la memoria donde se inicia, en este visual 61 00:02:42,757 --> 00:02:44,590 se inicia en la parte inferior y empezar a llenar 62 00:02:44,590 --> 00:02:48,040 desde el fondo con la pila, y se comenzar en la parte superior y empezar a llenar 63 00:02:48,040 --> 00:02:50,072 de arriba hacia abajo con el montón. 64 00:02:50,072 --> 00:02:51,780 Pero lo que realmente es la mismo grupo, es sólo 65 00:02:51,780 --> 00:02:56,050 diferentes puntos, diferentes ubicaciones en la memoria que se están asignado. 66 00:02:56,050 --> 00:02:59,060 Y usted puede quedarse sin memoria ya sea por tener 67 00:02:59,060 --> 00:03:01,240 el montón de ir todo el camino a la parte inferior, o tienen 68 00:03:01,240 --> 00:03:05,440 la pila de ir todo el camino hasta la cima, o que tengan el heap y la pila 69 00:03:05,440 --> 00:03:06,740 reunirse cara a cara. 70 00:03:06,740 --> 00:03:09,500 Todos los que puede haber condiciones que hacen que su programa 71 00:03:09,500 --> 00:03:11,030 que se quede sin memoria. 72 00:03:11,030 --> 00:03:11,952 Así que tenlo en mente. 73 00:03:11,952 --> 00:03:13,660 Cuando hablamos de la pila y la pila 74 00:03:13,660 --> 00:03:17,880 realmente estamos hablando de la mismo trozo general de la memoria, simplemente 75 00:03:17,880 --> 00:03:21,930 diferentes porciones de esa memoria. 76 00:03:21,930 --> 00:03:24,910 >> Entonces, ¿cómo hacemos para que de forma dinámica asignado memoria en el primer lugar? 77 00:03:24,910 --> 00:03:27,740 ¿Cómo funciona nuestro programa llegar la memoria como se está ejecutando? 78 00:03:27,740 --> 00:03:32,660 Bueno C proporciona una función llamada malloc, asignador de memoria, lo que 79 00:03:32,660 --> 00:03:36,810 usted hace una llamada a, y se pasa en cuántos bytes de memoria que desee. 80 00:03:36,810 --> 00:03:39,940 Así que si su programa se está ejecutando y quieres un tiempo de ejecución de enteros, 81 00:03:39,940 --> 00:03:46,040 es posible que Mallock cuatro bytes de memoria, malloc paréntesis cuatro. 82 00:03:46,040 --> 00:03:48,540 >> Mallock pasará por mirando a través de la pila, 83 00:03:48,540 --> 00:03:50,750 porque somos dinámicamente la asignación de memoria, 84 00:03:50,750 --> 00:03:53,500 y volverá a usted un puntero a la memoria. 85 00:03:53,500 --> 00:03:56,180 No te da que memory-- no da un nombre, 86 00:03:56,180 --> 00:03:57,950 que le da un puntero a él. 87 00:03:57,950 --> 00:04:00,780 Y por eso otra vez he dicho que es importante que tal vez 88 00:04:00,780 --> 00:04:03,770 han visto el video punteros antes de llegar demasiado lejos en esto. 89 00:04:03,770 --> 00:04:05,940 Así malloc va a va a devolver un puntero. 90 00:04:05,940 --> 00:04:08,950 >> Si Mallock no puede darle ninguna memoria porque se le han acabado, 91 00:04:08,950 --> 00:04:10,645 que voy a dar vuelta un puntero nulo. 92 00:04:10,645 --> 00:04:15,282 ¿Te acuerdas de lo que ocurre si tratar de eliminar la referencia a un puntero nulo? 93 00:04:15,282 --> 00:04:17,019 Sufrimos un fallo seg, ¿verdad? 94 00:04:17,019 --> 00:04:18,060 Eso probablemente no es bueno. 95 00:04:18,060 --> 00:04:21,579 >> Así que cada vez que realice una llamada a malloc que siempre, siempre, 96 00:04:21,579 --> 00:04:25,270 que comprobar si el puntero se lo dio vuelta es nulo. 97 00:04:25,270 --> 00:04:28,800 Si es así, usted necesita para poner fin a su programa porque si tratas de eliminar la referencia 98 00:04:28,800 --> 00:04:31,360 el puntero nulo vas Hubo un fallo de segmentación 99 00:04:31,360 --> 00:04:34,380 y su programa es yendo a estrellarse todos modos. 100 00:04:34,380 --> 00:04:37,190 Entonces, ¿cómo hacer que estáticamente obtener un número entero? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Probablemente nos hemos hecho un montón de veces, ¿verdad? 103 00:04:40,010 --> 00:04:43,480 Esto crea una variable llamada X que vive en la pila. 104 00:04:43,480 --> 00:04:46,190 ¿Cómo obtenemos dinámicamente un número entero? 105 00:04:46,190 --> 00:04:50,010 Int estrellas px equivale malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> O más apropiadamente diríamos int estrellas px 107 00:04:53,050 --> 00:04:57,680 igual tamaño malloc de int, sólo para arrojar algo menos 108 00:04:57,680 --> 00:04:59,740 números mágicos de todo nuestro programa. 109 00:04:59,740 --> 00:05:04,140 Esto va a obtener para nosotros cuatro bytes de memoria de la pila, 110 00:05:04,140 --> 00:05:06,720 y el puntero obtenemos de nuevo a él se llama px. 111 00:05:06,720 --> 00:05:08,430 Y a continuación, al igual que nosotros hemos hecho previamente nos 112 00:05:08,430 --> 00:05:13,966 puede eliminar la referencia a px acceder a esa memoria. 113 00:05:13,966 --> 00:05:15,590 ¿Cómo conseguimos un número entero de usuario? 114 00:05:15,590 --> 00:05:17,970 Podemos decir int x es igual a llegar int. 115 00:05:17,970 --> 00:05:19,930 Eso es bastante sencillo. 116 00:05:19,930 --> 00:05:24,030 ¿Qué pasa si queremos crear una matriz de x carrozas que viven en la pila? 117 00:05:24,030 --> 00:05:28,210 flotar stack_array-- ese es el nombre de nuestros corchetes array-- x. 118 00:05:28,210 --> 00:05:32,419 Eso creará para nosotros un array de x carrozas que viven en la pila. 119 00:05:32,419 --> 00:05:34,960 Podemos crear una matriz de carrozas que vive en el montón, también. 120 00:05:34,960 --> 00:05:37,330 La sintaxis puede parecer un poco más engorroso, 121 00:05:37,330 --> 00:05:41,740 pero podemos decir flotador heap_array estrellas es igual 122 00:05:41,740 --> 00:05:44,360 tiempos malloc x el tamaño del flotador. 123 00:05:44,360 --> 00:05:48,160 Necesito espacio suficiente para almacenar x valores de punto flotante. 124 00:05:48,160 --> 00:05:51,560 Así que digo que necesito 100 carrozas, o 1.000 flotadores. 125 00:05:51,560 --> 00:05:54,810 Así que en ese caso sería 400 bytes para 100 carros alegóricos, 126 00:05:54,810 --> 00:05:59,080 o 4.000 bytes para 1.000 flotadores, porque cada flotador ocupa 127 00:05:59,080 --> 00:06:01,230 cuatro bytes de espacio. 128 00:06:01,230 --> 00:06:05,110 >> Después de hacer esto que puedo utilizar el sintaxis de corchete en heap_array. 129 00:06:05,110 --> 00:06:08,970 Del mismo modo que lo haría en stack_array, I puede acceder a sus elementos individualmente 130 00:06:08,970 --> 00:06:11,590 utilizando heap_array cero, uno heap_array. 131 00:06:11,590 --> 00:06:15,800 Pero recordar la razón por la que podemos hacer eso se debe a que el nombre de una matriz en C 132 00:06:15,800 --> 00:06:19,990 es realmente un puntero a primer elemento de la matriz. 133 00:06:19,990 --> 00:06:23,480 Así que el hecho de que estamos declarando una variedad de carrozas en la pila aquí 134 00:06:23,480 --> 00:06:24,810 en realidad es un poco engañoso. 135 00:06:24,810 --> 00:06:27,600 Realmente estamos en el segunda línea de código que hay 136 00:06:27,600 --> 00:06:32,360 También la creación de un puntero a un trozo de memoria que a continuación hacemos un poco de trabajo con. 137 00:06:32,360 --> 00:06:35,620 >> Aquí está el gran problema con asignada dinámicamente memoria, sin embargo, 138 00:06:35,620 --> 00:06:38,360 y es por eso que es muy importante desarrollar algunos buenos hábitos 139 00:06:38,360 --> 00:06:39,800 cuando se trabaja con él. 140 00:06:39,800 --> 00:06:43,060 A diferencia estáticamente declarada la memoria, la memoria 141 00:06:43,060 --> 00:06:46,790 no se devuelve automáticamente al sistema cuando su función se hace. 142 00:06:46,790 --> 00:06:49,280 Así que si tenemos principal, y principal llama a una función 143 00:06:49,280 --> 00:06:53,860 f, cuando f acabados lo que está haciendo y devuelve el control del programa 144 00:06:53,860 --> 00:06:58,810 volver al principal, toda la memoria que f utilizada se devuelve. 145 00:06:58,810 --> 00:07:01,250 Se puede utilizar de nuevo por algún otro programa, 146 00:07:01,250 --> 00:07:04,250 o alguna otra función que se vuelve a llamar más tarde en la principal. 147 00:07:04,250 --> 00:07:06,970 Puede utilizar esa misma memoria otra vez. 148 00:07:06,970 --> 00:07:09,620 >> Si dinámicamente asignar memoria aunque 149 00:07:09,620 --> 00:07:14,380 usted tiene que decirle explícitamente la sistema que haya terminado con él. 150 00:07:14,380 --> 00:07:18,370 Se va a aferrarse a él para usted, lo que podría conducir a un problema de ustedes corriendo 151 00:07:18,370 --> 00:07:19,290 de la memoria. 152 00:07:19,290 --> 00:07:22,179 Y, de hecho, a veces nos referimos a esto como una pérdida de memoria. 153 00:07:22,179 --> 00:07:24,970 Y a veces estas pérdidas de memoria en realidad puede ser muy devastador 154 00:07:24,970 --> 00:07:27,020 para el rendimiento del sistema. 155 00:07:27,020 --> 00:07:31,120 >> Si usted es un usuario frecuente de Internet podría utilizar ciertos navegadores web, 156 00:07:31,120 --> 00:07:35,630 y no voy a dar nombres aquí, pero hay algunos navegadores web por ahí 157 00:07:35,630 --> 00:07:39,150 que son conocidos por tener realmente pérdidas de memoria que no te fijas. 158 00:07:39,150 --> 00:07:44,570 Y si usted deja su navegador abierta para un período muy largo de tiempo, día 159 00:07:44,570 --> 00:07:48,060 y días, o semanas, a veces podría darse cuenta de que su sistema 160 00:07:48,060 --> 00:07:49,790 está funcionando muy, muy lentamente. 161 00:07:49,790 --> 00:07:54,640 Y la razón de ello es que el navegador ha asignado memoria, 162 00:07:54,640 --> 00:07:57,320 pero entonces no le dijo al sistema que se hace con ella. 163 00:07:57,320 --> 00:08:01,000 Y por lo que deja menos memoria disponible para todos sus otros programas 164 00:08:01,000 --> 00:08:04,480 a tener que compartir, porque eres leaking-- que navegador web 165 00:08:04,480 --> 00:08:06,755 programa tiene una fuga de memoria. 166 00:08:06,755 --> 00:08:08,880 ¿Cómo nos damos memoria de nuevo cuando hayamos terminado con ella? 167 00:08:08,880 --> 00:08:10,838 Bueno, afortunadamente, es un manera muy fácil de hacerlo. 168 00:08:10,838 --> 00:08:11,710 Nos liberamos ella. 169 00:08:11,710 --> 00:08:15,020 Hay una función llamada gratuita, acepta un puntero a la memoria, 170 00:08:15,020 --> 00:08:16,010 y estamos listo para salir. 171 00:08:16,010 --> 00:08:18,310 >> Así que digamos que estamos en el medio de nuestro programa, 172 00:08:18,310 --> 00:08:21,970 queremos malloc 50 caracteres. 173 00:08:21,970 --> 00:08:25,710 Queremos malloc una matriz que puede capaz de contener 50 caracteres. 174 00:08:25,710 --> 00:08:29,109 Y cuando lleguemos a un puntero de nuevo a que, el nombre de ese puntero es la palabra. 175 00:08:29,109 --> 00:08:30,900 Hacemos lo que somos va a hacer con la palabra, 176 00:08:30,900 --> 00:08:33,440 y luego, cuando estamos hecho que sólo liberamos ella. 177 00:08:33,440 --> 00:08:37,460 Y ahora que hemos vuelto los 50 bytes de la memoria de vuelta al sistema. 178 00:08:37,460 --> 00:08:40,147 Alguna otra función puede utilizarlos. 179 00:08:40,147 --> 00:08:43,480 Nosotros no tenemos que preocuparnos por sufrir una pérdida de memoria, ya hemos liberado palabra. 180 00:08:43,480 --> 00:08:46,639 Hemos dado a la memoria de nuevo, así que hemos terminado de trabajar con él. 181 00:08:46,639 --> 00:08:48,430 Así que hay tres reglas de oro que deben 182 00:08:48,430 --> 00:08:51,700 debe tenerse en cuenta siempre que esté asignación dinámica de memoria 183 00:08:51,700 --> 00:08:52,990 con malloc. 184 00:08:52,990 --> 00:08:56,480 Cada bloque de memoria que que malloc debe ser liberado 185 00:08:56,480 --> 00:08:58,430 antes de su programa acaba de correr. 186 00:08:58,430 --> 00:09:02,029 Ahora, de nuevo, en el aparato o en el IDE este tipo de pasa para usted de todos modos 187 00:09:02,029 --> 00:09:04,820 cuando usted-- esto va a suceder de todos modos cuando se termina el programa, 188 00:09:04,820 --> 00:09:06,880 toda la memoria se dará a conocer. 189 00:09:06,880 --> 00:09:10,750 Pero es en general buena codificación la práctica de siempre, cuando haya terminado, 190 00:09:10,750 --> 00:09:13,810 liberar lo que has mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Dicho esto, las únicas cosas que tienes mallocd debe ser liberado. 192 00:09:16,690 --> 00:09:19,880 Si se declara estáticamente un número entero, int x punto y coma, 193 00:09:19,880 --> 00:09:23,500 que vive en la pila, que no entonces querer liberar x. 194 00:09:23,500 --> 00:09:25,970 Así únicas cosas que usted ha mallocd debe ser liberado. 195 00:09:25,970 --> 00:09:28,960 >> Y por último, no hacer algo libre dos veces. 196 00:09:28,960 --> 00:09:31,170 Eso puede conducir a otra situación extraña. 197 00:09:31,170 --> 00:09:33,530 Así que todo lo que tienes mallocd tiene que ser liberado. 198 00:09:33,530 --> 00:09:36,000 Sólo las cosas que usted ha malloc debe ser liberado. 199 00:09:36,000 --> 00:09:38,730 Y no hacer algo libre dos veces. 200 00:09:38,730 --> 00:09:43,660 >> Así que vamos a ir a través de un ejemplo aquí de lo que algunos asignan dinámicamente 201 00:09:43,660 --> 00:09:46,122 la memoria podría ser similar mixta en con un poco de memoria estática. 202 00:09:46,122 --> 00:09:47,080 ¿Qué podría pasar aquí? 203 00:09:47,080 --> 00:09:48,913 Vea si usted puede seguir a lo largo y ¿adivinen qué es 204 00:09:48,913 --> 00:09:51,720 va a ocurrir a medida que avanzamos a través de todas estas líneas de código. 205 00:09:51,720 --> 00:09:53,980 >> Por eso decimos int m. 206 00:09:53,980 --> 00:09:54,840 ¿Qué pasa aquí? 207 00:09:54,840 --> 00:09:56,339 Bueno, esto es bastante sencillo. 208 00:09:56,339 --> 00:09:59,650 Creo una variable entera llamada m. 209 00:09:59,650 --> 00:10:01,400 Coloreo es verde, porque ese es el color 210 00:10:01,400 --> 00:10:03,730 que utilizo cuando estoy hablando sobre variables enteras. 211 00:10:03,730 --> 00:10:05,160 Es una caja. 212 00:10:05,160 --> 00:10:08,400 Se llama m, y se puede almacenar enteros en el interior de la misma. 213 00:10:08,400 --> 00:10:12,400 >> ¿Y si luego decir int estrellas una? 214 00:10:12,400 --> 00:10:13,530 Bueno, eso es bastante similar. 215 00:10:13,530 --> 00:10:15,780 Estoy creando una caja llamada. 216 00:10:15,780 --> 00:10:19,100 Es capaz de celebración int estrellas, los punteros a enteros. 217 00:10:19,100 --> 00:10:21,570 Así que estoy colorear de verde-ish también. 218 00:10:21,570 --> 00:10:24,140 >> Sé que tiene algo que ver con un entero, 219 00:10:24,140 --> 00:10:25,852 pero ella misma no es un entero. 220 00:10:25,852 --> 00:10:27,310 Pero es más o menos la misma idea. 221 00:10:27,310 --> 00:10:28,101 He creado una caja. 222 00:10:28,101 --> 00:10:30,070 Ambos derecho ahora viven en la pila. 223 00:10:30,070 --> 00:10:32,520 Yo les he dado dos nombres. 224 00:10:32,520 --> 00:10:36,750 >> int estrellas b es igual tamaño malloc de int. 225 00:10:36,750 --> 00:10:38,560 Éste podría ser un poco difícil. 226 00:10:38,560 --> 00:10:44,110 Tome un segundo y pensar en lo que sería esperar que suceda en este diagrama. 227 00:10:44,110 --> 00:10:50,210 int estrellas b es igual tamaño malloc de int. 228 00:10:50,210 --> 00:10:51,940 >> Bueno, esto no se limita a crear una caja. 229 00:10:51,940 --> 00:10:53,800 En realidad, esto crea dos cajas. 230 00:10:53,800 --> 00:10:58,670 Y se vincula, también establece un punto en una relación. 231 00:10:58,670 --> 00:11:02,240 Hemos asignado un bloque de la memoria en el montón. 232 00:11:02,240 --> 00:11:05,940 Observe que el cuadro de arriba a la derecha allí no tiene un nombre. 233 00:11:05,940 --> 00:11:06,760 >> Nos mallocd ella. 234 00:11:06,760 --> 00:11:08,050 Existe en el montón. 235 00:11:08,050 --> 00:11:10,090 Pero b tiene un nombre. 236 00:11:10,090 --> 00:11:11,950 Es una variable puntero llamado b. 237 00:11:11,950 --> 00:11:13,910 Que vive en la pila. 238 00:11:13,910 --> 00:11:18,250 >> Así que es un pedazo de la memoria que apunta a otro. 239 00:11:18,250 --> 00:11:21,840 b contiene la dirección de ese bloque de memoria. 240 00:11:21,840 --> 00:11:23,757 No tiene un nombre de lo contrario. 241 00:11:23,757 --> 00:11:24,590 Pero apunta a la misma. 242 00:11:24,590 --> 00:11:29,760 Así que cuando decimos int estrellas b es igual a tamaño malloc de int, que allí mismo, 243 00:11:29,760 --> 00:11:33,490 esa flecha que apareció en la lado derecho hay, toda esa cosa, 244 00:11:33,490 --> 00:11:36,740 Voy a tener que parezca de nuevo, es lo que sucede. 245 00:11:36,740 --> 00:11:39,341 Todo eso sucede en esa sola línea de código. 246 00:11:39,341 --> 00:11:41,340 Ahora vamos a llegar poco más sencillo de nuevo. 247 00:11:41,340 --> 00:11:43,330 un signo igual a m. 248 00:11:43,330 --> 00:11:46,280 ¿Recuerdas lo que es un es igual signo m es? 249 00:11:46,280 --> 00:11:48,920 Bueno, eso es una obtiene la dirección del m. 250 00:11:48,920 --> 00:11:54,150 O dicho más esquemática, unos puntos a m. 251 00:11:54,150 --> 00:11:56,360 >> una es igual a b. 252 00:11:56,360 --> 00:11:57,560 Aceptar así que aquí está otro. 253 00:11:57,560 --> 00:11:59,230 A es igual a b. 254 00:11:59,230 --> 00:12:02,260 Qué va a pasar el diagrama de este tiempo? 255 00:12:02,260 --> 00:12:04,330 >> Bueno recordar que el trabaja el operador de asignación 256 00:12:04,330 --> 00:12:08,960 asignando el valor en el derecho a el valor a la izquierda. 257 00:12:08,960 --> 00:12:14,820 Así que en lugar de un señalador para m, una empresa apunta al mismo lugar que los puntos b. 258 00:12:14,820 --> 00:12:18,900 un no apunta a B, A señala los puntos donde b. 259 00:12:18,900 --> 00:12:25,280 >> Si una punta a B que haría han sido un símbolo de unión es igual a b. 260 00:12:25,280 --> 00:12:28,150 Pero en lugar de una es igual a b justo significa que ayb son ahora 261 00:12:28,150 --> 00:12:31,770 apuntando a la misma dirección, porque en el interior de b es sólo una dirección. 262 00:12:31,770 --> 00:12:35,004 Y ahora en el interior de un es la misma dirección. 263 00:12:35,004 --> 00:12:37,170 m es igual a 10, probablemente el cosa más sencilla 264 00:12:37,170 --> 00:12:38,690 que hemos hecho en un poco. 265 00:12:38,690 --> 00:12:40,460 Ponga el 10 en el cuadro. 266 00:12:40,460 --> 00:12:45,640 Estrella b es igual a m más 2, recuerdan desde nuestra punteros de video lo que la estrella b significa. 267 00:12:45,640 --> 00:12:50,230 Vamos a eliminar la referencia b y put algún valor en esa posición de memoria. 268 00:12:50,230 --> 00:12:51,860 En este caso 12. 269 00:12:51,860 --> 00:12:55,300 >> Así que cuando nos dereference un punto de Recordemos que sólo viajamos por la flecha. 270 00:12:55,300 --> 00:12:58,205 O dicho de otra manera, ir a esa dirección de memoria 271 00:12:58,205 --> 00:12:59,580 y manipulamos de alguna manera. 272 00:12:59,580 --> 00:13:00,830 Ponemos algún valor en allí. 273 00:13:00,830 --> 00:13:03,960 En este caso la estrella b es igual a m más 2 es sólo 274 00:13:03,960 --> 00:13:08,230 ir a la variable apuntada por b, ir a la memoria apuntada por b, 275 00:13:08,230 --> 00:13:11,750 y poner m más 2 ahí, 12. 276 00:13:11,750 --> 00:13:14,970 >> Ahora libero b. 277 00:13:14,970 --> 00:13:16,490 ¿Qué sucede cuando gratuito B? 278 00:13:16,490 --> 00:13:18,800 Recuerde lo que dije medios libres. 279 00:13:18,800 --> 00:13:21,920 ¿Qué estoy diciendo cuando me libero b? 280 00:13:21,920 --> 00:13:23,410 >> Ya he terminado de trabajar con él, ¿no? 281 00:13:23,410 --> 00:13:25,702 Yo esencialmente renunciar a la memoria. 282 00:13:25,702 --> 00:13:26,910 Me doy vuelta al sistema. 283 00:13:26,910 --> 00:13:33,010 No necesito más esto es lo que les estoy diciendo, ¿de acuerdo? 284 00:13:33,010 --> 00:13:37,390 >> Ahora bien, si yo digo una estrella es igual a 11 es probable que pueda 285 00:13:37,390 --> 00:13:40,460 ya decirle que algo malo que va a pasar aquí, ¿verdad? 286 00:13:40,460 --> 00:13:44,160 Y de hecho si lo intentara que probablemente sufriría un fallo de segmentación. 287 00:13:44,160 --> 00:13:47,140 Porque ahora, aunque previamente que trozo de memoria 288 00:13:47,140 --> 00:13:50,220 era algo que tenía el acceso a, en este punto 289 00:13:50,220 --> 00:13:54,590 ahora estoy acceder a la memoria que no es legal para que tenga acceso. 290 00:13:54,590 --> 00:13:57,330 >> Y a medida que probablemente recordar, cuando accedemos a la memoria 291 00:13:57,330 --> 00:14:00,000 que no se supone que tocar, esa es la causa más común 292 00:14:00,000 --> 00:14:01,860 de una segmentación culpa. Y así mi programa 293 00:14:01,860 --> 00:14:05,170 se estrellaría si trataba de hacer esto. 294 00:14:05,170 --> 00:14:09,910 Así que de nuevo es una buena idea para obtener buena prácticas y los buenos hábitos arraigados 295 00:14:09,910 --> 00:14:12,920 cuando se trabaja con malloc y libre, de modo que usted no sufre segmentación 296 00:14:12,920 --> 00:14:15,310 fallas, y que se utilizan su asignados dinámicamente 297 00:14:15,310 --> 00:14:17,370 memoria de forma responsable. 298 00:14:17,370 --> 00:14:20,300 >> Soy Doug Lloyd esto es CS50. 299 00:14:20,300 --> 00:14:21,947