1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MÚSICA DE XOGO] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. Malan: Todo ben. 4 00:00:12,640 --> 00:00:14,525 Este é CS50. 5 00:00:14,525 --> 00:00:16,009 E este é o inicio da semana 5. 6 00:00:16,009 --> 00:00:18,050 E como ten que notar, parte do material 7 00:00:18,050 --> 00:00:21,050 está quedando un pouco máis complexo, a pouco máis denso. 8 00:00:21,050 --> 00:00:24,560 >> E é moi doado, sobre todo se foi o costume hai algún tempo, 9 00:00:24,560 --> 00:00:28,600 estar tentando rabiscar máis todo o que facemos, nós estamos dicindo na aula. 10 00:00:28,600 --> 00:00:31,626 Pero entender, que quizais non sexa o enfoque pedagóxico ideal 11 00:00:31,626 --> 00:00:34,250 para aprender este tipo de material, e material dun xeito máis xeral. 12 00:00:34,250 --> 00:00:37,250 E así temos o pracer de anunciar propia Gheng dese CS50 13 00:00:37,250 --> 00:00:39,780 Gong comezou a prepararse un conxunto canónico de notas 14 00:00:39,780 --> 00:00:42,100 para o curso, a esperanza da que é o que, unha, estes 15 00:00:42,100 --> 00:00:44,030 non só servir como un referencia e un recurso 16 00:00:44,030 --> 00:00:47,410 para material de revisión e vai de volta a través do material que pode ter 17 00:00:47,410 --> 00:00:51,230 escapouse a primeira vez, pero tamén para que as súas cabezas poden ser máis 18 00:00:51,230 --> 00:00:53,740 -se que abaixo, cando chega o momento de charla, 19 00:00:53,740 --> 00:00:56,960 de modo que pode se involucrar máis pensativo, como 20 00:00:56,960 --> 00:00:59,170 oposición ao máis scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Co que dixen, o que vai atopar en o sitio é documentos como este. 22 00:01:02,510 --> 00:01:04,660 E observen, na esquina superior esquerda, hai non só unha táboa de contidos, 23 00:01:04,660 --> 00:01:06,920 pero tamén códigos de tempo que será inmediatamente ir ti 24 00:01:06,920 --> 00:01:09,077 á parte correspondente no vídeo en liña. 25 00:01:09,077 --> 00:01:11,410 E o que Chang fixo aquí é, esencialmente, documentado 26 00:01:11,410 --> 00:01:13,340 o que pasou neste especial de conferencias. 27 00:01:13,340 --> 00:01:16,370 E moitas das conferencias son Xa están en liña agora con este URL. 28 00:01:16,370 --> 00:01:20,110 E imos seguir a publicar o resto daqueles ata finais desta semana, 29 00:01:20,110 --> 00:01:22,380 por iso aproveitar deste recurso. 30 00:01:22,380 --> 00:01:25,740 >> Así, sen máis delongas, comezamos a pelar 31 00:01:25,740 --> 00:01:28,180 a capa que foi cadea por algún tempo. 32 00:01:28,180 --> 00:01:30,670 E o que dicimos unha cadea en realidade é da semana pasada? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Entón, estrela de char. 35 00:01:32,900 --> 00:01:34,900 E Char estrela, así, o que que iso realmente significa? 36 00:01:34,900 --> 00:01:37,150 Ben, todo este tempo, se nós foi chamada dunha función, 37 00:01:37,150 --> 00:01:40,450 como getString, e almacenamento o retorno chamada 38 00:01:40,450 --> 00:01:42,910 valor de getString nunha variable-- chámase 39 00:01:42,910 --> 00:01:47,721 s tipo string-- que teño escrito a liña de código alí enriba. 40 00:01:47,721 --> 00:01:49,970 E é só cando ver o meu caligrafía grande aquí 41 00:01:49,970 --> 00:01:51,930 eu entender o quão atroz que é iso. 42 00:01:51,930 --> 00:01:54,180 >> Con todo, imos supor que, no lado da man dereita 43 00:01:54,180 --> 00:01:57,070 é, con todo, unha razoable representación do que é 44 00:01:57,070 --> 00:01:58,880 vén a suceder todo isto tempo con getString. 45 00:01:58,880 --> 00:02:00,380 getString, claro, fica un cadea. 46 00:02:00,380 --> 00:02:01,691 Pero o que iso realmente significa? 47 00:02:01,691 --> 00:02:04,190 Isto significa que queda un anaco de memoria do sistema operativo 48 00:02:04,190 --> 00:02:06,040 chamando unha función, chamada malloc. 49 00:02:06,040 --> 00:02:07,390 Pero máis sobre iso máis tarde. 50 00:02:07,390 --> 00:02:09,139 E entón el enche que pedazo de memoria 51 00:02:09,139 --> 00:02:11,764 coas letras que o usuario ten escriba, seguido, por suposto, 52 00:02:11,764 --> 00:02:14,800 un carácter nulo, ou barra invertida cero ao final. 53 00:02:14,800 --> 00:02:18,280 >> Mentres tanto, no lado esquerdo desta historia, todo ese tempo, 54 00:02:18,280 --> 00:02:20,850 vimos declarar unha variable, como s. 55 00:02:20,850 --> 00:02:24,770 E esa variable é o que agora comezará a chamar un punteiro. 56 00:02:24,770 --> 00:02:29,190 Non é unha caixa dentro da cal poñemos a corda, Daven, por si só, 57 00:02:29,190 --> 00:02:32,550 pero poñemos naquela praza caixa á esquerda o que exactamente? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Si? 60 00:02:35,390 --> 00:02:37,118 >> Audiencia: O enderezo de onde está situado na memoria. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. Malan: Exactamente. 62 00:02:38,118 --> 00:02:40,690 O enderezo de onde Daven está situado na memoria. 63 00:02:40,690 --> 00:02:44,650 E non onde todos Daven está situado, de por si, pero especialmente a dirección 64 00:02:44,650 --> 00:02:45,150 de que? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Si? 67 00:02:46,810 --> 00:02:47,460 >> Audiencia: Primeiro personaxe. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. Malan: O primeiro carácter en Daven, que, neste caso, 69 00:02:50,209 --> 00:02:53,820 I proposto foi arbitrariamente e irrealisticamente 1, OX 1, 70 00:02:53,820 --> 00:02:55,910 o que significa só o número hexadecimal de 1. 71 00:02:55,910 --> 00:02:57,993 Pero seguramente para ser un número moi grande 72 00:02:57,993 --> 00:03:01,260 que poderiamos chamar cun 0x como un prefixo, 73 00:03:01,260 --> 00:03:02,806 representando un personaxe hexadecimal. 74 00:03:02,806 --> 00:03:05,930 E por que non necesitamos saber onde o resto dos personaxes de Daven 75 00:03:05,930 --> 00:03:09,860 son, por mor do que deseño simple decisión que foi tomada hai moitos anos? 76 00:03:09,860 --> 00:03:10,548 Si? 77 00:03:10,548 --> 00:03:11,651 >> Audiencia: Barra invertida 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. Malan: Si, exactamente. 79 00:03:12,900 --> 00:03:18,100 A barra invertida 0 permítelle, aínda que de tempo lineal, para atravesar a corda, 80 00:03:18,100 --> 00:03:20,400 a pé de esquerda a dereita, cun loop, ou un tempo 81 00:03:20,400 --> 00:03:22,608 loop, ou algo parecido que, e determinar, oh, aquí 82 00:03:22,608 --> 00:03:24,751 é o final desa secuencia particular. 83 00:03:24,751 --> 00:03:27,000 Así, con só a dirección en o inicio dunha cadea, 84 00:03:27,000 --> 00:03:30,290 podemos acceder a totalidade de Porque todo este tempo, 85 00:03:30,290 --> 00:03:32,030 unha secuencia foi só unha estrela de char. 86 00:03:32,030 --> 00:03:36,370 >> Por iso, é certamente ben para seguir a utilizar a biblioteca CS50 e esa abstracción, 87 00:03:36,370 --> 00:03:38,440 por así dicir, pero imos comezar a ver exactamente 88 00:03:38,440 --> 00:03:41,230 o que está pasando debaixo de todo este tempo. 89 00:03:41,230 --> 00:03:45,260 Entón pode lembrar este exemplo, tamén, a partir da última vez, comparar 0, 90 00:03:45,260 --> 00:03:47,300 que non chegou a comparar. 91 00:03:47,300 --> 00:03:49,070 Pero comezamos a resolver iso. 92 00:03:49,070 --> 00:03:52,020 >> Pero como, se cadra, unha reciclaxe, Podería interesar a alguén 93 00:03:52,020 --> 00:03:54,261 nun elefante rosa de hoxe, tamén feita por Chang? 94 00:03:54,261 --> 00:03:55,760 Que tal ti diante? [Inaudível]. 95 00:03:55,760 --> 00:03:56,660 Imos cara arriba. 96 00:03:56,660 --> 00:03:58,740 >> E nese medio tempo, como veña, imos 97 00:03:58,740 --> 00:04:01,670 considerar por un momento o que este código foi realmente facendo. 98 00:04:01,670 --> 00:04:04,917 É declarar dúas variables se top, s e t, e chamando getString. 99 00:04:04,917 --> 00:04:08,250 Este non é un programa de fácil utilización, porque non lle di o que facer. 100 00:04:08,250 --> 00:04:10,541 Pero imos supoñer que estamos focando a parte suculenta. 101 00:04:10,541 --> 00:04:14,470 E entón, o que facemos, se s é igual a é igual a t, debe dicir printf, 102 00:04:14,470 --> 00:04:16,170 inseriu o mesmo. 103 00:04:16,170 --> 00:04:16,670 Ola. 104 00:04:16,670 --> 00:04:17,050 Cal é o seu nome? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. Malan: Janelle, pracer de coñece-lo. 107 00:04:19,529 --> 00:04:21,800 Polo tanto, o seu reto no man a este elefante 108 00:04:21,800 --> 00:04:25,230 é o primeiro en chamar-nos un retrato do que está sendo representados neses dous primeiros 109 00:04:25,230 --> 00:04:25,970 liñas. 110 00:04:25,970 --> 00:04:28,139 Así, s e t pode ser representado como na pantalla? 111 00:04:28,139 --> 00:04:30,680 E pode só deseña-lo con dedo na pantalla grande. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Polo tanto, hai dúas metades para cada lado da ecuación. 114 00:04:34,510 --> 00:04:37,760 Polo tanto, non hai s á esquerda, e entón GetString á dereita. 115 00:04:37,760 --> 00:04:40,540 E despois hai t á esquerda, e, a continuación, GetString á dereita. 116 00:04:40,540 --> 00:04:42,630 Entón, como podemos comezar facer un deseño que 117 00:04:42,630 --> 00:04:46,340 representa o que está a suceder aquí na memoria, diría? 118 00:04:46,340 --> 00:04:49,150 E déixeme deixar explicar o que está facendo que vaia. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: Aceptar. 120 00:04:49,820 --> 00:04:58,890 Ben, en primeiro lugar, el estaría pedindo vostede para obter a secuencia de entrada. 121 00:04:58,890 --> 00:05:00,439 E sería store-- oh, sinto moito. 122 00:05:00,439 --> 00:05:01,230 DAVID J. Malan: Aceptar. 123 00:05:01,230 --> 00:05:01,730 Boa. 124 00:05:01,730 --> 00:05:03,330 E iso chámase que? 125 00:05:03,330 --> 00:05:03,950 Oh, Aceptar. 126 00:05:03,950 --> 00:05:04,450 Continúe. 127 00:05:04,450 --> 00:05:05,575 Eu non quería interromper. 128 00:05:05,575 --> 00:05:07,060 Janelle: Sentímolo. 129 00:05:07,060 --> 00:05:14,237 Por iso, sería introducir-lo en a dirección non de-- seguro. 130 00:05:14,237 --> 00:05:17,320 Non me lembro exactamente o número, pero eu creo que foi a partir de 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. Malan: Está todo ben, porque eu fixen os números anteriores, 132 00:05:18,420 --> 00:05:19,650 polo que non hai resposta correcta. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Comezando a 0 arco. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. Malan: OK, entón o elemento 0. 135 00:05:24,000 --> 00:05:24,765 Claro. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: E entón foise como só un dous-letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. Malan: OK, de volta para ti. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Entón o elemento 0, e logo, un elemento ou elemento 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. Malan: E que parte do a imaxe que está deseñando agora? 140 00:05:36,670 --> 00:05:37,690 A chamada a getString? 141 00:05:37,690 --> 00:05:38,830 Ou a declaración de s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: A declaración de s, eu creo. 143 00:05:42,890 --> 00:05:45,980 Oh, o getString porque sería ser introducido en cada un [? área. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. Malan: Good. 145 00:05:46,510 --> 00:05:47,051 Exactamente. 146 00:05:47,051 --> 00:05:49,300 Aínda que isto efectivamente retorna un array, recall, 147 00:05:49,300 --> 00:05:53,300 cando volvemos unha cadea, podemos índice para esta cadea utilizando 01 e 2. 148 00:05:53,300 --> 00:05:56,180 Tecnicamente, estes son, probablemente, representado por enderezos individuais, 149 00:05:56,180 --> 00:05:57,100 pero iso é bo. 150 00:05:57,100 --> 00:06:00,170 >> Entón supoño que, se eu poida só rápido encamiñar a onde paramos 151 00:06:00,170 --> 00:06:04,320 última vez que, se un de as cordas era g ab e, 152 00:06:04,320 --> 00:06:10,337 barra invertida 0, representando así Gabe entrada, como podemos representar s agora? 153 00:06:10,337 --> 00:06:12,670 Se esta é a memoria que está foron devoltos por getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Sería representado por un arco? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. Malan: por un arco? 157 00:06:18,750 --> 00:06:19,130 Ben, non. 158 00:06:19,130 --> 00:06:21,171 Nós só dicir que, pictoricamente, déixeme ir adiante 159 00:06:21,171 --> 00:06:25,710 e propoñer que, se isto é s, esta é o valor de retorno de getString. 160 00:06:25,710 --> 00:06:29,482 E deseñou iso como 0, 1, 2, que é perfectamente razoable, porque 161 00:06:29,482 --> 00:06:30,940 pode indexar na secuencia, como tal. 162 00:06:30,940 --> 00:06:33,340 Pero só para ser consistente co última vez, deixe-me ir adiante 163 00:06:33,340 --> 00:06:37,310 e arbitrariamente propoñer que esta é a dirección 1, este é o enderezo 2, 164 00:06:37,310 --> 00:06:39,597 este é o enderezo 3, e así por diante. 165 00:06:39,597 --> 00:06:41,430 E así, só para ser super por suposto, o que está a suceder 166 00:06:41,430 --> 00:06:44,580 ir ao s como un resultado que primeira liña de código, diría? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Enderezo 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. Malan: Exactamente. 169 00:06:46,420 --> 00:06:47,190 Así, abordar 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 E mentres tanto, deixe-me ir adiante e duplicar moito do que fixo 172 00:06:51,230 --> 00:06:52,740 e engadir o meu propio t aquí. 173 00:06:52,740 --> 00:06:56,340 Se eu fose para escribir Gabe de novo, por segunda vez, 174 00:06:56,340 --> 00:07:01,530 cando proceda con getString, onde, por suposto, é Gabe vai? 175 00:07:01,530 --> 00:07:02,280 Ben, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Como aquí? 178 00:07:05,975 --> 00:07:06,850 DAVID J. Malan: Yeah. 179 00:07:06,850 --> 00:07:08,516 Janelle: Ou tamén nas mesmas caixas? 180 00:07:08,516 --> 00:07:11,940 DAVID J. Malan: Déixeme propoñer, si, exactamente, polo que nestas caixas adicionais. 181 00:07:11,940 --> 00:07:15,230 Pero o que é fundamental, agora, é que, mesmo aínda que eu deseñei estas moi preto 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, este é 0x2-- en realidade, 183 00:07:18,650 --> 00:07:25,750 iso agora pode ser o enderezo 0x10, por exemplo, e de 0x11, 0x12 e, 184 00:07:25,750 --> 00:07:26,870 e así por diante. 185 00:07:26,870 --> 00:07:29,955 E así, se ese é o caso, o que vai acabar por aquí en t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. Malan: Exactamente. 188 00:07:31,830 --> 00:07:33,180 Entón 0x10. 189 00:07:33,180 --> 00:07:34,570 E agora, a pregunta final. 190 00:07:34,570 --> 00:07:37,510 Ten, de lonxe, tiña que traballar a máis difícil para un elefante ata o momento. 191 00:07:37,510 --> 00:07:42,650 Ata agora, se eu puxar arriba o código unha vez máis, cando fago, na liña de tres, 192 00:07:42,650 --> 00:07:47,630 se s é igual a igual t, o que eu son, en realidade, comparando que temos deseñado aquí? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Os dous enderezos? 194 00:07:49,271 --> 00:07:50,270 DAVID J. Malan: Exactamente. 195 00:07:50,270 --> 00:07:53,350 Entón, eu estou dicindo é S igual xeito at? 196 00:07:53,350 --> 00:07:56,210 Noutras palabras, é un xeito igual a 10? 197 00:07:56,210 --> 00:07:59,710 E, por suposto, o resposta obvia é agora, non. 198 00:07:59,710 --> 00:08:02,920 E así, este programa é, en definitiva vai imprimir o que, diría? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Sería, inseriu o mesmo? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. Malan: Entón, se s representa 1 e t é 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Escribiu cousas distintas. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. Malan: Exactamente. 204 00:08:13,570 --> 00:08:14,480 Inseriu cousas distintas. 205 00:08:14,480 --> 00:08:14,850 Todo correcto. 206 00:08:14,850 --> 00:08:16,714 Entón, unha salva de palmas, se puidésemos, aquí. 207 00:08:16,714 --> 00:08:17,214 [Aplausos] 208 00:08:17,214 --> 00:08:17,708 Iso foi doloroso. 209 00:08:17,708 --> 00:08:18,208 Sei. 210 00:08:18,208 --> 00:08:19,684 Moi ben feito. 211 00:08:19,684 --> 00:08:24,690 Entón agora imos ver se non podemos desmembrar o que a corrección era. 212 00:08:24,690 --> 00:08:28,040 E, por suposto, cando se fixa isso-- que agora vai representar en green-- 213 00:08:28,040 --> 00:08:29,690 fixemos algunhas melloras aquí. 214 00:08:29,690 --> 00:08:32,409 En primeiro lugar, así como unha sanidade comprobar, estou comprobando primeiro 215 00:08:32,409 --> 00:08:35,110 se s é igual a nulo e t é igual a null. 216 00:08:35,110 --> 00:08:39,440 E só para quedar claro, cando pode s ou t ser nulo no código coma este? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Cando S ou T pode ser nulo. 219 00:08:44,490 --> 00:08:44,990 Si? 220 00:08:44,990 --> 00:08:45,990 >> Audiencia: [inaudível]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. Malan: Exactamente. 223 00:08:50,510 --> 00:08:52,840 Se a secuencia de caracteres que o usuario ingresaran é un camiño moi longo 224 00:08:52,840 --> 00:08:56,140 para caber na memoria, ou algún caso canto estraño así, 225 00:08:56,140 --> 00:08:59,010 getString, como veremos, literalmente hoxe, na súa documentación, 226 00:08:59,010 --> 00:09:02,330 di que vai voltar nulo como un valor de sentinela especial, 227 00:09:02,330 --> 00:09:05,417 ou só unha especie de símbolo especial isto significa que algo deu errado. 228 00:09:05,417 --> 00:09:07,500 Por iso, queremos comprobar a que, xa que verifica-se 229 00:09:07,500 --> 00:09:09,720 que nulo é un valor moi perigoso. 230 00:09:09,720 --> 00:09:14,250 >> Moitas veces, se tentar facer algo con nulo inclúen un function-- pasalo 231 00:09:14,250 --> 00:09:17,470 como entrada, para que a función instance-- pode moi vai bater e, con el, 232 00:09:17,470 --> 00:09:19,090 derrubar todo o seu programa. 233 00:09:19,090 --> 00:09:22,570 Polo tanto, esta terceira liña agora é só unha sanidade cheque, comprobación de erros, se quere. 234 00:09:22,570 --> 00:09:25,450 Isto é un bo costume agora para nos para entrar en calquera momento que 235 00:09:25,450 --> 00:09:28,050 proba a usar un valor que podería, potencialmente, ser nulo. 236 00:09:28,050 --> 00:09:32,000 >> Agora, na cuarta liña aquí, "Se strcmp (s, t)," ben, 237 00:09:32,000 --> 00:09:33,180 que é o que se refire? 238 00:09:33,180 --> 00:09:36,750 Ben, dixo que esta era unha forma moi sucinta función chamada a comparación de cadeas. 239 00:09:36,750 --> 00:09:40,370 E o seu propósito na vida é comparar seu primeiro argumento contra ela en segundo lugar, 240 00:09:40,370 --> 00:09:44,640 pero non en termos de seus enderezos, como fixemos involuntariamente un momento 241 00:09:44,640 --> 00:09:48,270 atrás co código vermello, pero no canto de comparar os dous 242 00:09:48,270 --> 00:09:53,210 cordas no humanamente intuitiva forma, comparando este, contra este, 243 00:09:53,210 --> 00:09:56,690 contra iso, contra iso, e logo deixar que e cando un 244 00:09:56,690 --> 00:09:59,590 ou ambos os dedos alcanza unha barra invertida 0. 245 00:09:59,590 --> 00:10:04,530 Strcmp Entón anos alguén aplicado aplicar a nós a función 246 00:10:04,530 --> 00:10:08,890 que esperabamos, teriamos conseguido por só dous valores de comparación simple. 247 00:10:08,890 --> 00:10:14,929 >> Agora, francamente, eu sigo deseño todos estes varios números. 248 00:10:14,929 --> 00:10:17,470 Pero a realidade é, eu estiven converténdose os para arriba todo o tempo. 249 00:10:17,470 --> 00:10:19,580 E entón déixeme ir adiante e rabiscar estes para fóra 250 00:10:19,580 --> 00:10:23,100 facer un punto en que, ao final do día e seguir adiante, 251 00:10:23,100 --> 00:10:30,160 nós non estamos indo realmente se preocupan que aborda as cousas son, en realidade, 252 00:10:30,160 --> 00:10:30,790 na memoria. 253 00:10:30,790 --> 00:10:34,320 Entón eu non vou deseñar estes tipos de números moito máis, 254 00:10:34,320 --> 00:10:38,970 Eu son só un resumo este fóra un pouco máis agradable con só frechas. 255 00:10:38,970 --> 00:10:42,060 >> Noutras palabras, se s é un punteiro, Ben, imos só deseña-lo literalmente 256 00:10:42,060 --> 00:10:45,430 como un punteiro, unha frecha apuntando cara de si mesmo para outra cousa, 257 00:10:45,430 --> 00:10:48,280 e non se preocupe máis sobre as minúcias destes enderezos 258 00:10:48,280 --> 00:10:49,910 que, unha vez máis, eu fixen de calquera maneira. 259 00:10:49,910 --> 00:10:52,680 Pero imos ver os enderezos, ás veces, cando a depuración do código. 260 00:10:52,680 --> 00:10:56,450 >> Agora, con todo, este programa aquí correccións, por suposto, 261 00:10:56,450 --> 00:10:58,720 problema que comparando estas dúas cordas. 262 00:10:58,720 --> 00:11:00,260 Pero nós funcionamos noutro problema. 263 00:11:00,260 --> 00:11:03,180 Esta foi a partir da copia programar última vez, 264 00:11:03,180 --> 00:11:06,880 segundo o cal, eu estaba tentando capitalizar só o primeiro carácter nunha cadea. 265 00:11:06,880 --> 00:11:09,620 Pero o que era o síntoma vimos a última vez, cando 266 00:11:09,620 --> 00:11:14,150 un usuario inseriu un valor, como Gabe en minúsculas, para s, 267 00:11:14,150 --> 00:11:19,310 entón atribuído s en t, tal como na terceira liña non, 268 00:11:19,310 --> 00:11:22,900 e entón eu tente capitalizar t soporte 0? 269 00:11:22,900 --> 00:11:25,950 Cal foi o efecto de cambiando t soporte 0 aquí? 270 00:11:25,950 --> 00:11:27,150 >> Audiencia: Mudouse s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. Malan: Si, Mudei s, tamén. 272 00:11:29,360 --> 00:11:31,050 Porque o que realmente estaba a suceder? 273 00:11:31,050 --> 00:11:34,130 Ben, deixe-me ver se eu podo borrar esta imaxe, como segue. 274 00:11:34,130 --> 00:11:41,390 >> Se s sexa, outra vez, a palabra g, A, B, E, barra invertida, 0 e s 275 00:11:41,390 --> 00:11:44,084 imos seguir a deseñar como unha caixa aquí, pero non máis enderezos. 276 00:11:44,084 --> 00:11:45,250 Imos deixar de facer as cousas. 277 00:11:45,250 --> 00:11:47,510 Nós só facer un debuxo para simplificar o mundo. 278 00:11:47,510 --> 00:11:52,640 >> Cando declaro t con corda t, que crea ese anaco de memoria. 279 00:11:52,640 --> 00:11:55,850 Praza pasa a ser 32 bits na maioría dos ordenadores. 280 00:11:55,850 --> 00:11:59,530 De feito, se xa escoitou falar dun ordenador cunha arquitectura de 32 bits, 281 00:11:59,530 --> 00:12:03,000 moi chique-dicir, que só significa que usa enderezos de 32 bits. 282 00:12:03,000 --> 00:12:05,370 E como un técnico de banda, Se xa se preguntas 283 00:12:05,370 --> 00:12:09,630 Por que os ordenadores máis antigos, se o intentou sopa-los con moita memoria RAM, 284 00:12:09,630 --> 00:12:12,360 só pode ter un máximo de catro gigabytes de memoria RAM, 285 00:12:12,360 --> 00:12:14,860 ben iso é porque, literalmente, ordenador antigo só podía 286 00:12:14,860 --> 00:12:17,250 Cantidade de tan elevada como 4 millóns, 4 millóns de bytes, 287 00:12:17,250 --> 00:12:20,590 porque se utilizando 32 bits números de enderezos. 288 00:12:20,590 --> 00:12:23,260 >> Pero en calquera caso, neste exemplo, da historia moito máis simple. 289 00:12:23,260 --> 00:12:27,250 t é só outro punteiro, ou realmente unha estrela char, aka cadea. 290 00:12:27,250 --> 00:12:30,860 E como me gustaría actualizar esta foto agora con esta segunda liña de código, 291 00:12:30,860 --> 00:12:31,950 despois do punto, punto, punto? 292 00:12:31,950 --> 00:12:35,845 Cando fago corda t é igual a s punto e coma, como é que esta foto cambiar? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Si? 295 00:12:38,000 --> 00:12:38,916 >> Audiencia: [inaudível]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. Malan: Yeah. 298 00:12:42,020 --> 00:12:42,600 Exactamente. 299 00:12:42,600 --> 00:12:45,620 Acaba de poñer unha frecha t caixa para o mesmo enderezo, 300 00:12:45,620 --> 00:12:47,570 a mesma primeira letra deu. 301 00:12:47,570 --> 00:12:50,850 Ou tecnicamente, se esta cara aínda estaba en 0x1, 302 00:12:50,850 --> 00:12:53,052 é coma se tivese Aquí 0x1 e 0x1 aquí. 303 00:12:53,052 --> 00:12:54,760 Pero, de novo, quen lle importa sobre os enderezos? 304 00:12:54,760 --> 00:12:56,345 É só a idea de que agora importa. 305 00:12:56,345 --> 00:12:57,720 Entón é iso que está pasando aquí. 306 00:12:57,720 --> 00:13:02,690 Entón, por suposto, se fai soporte t 0, que é a reserva de matriz, 307 00:13:02,690 --> 00:13:05,650 de course-- e, a verdade, parece como se houbese unha matriz por aquí, 308 00:13:05,650 --> 00:13:07,340 pero agora hai unha cousa estraña. 309 00:13:07,340 --> 00:13:11,160 Saber que a linguaxe de programación, C, ofrece este recurso, 310 00:13:11,160 --> 00:13:14,650 polo que, aínda que t é un punteiro, é s é un punteiro, 311 00:13:14,650 --> 00:13:18,050 tamén se pode usar aquel familiar, corchete cómodo 312 00:13:18,050 --> 00:13:22,520 notación para ir ao primeiro elemento, ou o segundo elemento, ou calquera elemento 313 00:13:22,520 --> 00:13:26,130 que ese punteiro está apuntando para por, presuntamente, el 314 00:13:26,130 --> 00:13:29,410 é, como no caso presente, apuntando algunha matriz. 315 00:13:29,410 --> 00:13:30,340 >> Entón, como imos solucionar isto? 316 00:13:30,340 --> 00:13:33,660 Francamente, isto é onde ten un pouco esmagadora a primeira vista. 317 00:13:33,660 --> 00:13:35,340 Pero aquí é unha versión nova e mellorada. 318 00:13:35,340 --> 00:13:37,460 >> Entón, primeiro, eu estou quedando librar da biblioteca CS50, 319 00:13:37,460 --> 00:13:41,170 só para expoñer que s é de feito unha estrela char, só un sinónimo. 320 00:13:41,170 --> 00:13:43,540 E t é tamén unha estrela de char. 321 00:13:43,540 --> 00:13:48,290 Pero o que está pasando no do lado dereito da liña 322 00:13:48,290 --> 00:13:49,970 onde t é asignado un valor? 323 00:13:49,970 --> 00:13:50,790 >> Que é malloc? 324 00:13:50,790 --> 00:13:51,630 Que é strlen? 325 00:13:51,630 --> 00:13:52,547 Que é sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Por que diaños fai iso ollar liña tan complexo? 327 00:13:54,380 --> 00:13:55,713 O que está facendo en un alto nivel? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Que o almacenamento en t? 330 00:13:57,440 --> 00:13:58,646 Si? 331 00:13:58,646 --> 00:14:01,104 Audiencia: É a concesión dunha certa cantidade de espazo de memoria. 332 00:14:01,104 --> 00:14:03,032 É para gardar, creo, letras [inaudível]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. Malan: Perfecto. 334 00:14:04,032 --> 00:14:04,540 Perfecto. 335 00:14:04,540 --> 00:14:06,650 É atribución dun certo cantidade de espazo de memoria 336 00:14:06,650 --> 00:14:08,940 para almacenar, presuntamente, cartas futuras. 337 00:14:08,940 --> 00:14:11,310 E, en particular, malloc polo tanto, está retornando dunha cousa? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Audiencia: Alumnado o [inaudível]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. Malan: Exactamente. 341 00:14:15,850 --> 00:14:18,850 Retornando a dirección de que a memoria, que é un xeito elegante de dicir, 342 00:14:18,850 --> 00:14:21,640 retorna a dirección do primeiro byte desta memoria. 343 00:14:21,640 --> 00:14:25,460 A responsabilidade recae sobre min para recordar a cantidade de memoria que realmente 344 00:14:25,460 --> 00:14:27,140 asignado ou malloc pediu. 345 00:14:27,140 --> 00:14:28,384 >> Agora que é isto? 346 00:14:28,384 --> 00:14:30,550 Ben, aínda que non haxa un lote de parénteses aquí, 347 00:14:30,550 --> 00:14:32,970 malloc leva só un único argumento. 348 00:14:32,970 --> 00:14:37,250 E eu estou especificando strlen de s, para dar me como moitos bytes, como existen en s, 349 00:14:37,250 --> 00:14:37,800 pero engade un. 350 00:14:37,800 --> 00:14:38,300 Por que? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Si? 353 00:14:39,530 --> 00:14:40,840 >> Audiencia: A barra invertida 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. Malan: Exactamente. 355 00:14:41,840 --> 00:14:43,423 Temos que facer un pouco de limpeza. 356 00:14:43,423 --> 00:14:45,970 Entón, por que non hai unha barra invertida 0, o mellor é lembrar diso. 357 00:14:45,970 --> 00:14:47,310 Se non, nós imos para crear unha cadea que 358 00:14:47,310 --> 00:14:49,170 Non ten que terminador especial. 359 00:14:49,170 --> 00:14:52,640 >> Mentres tanto, só para ser super anal, teño sizeof (char), 360 00:14:52,640 --> 00:14:55,730 só no caso de alguén corre o meu código non no aparello CS50, 361 00:14:55,730 --> 00:14:58,220 pero quizais un ordenador diferente en total, onde chars 362 00:14:58,220 --> 00:15:01,470 é un byte, por convención, pero dous bytes, ou algo máis que iso. 363 00:15:01,470 --> 00:15:04,490 É só para ser super, Super aversión a erros. 364 00:15:04,490 --> 00:15:06,940 Aínda que, en realidade, é probablemente será un 1. 365 00:15:06,940 --> 00:15:11,490 >> Agora, mentres tanto, eu vou adiante e copiar o corda, soporte t i é igual a pista t s. 366 00:15:11,490 --> 00:15:14,962 E eu vou retrasar a última semana código fonte para ver o que está pasando. 367 00:15:14,962 --> 00:15:17,670 Pero o principal argumento, eo razón de eu poñer o código agora en verde, 368 00:15:17,670 --> 00:15:22,520 é porque esa última liña, t soporte 0 é igual a toupper, 369 00:15:22,520 --> 00:15:25,230 ten o efecto de capitalizar que secuencia? 370 00:15:25,230 --> 00:15:26,960 t e / ou s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Esta última liña de código. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Só t, porque o que é pasou esta vez, 375 00:15:35,560 --> 00:15:41,500 se eu lixeiramente desfacer o último paso, Que pasou é, cando eu chamo malloc, 376 00:15:41,500 --> 00:15:45,380 Eu esencialmente obter un anaco de memoria que é do mesmo tamaño que o inicio, 377 00:15:45,380 --> 00:15:47,020 porque esa é a aritmética que eu fixen. 378 00:15:47,020 --> 00:15:50,920 Estou almacenando en t enderezo dese anaco de memoria. 379 00:15:50,920 --> 00:15:53,370 Aínda que isto parece bo e bonito, agradable e en branco, 380 00:15:53,370 --> 00:15:56,882 A realidade é que é, o que imos seguen chamando, os valores de lixo aquí. 381 00:15:56,882 --> 00:15:59,340 Este anaco de memoria pode moi moi ben ser usado antes, 382 00:15:59,340 --> 00:16:00,940 uns segundos, algúns minutos. 383 00:16:00,940 --> 00:16:04,410 Polo tanto, non podería absolutamente ser números ou letras alí, só por casualidade. 384 00:16:04,410 --> 00:16:08,580 Pero eles non son válidos, ata que eu me cubrir este anaco de memoria 385 00:16:08,580 --> 00:16:12,510 con caracteres reais, como eu facer ese loop for alí. 386 00:16:12,510 --> 00:16:13,180 Todo non? 387 00:16:13,180 --> 00:16:16,180 >> Entón, agora, o clímax da Estes tres exemplos 388 00:16:16,180 --> 00:16:20,730 que foron aparentemente dobres última vez, Neste exemplo intercambio, esta función 389 00:16:20,730 --> 00:16:23,670 traballou no sentido que trocou a e b. 390 00:16:23,670 --> 00:16:25,620 Pero non deu correcto en que outro sentido? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Si? 393 00:16:28,614 --> 00:16:29,612 >> Audiencia: [inaudível]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. Malan: Exactamente. 396 00:16:36,700 --> 00:16:39,530 Se eu fose para chamar esta función de another-- por exemplo, 397 00:16:39,530 --> 00:16:42,870 desde unha función como principal, onde Eu teño unha variable, x e y, como eu 398 00:16:42,870 --> 00:16:46,160 fixo a semana pasada, o mesmo código, e eu pasar en x e y 399 00:16:46,160 --> 00:16:49,860 Cambiar e despois chamar Swap-- tanto, por suposto, é a versión correcta 400 00:16:49,860 --> 00:16:52,220 é o que estamos a piques de ver-- non funcionou. 401 00:16:52,220 --> 00:16:53,770 Entón, cal é a corrección? 402 00:16:53,770 --> 00:16:56,850 >> Ben, entón, pode ser suposto, deixe-me ir adiante 403 00:16:56,850 --> 00:17:05,450 e-- me dar un segundo aquí, e ver se podo amosar-lle a última, que 404 00:17:05,450 --> 00:17:12,464 será em-- imos ver se podo atopar esta OK fast-- real, [inaudível]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, está alí. 407 00:17:19,240 --> 00:17:21,000 Así, ignorar as ordes que estou só escribindo. 408 00:17:21,000 --> 00:17:23,780 Quero que recuperar a o último minuto dun exemplo 409 00:17:23,780 --> 00:17:27,960 desde a última vez, que agora chámase non cambiar. 410 00:17:27,960 --> 00:17:30,200 >> Polo tanto, non Intercambio é onde paramos a última vez, 411 00:17:30,200 --> 00:17:32,930 polo cal, I inicializar x e y de un a dous. 412 00:17:32,930 --> 00:17:35,840 Eu, entón, chamar de Intercambio, pasando en 1 e 2. 413 00:17:35,840 --> 00:17:37,930 E entón esta función traballou nalgún sentido, 414 00:17:37,930 --> 00:17:40,750 pero non tiña permanente efecto xe y. 415 00:17:40,750 --> 00:17:45,430 Entón, a cuestión en apreciado é, como agora é que imos realmente resolver este problema? 416 00:17:45,430 --> 00:17:47,820 Cal é a solución na man? 417 00:17:47,820 --> 00:17:53,150 >> Ben, en swap.c, que é novo hoxe, notar algunhas diferenzas. 418 00:17:53,150 --> 00:17:54,700 x e y son o mesmo. 419 00:17:54,700 --> 00:17:57,250 Pero o que é claramente diferente sobre liña 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 O que hai de novo alí, se se lembra o que parecía un segundo atrás? 422 00:18:01,715 --> 00:18:02,565 >> Audiencia: [inaudível]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. Malan: Yeah. 424 00:18:03,440 --> 00:18:06,680 Así, os ampersands son unha nova peza de sintaxe, non só neste programa, 425 00:18:06,680 --> 00:18:08,560 pero tamén en termos máis xerais en CS50. 426 00:18:08,560 --> 00:18:10,680 Ata o momento, eu non creo que temos coñecemento de exemplos 427 00:18:10,680 --> 00:18:14,070 ou realmente falado sobre eles en calquera detalle, agás, quizais, cautelarmente 428 00:18:14,070 --> 00:18:16,467 en corte, un e comercial como esta. 429 00:18:16,467 --> 00:18:19,300 Ben, acontece que é un comercial dos últimos anacos de nova sintaxe 430 00:18:19,300 --> 00:18:20,174 imos aprender. 431 00:18:20,174 --> 00:18:23,500 Todo isto significa é o dirección dalgunha variable. 432 00:18:23,500 --> 00:18:25,070 En que dirección se x vivir? 433 00:18:25,070 --> 00:18:26,510 Pero a dirección que y vivir? 434 00:18:26,510 --> 00:18:28,700 Porque se o problema fundamental antes 435 00:18:28,700 --> 00:18:32,970 foi que xe y eran trasladados como copias, o que realmente queremos facer 436 00:18:32,970 --> 00:18:38,780 é proporcionar Intercambio con como un tesouro mapa que leva a que x e y efectivamente 437 00:18:38,780 --> 00:18:41,910 están na memoria RAM, para que Cambiar pode seguir este mapa 438 00:18:41,910 --> 00:18:47,760 e ir onde queira que x ou y marca o local e cambiar os valores reais 1 e 2 439 00:18:47,760 --> 00:18:48,270 alí. 440 00:18:48,270 --> 00:18:50,710 >> Entón cambiar que cambiar un pouco tamén. 441 00:18:50,710 --> 00:18:53,760 E, a primeira vista, isto pode parece un pouco semellante ao carbón estrela. 442 00:18:53,760 --> 00:18:54,850 E de feito é. 443 00:18:54,850 --> 00:18:59,635 Así, un é un punteiro para o tipo de datos, derivada porción destacada? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Polo tanto, é un int. 446 00:19:01,620 --> 00:19:04,880 >> Así, un non é un int, é a dirección dun int. 447 00:19:04,880 --> 00:19:07,910 E do mesmo xeito, b agora vai para ser o enderezo dun int. 448 00:19:07,910 --> 00:19:12,470 Entón, cando eu agora chamo de intercambio de Main, Eu non vou dar Cambiar 1 e 2. 449 00:19:12,470 --> 00:19:15,540 Vou dar-lle como Ox-algo e Ox-algo, 450 00:19:15,540 --> 00:19:19,820 dous enderezos que levarán Cambiar para os seus lugares reais 451 00:19:19,820 --> 00:19:21,310 na memoria do meu ordenador. 452 00:19:21,310 --> 00:19:25,580 >> Entón, agora, a miña aplicación resto que cambiar un pouco. 453 00:19:25,580 --> 00:19:28,650 O que é, obviamente, diferente agora nestas tres liñas de código? 454 00:19:28,650 --> 00:19:31,350 Hai esas estrelas malditos todos sobre o lugar, non? 455 00:19:31,350 --> 00:19:33,014 Entón, o que está pasando aquí? 456 00:19:33,014 --> 00:19:33,514 Si? 457 00:19:33,514 --> 00:19:35,055 >> Audiencia: É evidentemente [inaudível]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. Malan: Exactamente. 460 00:19:37,990 --> 00:19:41,560 Polo tanto, neste context-- e iso non era a mellor decisión de proxecto, de feito, 461 00:19:41,560 --> 00:19:42,530 anos. 462 00:19:42,530 --> 00:19:45,110 Neste contexto, no que só ten unha estrela, 463 00:19:45,110 --> 00:19:48,240 e non ten un tipo de datos, como int, inmediatamente á esquerda, 464 00:19:48,240 --> 00:19:53,146 en vez diso ten un signo igual, de forma clara, Neste contexto, cando di que protagonizar un, 465 00:19:53,146 --> 00:19:56,980 isto significa ir á dirección que está nun. 466 00:19:56,980 --> 00:19:58,870 Segue o mapa do tesouro, por así dicir. 467 00:19:58,870 --> 00:20:01,720 >> E mentres tanto, na liña 37, isto significa o mesmo. 468 00:20:01,720 --> 00:20:05,460 Ir ao enderezo dun, e poñer o que hai? 469 00:20:05,460 --> 00:20:09,520 Sexa cal sexa a local que b especifica. 470 00:20:09,520 --> 00:20:10,980 Noutras palabras, ir b. 471 00:20:10,980 --> 00:20:12,130 Obter este valor. 472 00:20:12,130 --> 00:20:15,620 Vaia a unha e, por igual asinar, o operador de asignación, 473 00:20:15,620 --> 00:20:17,010 poñer este valor alí. 474 00:20:17,010 --> 00:20:19,272 >> Do mesmo xeito, int temperatura é só un int. 475 00:20:19,272 --> 00:20:20,730 Nada que cambiar en Temp. 476 00:20:20,730 --> 00:20:24,810 É só un vaso de reposición de Annenberg un pouco de leite ou zume de laranxa. 477 00:20:24,810 --> 00:20:27,630 Pero eu teño que dicir, ir b. 478 00:20:27,630 --> 00:20:31,449 Vaia a este destino e poñer o valor en temperatura alí. 479 00:20:31,449 --> 00:20:32,490 Entón, o que está a suceder, entón? 480 00:20:32,490 --> 00:20:36,540 Cando realmente chamar Intercambia este tempo, se esta primeira bandexa aquí representa principal, 481 00:20:36,540 --> 00:20:42,270 Nesta segunda bandexa representa intercambio, cando Eu paso Ampersand xe y comercial 482 00:20:42,270 --> 00:20:47,150 de principal de cambiar, só para quedar claro, o que é ese cadro de pila de recepción? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Si? 485 00:20:49,200 --> 00:20:50,180 >> Audiencia: [inaudível]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. Malan: Exactamente. 487 00:20:51,180 --> 00:20:53,129 O enderezo de xe a dirección de Y. 488 00:20:53,129 --> 00:20:55,170 E pode pensar neles como enderezos postais. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street e 35 Oxford Street, e 490 00:20:58,772 --> 00:21:01,230 quere mover os dous edificios que están nesas localizacións. 491 00:21:01,230 --> 00:21:04,680 >> É unha especie de unha idea ridícula, pero iso é todo o que queremos dicir por enderezo. 492 00:21:04,680 --> 00:21:07,000 Onde o mundo pode atopa estes dous enteiros? 493 00:21:07,000 --> 00:21:09,470 Onde o mundo se pode atopar os dous edificios? 494 00:21:09,470 --> 00:21:15,170 Entón, finalmente, despois de todo este tempo eu entrar código fonte e compilar de hoxe 495 00:21:15,170 --> 00:21:22,110 Cambiar e executar ./swap finalmente ao primeira vez que realmente vemos que 496 00:21:22,110 --> 00:21:25,330 meus valores teñen, de feito foi trocado correctamente. 497 00:21:25,330 --> 00:21:30,860 E agora, podemos ata ter coñecemento do presente, digamos, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Entón deixe-me ir ao mesmo ficheiro. 499 00:21:32,740 --> 00:21:35,010 Deixe-me ir adiante e executar gdb de ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 E agora, en cambiar, eu estou indo a ir adiante e establecer un punto de ruptura na principal. 502 00:21:40,547 --> 00:21:42,630 E agora eu estou indo a ir adiante e executar o programa. 503 00:21:42,630 --> 00:21:45,810 E agora imos ver o meu código parou en liña. 504 00:21:45,810 --> 00:21:48,330 >> Se eu ir adiante e impresión x, o que debo ver aquí? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 É unha pregunta. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Diga de novo? 509 00:21:51,530 --> 00:21:52,295 >> Audiencia: [inaudível]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. Malan: Entón números aleatorios, quizais. 511 00:21:53,910 --> 00:21:56,010 Poida que eu teña sorte, e é agradable e simples, como 0. 512 00:21:56,010 --> 00:21:57,230 Pero é posible que algún número aleatorio. 513 00:21:57,230 --> 00:21:58,090 Neste caso, eu tiven sorte. 514 00:21:58,090 --> 00:21:59,030 El só pasa a ser 0. 515 00:21:59,030 --> 00:22:00,780 Pero é realmente sorte, por que non ata que eu 516 00:22:00,780 --> 00:22:06,280 tipo seguinte e, a continuación, imprimir x ten que liña de código, liña 19, foron executados. 517 00:22:06,280 --> 00:22:10,942 >> Mentres tanto, se eu escribir próxima vez, e agora imprimir y, eu vou ver 2. 518 00:22:10,942 --> 00:22:13,900 Agora, se eu escribir a continuación, que vai estar un pouco confuso, porque agora, 519 00:22:13,900 --> 00:22:17,250 o printf aparecerá a pantalla, como o fixo. x é 1. 520 00:22:17,250 --> 00:22:18,606 >> Imos facer iso de novo. 521 00:22:18,606 --> 00:22:20,480 E agora, aquí é onde as cousas comezan a estar interesantes. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Antes de me chamar de Intercambio ou mesmo paso para el, imos dar un olhadinha. 524 00:22:26,580 --> 00:22:28,980 x é, de novo, 1. 525 00:22:28,980 --> 00:22:33,240 Y é, por suposto, sanidade rápido comprobar, 2, polo que non é difícil alí. 526 00:22:33,240 --> 00:22:35,740 Pero o que é comercial x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Resposta, é unha especie de vista funky. 529 00:22:39,350 --> 00:22:43,500 Pero a estrela int en parénteses é só forma de PIB de dicir isto é unha dirección. 530 00:22:43,500 --> 00:22:48,290 Non é un int, que é un punteiro para un int, ou doutro xeito coñecido como un enderezo. 531 00:22:48,290 --> 00:22:49,742 >> Que é esa cousa tola? 532 00:22:49,742 --> 00:22:51,825 Nunca vimos algo ben así antes. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Polo tanto, este é o enderezo no meu ordenador de memoria de onde x pasa a vivir. 535 00:22:58,120 --> 00:22:59,040 É Ox-algo. 536 00:22:59,040 --> 00:23:01,290 E este é, francamente, por que Eu comecei a deseñar frechas, 537 00:23:01,290 --> 00:23:03,340 no canto de números, porque quen realmente lle importa 538 00:23:03,340 --> 00:23:06,890 Cal é o int nun determinado enderezo que é tan grande. 539 00:23:06,890 --> 00:23:12,160 Pero bffff0c4, todos estes son en realidade díxitos hexadecimais, 540 00:23:12,160 --> 00:23:13,720 que van de 0 a f. 541 00:23:13,720 --> 00:23:16,590 >> Entón, nós non imos vivir moi tempo en que estas cousas son. 542 00:23:16,590 --> 00:23:19,400 Pero se eu imprimir y, claro, vexo 2. 543 00:23:19,400 --> 00:23:22,440 Pero comercial y, vexo esta dirección. 544 00:23:22,440 --> 00:23:26,527 E aviso, para os curiosos, Cara a unha distancia entre x e y? 545 00:23:26,527 --> 00:23:27,985 Pode ignorar a maior parte do enderezo. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Catro bytes. 548 00:23:29,920 --> 00:23:33,510 E iso é consistente coa nosa anteriormente afirman que o tamaño é un int? 549 00:23:33,510 --> 00:23:34,130 Catro bytes. 550 00:23:34,130 --> 00:23:37,420 Polo tanto, parece que todo está aliñados ben, como podería esperar, na memoria. 551 00:23:37,420 --> 00:23:40,010 >> Entón, agora, imos avanzar rapidamente ao final desta historia. 552 00:23:40,010 --> 00:23:43,290 Imos adiante e escriba paso, para mergullo na Función Intercambio. 553 00:23:43,290 --> 00:23:46,880 Agora conta, se eu escribir un, é mesmo que o enderezo de x. 554 00:23:46,880 --> 00:23:52,130 Se eu escribir b, é idéntica ao enderezo de y. 555 00:23:52,130 --> 00:23:57,020 Entón, o que eu debería ver se eu dicir, ir ao enderezo dun? 556 00:23:57,020 --> 00:23:58,120 Así imprimir protagonizar un. 557 00:23:58,120 --> 00:24:00,130 Así estrela significa ir alí, neste contexto. 558 00:24:00,130 --> 00:24:02,730 Ampersand significa que é o enderezo. 559 00:24:02,730 --> 00:24:05,000 Así, unha forma protagonizar 1. 560 00:24:05,000 --> 00:24:09,590 E estrela de impresión b dáme 2. 561 00:24:09,590 --> 00:24:15,750 >> E déixeme asumir, para o momento, que polo menos o código que 562 00:24:15,750 --> 00:24:18,950 seguirá a executar pode ser agora fundamentado a través desta forma. 563 00:24:18,950 --> 00:24:21,150 Pero imos voltar a esta idea en pouco tempo. 564 00:24:21,150 --> 00:24:23,850 Polo tanto, esta versión do intercambio é agora correcta e permite 565 00:24:23,850 --> 00:24:26,650 nos para cambiar este tipo de datos particular. 566 00:24:26,650 --> 00:24:29,120 >> Así, todas as preguntas, entón en Cambiar? 567 00:24:29,120 --> 00:24:29,890 En estrela? 568 00:24:29,890 --> 00:24:30,690 O enderezo? 569 00:24:30,690 --> 00:24:33,270 E vai ver, con conxunto de problemas 4, dalgún xeito, 570 00:24:33,270 --> 00:24:37,310 pero o problema axuste 5, en definitiva, o xeito no que estes as cousas son útiles e obter máis 571 00:24:37,310 --> 00:24:39,584 cómodo con eles, como un resultado. 572 00:24:39,584 --> 00:24:40,430 Calquera cousa? 573 00:24:40,430 --> 00:24:40,930 Todo correcto. 574 00:24:40,930 --> 00:24:44,350 Entón malloc é, de novo, esta función que aloca memoria, a memoria 575 00:24:44,350 --> 00:24:45,330 distribución. 576 00:24:45,330 --> 00:24:47,024 E por que iso é útil? 577 00:24:47,024 --> 00:24:48,940 Ben, todo este tempo, vostede está a usar malloc. 578 00:24:48,940 --> 00:24:52,230 Se considerar agora como GetString obras, presuntamente, é 579 00:24:52,230 --> 00:24:56,140 foi pedir a alguén por unha peza de memoria, en calquera momento o usuario escribe unha cadea 580 00:24:56,140 --> 00:24:59,040 no, porque seguramente non sabía, como persoal CS50, 581 00:24:59,040 --> 00:25:02,710 como aquelas cordas grande que o ser humano están indo escribir podería ser. 582 00:25:02,710 --> 00:25:07,910 >> Entón, imos, por primeira vez, comezar a Descasque todas como funciona a biblioteca CS50, 583 00:25:07,910 --> 00:25:10,990 por medio dun par de exemplos que nos levará alí. 584 00:25:10,990 --> 00:25:15,300 Entón, se eu abrir gedit e abrir scanf 0, 585 00:25:15,300 --> 00:25:17,055 imos ver o seguinte código. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, dispoñible na páxina web para hoxe, ten relativamente poucas liñas de código 588 00:25:23,530 --> 00:25:25,351 aquí, 14 a 20. 589 00:25:25,351 --> 00:25:26,600 E imos ver o que está facendo. 590 00:25:26,600 --> 00:25:28,920 El declara un int, chamado x. 591 00:25:28,920 --> 00:25:30,850 Di algo así como, número por favor. 592 00:25:30,850 --> 00:25:33,940 E agora di, scanf% i, e x. 593 00:25:33,940 --> 00:25:35,620 Polo tanto, hai unha morea de cousas novas alí. 594 00:25:35,620 --> 00:25:38,420 >> Pero scanf, pode tipo de pensar como o contrario de printf. 595 00:25:38,420 --> 00:25:40,090 printf, por suposto, para a impresión en pantalla. 596 00:25:40,090 --> 00:25:44,410 tipo scanf de scans de usuario do teclado algo que el ou ela teña ingresaran. 597 00:25:44,410 --> 00:25:46,550 >> % I é como printf. 598 00:25:46,550 --> 00:25:49,410 Isto quere dicir que a espera usuario introduza un int. 599 00:25:49,410 --> 00:25:52,820 E agora, por que pensas que eu pode estar pasando scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Se o obxectivo de vida de scanf é facer que algo do usuario, 602 00:25:57,770 --> 00:26:02,480 cal é o significado pasando-o, e x, agora? 603 00:26:02,480 --> 00:26:02,980 Si? 604 00:26:02,980 --> 00:26:03,896 >> Audiencia: [inaudível]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. Malan: Exactamente. 607 00:26:06,540 --> 00:26:12,900 Todo o que eu, o ser humano, datilografada, miña entrada será gardado no lugar. 608 00:26:12,900 --> 00:26:17,660 Non é suficiente, lembre, só pasar en x, porque a xente xa viu, 609 00:26:17,660 --> 00:26:21,630 calquera momento que pasa só unha variable cru, como un enteiro, de algunha outra función, 610 00:26:21,630 --> 00:26:25,640 Por suposto, isto pode cambiar isto variable, pero non permanentemente. 611 00:26:25,640 --> 00:26:27,360 Non pode ter un efecto sobre Principal. 612 00:26:27,360 --> 00:26:29,420 Ela só pode cambiar a súa propia copia local. 613 00:26:29,420 --> 00:26:32,560 Pero se, no canto diso, non dáme a real int, 614 00:26:32,560 --> 00:26:36,640 pero me dar instrucións para int que, agora, sendo scanf, 615 00:26:36,640 --> 00:26:41,050 Certamente, podo seguir ese abordar e poñer un número non 616 00:26:41,050 --> 00:26:43,280 para que teña acceso a el tamén. 617 00:26:43,280 --> 00:26:45,120 >> Entón, cando eu executar este programa, xa veremos. 618 00:26:45,120 --> 00:26:49,660 Fai scanf 0 punto barra, scanf 0. 619 00:26:49,660 --> 00:26:54,030 E se eu agora escriba un número como 50, grazas ao 50. 620 00:26:54,030 --> 00:26:58,150 Se eu agora escriba un número como 1 negativo, ao negativo 1. 621 00:26:58,150 --> 00:27:04,200 Agora escriba un número como 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Por que o meu programa me ignorar? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Ben, porque simplemente, eu che dixen que esperar só un int. 625 00:27:09,880 --> 00:27:10,380 Todo correcto. 626 00:27:10,380 --> 00:27:11,630 Así que esta é unha versión deste. 627 00:27:11,630 --> 00:27:16,600 Imos levar as cousas por riba de un entalhe e propoñer que iso non é bo. 628 00:27:16,600 --> 00:27:20,530 E aquí reside un exemplo moi sinxelo de como podemos comezar a escribir código 629 00:27:20,530 --> 00:27:24,450 que outras persoas poidan explorar ou comprometer, facendo cousas malas. 630 00:27:24,450 --> 00:27:28,336 Así, liña 16, tan semellantes en espírito de antes, 631 00:27:28,336 --> 00:27:29,960 pero eu non estou declarándose o int neste momento. 632 00:27:29,960 --> 00:27:32,970 Estou declarándose o carácter estrela, tamén coñecido como corda. 633 00:27:32,970 --> 00:27:35,190 >> Pero o que iso realmente significa? 634 00:27:35,190 --> 00:27:38,790 Entón, se eu non especificar unha address-- e Estou chamando-o de forma arbitraria, buffer, 635 00:27:38,790 --> 00:27:43,370 pero eu podería chamalo é, para ser simple-- e entón eu fago iso, me explique, 636 00:27:43,370 --> 00:27:48,630 se puidese, con base na anterior lóxica, o que está facendo no scanf liña 18, 637 00:27:48,630 --> 00:27:55,000 se pase% s e buffer, cal é o enderezo? 638 00:27:55,000 --> 00:27:58,210 Que é scanf, se aplicar o exactamente a mesma lóxica que a versión 0, 639 00:27:58,210 --> 00:28:00,640 vou tentar facer aquí, cando o usuario escribe algo en? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Si? 642 00:28:03,409 --> 00:28:04,407 >> Audiencia: [inaudível]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. Malan: Exactamente. 645 00:28:08,890 --> 00:28:11,577 Scanf, pola lóxica anterior, vai levar a cadea 646 00:28:11,577 --> 00:28:13,410 que o ingresaran humano em-- agora é unha cadea, 647 00:28:13,410 --> 00:28:15,790 Non é un número, presuntamente, se el ou ela cooperates-- 648 00:28:15,790 --> 00:28:19,310 e vai poñer isto secuencia na memoria en calquera dirección 649 00:28:19,310 --> 00:28:20,340 tapón especifica. 650 00:28:20,340 --> 00:28:23,870 E iso é óptimo, porque o buffer é realmente deseñado para ser un enderezo. 651 00:28:23,870 --> 00:28:30,470 >> Pero eu reivindico este programa é buggy nun forma moi grave, xa que o valor é 652 00:28:30,470 --> 00:28:31,330 tapón por defecto? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 O que eu inicializar en? 655 00:28:34,790 --> 00:28:35,770 O anaco de memoria? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Eu non teño, non? 658 00:28:38,620 --> 00:28:42,265 >> Entón, aínda que eu teña asignado un estrela de char que xa non se chama s, 659 00:28:42,265 --> 00:28:48,030 chámase en vez, de xeito buffer-- imos debuxar o nome dunha variable 660 00:28:48,030 --> 00:28:53,380 agora como buffer-- se eu non teño chamado getString ou malloc aquí, 661 00:28:53,380 --> 00:28:56,030 que efectivamente significa que tapón é só un valor de lixo. 662 00:28:56,030 --> 00:28:57,030 >> Agora, o que significa isto? 663 00:28:57,030 --> 00:29:00,220 Isto significa que eu teño dito scanf esperar unha cadea de usuario. 664 00:29:00,220 --> 00:29:01,300 E vostede sabe o que? 665 00:29:01,300 --> 00:29:03,883 O que quere que esta cousa está a apuntar para-- e eu chamar punto de interrogación, 666 00:29:03,883 --> 00:29:07,060 pero, en realidade, que vai ser algo así como OX 1, 2, 3, non? 667 00:29:07,060 --> 00:29:10,730 É un valor falso que só pasa a ser alí de antes. 668 00:29:10,730 --> 00:29:13,440 Entón, dito doutro xeito, é como se tapón é só 669 00:29:13,440 --> 00:29:16,180 apuntando a algo na memoria. 670 00:29:16,180 --> 00:29:17,610 Eu non teño ningunha idea do que. 671 00:29:17,610 --> 00:29:24,130 >> Entón, se eu escribir Gabe agora, vai para tratar de poñer g-a-b-e / 0 non. 672 00:29:24,130 --> 00:29:25,530 Pero quen sabe o que é iso? 673 00:29:25,530 --> 00:29:27,480 E, no pasado, calquera xa que tente reproducir 674 00:29:27,480 --> 00:29:29,770 memoria que non pertence para nós, o que pasou? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Ou case sempre. 677 00:29:32,870 --> 00:29:34,310 Fallo de segmentación, non? 678 00:29:34,310 --> 00:29:37,829 >> Esta frecha, eu non teño ningunha idea de onde é anotador. É só un valor aleatorio. 679 00:29:37,829 --> 00:29:40,370 E, por suposto, se interpretar un valor aleatorio como enderezo, 680 00:29:40,370 --> 00:29:42,610 está indo a ir a algún destino aleatoria. 681 00:29:42,610 --> 00:29:46,810 Entón Gabe pode de feito accidente meu programa, neste caso aquí. 682 00:29:46,810 --> 00:29:50,600 >> Entón o que podemos facer iso é case tan malo? 683 00:29:50,600 --> 00:29:52,660 Considero este terceiro e último exemplo de scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Esta versión é mellor en que sentido? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Se está cómodo co problema anterior, este é mellor. 688 00:30:01,400 --> 00:30:02,250 Por que? 689 00:30:02,250 --> 00:30:03,250 >> Audiencia: [inaudível]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. Malan: Good. 692 00:30:07,110 --> 00:30:09,970 Entón, neste caso da liña 16 é mellor, no sentido 693 00:30:09,970 --> 00:30:12,030 que estamos explicitamente a asignación dunha memoria. 694 00:30:12,030 --> 00:30:14,190 Non estamos a usar malloc, Utilizamos a 2 semanas 695 00:30:14,190 --> 00:30:16,060 visión de só declarar unha matriz. 696 00:30:16,060 --> 00:30:18,130 E nós dixemos antes que unha secuencia é só un conxunto de caracteres, 697 00:30:18,130 --> 00:30:19,690 entón iso é totalmente lexítimo. 698 00:30:19,690 --> 00:30:22,910 Pero é, por suposto, como vostede nota, tamaño fixo, 16. 699 00:30:22,910 --> 00:30:25,440 >> Polo tanto, este programa é totalmente seguro, se eu escribir 700 00:30:25,440 --> 00:30:29,760 en secuencias dun personaxe, de dous caracteres cordas, 15 cadeas de caracteres. 701 00:30:29,760 --> 00:30:34,970 Pero así que eu comezar a escribir 16, 17, 18, 1000 cadeas de caracteres, 702 00:30:34,970 --> 00:30:37,390 onde está esa corda vai acabar? 703 00:30:37,390 --> 00:30:39,570 Vai acabar en parte aquí. 704 00:30:39,570 --> 00:30:42,820 Pero, entón, quen sabe o que máis está alén dos límites 705 00:30:42,820 --> 00:30:44,270 desta variedade particular? 706 00:30:44,270 --> 00:30:48,015 >> É como se eu tivese declarou 16 caixas aquí. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Entón en vez de aproveitar todos os 16, imos finxir que eu deseño 16. 709 00:30:52,690 --> 00:30:56,540 Pero se eu tente ler unha cadea que é moito máis longo, como 50 caracteres, 710 00:30:56,540 --> 00:31:01,270 Vou comezar a poñer a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 E esta é presuntamente algún outro segmento de memoria 712 00:31:04,916 --> 00:31:06,790 que, de novo, pode causar meu programa trabe, 713 00:31:06,790 --> 00:31:10,600 por que non pediu nada máis que 16 bytes. 714 00:31:10,600 --> 00:31:12,260 >> Entón, quen lle importa? 715 00:31:12,260 --> 00:31:13,880 Ben, aquí está a biblioteca CS50. 716 00:31:13,880 --> 00:31:17,220 E a maior parte deste é só como instrucións enriba. 717 00:31:17,220 --> 00:31:21,670 A biblioteca CS50, todo este tempo, tivo esta liña na liña 52. 718 00:31:21,670 --> 00:31:23,680 Vimos typedef, ou vai ver typedef 719 00:31:23,680 --> 00:31:27,930 en pset 4, que crea unha sinónimo polo cal carácter estrela pode ser máis 720 00:31:27,930 --> 00:31:29,290 simplemente refire como cadea. 721 00:31:29,290 --> 00:31:31,540 Polo tanto, este é un dos algunhas Rodas pequenas 722 00:31:31,540 --> 00:31:34,120 usamos secretaría debaixo do capó. 723 00:31:34,120 --> 00:31:36,490 >> Mentres tanto, aquí está a función, getchar. 724 00:31:36,490 --> 00:31:38,190 Agora, ao parecer, non hai corpo para el. 725 00:31:38,190 --> 00:31:40,273 E, de feito, se eu continuar desprazamento, realmente non 726 00:31:40,273 --> 00:31:42,080 ver calquera implementacións destas funcións. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Como unha verificación de sanidade, por que isto? 729 00:31:45,516 --> 00:31:46,795 >> Audiencia: [inaudível]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. Malan: Yeah. 731 00:31:47,670 --> 00:31:48,950 Polo tanto, este é o ficheiro de cabeceira. 732 00:31:48,950 --> 00:31:52,520 E arquivos de cabeceira conteñen prototipos, ademais dalgunhas outras cousas, ao parecer, 733 00:31:52,520 --> 00:31:53,780 como typedefs. 734 00:31:53,780 --> 00:31:56,910 Pero en CS50.c, que temos nunca lle deu a título definitivo, 735 00:31:56,910 --> 00:32:02,100 pero foi no aparello CS50 todos esta vez, ben no fondo das súas carpetas, 736 00:32:02,100 --> 00:32:04,990 ter en conta que non hai un todo chea de funcións aquí. 737 00:32:04,990 --> 00:32:06,720 >> De feito, imos rodar cara abaixo. 738 00:32:06,720 --> 00:32:08,810 Imos ignorar a maioría deles, polo de agora. 739 00:32:08,810 --> 00:32:12,670 Pero descenda ata getInt para ver como getInt funciona. 740 00:32:12,670 --> 00:32:13,890 Entón aquí está getInt. 741 00:32:13,890 --> 00:32:17,727 E se realmente lle importa como chegar int funciona, aquí é a súa documentación. 742 00:32:17,727 --> 00:32:19,560 E entre as cousas el di é que lle di 743 00:32:19,560 --> 00:32:21,340 que os rangos de valores que pode devolver. 744 00:32:21,340 --> 00:32:24,400 É esencialmente negativo 2000000000 ao positivo 2 millóns, máis ou menos. 745 00:32:24,400 --> 00:32:26,420 >> E ao parecer, todo isto tempo, aínda que nunca 746 00:32:26,420 --> 00:32:28,570 tiña que comprobar a el, Se algo sae mal, 747 00:32:28,570 --> 00:32:30,680 verifícase que todo Neste momento, ten getInt 748 00:32:30,680 --> 00:32:33,600 foron retornando un especial constante, non nulo, 749 00:32:33,600 --> 00:32:36,760 senón INT_MAX, que é convención só un programador. 750 00:32:36,760 --> 00:32:38,846 Isto significa que aquí é un valor especial. 751 00:32:38,846 --> 00:32:41,470 Asegúrese de comprobar iso, só tes no caso de algo correr mal. 752 00:32:41,470 --> 00:32:43,261 Pero nunca se preocupou que ata a data, 753 00:32:43,261 --> 00:32:45,200 porque unha vez máis, este destínase a simplificar. 754 00:32:45,200 --> 00:32:46,950 >> Pero como é que se getInt aplicado? 755 00:32:46,950 --> 00:32:48,450 Ben, un, non ten argumentos. 756 00:32:48,450 --> 00:32:49,390 Sabemos diso. 757 00:32:49,390 --> 00:32:50,820 El retorna un int. 758 00:32:50,820 --> 00:32:51,950 Sabemos diso. 759 00:32:51,950 --> 00:32:54,460 Entón, como é que funciona baixo o capo? 760 00:32:54,460 --> 00:32:58,290 >> Polo tanto, non hai aparentemente un infinito ciclo, polo menos a aparición dun. 761 00:32:58,290 --> 00:33:00,290 Teña en conta que estamos a usar getString. 762 00:33:00,290 --> 00:33:04,000 Entón, iso é interesante. getInt chama a propia función, getString. 763 00:33:04,000 --> 00:33:05,645 E agora por que isto podería ser o caso? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Por que estou a ser defensiva aquí na liña 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 O que podería ocorrer en liña 164, só para quedar claro? 768 00:33:15,639 --> 00:33:16,930 É a mesma resposta de antes. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Pode ser só falta de memoria. 771 00:33:20,089 --> 00:33:23,130 Algo vai mal con getString, debemos ser capaces de tratar con isto. 772 00:33:23,130 --> 00:33:27,070 E a razón de eu non retornan nulo é que, tecnicamente, null é un punteiro. 773 00:33:27,070 --> 00:33:29,120 getInt ten que voltar un int. 774 00:33:29,120 --> 00:33:31,060 Entón, eu teño arbitrariamente decidiu, esencialmente, 775 00:33:31,060 --> 00:33:34,600 que 2 millóns, máis ou menos, vai ser un valor especial que eu nunca pode 776 00:33:34,600 --> 00:33:35,970 realmente obter do usuario. 777 00:33:35,970 --> 00:33:39,930 É só o valor que eu vou ao lixo para representar un código de erro. 778 00:33:39,930 --> 00:33:41,540 >> Entón, agora, as cousas están un pouco de fantasía. 779 00:33:41,540 --> 00:33:44,670 E non é así a mesma función como antes, pero é moi similar. 780 00:33:44,670 --> 00:33:50,120 Entón, observe, eu declaro aquí, na liña 172, tanto un int n e un char c. 781 00:33:50,120 --> 00:33:53,600 E entón eu uso esa liña funky, sscanf, o que se ve 782 00:33:53,600 --> 00:33:55,990 non verifica a cadea desde o teclado. 783 00:33:55,990 --> 00:33:59,226 Ergue-se unha secuencia existente que o usuario xa inseriu. 784 00:33:59,226 --> 00:34:02,100 Entón, eu xa chamado getString, que significa que eu teño unha cadea na memoria. 785 00:34:02,100 --> 00:34:05,020 sscanf é o que chamar unha función de análise. 786 00:34:05,020 --> 00:34:07,760 El mira para a cadea teño introduciu, carácter por carácter, 787 00:34:07,760 --> 00:34:09,250 e fai algo útil. 788 00:34:09,250 --> 00:34:10,969 Esta secuencia é almacenado na cola. 789 00:34:10,969 --> 00:34:13,560 E sei que só indo volver aquí e dicir, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Liguei para el non s neste momento, pero a liña. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> E agora isto é un pouco diferente. 793 00:34:18,080 --> 00:34:22,480 Pero isto significa que de forma eficaz, por razóns que de certa forma vai acenar as mans no día de hoxe, 794 00:34:22,480 --> 00:34:26,070 que estamos comprobando a ver se o usuario inseriu 795 00:34:26,070 --> 00:34:29,909 e int e quizais outro personaxe. 796 00:34:29,909 --> 00:34:33,610 Se o usuario inseriu nun int, é vai ser almacenados en n, xa estou 797 00:34:33,610 --> 00:34:36,739 pasando por esta dirección, o novo truco que vimos hoxe. 798 00:34:36,739 --> 00:34:41,570 Se o usuario tamén ingresaran en como 123x, que x 799 00:34:41,570 --> 00:34:45,060 vai acabar un carta en carácter c. 800 00:34:45,060 --> 00:34:48,739 >> Agora verifícase que sscanf me vai dicir, de forma intelixente, 801 00:34:48,739 --> 00:34:54,750 cantas variables foi sscanf correctamente poder cubrir. 802 00:34:54,750 --> 00:34:58,770 Entón, por esta lóxica, a función Estou aplicando é getInt, 803 00:34:58,770 --> 00:35:00,900 pero estou comprobando, , Potencialmente, para o usuario 804 00:35:00,900 --> 00:35:04,190 ter ingresaran nun int seguido por outra cousa, 805 00:35:04,190 --> 00:35:08,580 o que quero de sscanf valor de retorno realmente ser? 806 00:35:08,580 --> 00:35:10,950 Se o obxectivo é obter só un int de usuario? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Entón, se sscanf retorno 2, o que significa isto? 809 00:35:19,300 --> 00:35:21,660 O usuario inseriu algo así como, literalmente, 810 00:35:21,660 --> 00:35:24,770 123x, o que é absurdo. 811 00:35:24,770 --> 00:35:27,490 É unha condición de erro, e Quero comprobar para iso. 812 00:35:27,490 --> 00:35:32,960 >> Polo tanto, se o usuario escribe isto en, polo Nesa lóxica, o que fai sscanf volver, 813 00:35:32,960 --> 00:35:33,740 que diría? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Entón, que vai voltar 2, porque o 123 vai entrar aquí, 816 00:35:39,130 --> 00:35:41,580 eo x vai acabar aquí. 817 00:35:41,580 --> 00:35:43,970 Pero eu non quero que o x para estar cheo. 818 00:35:43,970 --> 00:35:48,580 Quero sscanf só ter éxito en encher a primeira das súas variables. 819 00:35:48,580 --> 00:35:52,490 E é por iso que eu quere sscanf para volver 1. 820 00:35:52,490 --> 00:35:55,750 >> E se isto é un pouco sobre a cabeza para o momento, iso é totalmente bo. 821 00:35:55,750 --> 00:36:00,030 Entenda, porén, que un dos valores de getInt e getString 822 00:36:00,030 --> 00:36:03,630 é que estamos facendo unha peza de un chea de verificación de erros coma este para 823 00:36:03,630 --> 00:36:07,130 que, ata agora, pode moi ben escribir nada no teclado, 824 00:36:07,130 --> 00:36:08,490 e nós imos pegalo. 825 00:36:08,490 --> 00:36:10,592 E por suposto, o persoal, non é sempre 826 00:36:10,592 --> 00:36:13,300 ser a fonte de un erro no seu programa, porque estamos á defensiva 827 00:36:13,300 --> 00:36:16,270 verificación de todos os estúpidos cousas que un usuario pode facer, 828 00:36:16,270 --> 00:36:18,900 como escribir un texto, cando realmente quería int. 829 00:36:18,900 --> 00:36:21,350 Así, para agora-- nós viremos de volta a este antes long-- 830 00:36:21,350 --> 00:36:23,710 pero todo este tempo, getString e getInt ter 831 00:36:23,710 --> 00:36:29,950 foi por baixo do capuz con esta idea básica de enderezos de memoria. 832 00:36:29,950 --> 00:36:32,580 >> Entón, agora, imos facer as cousas un pouco máis amigable. 833 00:36:32,580 --> 00:36:38,740 Como pode lembrar, desde Binky última tempo-- se o meu rato vai cooperate-- así 834 00:36:38,740 --> 00:36:42,560 tivemos ese código, que francamente, é moi absurda. 835 00:36:42,560 --> 00:36:45,330 Este código obtén nada útil, pero foi o exemplo 836 00:36:45,330 --> 00:36:48,330 que o profesor parlante utilizado para representar 837 00:36:48,330 --> 00:36:51,840 o que estaba a ocorrer en un programa inclúen memoria. 838 00:36:51,840 --> 00:36:54,850 >> Entón, imos recontar esa historia de super brevemente. 839 00:36:54,850 --> 00:36:58,720 Estas dúas primeiras liñas, en Inglés, facer o que, diría? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Só no razoablemente humano, pero lixeiramente termos técnicos, tomar unha facada. 842 00:37:05,430 --> 00:37:06,346 Audiencia: [inaudível]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. Malan: OK, está establecendo enderezos para o seu variables x e y. 845 00:37:11,080 --> 00:37:15,520 Non é ben así, xa xe y non son variables no sentido tradicional. 846 00:37:15,520 --> 00:37:18,054 x e y son enderezos ou vai gardar o enderezo. 847 00:37:18,054 --> 00:37:19,220 Entón, imos tratar unha vez máis. 848 00:37:19,220 --> 00:37:21,010 Non é un mal comezo, con todo. 849 00:37:21,010 --> 00:37:21,510 Si? 850 00:37:21,510 --> 00:37:22,426 >> Audiencia: [inaudível]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. Malan: Good. 853 00:37:24,840 --> 00:37:26,173 Creo que é un pouco máis limpo. 854 00:37:26,173 --> 00:37:28,630 Declarando dous punteiros, dous enteiros. 855 00:37:28,630 --> 00:37:30,150 E nós estamos chamando-xe y. 856 00:37:30,150 --> 00:37:32,790 Ou, se fose deseñar isto como unha imaxe de, de novo, 857 00:37:32,790 --> 00:37:36,410 lembro moi simplemente que todos estamos facendo que a primeira liña 858 00:37:36,410 --> 00:37:39,690 está deseñando un cadro como esta, con algún valor de lixo na mesma, 859 00:37:39,690 --> 00:37:41,920 e chamando-x, e logo outra caixa como esta, 860 00:37:41,920 --> 00:37:43,880 cun valor de lixo nel, chamando-y. 861 00:37:43,880 --> 00:37:45,810 Xa declarou dous punteiros que, en última instancia 862 00:37:45,810 --> 00:37:47,860 pode almacenar a dirección dun int. 863 00:37:47,860 --> 00:37:49,170 Entón, iso é todo o que existe. 864 00:37:49,170 --> 00:37:53,290 >> Entón, cando Binky fixo iso, o arxila só mirou como este. 865 00:37:53,290 --> 00:37:55,350 E Nick só un tipo de embrulhado as frechas, 866 00:37:55,350 --> 00:37:57,590 como se eles non están apuntando para calquera lugar en particular, porque son só 867 00:37:57,590 --> 00:37:58,250 valores de lixo. 868 00:37:58,250 --> 00:38:01,670 Eles non están explícitamente inicializar en calquera en particular. 869 00:38:01,670 --> 00:38:03,980 >> Agora, a seguinte liña de código, recall, era iso. 870 00:38:03,980 --> 00:38:07,510 Así, en razoablemente amigable, pero o inglés un pouco técnico, 871 00:38:07,510 --> 00:38:09,790 o que é esa liña de código está facendo? 872 00:38:09,790 --> 00:38:10,391 Si? 873 00:38:10,391 --> 00:38:11,333 >> Audiencia: [inaudível]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. Malan: Perfecto. 876 00:38:13,950 --> 00:38:17,016 É atribución da parcela do memoria que é do tamaño dun int. 877 00:38:17,016 --> 00:38:18,140 E iso é a metade da resposta. 878 00:38:18,140 --> 00:38:20,056 Vostede respondeu á dereita metade da expresión. 879 00:38:20,056 --> 00:38:22,473 O que está pasando na á esquerda do signo igual? 880 00:38:22,473 --> 00:38:22,972 Si? 881 00:38:22,972 --> 00:38:24,814 Audiencia: e atribúe á variable x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. Malan: e atribúe á variable x. 883 00:38:27,690 --> 00:38:31,650 Entón, para recapitular, aloca lado dereito memoria suficiente para almacenar un int. 884 00:38:31,650 --> 00:38:34,150 Pero malloc especificamente retorna a dirección 885 00:38:34,150 --> 00:38:37,270 dese anaco de memoria, o que ten só proposto queda almacenado en x. 886 00:38:37,270 --> 00:38:42,560 >> Entón, o que Nick fixo a última vez con Binky é el arrastrou este punteiro para fóra, o barro, 887 00:38:42,560 --> 00:38:46,820 para apuntar agora nun anaco branco de memoria que coincide co tamaño dun int. 888 00:38:46,820 --> 00:38:49,360 E, de feito, que supuxo para representar catro bytes. 889 00:38:49,360 --> 00:38:55,310 >> Agora, a seguinte liña de código Fíxoo, estrela x recibe 42. 890 00:38:55,310 --> 00:38:58,530 Entón 42 é simple na lado dereito, sentido da vida. 891 00:38:58,530 --> 00:39:00,500 Lado esquerdo, estrela x significa o que? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Isto tamén pode ter gone-- está todo OK. 894 00:39:03,280 --> 00:39:04,220 Está ben. 895 00:39:04,220 --> 00:39:06,875 >> Audiencia: Basicamente, ir ao [inaudível] 896 00:39:06,875 --> 00:39:07,750 DAVID J. Malan: Good. 897 00:39:07,750 --> 00:39:08,760 Audiencia: [inaudível]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. Malan: Exactamente. 899 00:39:09,760 --> 00:39:11,979 Lado esquerdo significa ir x. 900 00:39:11,979 --> 00:39:12,520 x é a dirección. 901 00:39:12,520 --> 00:39:15,520 É como 33 Oxford Street, ou OX 1. 902 00:39:15,520 --> 00:39:18,690 E estrela x significa ir a aquela tratar e poñer o que hai? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Entón, en realidade, iso é o que Nick fixo. 905 00:39:21,290 --> 00:39:23,740 Empezou con polo, esencialmente, mental 906 00:39:23,740 --> 00:39:26,270 apuntando o dedo x, seguindo a frecha 907 00:39:26,270 --> 00:39:30,670 á caixa branca do lado dereito banda, e poñer o número 42 alí. 908 00:39:30,670 --> 00:39:34,120 Pero despois as cousas quedaron un pouco perigoso, non? 909 00:39:34,120 --> 00:39:35,860 Binky está a piques de perder a cabeza. 910 00:39:35,860 --> 00:39:39,465 >> Estrela y é igual a 13, a mala sorte, significa o que? 911 00:39:39,465 --> 00:39:43,620 Entón medios y estrela ir ao enderezo en y. 912 00:39:43,620 --> 00:39:45,630 Pero cal é a dirección en y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Todo ben, é valor de lixo, non? 915 00:39:49,440 --> 00:39:50,800 Eu tirei-o como un punto de interrogação. 916 00:39:50,800 --> 00:39:54,850 Nick chamou-o como unha frecha enrolado. 917 00:39:54,850 --> 00:39:59,600 E así que intenta facer estrela y dicindo ir alí, 918 00:39:59,600 --> 00:40:03,872 pero non hai unha lexítima dirección, é unha situación falsa, 919 00:40:03,872 --> 00:40:05,080 o programa vai fallar. 920 00:40:05,080 --> 00:40:08,580 E a cabeza de Binky vai para voar aquí, como o fixo. 921 00:40:08,580 --> 00:40:12,130 >> Entón, ao final, este programa era só plana fallo fora. 922 00:40:12,130 --> 00:40:13,540 Era un programa de buggy. 923 00:40:13,540 --> 00:40:14,760 E precisaba ser modificado. 924 00:40:14,760 --> 00:40:18,260 E a única forma, realmente, para resolve-lo sería, por exemplo, esta liña de, 925 00:40:18,260 --> 00:40:21,010 que nin sequera chegar, porque o programa caeu moi pronto. 926 00:40:21,010 --> 00:40:26,170 Pero se tivésemos de solucionar isto, o que efecto que facer y iguais x ten? 927 00:40:26,170 --> 00:40:30,010 Ben, esencialmente apunta y en calquera valor x está a apuntar. 928 00:40:30,010 --> 00:40:32,430 >> Así, na historia de Nick, ou a historia de Binky, tanto 929 00:40:32,430 --> 00:40:34,640 x e y foron apuntando o anaco branco de memoria, 930 00:40:34,640 --> 00:40:38,300 de xeito que, por fin, cando non protagonizar y é igual a 13, unha vez máis, 931 00:40:38,300 --> 00:40:43,080 acaba colocando 13 en o lugar apropiado. 932 00:40:43,080 --> 00:40:47,640 Así, todas estas liñas son perfectamente lexítima, con excepción de un regalo, 933 00:40:47,640 --> 00:40:51,730 cando isto aconteceu antes de ti efectivamente asignados y algún valor. 934 00:40:51,730 --> 00:40:54,290 >> Agora, por sorte, non ten que razoar a través de todos 935 00:40:54,290 --> 00:40:56,560 destes tipos de problemas no seu propio país. 936 00:40:56,560 --> 00:40:59,310 Deixe-me ir adiante e abrir unha fiestra de terminal aquí 937 00:40:59,310 --> 00:41:03,050 e abrir-se, por un momento, un super programa curto que 938 00:41:03,050 --> 00:41:04,360 tamén é unha especie de inútil. 939 00:41:04,360 --> 00:41:05,152 É feo. 940 00:41:05,152 --> 00:41:06,610 Non conseguir calquera cousa útil. 941 00:41:06,610 --> 00:41:10,180 Pero iso non demostrar problemas de memoria, así que imos dar un ollo. 942 00:41:10,180 --> 00:41:11,830 >> Principal, super sinxelo. 943 00:41:11,830 --> 00:41:14,830 Ao parecer, chama unha función, f, e, a continuación, retorna 0. 944 00:41:14,830 --> 00:41:16,310 É medio difícil de romper iso. 945 00:41:16,310 --> 00:41:18,540 Entón principal é moi bo, ata agora. 946 00:41:18,540 --> 00:41:20,100 >> Así, f é problemático. 947 00:41:20,100 --> 00:41:22,120 E só non poñer moito esforzo en nomealo 948 00:41:22,120 --> 00:41:23,990 aquí, para manter o foco sobre o código. 949 00:41:23,990 --> 00:41:25,740 f ten dúas liñas. 950 00:41:25,740 --> 00:41:27,610 E imos ver o que está pasando agora. 951 00:41:27,610 --> 00:41:29,840 Así, por unha banda aqui-- e déixeme facer 952 00:41:29,840 --> 00:41:32,680 isto é consistente coa anterior example-- por unha banda, 953 00:41:32,680 --> 00:41:35,830 á esquerda está facer o que, en inglés? 954 00:41:35,830 --> 00:41:36,493 El é-- 955 00:41:36,493 --> 00:41:37,701 Audiencia: Creando un punteiro. 956 00:41:37,701 --> 00:41:40,830 DAVID J. Malan: Creando un punteiro para un int e chamándoo x. 957 00:41:40,830 --> 00:41:43,789 Entón, é a creación dunha desas caixas Eu sigo deseñando na pantalla táctil. 958 00:41:43,789 --> 00:41:45,913 E agora, na man dereita banda, malloc, por suposto, 959 00:41:45,913 --> 00:41:47,420 está alocando un bloque de memoria. 960 00:41:47,420 --> 00:41:49,989 E só para quedar claro, como cantidade de memoria é, ao parecer, 961 00:41:49,989 --> 00:41:52,030 distribución, se acaba de tipo de facer as contas aquí? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Polo tanto, é de 40 bytes. 964 00:41:54,040 --> 00:41:57,400 E sei que só porque sei que un int, no aparello CS50, polo menos, 965 00:41:57,400 --> 00:41:58,060 ten catro bytes. 966 00:41:58,060 --> 00:41:59,610 Así, 10 veces 4 é 40. 967 00:41:59,610 --> 00:42:04,924 Entón iso é almacenar un x, a dirección do primeiro de 40 Ints que 968 00:42:04,924 --> 00:42:07,340 Foron atribuídos espazo de volta, cara atrás, cara atrás, cara atrás. 969 00:42:07,340 --> 00:42:08,470 >> E iso é o que é importante sobre malloc. 970 00:42:08,470 --> 00:42:11,261 Non é preciso un pouco de memoria aquí, un pouco aquí, un pouco aquí. 971 00:42:11,261 --> 00:42:14,220 Dálle un anaco de memoria, contiguamente, a partir da operación 972 00:42:14,220 --> 00:42:15,240 sistema. 973 00:42:15,240 --> 00:42:18,500 >> Agora, o que sobre iso, x soporte de 10 é igual a 0? 974 00:42:18,500 --> 00:42:19,470 Liña arbitraria de código. 975 00:42:19,470 --> 00:42:21,100 Non conseguir calquera cousa útil. 976 00:42:21,100 --> 00:42:26,128 Pero é interesante, porque x soporte 10--? 977 00:42:26,128 --> 00:42:26,628 Si? 978 00:42:26,628 --> 00:42:27,912 >> Audiencia: [inaudível]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. Malan: x soporte 10 non ten que ser nulo. 980 00:42:30,500 --> 00:42:35,070 O detalle nulo só entra en xogo con cordas, no extremo dunha corda. 981 00:42:35,070 --> 00:42:36,700 Pero un bo pensamento. 982 00:42:36,700 --> 00:42:39,615 >> Que grande é esa matriz, aínda aínda que eu teña asignado 40 bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 É 0 a nove, non? 985 00:42:43,690 --> 00:42:45,120 É 10 Ints, en total. 986 00:42:45,120 --> 00:42:48,790 40 bytes, pero 10 Ints, indexados de 0 a 0. 987 00:42:48,790 --> 00:42:50,930 >> Entón que é o que x soporte de 10? 988 00:42:50,930 --> 00:42:53,090 En realidade, é un pouco valor de lixo descoñecido. 989 00:42:53,090 --> 00:42:54,780 É a memoria que non pertence a min. 990 00:42:54,780 --> 00:42:59,650 Non debería estar tocando que byte número 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Estou un pouco lonxe de máis. 992 00:43:01,420 --> 00:43:04,490 >> E, de feito, se eu executar este programa, pode moi ben funcionar. 993 00:43:04,490 --> 00:43:05,790 Pero, ás veces, teñamos sorte. 994 00:43:05,790 --> 00:43:07,706 E así, só para demostrar isso-- e, a verdade, 995 00:43:07,706 --> 00:43:11,000 vostede non sabe antes non ele-- imos realizar este. 996 00:43:11,000 --> 00:43:12,480 Non chegou a fallar. 997 00:43:12,480 --> 00:43:15,032 >> Pero se eu cambiar isto, para exemplo, ser como 1.000, 998 00:43:15,032 --> 00:43:16,740 para facelo realmente deliberada, xa veremos 999 00:43:16,740 --> 00:43:18,710 se podemos facelo falla esta vez. 1000 00:43:18,710 --> 00:43:20,070 OK, non caeu. 1001 00:43:20,070 --> 00:43:22,600 Como preto de 100.000? 1002 00:43:22,600 --> 00:43:25,000 Imos refacelo lo, e agora executa-lo de novo. 1003 00:43:25,000 --> 00:43:25,500 Está ben. 1004 00:43:25,500 --> 00:43:25,960 Ufa. 1005 00:43:25,960 --> 00:43:26,460 Todo correcto. 1006 00:43:26,460 --> 00:43:29,090 Entón, ao parecer, unha vez máis, estes rutas de memoria, por así dicir, 1007 00:43:29,090 --> 00:43:32,660 son razoabelmente grande, para que poidamos ter sorte de novo e de novo. 1008 00:43:32,660 --> 00:43:36,510 Pero ao final, cando chegar ridículo e realmente ir lonxe na pantalla, 1009 00:43:36,510 --> 00:43:39,120 tocar memoria que realmente, realmente non pertence a vostede. 1010 00:43:39,120 --> 00:43:40,870 >> Pero, francamente, estes tipos de erros están indo 1011 00:43:40,870 --> 00:43:43,020 a ser cada vez máis difícil para descubrir por conta propia. 1012 00:43:43,020 --> 00:43:47,880 Pero, por sorte, como programadores, temos ferramentas que nos permiten facelo por nós. 1013 00:43:47,880 --> 00:43:50,140 Polo tanto, este é, quizais, un dos programas máis feos, 1014 00:43:50,140 --> 00:43:52,060 aínda máis fea do que a produción do gdb. 1015 00:43:52,060 --> 00:43:55,670 Pero sempre ten unha liña ou dous que son super útiles. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind é un programa que axuda non depurar un programa, de per si, 1017 00:44:00,310 --> 00:44:03,500 pero atopar relativas á memoria problemas, especialmente. 1018 00:44:03,500 --> 00:44:07,590 Esta será executado automaticamente o código para vostede e buscar polo menos dúas cousas. 1019 00:44:07,590 --> 00:44:10,680 Unha, que fixo algo accidental como a memoria de chamada 1020 00:44:10,680 --> 00:44:11,980 que non pertence a vostede? 1021 00:44:11,980 --> 00:44:13,590 El pode axudar a atopar estes casos. 1022 00:44:13,590 --> 00:44:15,710 >> E dous, que vai axudar atopa algo chamado 1023 00:44:15,710 --> 00:44:19,270 perdas de memoria, o que temos totalmente ignorado, inxenuamente, 1024 00:44:19,270 --> 00:44:21,380 por algún tempo e sorte. 1025 00:44:21,380 --> 00:44:23,140 Pero ao parecer, todo Neste momento, cando 1026 00:44:23,140 --> 00:44:26,620 chamou getString en moitos dos nosos programas, 1027 00:44:26,620 --> 00:44:28,930 está pregunta o funcionamento sistema para a memoria, 1028 00:44:28,930 --> 00:44:32,070 pero tes calquera lembranza de cada vez dándolle 1029 00:44:32,070 --> 00:44:36,169 cara atrás, facendo unalloc, ou libre, como se chama. 1030 00:44:36,169 --> 00:44:37,960 Non, porque nunca pediulle para facelo. 1031 00:44:37,960 --> 00:44:41,250 >> Pero todo este tempo, os programas ten escrito en C 1032 00:44:41,250 --> 00:44:43,800 foron baleirado de memoria, pedindo ao funcionamento 1033 00:44:43,800 --> 00:44:46,190 sistema para obter máis e máis memoria para cordas e outros enfeites, 1034 00:44:46,190 --> 00:44:47,870 pero nunca entrega-la de volta. 1035 00:44:47,870 --> 00:44:50,080 E agora isto é un pouco dunha simplificación, 1036 00:44:50,080 --> 00:44:53,550 pero se xa executar o Mac ou seu PC por algún tempo, a apertura 1037 00:44:53,550 --> 00:44:55,790 moitos programas, quizais pechar programas, 1038 00:44:55,790 --> 00:44:57,795 e aínda que o seu ordenador non caeu, 1039 00:44:57,795 --> 00:45:01,690 está quedando máis lento, como se fose realmente 1040 00:45:01,690 --> 00:45:04,290 usando unha gran cantidade de memoria ou recursos, a pesar de, 1041 00:45:04,290 --> 00:45:06,070 se non o é tocar o teclado, 1042 00:45:06,070 --> 00:45:10,430 que pode ser-- pero non podía always-- ser que os programas que está executando 1043 00:45:10,430 --> 00:45:11,920 ten-se perdas de memoria. 1044 00:45:11,920 --> 00:45:15,645 E eles seguen pedindo VOS para máis e máis memoria, pero esquece-lo, 1045 00:45:15,645 --> 00:45:18,470 en realidade non usalo, pero polo tanto, levando a memoria lonxe 1046 00:45:18,470 --> 00:45:20,500 doutros programas que poidan querer iso. 1047 00:45:20,500 --> 00:45:23,940 Entón, iso é unha explicación común. 1048 00:45:23,940 --> 00:45:25,940 Agora aquí é onde Valgrind de saída é completamente 1049 00:45:25,940 --> 00:45:29,290 atroz aos menos e máis cómodo iguais. 1050 00:45:29,290 --> 00:45:32,690 Pero o interesante material é ben aquí. 1051 00:45:32,690 --> 00:45:37,060 Está me dicindo unha gravación válido de tamaño catro acontece neste programa, 1052 00:45:37,060 --> 00:45:40,640 en particular, na liña 21 da memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Se eu ir á liña 21, hm, hai de feito é unha gravación válido de tamaño catro. 1054 00:45:45,450 --> 00:45:46,250 Por tamaño de catro? 1055 00:45:46,250 --> 00:45:49,500 Ben, este number-- e podería ser calquera cousa é un int. 1056 00:45:49,500 --> 00:45:50,450 Entón é catro bytes. 1057 00:45:50,450 --> 00:45:52,550 Entón, eu estou poñendo catro bytes onde non pertencen. 1058 00:45:52,550 --> 00:45:55,080 Iso é o que Valgrind está realmente dicindo. 1059 00:45:55,080 --> 00:45:57,600 Ademais, tamén será me diga, como veremos, 1060 00:45:57,600 --> 00:46:01,490 como realizar isto nun pset futuro, e cando xa se filtrou memoria, o que de feito 1061 00:46:01,490 --> 00:46:05,300 Eu teño, porque eu chamei malloc, pero eu realmente non teño 1062 00:46:05,300 --> 00:46:08,010 chamado, neste caso, libre, que imos finalmente ver 1063 00:46:08,010 --> 00:46:09,830 é o contrario de malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Entón, agora, eu creo, un exemplo final. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Entón, este é un pouco máis arcano, pero é posible que 1068 00:46:16,690 --> 00:46:19,180 a maior razón para ter coidado coa memoria, 1069 00:46:19,180 --> 00:46:24,490 ea razón que moitos programas e / ou servidores web, ata hoxe, 1070 00:46:24,490 --> 00:46:28,200 son tomadas por bandidos nalgún lugar en internet que están de algunha maneira 1071 00:46:28,200 --> 00:46:33,390 envío de paquetes falsos ao servidor tentando comprometer as súas contas, 1072 00:46:33,390 --> 00:46:36,420 ou ter os seus datos, ou só xeralmente asumir unha máquina. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, como o nome indica, medios 1074 00:46:38,910 --> 00:46:40,740 transbordador non un int, pero un tapón. 1075 00:46:40,740 --> 00:46:43,490 E un buffer é só un xeito elegante de dicir que é un monte de memoria. 1076 00:46:43,490 --> 00:46:46,710 >> E, de feito, chamei unha cadea antes de buffer, no canto de s. 1077 00:46:46,710 --> 00:46:49,234 Porque se é un buffer, como no sentido YouTube, 1078 00:46:49,234 --> 00:46:52,400 ou cando está a asistir a un vídeo, podes ver a palabra de tamponamento, 1079 00:46:52,400 --> 00:46:53,040 punto, punto, punto. 1080 00:46:53,040 --> 00:46:54,240 É incrible irritante. 1081 00:46:54,240 --> 00:46:55,990 E iso significa só que o seu reprodutor de vídeo 1082 00:46:55,990 --> 00:46:58,710 está intentando descargar lotes de bytes, os lotes de bytes 1083 00:46:58,710 --> 00:47:00,170 a partir dun vídeo de internet. 1084 00:47:00,170 --> 00:47:02,920 Pero é lento, polo que el está tratando descargar unha morea deles 1085 00:47:02,920 --> 00:47:06,430 para encher un tapón, un recipiente, de xeito que ten suficiente bytes que pode, entón, 1086 00:47:06,430 --> 00:47:09,174 amosar-lle o vídeo, sen deixar constantemente. 1087 00:47:09,174 --> 00:47:11,340 Pero acontece, pode teñen unha memoria intermedia para esta grande. 1088 00:47:11,340 --> 00:47:15,710 Pero tentar poñer esa cantidade de datos en iso, e moito as cousas malas poden ocorrer. 1089 00:47:15,710 --> 00:47:22,780 Así, por exemplo, imos ollar para este teaser final dun exemplo. 1090 00:47:22,780 --> 00:47:24,720 Este é outro programa que, a primeira vista, 1091 00:47:24,720 --> 00:47:26,540 non fai nada super útil. 1092 00:47:26,540 --> 00:47:29,590 Ten unha función principal que chama esa función, f. 1093 00:47:29,590 --> 00:47:36,640 E esa función, f, ata aquí, ten unha matriz de char, chamado c, de tamaño 12. 1094 00:47:36,640 --> 00:47:39,340 E el está a usar este nova función chamada strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Acontece que, con este sinxelo, simple liña de código, só dúas liñas, 1097 00:47:45,190 --> 00:47:49,130 fixemos todo o meu programa, e, polo tanto, todo o meu ordenador, 1098 00:47:49,130 --> 00:47:54,000 e miña conta de usuario, e meu disco conducir potencialmente vulnerábel a calquera persoa 1099 00:47:54,000 --> 00:47:58,170 quen sabe e é bo o suficiente para realizar este programa cunha certa liña de comandos 1100 00:47:58,170 --> 00:47:58,900 argumento. 1101 00:47:58,900 --> 00:48:03,400 Noutras palabras, se este cara mal pon dentro argvargv [1], escribindo 1102 00:48:03,400 --> 00:48:08,750 no teclado moi especialmente creado corda, non abc, 123, pero, esencialmente, 1103 00:48:08,750 --> 00:48:15,180 símbolos binarios que representan executable código, un programa que el ou ela escribiu: 1104 00:48:15,180 --> 00:48:19,190 con este programa sinxelo, que é representativa de miles de programas 1105 00:48:19,190 --> 00:48:23,610 que son igualmente vulnerables, atrévome a dicir, el ou ela pode chegar a eliminar todos 1106 00:48:23,610 --> 00:48:26,680 os arquivos no meu disco duro, obter un alerta chiscando para que el ou ela pode 1107 00:48:26,680 --> 00:48:30,170 escribir comandos por conta propia, enviar correo-e todos os ficheiros para min. 1108 00:48:30,170 --> 00:48:34,660 O que eu poida facer, el ou ela pode facer con este código. 1109 00:48:34,660 --> 00:48:36,575 >> Non imos solucionar isto bastante aínda. 1110 00:48:36,575 --> 00:48:38,700 E, de feito, que vai implicar un pouco de imaxe 1111 00:48:38,700 --> 00:48:41,470 como este, que nos imos en breve para entender todo mellor. 1112 00:48:41,470 --> 00:48:44,480 Pero por hoxe, imos rematar en o que é, por sorte, un pouco máis 1113 00:48:44,480 --> 00:48:48,360 comprensible broma xkcd, ata retomar a próxima vez. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Todo correcto. 1116 00:48:51,600 --> 00:48:53,446 Vexo vostedes o mércores. 1117 00:48:53,446 --> 00:48:54,754 >> [MÚSICA DE XOGO] 1118 00:48:54,754 --> 00:48:57,790 >> Orador: E agora, no fondo pensamentos, por Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 A memoria é como saltar nunha pila de follas de ouro nunha tarde de domingo. 1121 00:49:04,770 --> 00:49:09,000 Vento golpe, lanzando o seu hair-- oh, eu sinto falta dos días when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Risas] 1124 00:49:12,650 --> 00:49:13,750