1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [RIPRODUZIONE DI BRANI MUSICALI] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK così un suggerimento prima di iniziare qui. 5 00:00:07,940 --> 00:00:11,660 Se non avete visto il video su Puntatori si potrebbe desiderare di farlo prima. 6 00:00:11,660 --> 00:00:15,860 Poiché il video è un altro modo di lavorare con i puntatori. 7 00:00:15,860 --> 00:00:17,574 >> Così sta andando a parlare su alcuni concetti 8 00:00:17,574 --> 00:00:19,490 che copriamo nella puntatori video, e siamo 9 00:00:19,490 --> 00:00:21,948 andando a sorvolare su di loro ora, partendo dal presupposto che sono già 10 00:00:21,948 --> 00:00:23,090 sorta di intesa. 11 00:00:23,090 --> 00:00:25,440 Ecco, questo è solo il tuo avvertimento fiera che se stai vedendo questo video 12 00:00:25,440 --> 00:00:27,814 e non avete visto la Video puntatori, potrebbe sorta di 13 00:00:27,814 --> 00:00:29,610 volare sopra la testa un po '. 14 00:00:29,610 --> 00:00:32,080 E così potrebbe essere migliore a guardarlo in questo ordine. 15 00:00:32,080 --> 00:00:34,710 >> Così abbiamo già visto uno modo di lavorare con i puntatori, 16 00:00:34,710 --> 00:00:37,810 che è dichiariamo un variabili, e quindi noi 17 00:00:37,810 --> 00:00:42,160 dichiarare un'altra variabile, un puntatore variabile, che punta ad esso. 18 00:00:42,160 --> 00:00:44,870 Per questo abbiamo creato una variabile con un nome, abbiamo 19 00:00:44,870 --> 00:00:48,480 creato una seconda variabile con un nome, e si segnala che seconda variabile 20 00:00:48,480 --> 00:00:50,220 a quella prima. 21 00:00:50,220 --> 00:00:52,370 Questo tipo di ha un problema, però, perché 22 00:00:52,370 --> 00:00:54,650 ci impone di sapere esattamente la quantità di memoria che siamo 23 00:00:54,650 --> 00:00:57,600 andando ad avere bisogno del momento il nostro programma è compilato. 24 00:00:57,600 --> 00:00:58,220 >> Come mai? 25 00:00:58,220 --> 00:01:03,338 Perché abbiamo bisogno di essere in grado di nominare o identificare tutte le possibili variabili 26 00:01:03,338 --> 00:01:04,129 che possiamo incontrare. 27 00:01:04,129 --> 00:01:07,910 Potremmo avere una matrice che potrebbe essere in grado di contenere un sacco di informazioni, 28 00:01:07,910 --> 00:01:10,110 ma non è ancora esattamente abbastanza preciso. 29 00:01:10,110 --> 00:01:12,640 Che cosa succede se non lo sappiamo, E se non abbiamo idea 30 00:01:12,640 --> 00:01:14,370 quanto avremo bisogno durante la compilazione? 31 00:01:14,370 --> 00:01:17,020 O se il nostro programma sarà correre per un tempo molto lungo, 32 00:01:17,020 --> 00:01:19,810 accettando varie utente i dati, e non possiamo davvero 33 00:01:19,810 --> 00:01:23,170 stimare se siamo andando a bisogno di 1.000 unità? 34 00:01:23,170 --> 00:01:26,060 >> Non è che possiamo dire dalla riga di comando 35 00:01:26,060 --> 00:01:28,040 inserire il numero di elementi si pensi hai bisogno. 36 00:01:28,040 --> 00:01:31,100 Beh, cosa succede se questo ipotesi è sbagliato? 37 00:01:31,100 --> 00:01:34,300 Allocazione dinamica della memoria sorta di ci permette la via 38 00:01:34,300 --> 00:01:36,867 per ovviare a questo particolare problema. 39 00:01:36,867 --> 00:01:38,700 E il modo lo fa è quello di utilizzare i puntatori. 40 00:01:38,700 --> 00:01:42,140 >> Possiamo usare i puntatori a ottenere l'accesso a dinamicamente 41 00:01:42,140 --> 00:01:45,710 memoria allocata, memoria che è assegnato come programma è in esecuzione. 42 00:01:45,710 --> 00:01:48,290 Non è allocata in fase di compilazione. 43 00:01:48,290 --> 00:01:51,570 Quando si allocare dinamicamente memoria proviene da un pool 44 00:01:51,570 --> 00:01:53,795 di memoria noto come cumulo. 45 00:01:53,795 --> 00:01:56,420 In precedenza tutta la memoria che abbiamo lavorato con in corso 46 00:01:56,420 --> 00:01:59,920 è stato provenienti da un pool della memoria noto come stack. 47 00:01:59,920 --> 00:02:02,470 Un buon modo per genere tenere in regola mind-- e questo 48 00:02:02,470 --> 00:02:04,720 non regge sempre vero, ma praticamente quasi 49 00:02:04,720 --> 00:02:09,940 tiene sempre true-- è che qualsiasi volta che si dà un nome di variabile che 50 00:02:09,940 --> 00:02:12,090 probabilmente vive nello stack. 51 00:02:12,090 --> 00:02:14,650 E ogni volta che non lo fanno dare una variabile un nome, 52 00:02:14,650 --> 00:02:19,160 che si può fare con la memoria dinamica assegnazione, vive sul mucchio. 53 00:02:19,160 --> 00:02:22,190 >> Ora sto tipo di presentare questo come se ci sono questi due piscine della memoria. 54 00:02:22,190 --> 00:02:24,740 Ma potreste aver visto questo diagramma, che è generalmente 55 00:02:24,740 --> 00:02:27,290 una rappresentazione di ciò che la memoria sembra, 56 00:02:27,290 --> 00:02:30,373 e non stiamo andando a prendersi cura di tutto la roba in alto e in basso. 57 00:02:30,373 --> 00:02:33,580 Quello che ci interessa è questo in parte Al centro qui, heap e stack. 58 00:02:33,580 --> 00:02:35,570 Come si può vedere da guardando questo diagramma, 59 00:02:35,570 --> 00:02:38,390 questi in realtà non sono due piscine separate della memoria. 60 00:02:38,390 --> 00:02:42,757 E 'una piscina in comune della memoria dove si inizia, in questa visuale 61 00:02:42,757 --> 00:02:44,590 si avvia in basso e iniziare a riempire 62 00:02:44,590 --> 00:02:48,040 dal basso con la pila, e avviare in alto e iniziare a riempire 63 00:02:48,040 --> 00:02:50,072 dall'alto verso il basso con il mucchio. 64 00:02:50,072 --> 00:02:51,780 Ma è davvero la stesso pool, è solo 65 00:02:51,780 --> 00:02:56,050 punti diversi, luoghi diversi in memoria che vengono assegnati. 66 00:02:56,050 --> 00:02:59,060 E si può esaurire memoria o avere 67 00:02:59,060 --> 00:03:01,240 mucchio andare fino in fondo verso il basso, o hanno 68 00:03:01,240 --> 00:03:05,440 lo stack andare fino alla cima, o aventi mucchio e lo stack 69 00:03:05,440 --> 00:03:06,740 soddisfare una contro l'altra. 70 00:03:06,740 --> 00:03:09,500 Tutti questi possono essere condizioni che causano il vostro programma 71 00:03:09,500 --> 00:03:11,030 a corto di memoria. 72 00:03:11,030 --> 00:03:11,952 Modo da tenere a mente. 73 00:03:11,952 --> 00:03:13,660 Quando si parla di l'heap e stack 74 00:03:13,660 --> 00:03:17,880 stiamo davvero parlando della stesso pezzo di memoria generale, solo 75 00:03:17,880 --> 00:03:21,930 diverse porzioni di quella memoria. 76 00:03:21,930 --> 00:03:24,910 >> Quindi, come possiamo ottenere in modo dinamico memoria allocata in primo luogo? 77 00:03:24,910 --> 00:03:27,740 Come fa il nostro programma di arrivare memoria, come è in esecuzione? 78 00:03:27,740 --> 00:03:32,660 Beh C offre una funzione chiamata malloc, allocatore di memoria, che 79 00:03:32,660 --> 00:03:36,810 si effettua una chiamata a, e si passa quanti byte di memoria che si desidera. 80 00:03:36,810 --> 00:03:39,940 Così, se il programma è in esecuzione e si desidera un runtime intero, 81 00:03:39,940 --> 00:03:46,040 si potrebbe Mallock quattro byte memoria, malloc parentesi quattro. 82 00:03:46,040 --> 00:03:48,540 >> Mallock passerà attraverso guardando attraverso il mucchio, 83 00:03:48,540 --> 00:03:50,750 perché siamo in modo dinamico l'allocazione della memoria, 84 00:03:50,750 --> 00:03:53,500 e tornerà a voi un puntatore a tale memoria. 85 00:03:53,500 --> 00:03:56,180 Esso non ti dà che memory-- non dà un nome, 86 00:03:56,180 --> 00:03:57,950 ti dà un puntatore ad esso. 87 00:03:57,950 --> 00:04:00,780 Ed è per questo che ancora una volta ho detto che è importante forse 88 00:04:00,780 --> 00:04:03,770 hanno guardato il video puntatori prima di arrivare troppo lontano in questo. 89 00:04:03,770 --> 00:04:05,940 Così malloc sta andando a dare indietro un puntatore. 90 00:04:05,940 --> 00:04:08,950 >> Se Mallock non è possibile dare alcuna memoria perché si è a corto, 91 00:04:08,950 --> 00:04:10,645 ti do indietro un puntatore nullo. 92 00:04:10,645 --> 00:04:15,282 Ti ricordi cosa succede se cercare di dereference un puntatore nullo? 93 00:04:15,282 --> 00:04:17,019 Soffriamo un guasto seg, giusto? 94 00:04:17,019 --> 00:04:18,060 Che probabilmente non è buono. 95 00:04:18,060 --> 00:04:21,579 >> Così ogni volta che si effettua una chiamata a malloc voi sempre, sempre 96 00:04:21,579 --> 00:04:25,270 bisogno di controllare se il puntatore ha dato voi è indietro nulla. 97 00:04:25,270 --> 00:04:28,800 Se lo è, è necessario terminare il vostro programma perché se si cerca di risolvere il riferimento 98 00:04:28,800 --> 00:04:31,360 il puntatore nullo si sta andando a soffrire un errore di segmentazione 99 00:04:31,360 --> 00:04:34,380 e il vostro programma è andare a sbattere comunque. 100 00:04:34,380 --> 00:04:37,190 Quindi, come possiamo staticamente ottenere un intero? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Probabilmente abbiamo fatto che un sacco di volte, giusto? 103 00:04:40,010 --> 00:04:43,480 Questo crea una variabile chiamata x che vive in pila. 104 00:04:43,480 --> 00:04:46,190 Come possiamo ottenere dinamicamente un intero? 105 00:04:46,190 --> 00:04:50,010 Int stella px uguale malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> O, più appropriatamente diremmo int stelle px 107 00:04:53,050 --> 00:04:57,680 uguale formato malloc di int, solo per gettare un po 'meno 108 00:04:57,680 --> 00:04:59,740 numeri magici intorno al nostro programma. 109 00:04:59,740 --> 00:05:04,140 Questo sta per ottenerci quattro byte di memoria dal mucchio, 110 00:05:04,140 --> 00:05:06,720 e il puntatore otteniamo di nuovo esso è chiamato px. 111 00:05:06,720 --> 00:05:08,430 E poi basta, come abbiamo fatto in precedenza abbiamo 112 00:05:08,430 --> 00:05:13,966 possono dereference px a accedere a tale memoria. 113 00:05:13,966 --> 00:05:15,590 Come possiamo ottenere un numero intero da parte dell'utente? 114 00:05:15,590 --> 00:05:17,970 Possiamo dire int x è uguale a ottenere int. 115 00:05:17,970 --> 00:05:19,930 Questo è abbastanza semplice. 116 00:05:19,930 --> 00:05:24,030 Che cosa succede se si vuole creare un array di x galleggianti che vivono nello stack? 117 00:05:24,030 --> 00:05:28,210 galleggiare stack_array-- questo è il nome dei nostri array-- parentesi quadre x. 118 00:05:28,210 --> 00:05:32,419 Che creerà per noi un array di x galleggianti che vivono in pila. 119 00:05:32,419 --> 00:05:34,960 Siamo in grado di creare un array di carri allegorici che vive sul mucchio, anche. 120 00:05:34,960 --> 00:05:37,330 La sintassi potrebbe sembrare un poco più ingombrante, 121 00:05:37,330 --> 00:05:41,740 ma possiamo dire galleggiante stella heap_array uguale 122 00:05:41,740 --> 00:05:44,360 malloc x volte la dimensione del galleggiante. 123 00:05:44,360 --> 00:05:48,160 Ho bisogno di spazio sufficiente per contenere x valori in virgola mobile. 124 00:05:48,160 --> 00:05:51,560 Così dico ho bisogno di 100 galleggianti, o 1.000 carri allegorici. 125 00:05:51,560 --> 00:05:54,810 Quindi, in questo caso sarebbe 400 byte per 100 carri allegorici, 126 00:05:54,810 --> 00:05:59,080 o 4.000 byte per 1.000 carri allegorici, perché ogni galleggiante occupa 127 00:05:59,080 --> 00:06:01,230 quattro byte di spazio. 128 00:06:01,230 --> 00:06:05,110 >> Dopo aver fatto questo posso usare il sintassi parentesi quadra su heap_array. 129 00:06:05,110 --> 00:06:08,970 Proprio come farebbe su stack_array, io può accedere ai suoi elementi singolarmente 130 00:06:08,970 --> 00:06:11,590 utilizzando heap_array zero, uno heap_array. 131 00:06:11,590 --> 00:06:15,800 Ma ricordare la ragione possiamo farlo è perché il nome di un array in C 132 00:06:15,800 --> 00:06:19,990 è davvero un puntatore primo elemento di quella matrice. 133 00:06:19,990 --> 00:06:23,480 Quindi il fatto che stiamo dichiarando una gamma di carri sullo stack qui 134 00:06:23,480 --> 00:06:24,810 è in realtà un po 'fuorviante. 135 00:06:24,810 --> 00:06:27,600 Siamo davvero in seconda riga di codice lì 136 00:06:27,600 --> 00:06:32,360 creando anche un puntatore a un pezzo di memoria che allora facciamo un po 'di lavoro con. 137 00:06:32,360 --> 00:06:35,620 >> Ecco il grande problema con allocata dinamicamente la memoria, però, 138 00:06:35,620 --> 00:06:38,360 ed è per questo che è davvero importante sviluppare alcune buone abitudini 139 00:06:38,360 --> 00:06:39,800 quando si lavora con esso. 140 00:06:39,800 --> 00:06:43,060 A differenza staticamente dichiarato la memoria, la memoria 141 00:06:43,060 --> 00:06:46,790 Non viene restituito automaticamente sistema quando la funzione è fatto. 142 00:06:46,790 --> 00:06:49,280 Quindi, se abbiamo principale, e principale chiama una funzione 143 00:06:49,280 --> 00:06:53,860 f, quando f finiture qualunque cosa sta facendo e restituisce il controllo del programma 144 00:06:53,860 --> 00:06:58,810 torna alla principale, tutta la memoria che f utilizzata viene restituita. 145 00:06:58,810 --> 00:07:01,250 Può essere riutilizzato da qualche altro programma, 146 00:07:01,250 --> 00:07:04,250 o qualche altra funzione che viene chiamato in seguito in principale. 147 00:07:04,250 --> 00:07:06,970 Si può usare quella stessa memoria di nuovo. 148 00:07:06,970 --> 00:07:09,620 >> Se dinamicamente allocare la memoria se 149 00:07:09,620 --> 00:07:14,380 dovete dire esplicitamente il sistema che hai finito con esso. 150 00:07:14,380 --> 00:07:18,370 Sarà tenere su di esso per voi, che potrebbe portare a un problema di voi esaurirsi 151 00:07:18,370 --> 00:07:19,290 della memoria. 152 00:07:19,290 --> 00:07:22,179 E infatti a volte ci riferiamo a questo come una perdita di memoria. 153 00:07:22,179 --> 00:07:24,970 E a volte queste perdite di memoria può effettivamente essere davvero devastante 154 00:07:24,970 --> 00:07:27,020 per le prestazioni del sistema. 155 00:07:27,020 --> 00:07:31,120 >> Se sei un utente internet frequente si potrebbe utilizzare alcuni browser web, 156 00:07:31,120 --> 00:07:35,630 e non voglio fare nomi qui, ma ci sono alcuni browser web là fuori 157 00:07:35,630 --> 00:07:39,150 che sono noti per avere effettivamente perdite di memoria che non vengono risolti. 158 00:07:39,150 --> 00:07:44,570 E se si lascia il browser aperto per un lungo periodo di tempo, giorni 159 00:07:44,570 --> 00:07:48,060 e giorni, o settimane, a volte potrebbe notare che il sistema 160 00:07:48,060 --> 00:07:49,790 è in esecuzione molto, molto lentamente. 161 00:07:49,790 --> 00:07:54,640 E la ragione di ciò è che il browser ha stanziato la memoria, 162 00:07:54,640 --> 00:07:57,320 ma poi non ha detto il sistema che è fatto con esso. 163 00:07:57,320 --> 00:08:01,000 E in modo che lascia meno memoria a disposizione di tutti gli altri programmi 164 00:08:01,000 --> 00:08:04,480 di dover condividere, perché sei leaking-- che il browser web 165 00:08:04,480 --> 00:08:06,755 il programma perde la memoria. 166 00:08:06,755 --> 00:08:08,880 Come facciamo a dare memoria indietro quando avremo finito con esso? 167 00:08:08,880 --> 00:08:10,838 Beh per fortuna si tratta di un modo molto semplice per farlo. 168 00:08:10,838 --> 00:08:11,710 Abbiamo appena liberiamo di esso. 169 00:08:11,710 --> 00:08:15,020 C'è una funzione chiamata gratuito, accetta un puntatore alla memoria, 170 00:08:15,020 --> 00:08:16,010 e siamo a posto. 171 00:08:16,010 --> 00:08:18,310 >> Quindi diciamo che siamo in centro del nostro programma, 172 00:08:18,310 --> 00:08:21,970 vogliamo malloc 50 caratteri. 173 00:08:21,970 --> 00:08:25,710 Vogliamo malloc un array che può in grado di contenere 50 caratteri. 174 00:08:25,710 --> 00:08:29,109 E quando si ottiene un puntatore torna a che, il nome di quel puntatore è la parola. 175 00:08:29,109 --> 00:08:30,900 Facciamo di tutto siamo intenzione di fare con la parola, 176 00:08:30,900 --> 00:08:33,440 e poi quando siamo fatto che abbiamo appena liberiamo di esso. 177 00:08:33,440 --> 00:08:37,460 E ora siamo ritornati quelli 50 byte di memoria al sistema. 178 00:08:37,460 --> 00:08:40,147 Qualche altra funzione può usarli. 179 00:08:40,147 --> 00:08:43,480 Noi non dobbiamo preoccuparci di subire un perdita di memoria perché abbiamo liberato la parola. 180 00:08:43,480 --> 00:08:46,639 Abbiamo dato la memoria indietro, così abbiamo finito di lavorare con esso. 181 00:08:46,639 --> 00:08:48,430 Quindi ci sono tre regole d'oro che dovrebbero 182 00:08:48,430 --> 00:08:51,700 essere tenuto a mente ogni volta che sei allocare dinamicamente la memoria 183 00:08:51,700 --> 00:08:52,990 con malloc. 184 00:08:52,990 --> 00:08:56,480 Ogni blocco di memoria si malloc deve essere liberato 185 00:08:56,480 --> 00:08:58,430 prima che il programma termina l'esecuzione. 186 00:08:58,430 --> 00:09:02,029 Ora di nuovo, dall'applicazione o nel IDE questo tipo di verifica per voi in ogni caso 187 00:09:02,029 --> 00:09:04,820 quando you-- questo accadrà comunque quando il programma è terminato, 188 00:09:04,820 --> 00:09:06,880 tutta la memoria verrà rilasciato. 189 00:09:06,880 --> 00:09:10,750 Ma è generalmente buona codifica pratica per sempre, quando hai finito, 190 00:09:10,750 --> 00:09:13,810 liberare ciò che avete mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Detto questo, solo cose che hai mallocd dovrebbero essere liberati. 192 00:09:16,690 --> 00:09:19,880 Se si dichiara un statico integer, int x punto e virgola, 193 00:09:19,880 --> 00:09:23,500 che vive sullo stack, è non poi si desidera liberare x. 194 00:09:23,500 --> 00:09:25,970 In modo che solo cose che hai mallocd dovrebbe essere liberato. 195 00:09:25,970 --> 00:09:28,960 >> E, infine, non fare qualcosa di gratuito due volte. 196 00:09:28,960 --> 00:09:31,170 Che possono portare a un'altra situazione strana. 197 00:09:31,170 --> 00:09:33,530 Quindi tutto ciò che hai mallocd deve essere liberato. 198 00:09:33,530 --> 00:09:36,000 Solo cose che hai malloc deve essere liberato. 199 00:09:36,000 --> 00:09:38,730 E non fare qualcosa di gratuito due volte. 200 00:09:38,730 --> 00:09:43,660 >> Quindi cerchiamo di passare attraverso un esempio qui di ciò che alcuni allocati dinamicamente 201 00:09:43,660 --> 00:09:46,122 memoria potrebbe apparire come misto con alcuni memoria statica. 202 00:09:46,122 --> 00:09:47,080 Cosa potrebbe accadere qui? 203 00:09:47,080 --> 00:09:48,913 Vedi se riesci a seguire lungo e indovinate cosa è 204 00:09:48,913 --> 00:09:51,720 succederà come andiamo attraverso tutte queste linee di codice. 205 00:09:51,720 --> 00:09:53,980 >> Così diciamo int m. 206 00:09:53,980 --> 00:09:54,840 Che succede qui? 207 00:09:54,840 --> 00:09:56,339 Bene, questo è abbastanza semplice. 208 00:09:56,339 --> 00:09:59,650 Creo una variabile intera chiamata m. 209 00:09:59,650 --> 00:10:01,400 Io colore verde che, perché questo è il colore 210 00:10:01,400 --> 00:10:03,730 che uso quando parlo circa variabili intere. 211 00:10:03,730 --> 00:10:05,160 Si tratta di una scatola. 212 00:10:05,160 --> 00:10:08,400 Si chiama metri, e si può memorizzare numeri interi al suo interno. 213 00:10:08,400 --> 00:10:12,400 >> Che cosa succede se poi dico int stella una? 214 00:10:12,400 --> 00:10:13,530 Beh, questo è abbastanza simile. 215 00:10:13,530 --> 00:10:15,780 Sto creando una scatola chiamata. 216 00:10:15,780 --> 00:10:19,100 E 'in grado di int partecipazione stelle, puntatori a interi. 217 00:10:19,100 --> 00:10:21,570 Così sto colorando di verde-ish pure. 218 00:10:21,570 --> 00:10:24,140 >> So che ha qualcosa a che fare con un numero intero, 219 00:10:24,140 --> 00:10:25,852 ma essa non è un numero intero. 220 00:10:25,852 --> 00:10:27,310 Ma è più o meno la stessa idea. 221 00:10:27,310 --> 00:10:28,101 Ho creato una scatola. 222 00:10:28,101 --> 00:10:30,070 Entrambi questi giusto ora vivono in pila. 223 00:10:30,070 --> 00:10:32,520 Ho dato loro entrambi i nomi. 224 00:10:32,520 --> 00:10:36,750 >> int stella b uguale dimensione malloc di int. 225 00:10:36,750 --> 00:10:38,560 Questo potrebbe essere un po 'complicato. 226 00:10:38,560 --> 00:10:44,110 Prendete un secondo e pensare a quello che ci si aspetta che accada in questo schema. 227 00:10:44,110 --> 00:10:50,210 int stella b uguale dimensione malloc di int. 228 00:10:50,210 --> 00:10:51,940 >> Beh, questo non solo crea una scatola. 229 00:10:51,940 --> 00:10:53,800 Questo in realtà crea due caselle. 230 00:10:53,800 --> 00:10:58,670 E si lega, stabilisce anche un punto in un rapporto. 231 00:10:58,670 --> 00:11:02,240 Abbiamo assegnato un blocco della memoria sul mucchio. 232 00:11:02,240 --> 00:11:05,940 Si noti che la casella in alto a destra là non hanno un nome. 233 00:11:05,940 --> 00:11:06,760 >> Noi mallocd esso. 234 00:11:06,760 --> 00:11:08,050 Esiste sul mucchio. 235 00:11:08,050 --> 00:11:10,090 Ma b ha un nome. 236 00:11:10,090 --> 00:11:11,950 E 'una variabile puntatore chiamato b. 237 00:11:11,950 --> 00:11:13,910 Che vive in pila. 238 00:11:13,910 --> 00:11:18,250 >> Quindi è un pezzo di memoria che punta a un altro. 239 00:11:18,250 --> 00:11:21,840 b contiene l'indirizzo di detto blocco di memoria. 240 00:11:21,840 --> 00:11:23,757 Non ha un nome altrimenti. 241 00:11:23,757 --> 00:11:24,590 Ma che punti ad esso. 242 00:11:24,590 --> 00:11:29,760 Così, quando diciamo int stelle b uguale dimensioni malloc di int, che proprio lì, 243 00:11:29,760 --> 00:11:33,490 quella freccia che spuntato sul lato destro lì, che tutta la faccenda, 244 00:11:33,490 --> 00:11:36,740 Dovrò apparire ancora una volta, è ciò che accade. 245 00:11:36,740 --> 00:11:39,341 Tutto ciò accade in quella singola riga di codice. 246 00:11:39,341 --> 00:11:41,340 Ora avremo poco più semplice di nuovo. 247 00:11:41,340 --> 00:11:43,330 un uguale commerciale m. 248 00:11:43,330 --> 00:11:46,280 Ti ricordi quello che un uguale e commerciale m è? 249 00:11:46,280 --> 00:11:48,920 Beh, questa è una ottiene l'indirizzo di m. 250 00:11:48,920 --> 00:11:54,150 Oppure mettere più schematicamente, una punta a m. 251 00:11:54,150 --> 00:11:56,360 >> un uguale b. 252 00:11:56,360 --> 00:11:57,560 OK, ecco un altro. 253 00:11:57,560 --> 00:11:59,230 A è uguale a b. 254 00:11:59,230 --> 00:12:02,260 Cosa succederà al diagramma stavolta? 255 00:12:02,260 --> 00:12:04,330 >> Bene ricordare che la opere operatore di assegnazione 256 00:12:04,330 --> 00:12:08,960 assegnando il valore sulla diritto al valore a sinistra. 257 00:12:08,960 --> 00:12:14,820 Così, invece di una punta a m, un ora punti nello stesso posto che i punti b. 258 00:12:14,820 --> 00:12:18,900 un non punta a B, A punti punti in cui b. 259 00:12:18,900 --> 00:12:25,280 >> Se una punta di B, che avrebbe sono stati un uguale commerciale b. 260 00:12:25,280 --> 00:12:28,150 Ma invece è uguale a B solo significa che e b sono ora 261 00:12:28,150 --> 00:12:31,770 indicando lo stesso indirizzo, perché all'interno di b è solo un indirizzo. 262 00:12:31,770 --> 00:12:35,004 E ora all'interno di a è lo stesso indirizzo. 263 00:12:35,004 --> 00:12:37,170 m è uguale a 10, probabilmente la cosa più semplice 264 00:12:37,170 --> 00:12:38,690 abbiamo fatto in un po '. 265 00:12:38,690 --> 00:12:40,460 Mettere il 10 nella casella. 266 00:12:40,460 --> 00:12:45,640 Stella b è uguale a più 2 m, da ricordare il nostro video di puntatori quale stella b significa. 267 00:12:45,640 --> 00:12:50,230 Stiamo andando a dereference b e put un valore in quella posizione di memoria. 268 00:12:50,230 --> 00:12:51,860 In questo caso 12. 269 00:12:51,860 --> 00:12:55,300 >> Così, quando abbiamo dereference un punto di Ricordiamo che abbiamo appena viaggiamo lungo la freccia. 270 00:12:55,300 --> 00:12:58,205 Oppure, in altre parole, ci andare a questo indirizzo di memoria 271 00:12:58,205 --> 00:12:59,580 e manipolare in qualche modo. 272 00:12:59,580 --> 00:13:00,830 Abbiamo messo un certo valore in là. 273 00:13:00,830 --> 00:13:03,960 In questo caso stelle b è uguale a m + 2 è solo 274 00:13:03,960 --> 00:13:08,230 andare alla variabile puntata da b, andare alla memoria puntata da b, 275 00:13:08,230 --> 00:13:11,750 e mettere m più 2 in là, 12. 276 00:13:11,750 --> 00:13:14,970 >> Ora mi libero b. 277 00:13:14,970 --> 00:13:16,490 Cosa succede quando mi libero b? 278 00:13:16,490 --> 00:13:18,800 Ricordate ciò che ho detto mezzi liberi. 279 00:13:18,800 --> 00:13:21,920 Quello che sto dicendo quando mi libero b? 280 00:13:21,920 --> 00:13:23,410 >> Io sono fatto lavorando con esso, giusto? 281 00:13:23,410 --> 00:13:25,702 Io do essenzialmente la memoria. 282 00:13:25,702 --> 00:13:26,910 Io restituisco al sistema. 283 00:13:26,910 --> 00:13:33,010 Non ho bisogno di questo più è quello che li dico, va bene? 284 00:13:33,010 --> 00:13:37,390 >> Ora, se io dico una stella è uguale a 11 si può probabilmente 285 00:13:37,390 --> 00:13:40,460 già dire che qualcosa di brutto sta per accadere qui, giusto? 286 00:13:40,460 --> 00:13:44,160 E in effetti se ho provato che probabilmente subirebbe un segmentation fault. 287 00:13:44,160 --> 00:13:47,140 Perché ora, anche se in precedenza che pezzo di memoria 288 00:13:47,140 --> 00:13:50,220 era qualcosa che ho avuto accesso a, a questo punto 289 00:13:50,220 --> 00:13:54,590 ora sto accedere alla memoria che Non è legale per me accedi. 290 00:13:54,590 --> 00:13:57,330 >> E come si sarà probabilmente ricordare, quando si accede memoria 291 00:13:57,330 --> 00:14:00,000 che non dovremmo toccare, che è la causa più comune 292 00:14:00,000 --> 00:14:01,860 di una segmentazione colpa. E così il mio programma 293 00:14:01,860 --> 00:14:05,170 potrebbe andare in crash se ho provato a fare questo. 294 00:14:05,170 --> 00:14:09,910 Quindi, di nuovo è una buona idea per ottenere un buon pratiche e buone abitudini radicate 295 00:14:09,910 --> 00:14:12,920 quando si lavora con malloc e gratuito, in modo che non si soffre la segmentazione 296 00:14:12,920 --> 00:14:15,310 difetti, e che si utilizza il tuo allocati dinamicamente 297 00:14:15,310 --> 00:14:17,370 la memoria in modo responsabile. 298 00:14:17,370 --> 00:14:20,300 >> Sono Doug Lloyd è CS50. 299 00:14:20,300 --> 00:14:21,947