1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Música tocando] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK, então uma sugestão antes de iniciar aqui. 5 00:00:07,940 --> 00:00:11,660 Se você ainda não assistiu o vídeo em dicas que você pode querer fazê-lo em primeiro lugar. 6 00:00:11,660 --> 00:00:15,860 Porque este vídeo é outra forma de trabalhar com ponteiros. 7 00:00:15,860 --> 00:00:17,574 >> Por isso, vai falar sobre alguns conceitos 8 00:00:17,574 --> 00:00:19,490 que cobrem no Indicadores de vídeo, e estamos 9 00:00:19,490 --> 00:00:21,948 vai passar por cima deles agora, supondo que eles já estão 10 00:00:21,948 --> 00:00:23,090 tipo de entendido. 11 00:00:23,090 --> 00:00:25,440 Então, isso é apenas o seu aviso justo que, se você está vendo este vídeo 12 00:00:25,440 --> 00:00:27,814 e você ainda não viu o vídeo ponteiros, pode tipo de 13 00:00:27,814 --> 00:00:29,610 voar sobre sua cabeça um pouco. 14 00:00:29,610 --> 00:00:32,080 E por isso talvez seja melhor para vê-lo nessa ordem. 15 00:00:32,080 --> 00:00:34,710 >> Então, nós já vimos um maneira de trabalhar com ponteiros, 16 00:00:34,710 --> 00:00:37,810 que é nós declaramos um variável, e então nós 17 00:00:37,810 --> 00:00:42,160 declarar outra variável, um ponteiro variável, que aponta para ele. 18 00:00:42,160 --> 00:00:44,870 Então nós criamos um variável com um nome, nós temos 19 00:00:44,870 --> 00:00:48,480 criada uma segunda variável com um nome, e apontamos que a segunda variável 20 00:00:48,480 --> 00:00:50,220 em que em primeiro lugar. 21 00:00:50,220 --> 00:00:52,370 Este tipo de tem um problema, porém, porque 22 00:00:52,370 --> 00:00:54,650 obriga-nos a saber exatamente a quantidade de memória que estamos 23 00:00:54,650 --> 00:00:57,600 vai precisar do momento nosso programa é compilado. 24 00:00:57,600 --> 00:00:58,220 >> Por que é que? 25 00:00:58,220 --> 00:01:03,338 Porque temos de ser capazes de nomear ou identificar todas as possíveis variáveis 26 00:01:03,338 --> 00:01:04,129 poderíamos encontrar. 27 00:01:04,129 --> 00:01:07,910 Podemos ter uma matriz que pode ser capaz de manter uma grande quantidade de informações, 28 00:01:07,910 --> 00:01:10,110 mas ainda não é exatamente suficientemente precisa. 29 00:01:10,110 --> 00:01:12,640 E se nós não sabemos, E se não temos idéia 30 00:01:12,640 --> 00:01:14,370 o quanto vamos precisar em tempo de compilação? 31 00:01:14,370 --> 00:01:17,020 Ou que se o nosso programa vai executado por um tempo muito longo, 32 00:01:17,020 --> 00:01:19,810 aceitar vários usuário dados, e não podemos realmente 33 00:01:19,810 --> 00:01:23,170 estimar se estamos vai precisar de 1.000 unidades? 34 00:01:23,170 --> 00:01:26,060 >> Não é como nós podemos dizer na linha de comando 35 00:01:26,060 --> 00:01:28,040 inserir quantos itens você acha que vai precisar. 36 00:01:28,040 --> 00:01:31,100 Bem, o que se esse palpite é errado? 37 00:01:31,100 --> 00:01:34,300 Alocação dinâmica de memória tipo de permite-nos a caminho 38 00:01:34,300 --> 00:01:36,867 para contornar este problema particular. 39 00:01:36,867 --> 00:01:38,700 E a maneira como ele faz isso é usando ponteiros. 40 00:01:38,700 --> 00:01:42,140 >> Podemos usar ponteiros para tenha acesso aos dinamicamente 41 00:01:42,140 --> 00:01:45,710 memória alocada, memória que está alocado como o programa está sendo executado. 42 00:01:45,710 --> 00:01:48,290 Não é alocada em tempo de compilação. 43 00:01:48,290 --> 00:01:51,570 Quando você alocar dinamicamente memória se trata de um pool 44 00:01:51,570 --> 00:01:53,795 de memória conhecido como o heap. 45 00:01:53,795 --> 00:01:56,420 Anteriormente toda a memória nós temos vindo a trabalhar com no curso 46 00:01:56,420 --> 00:01:59,920 foi proveniente de uma piscina de memória conhecida como a pilha. 47 00:01:59,920 --> 00:02:02,470 Uma boa maneira de geral manter em regra mente-- e este 48 00:02:02,470 --> 00:02:04,720 nem sempre são verdadeiras, mas praticamente quase 49 00:02:04,720 --> 00:02:09,940 mantém sempre é que qualquer true-- vez que você dá um nome de variável que 50 00:02:09,940 --> 00:02:12,090 provavelmente vive na pilha. 51 00:02:12,090 --> 00:02:14,650 E qualquer hora que você não fazer dar uma variável de um nome, 52 00:02:14,650 --> 00:02:19,160 que você pode fazer com memória dinâmica alocação, ele vive na pilha. 53 00:02:19,160 --> 00:02:22,190 >> Agora eu sou o tipo de apresentar isso como se há essas duas piscinas de memória. 54 00:02:22,190 --> 00:02:24,740 Mas você pode ter visto este diagrama, que é geralmente 55 00:02:24,740 --> 00:02:27,290 uma representação de o que a memória parece, 56 00:02:27,290 --> 00:02:30,373 e nós não estamos indo para se preocupar com tudo o material na parte superior e na parte inferior. 57 00:02:30,373 --> 00:02:33,580 O que nos interessa é esta parte em meio aqui, heap e pilha. 58 00:02:33,580 --> 00:02:35,570 Como você pode ver por olhando para este diagrama, 59 00:02:35,570 --> 00:02:38,390 estes não são, na verdade, dois grupos separados de memória. 60 00:02:38,390 --> 00:02:42,757 É um conjunto compartilhado de memória onde você começa, neste visuais 61 00:02:42,757 --> 00:02:44,590 você começa na parte inferior e começar a encher 62 00:02:44,590 --> 00:02:48,040 a partir do fundo com a pilha, e você começar no topo e começar a encher 63 00:02:48,040 --> 00:02:50,072 de cima para baixo com o heap. 64 00:02:50,072 --> 00:02:51,780 Mas é realmente o mesmo pool, é apenas 65 00:02:51,780 --> 00:02:56,050 spots diferentes, diferentes locais na memória que estão sendo alocados. 66 00:02:56,050 --> 00:02:59,060 E você pode ficar sem memória por um ou outro ter 67 00:02:59,060 --> 00:03:01,240 o heap percorrer todo o caminho para a parte inferior, ou têm 68 00:03:01,240 --> 00:03:05,440 a pilha de percorrer todo o caminho até o topo, ou que tenham a pilha ea pilha 69 00:03:05,440 --> 00:03:06,740 encontrar-se uns contra os outros. 70 00:03:06,740 --> 00:03:09,500 Todos esses podem ser condições que causam o seu programa 71 00:03:09,500 --> 00:03:11,030 para executar com falta de memória. 72 00:03:11,030 --> 00:03:11,952 Portanto, manter isso em mente. 73 00:03:11,952 --> 00:03:13,660 Quando falamos de a pilha ea pilha 74 00:03:13,660 --> 00:03:17,880 estamos realmente falando sobre o mesmo pedaço geral da memória, apenas 75 00:03:17,880 --> 00:03:21,930 diferentes porções de que a memória. 76 00:03:21,930 --> 00:03:24,910 >> Então, como é que vamos chegar dinamicamente memória alocada em primeiro lugar? 77 00:03:24,910 --> 00:03:27,740 Como é que o nosso programa começar memória como ele está funcionando? 78 00:03:27,740 --> 00:03:32,660 Bem C fornece uma função chamada malloc, alocador de memória, o que 79 00:03:32,660 --> 00:03:36,810 você faz uma chamada, e você passar em quantos bytes de memória que você deseja. 80 00:03:36,810 --> 00:03:39,940 Portanto, se seu programa está sendo executado e você quer um tempo de execução inteiro, 81 00:03:39,940 --> 00:03:46,040 você pode Mallock quatro bytes de memória, malloc parênteses quatro. 82 00:03:46,040 --> 00:03:48,540 >> Mallock vai passar por olhando através da pilha, 83 00:03:48,540 --> 00:03:50,750 porque estamos dinamicamente alocação de memória, 84 00:03:50,750 --> 00:03:53,500 e ele vai voltar para você um ponteiro para a memória. 85 00:03:53,500 --> 00:03:56,180 Ele não lhe dá que memory-- não dar-lhe um nome, 86 00:03:56,180 --> 00:03:57,950 dá-lhe um ponteiro para ele. 87 00:03:57,950 --> 00:04:00,780 E é por isso que eu disse de novo que é importante talvez 88 00:04:00,780 --> 00:04:03,770 assistiram o vídeo ponteiros antes de chegar longe demais para isso. 89 00:04:03,770 --> 00:04:05,940 Então malloc vai lhe dar de volta um ponteiro. 90 00:04:05,940 --> 00:04:08,950 >> Se Mallock não posso lhe dar qualquer memória porque você correr para fora, 91 00:04:08,950 --> 00:04:10,645 ele vai lhe dar de volta um ponteiro nulo. 92 00:04:10,645 --> 00:04:15,282 Você se lembra o que acontece se tentar excluir a referência um ponteiro nulo? 93 00:04:15,282 --> 00:04:17,019 Nós sofremos uma falha seg, certo? 94 00:04:17,019 --> 00:04:18,060 Isso provavelmente não é bom. 95 00:04:18,060 --> 00:04:21,579 >> Assim, cada vez que você faz uma chamada para malloc você sempre, sempre 96 00:04:21,579 --> 00:04:25,270 precisa verificar se ou não o ponteiro deu-lhe de volta é nulo. 97 00:04:25,270 --> 00:04:28,800 Se for, você precisa terminar o seu programa porque se você tentar e dereference 98 00:04:28,800 --> 00:04:31,360 o ponteiro nulo você está indo a sofrer uma falha de segmentação 99 00:04:31,360 --> 00:04:34,380 e seu programa é vai falhar de qualquer maneira. 100 00:04:34,380 --> 00:04:37,190 Assim como nós estaticamente obter um inteiro? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Nós provavelmente fiz isso um monte de vezes, certo? 103 00:04:40,010 --> 00:04:43,480 Isso cria uma variável chamada x que vive na pilha. 104 00:04:43,480 --> 00:04:46,190 Como podemos obter dinamicamente um número inteiro? 105 00:04:46,190 --> 00:04:50,010 Int estrela px igual malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Ou, mais apropriadamente nós diríamos int estrela px 107 00:04:53,050 --> 00:04:57,680 equivale ao tamanho de malloc de int, apenas para jogar um pouco menos 108 00:04:57,680 --> 00:04:59,740 números mágicos em torno do nosso programa. 109 00:04:59,740 --> 00:05:04,140 Isto vai obter para nós quatro bytes de memória do heap, 110 00:05:04,140 --> 00:05:06,720 eo ponteiro chegarmos de volta para ele é chamado px. 111 00:05:06,720 --> 00:05:08,430 E então, assim como nós temos feito anteriormente nós 112 00:05:08,430 --> 00:05:13,966 pode excluir a referência para px acessar essa memória. 113 00:05:13,966 --> 00:05:15,590 Como podemos obter um número inteiro do usuário? 114 00:05:15,590 --> 00:05:17,970 Podemos dizer int x é igual a obter int. 115 00:05:17,970 --> 00:05:19,930 Isso é bastante simples. 116 00:05:19,930 --> 00:05:24,030 E se nós queremos criar uma matriz x de carros alegóricos que vivem na pilha? 117 00:05:24,030 --> 00:05:28,210 flutuar stack_array-- esse é o nome dos nossos colchetes array-- x. 118 00:05:28,210 --> 00:05:32,419 Isso vai criar para nós um array x de carros alegóricos que vivem na pilha. 119 00:05:32,419 --> 00:05:34,960 Podemos criar uma matriz de carros alegóricos que vive na pilha também. 120 00:05:34,960 --> 00:05:37,330 A sintaxe pode parecer um pouco mais complicado, 121 00:05:37,330 --> 00:05:41,740 mas podemos dizer flutuador estrela heap_array igual 122 00:05:41,740 --> 00:05:44,360 malloc x vezes o tamanho do flutuador. 123 00:05:44,360 --> 00:05:48,160 Eu preciso de espaço suficiente para armazenar x valores de ponto flutuante. 124 00:05:48,160 --> 00:05:51,560 Então digo que preciso de 100 carros alegóricos, ou 1.000 carros alegóricos. 125 00:05:51,560 --> 00:05:54,810 Assim, nesse caso, seria 400 bytes para 100 carros alegóricos, 126 00:05:54,810 --> 00:05:59,080 ou 4.000 bytes para 1.000 carros alegóricos, porque cada flutuador ocupa 127 00:05:59,080 --> 00:06:01,230 quatro bytes de espaço. 128 00:06:01,230 --> 00:06:05,110 >> Depois de fazer isso eu posso usar o sintaxe colchete em heap_array. 129 00:06:05,110 --> 00:06:08,970 Assim como eu faria em stack_array, I pode acessar seus elementos individualmente 130 00:06:08,970 --> 00:06:11,590 usando heap_array zero, um heap_array. 131 00:06:11,590 --> 00:06:15,800 Mas recordar a razão que nós podemos fazer isso porque é o nome de uma matriz em C 132 00:06:15,800 --> 00:06:19,990 é realmente um ponteiro para primeiro elemento desse conjunto. 133 00:06:19,990 --> 00:06:23,480 Assim, o fato de que estamos declarando um matriz de carros alegóricos na pilha aqui 134 00:06:23,480 --> 00:06:24,810 na verdade é um pouco enganador. 135 00:06:24,810 --> 00:06:27,600 Nós realmente estamos no segunda linha de código não 136 00:06:27,600 --> 00:06:32,360 também a criação de um ponteiro para um pedaço de memória que, em seguida, fazer algum trabalho com. 137 00:06:32,360 --> 00:06:35,620 >> Aqui está o grande problema com alocada dinamicamente a memória, porém, 138 00:06:35,620 --> 00:06:38,360 e é por isso que é realmente importante desenvolver alguns bons hábitos 139 00:06:38,360 --> 00:06:39,800 quando você está trabalhando com ele. 140 00:06:39,800 --> 00:06:43,060 Ao contrário declarada estaticamente memória, a memória 141 00:06:43,060 --> 00:06:46,790 não é automaticamente devolvida ao sistema quando sua função é feito. 142 00:06:46,790 --> 00:06:49,280 Então, se temos principal, e principal chama uma função 143 00:06:49,280 --> 00:06:53,860 f, quando f acabamentos seja o que está fazendo e devolve o controlo do programa 144 00:06:53,860 --> 00:06:58,810 de volta à principal, toda a memória que f usado é dado de volta. 145 00:06:58,810 --> 00:07:01,250 Ele pode ser usado novamente por algum outro programa, 146 00:07:01,250 --> 00:07:04,250 ou alguma outra função que é chamado mais tarde na principal. 147 00:07:04,250 --> 00:07:06,970 Ele pode usar a mesma memória de novo. 148 00:07:06,970 --> 00:07:09,620 >> Se você dinamicamente alocar memória embora 149 00:07:09,620 --> 00:07:14,380 você tem que dizer explicitamente o sistema que você está feito com ele. 150 00:07:14,380 --> 00:07:18,370 Ele vai agarrar-lo para você, o que poderia levar a um problema de vocês se esgotando 151 00:07:18,370 --> 00:07:19,290 de memória. 152 00:07:19,290 --> 00:07:22,179 E, na verdade, por vezes, referem-se para isto como uma perda de memória. 153 00:07:22,179 --> 00:07:24,970 E às vezes esses vazamentos de memória pode realmente ser realmente devastador 154 00:07:24,970 --> 00:07:27,020 para o desempenho do sistema. 155 00:07:27,020 --> 00:07:31,120 >> Se você é um usuário freqüente internet você pode usar determinados navegadores da web, 156 00:07:31,120 --> 00:07:35,630 e eu não vou citar nomes aqui, mas existem alguns navegadores da web lá fora 157 00:07:35,630 --> 00:07:39,150 que são notórias para realmente ter vazamentos de memória que não são fixos. 158 00:07:39,150 --> 00:07:44,570 E se você deixa o seu navegador aberto para um período muito longo de tempo, dias 159 00:07:44,570 --> 00:07:48,060 e em dias, ou semanas, você às vezes pode notar que seu sistema 160 00:07:48,060 --> 00:07:49,790 é correndo muito, muito lentamente. 161 00:07:49,790 --> 00:07:54,640 E a razão para isso é que o navegador alocou memória, 162 00:07:54,640 --> 00:07:57,320 mas depois não contou o sistema que é feito com ele. 163 00:07:57,320 --> 00:08:01,000 E assim que deixa menos memória disponível para todos os seus outros programas 164 00:08:01,000 --> 00:08:04,480 ter que compartilhar, porque você é leaking-- que o navegador web 165 00:08:04,480 --> 00:08:06,755 programa está vazando memória. 166 00:08:06,755 --> 00:08:08,880 Como é que vamos dar de memória de volta quando estamos a fazer com ele? 167 00:08:08,880 --> 00:08:10,838 Bem, felizmente, é uma maneira muito fácil de fazê-lo. 168 00:08:10,838 --> 00:08:11,710 Nós apenas livrá-lo. 169 00:08:11,710 --> 00:08:15,020 Há uma função chamada livre, que aceita um apontador para a memória, 170 00:08:15,020 --> 00:08:16,010 e nós somos bons de ir. 171 00:08:16,010 --> 00:08:18,310 >> Então, vamos dizer que estamos no meio do nosso 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 uma matriz que pode capaz de reter 50 caracteres. 174 00:08:25,710 --> 00:08:29,109 E quando temos um ponteiro de volta ao que, o nome do ponteiro é a palavra. 175 00:08:29,109 --> 00:08:30,900 Fazemos o que nós somos vai fazer com palavra, 176 00:08:30,900 --> 00:08:33,440 e, em seguida, quando estamos feito que apenas livrá-lo. 177 00:08:33,440 --> 00:08:37,460 E agora temos devolvido os 50 bytes de memória de volta para o sistema. 178 00:08:37,460 --> 00:08:40,147 Alguma outra função pode usá-los. 179 00:08:40,147 --> 00:08:43,480 Nós não temos que se preocupar com um sofrimento vazamento de memória porque temos libertado palavra. 180 00:08:43,480 --> 00:08:46,639 Nós demos a memória de volta, por isso, terminar de trabalhar com ele. 181 00:08:46,639 --> 00:08:48,430 Portanto, há três regras de ouro que devem 182 00:08:48,430 --> 00:08:51,700 ser mantido em mente sempre que você está alocar dinamicamente a memória 183 00:08:51,700 --> 00:08:52,990 com malloc. 184 00:08:52,990 --> 00:08:56,480 Cada bloco de memória que malloc você deve ser liberado 185 00:08:56,480 --> 00:08:58,430 antes de seu programa termina a execução. 186 00:08:58,430 --> 00:09:02,029 Agora, novamente, no aparelho ou no IDE esse tipo de acontece para você de qualquer maneira 187 00:09:02,029 --> 00:09:04,820 você-- quando isso vai acontecer de qualquer maneira quando o programa é encerrado, 188 00:09:04,820 --> 00:09:06,880 toda a memória será liberado. 189 00:09:06,880 --> 00:09:10,750 Mas é geralmente boa codificação prática para sempre, quando você estiver pronto, 190 00:09:10,750 --> 00:09:13,810 libertar o que você mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Dito isto, únicas coisas que você tem mallocd deveriam ser libertados. 192 00:09:16,690 --> 00:09:19,880 Se você declarar um estaticamente inteiro, int x-e-vírgula, 193 00:09:19,880 --> 00:09:23,500 que vive na pilha, você não, então queremos libertar x. 194 00:09:23,500 --> 00:09:25,970 Então únicas coisas que você mallocd deveriam ser libertados. 195 00:09:25,970 --> 00:09:28,960 >> E, por último, não fazer algo livre duas vezes. 196 00:09:28,960 --> 00:09:31,170 Isso pode levar a outra situação estranha. 197 00:09:31,170 --> 00:09:33,530 Então, tudo que você tem mallocd tem de ser libertado. 198 00:09:33,530 --> 00:09:36,000 Únicas coisas que você malloc deveriam ser libertados. 199 00:09:36,000 --> 00:09:38,730 E não fazer algo livre duas vezes. 200 00:09:38,730 --> 00:09:43,660 >> Então, vamos passar por um exemplo aqui do que alguns alocada dinamicamente 201 00:09:43,660 --> 00:09:46,122 memória pode parecer misto com alguma memória estática. 202 00:09:46,122 --> 00:09:47,080 O que pode acontecer aqui? 203 00:09:47,080 --> 00:09:48,913 Veja se você pode seguir ao longo e adivinhar o que está 204 00:09:48,913 --> 00:09:51,720 vai acontecer como nós vamos através de todas estas linhas de código. 205 00:09:51,720 --> 00:09:53,980 >> Assim, dizemos int m. 206 00:09:53,980 --> 00:09:54,840 o que acontece aqui? 207 00:09:54,840 --> 00:09:56,339 Bem, isso é bastante simples. 208 00:09:56,339 --> 00:09:59,650 Eu criar uma variável inteira chamada m. 209 00:09:59,650 --> 00:10:01,400 Eu colori-lo verde, porque essa é a cor 210 00:10:01,400 --> 00:10:03,730 que eu uso quando estou falando cerca de variáveis ​​inteiras. 211 00:10:03,730 --> 00:10:05,160 É uma caixa. 212 00:10:05,160 --> 00:10:08,400 É chamado m, e você pode armazenar números inteiros dentro dele. 213 00:10:08,400 --> 00:10:12,400 >> E se eu, em seguida, dizer int estrela um? 214 00:10:12,400 --> 00:10:13,530 Bem, isso é bastante semelhante. 215 00:10:13,530 --> 00:10:15,780 Estou criando uma caixa chamada a. 216 00:10:15,780 --> 00:10:19,100 Ele é capaz de exploração int estrelas, ponteiros para inteiros. 217 00:10:19,100 --> 00:10:21,570 Então, eu estou colorindo-verde-ish também. 218 00:10:21,570 --> 00:10:24,140 >> Eu sei que tem algo a ver com um número inteiro, 219 00:10:24,140 --> 00:10:25,852 mas ela própria não é um número inteiro. 220 00:10:25,852 --> 00:10:27,310 Mas é praticamente a mesma idéia. 221 00:10:27,310 --> 00:10:28,101 Eu criei uma caixa. 222 00:10:28,101 --> 00:10:30,070 Ambos direita agora vivem na pilha. 223 00:10:30,070 --> 00:10:32,520 Eu dei-lhes ambos os nomes. 224 00:10:32,520 --> 00:10:36,750 >> int estrela b equivale ao tamanho de malloc de int. 225 00:10:36,750 --> 00:10:38,560 Este pode ser um pouco complicado. 226 00:10:38,560 --> 00:10:44,110 Leva um segundo e pensar sobre o que você seria de esperar que aconteça neste diagrama. 227 00:10:44,110 --> 00:10:50,210 int estrela b equivale ao tamanho de malloc de int. 228 00:10:50,210 --> 00:10:51,940 >> Bem, isso não basta criar uma caixa. 229 00:10:51,940 --> 00:10:53,800 Isso realmente cria duas caixas. 230 00:10:53,800 --> 00:10:58,670 E ela se liga, ele também estabelece um ponto em uma relação. 231 00:10:58,670 --> 00:11:02,240 Temos atribuído a uma quadra de memória na pilha. 232 00:11:02,240 --> 00:11:05,940 Observe que a caixa superior direito lá não tem um nome. 233 00:11:05,940 --> 00:11:06,760 >> Nós mallocd-lo. 234 00:11:06,760 --> 00:11:08,050 Ela existe na pilha. 235 00:11:08,050 --> 00:11:10,090 Mas b tem um nome. 236 00:11:10,090 --> 00:11:11,950 É uma variável ponteiro chamado b. 237 00:11:11,950 --> 00:11:13,910 Que vive na pilha. 238 00:11:13,910 --> 00:11:18,250 >> Portanto, é um pedaço de memória que aponta para outro. 239 00:11:18,250 --> 00:11:21,840 b contém o endereço do bloco de memória. 240 00:11:21,840 --> 00:11:23,757 Ele não tem um nome de outra forma. 241 00:11:23,757 --> 00:11:24,590 Mas ele aponta para isso. 242 00:11:24,590 --> 00:11:29,760 Assim, quando dizemos int estrela b é igual a malloc tamanho do int, que ali mesmo, 243 00:11:29,760 --> 00:11:33,490 que a flecha que apareceu na lado direito lá, aquela coisa toda, 244 00:11:33,490 --> 00:11:36,740 Eu vou ter que aparecer novamente, é o que acontece. 245 00:11:36,740 --> 00:11:39,341 Tudo isto acontece em que uma única linha de código. 246 00:11:39,341 --> 00:11:41,340 Agora nós vamos chegar pouco mais simples novamente. 247 00:11:41,340 --> 00:11:43,330 um é igual e comercial m. 248 00:11:43,330 --> 00:11:46,280 Você se lembra o que um é igual e comercial m é? 249 00:11:46,280 --> 00:11:48,920 Bem, isso é um recebe o endereço de m. 250 00:11:48,920 --> 00:11:54,150 Ou colocar mais esquematicamente, alguns pontos para m. 251 00:11:54,150 --> 00:11:56,360 >> b é igual a um. 252 00:11:56,360 --> 00:11:57,560 OK então aqui está um outro. 253 00:11:57,560 --> 00:11:59,230 Um igual ao b. 254 00:11:59,230 --> 00:12:02,260 O que vai acontecer o diagrama desta vez? 255 00:12:02,260 --> 00:12:04,330 >> Bem recordar que o obras operador de atribuição 256 00:12:04,330 --> 00:12:08,960 atribuindo o valor no direito de o valor do lado esquerdo. 257 00:12:08,960 --> 00:12:14,820 Então, em vez de um apontador para m, uma empresa aponta para o mesmo lugar que b pontos. 258 00:12:14,820 --> 00:12:18,900 um não aponta para B, A pontos onde b pontos. 259 00:12:18,900 --> 00:12:25,280 >> Se um aguçado para b que faria ter sido um igual e comercial b. 260 00:12:25,280 --> 00:12:28,150 Mas, em vez de um é igual a b apenas significa que a e b são agora 261 00:12:28,150 --> 00:12:31,770 apontando para o mesmo endereço, porque dentro de b é apenas um endereço. 262 00:12:31,770 --> 00:12:35,004 E agora dentro de um é o mesmo endereço. 263 00:12:35,004 --> 00:12:37,170 m é igual a 10, provavelmente o coisa mais simples 264 00:12:37,170 --> 00:12:38,690 nós fizemos em um pouco. 265 00:12:38,690 --> 00:12:40,460 Coloque a 10 na caixa. 266 00:12:40,460 --> 00:12:45,640 Estrela b é igual a m plus 2, recorde de nossa ponteiros vídeo que estrela b significa. 267 00:12:45,640 --> 00:12:50,230 Nós estamos indo para dereference b e put algum valor em que a localização de memória. 268 00:12:50,230 --> 00:12:51,860 Neste caso 12. 269 00:12:51,860 --> 00:12:55,300 >> Então, quando nós dereference um ponto de lembrar que acabamos de viajar para baixo a seta. 270 00:12:55,300 --> 00:12:58,205 Ou dito de outra forma, ir para esse endereço de memória 271 00:12:58,205 --> 00:12:59,580 e manipulá-lo de alguma forma. 272 00:12:59,580 --> 00:13:00,830 Nós colocamos algum valor lá. 273 00:13:00,830 --> 00:13:03,960 Neste caso estrela b é igual a m mais 2 é apenas 274 00:13:03,960 --> 00:13:08,230 ir para a variável apontada por b, ir para a memória apontada por b, 275 00:13:08,230 --> 00:13:11,750 e colocar mais 2 m de lá, 12. 276 00:13:11,750 --> 00:13:14,970 >> Agora eu libertar b. 277 00:13:14,970 --> 00:13:16,490 O que acontece quando eu liberar b? 278 00:13:16,490 --> 00:13:18,800 Lembre-se que eu disse meios livres. 279 00:13:18,800 --> 00:13:21,920 O que estou dizendo quando eu liberar b? 280 00:13:21,920 --> 00:13:23,410 >> Estou cansado de trabalhar com ele, certo? 281 00:13:23,410 --> 00:13:25,702 Eu essencialmente desistir da memória. 282 00:13:25,702 --> 00:13:26,910 Dou-lhe de volta para o sistema. 283 00:13:26,910 --> 00:13:33,010 Eu não preciso mais disso é o que eu estou dizendo a eles, OK? 284 00:13:33,010 --> 00:13:37,390 >> Agora, se eu digo uma estrela é igual a 11 você provavelmente pode 285 00:13:37,390 --> 00:13:40,460 já dizer que algo ruim que vai acontecer aqui, certo? 286 00:13:40,460 --> 00:13:44,160 E, de fato, se eu tentei que eu provavelmente sofreria uma falha de segmentação. 287 00:13:44,160 --> 00:13:47,140 Porque agora, embora anteriormente que pedaço de memória 288 00:13:47,140 --> 00:13:50,220 era algo que eu tinha acesso, neste ponto 289 00:13:50,220 --> 00:13:54,590 Agora eu estou acessando memória que não é legal para mim para acessar. 290 00:13:54,590 --> 00:13:57,330 >> E como nós, provavelmente, lembro, quando nós acessar a memória 291 00:13:57,330 --> 00:14:00,000 que não é suposto ao toque, essa é a causa mais comum 292 00:14:00,000 --> 00:14:01,860 de uma segmentação falha. E assim meu programa 293 00:14:01,860 --> 00:14:05,170 deixaria de funcionar se eu tentasse fazer isso. 294 00:14:05,170 --> 00:14:09,910 Então, novamente, é uma boa idéia para obter um bom práticas e bons hábitos enraizados 295 00:14:09,910 --> 00:14:12,920 quando se trabalha com malloc e livre, de modo que você não sofre de segmentação 296 00:14:12,920 --> 00:14:15,310 falhas, e que você usa seu alocada dinamicamente 297 00:14:15,310 --> 00:14:17,370 memória de forma responsável. 298 00:14:17,370 --> 00:14:20,300 >> Eu sou Doug Lloyd este é CS50. 299 00:14:20,300 --> 00:14:21,947