1 00:00:00,000 --> 00:00:10,970 >> [MUSIC PLAYING] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: Va bene. 3 00:00:12,536 --> 00:00:13,392 >> [Risata] 4 00:00:13,392 --> 00:00:14,240 >> Bentornato. 5 00:00:14,240 --> 00:00:14,990 Questo è CS50. 6 00:00:14,990 --> 00:00:16,890 E questo fine settimana cinque. 7 00:00:16,890 --> 00:00:20,020 E fino ad ora, abbiamo più o meno state dando per scontato che non ci 8 00:00:20,020 --> 00:00:23,480 esiste questo compilatore Clang, che avete state invocando titolo di questa 9 00:00:23,480 --> 00:00:27,100 altro strumento chiamato Assicurarsi che in qualche modo converte magicamente il codice sorgente 10 00:00:27,100 --> 00:00:31,350 in codice oggetto, gli zeri e quelli che la CPU computer, centrale 11 00:00:31,350 --> 00:00:33,410 unità di elaborazione, comprende in realtà. 12 00:00:33,410 --> 00:00:36,770 Ma si scopre c'è un numero che è succedendo sotto il cofano in 13 00:00:36,770 --> 00:00:38,690 tra ingresso e uscita. 14 00:00:38,690 --> 00:00:41,800 >> E vorrei proporre di carne che in un po 'più in dettaglio in 15 00:00:41,800 --> 00:00:45,130 queste quattro fasi, hanno qualcosa chiamato pre-elaborazione, qualcosa 16 00:00:45,130 --> 00:00:48,300 chiamato compilazione, che abbiamo visto, qualcosa chiamato assemblaggio, e 17 00:00:48,300 --> 00:00:49,420 qualcosa chiamato collegamento. 18 00:00:49,420 --> 00:00:53,270 Così fino ad ora, in alcuni dei nostri programmi, abbiamo avuto tagliente comprende. 19 00:00:53,270 --> 00:00:56,650 Più di recente abbiamo avuto alcuni forte definisce per le costanti. 20 00:00:56,650 --> 00:01:00,660 Così si scopre che quelle cose che sono preceduti dal simbolo cancelletto o 21 00:01:00,660 --> 00:01:04,150 il simbolo della lira sono pre-processore direttive. 22 00:01:04,150 --> 00:01:07,960 Questo è solo un modo elegante per dire che è una riga di codice che in realtà è 23 00:01:07,960 --> 00:01:12,280 trasformato in qualcosa d'altro prima che il computer anche provare a convertire il vostro 24 00:01:12,280 --> 00:01:13,800 programma in zero e uno. 25 00:01:13,800 --> 00:01:19,000 >> Per esempio, tagliente comprende di serie I / O. H, praticamente significa solo andare 26 00:01:19,000 --> 00:01:24,010 avanti, afferrare il contenuto dei file stdio.he incollarli proprio lì. 27 00:01:24,010 --> 00:01:25,880 Quindi non zero e uno ancora a quel punto. 28 00:01:25,880 --> 00:01:27,470 E 'davvero solo una sostituzione. 29 00:01:27,470 --> 00:01:30,790 E questo è fatto durante la cosiddetta fase di pre-elaborazione, quando si 30 00:01:30,790 --> 00:01:34,230 effettivamente eseguito Clang o specificamente Fare nella maggior parte dei casi. 31 00:01:34,230 --> 00:01:36,950 Quindi tutto questo è accaduto prima automaticamente finora. 32 00:01:36,950 --> 00:01:38,800 >> Poi viene la fase di compilazione. 33 00:01:38,800 --> 00:01:40,920 Ma ci è stato semplificato al massimo compilazione. 34 00:01:40,920 --> 00:01:45,060 Compilazione di un programma significa veramente prendere da qualcosa come C, la 35 00:01:45,060 --> 00:01:48,430 codice sorgente abbiamo scritto, giù a qualcosa chiamato montaggio. 36 00:01:48,430 --> 00:01:52,900 Linguaggio assembly è un livello inferiore linguaggio che, per fortuna, non lo faremo 37 00:01:52,900 --> 00:01:55,480 hanno molte occasioni di scrivere questo semestre. 38 00:01:55,480 --> 00:01:59,100 Ma è al livello più basso nella senso che è letteralmente iniziare a scrivere 39 00:01:59,100 --> 00:02:04,270 aggiungere e sottrarre e moltiplicare e caricare dalla memoria e salvare in memoria, la 40 00:02:04,270 --> 00:02:08,259 istruzioni di base che un computer, sotto la cappa, 41 00:02:08,259 --> 00:02:09,639 in realtà capisce. 42 00:02:09,639 --> 00:02:14,930 >> Infine, il montaggio richiede che il linguaggio le zero e uno che siamo stati 43 00:02:14,930 --> 00:02:16,190 descrivendo finora. 44 00:02:16,190 --> 00:02:19,270 E veramente, infine, c'è il cosiddetto collegamento fase, che faremo 45 00:02:19,270 --> 00:02:22,360 vedere in un momento, che combina le zero e uno con zeri e 46 00:02:22,360 --> 00:02:24,870 quelle altre persone prima avete creato. 47 00:02:24,870 --> 00:02:26,660 >> Quindi prendere in considerazione questo super semplice programma. 48 00:02:26,660 --> 00:02:27,560 E 'stato da Settimana 1. 49 00:02:27,560 --> 00:02:29,610 E 'appena detto, Ciao Mondo, sullo schermo. 50 00:02:29,610 --> 00:02:30,920 Abbiamo svolto questo attraverso Clang. 51 00:02:30,920 --> 00:02:33,200 O abbiamo corso attraverso Fai che si è svolta Clang. 52 00:02:33,200 --> 00:02:36,170 E inviato in uscita al tempo in cui alcuni zero e uno. 53 00:02:36,170 --> 00:02:38,100 Ma si scopre non c'è un passaggio intermedio. 54 00:02:38,100 --> 00:02:40,460 Se vado qui - oops, non ha fatto Voglio vederlo ancora. 55 00:02:40,460 --> 00:02:44,800 Se vado qui al mio apparecchio e mi apro hello.c, qui 56 00:02:44,800 --> 00:02:46,160 è quello stesso programma. 57 00:02:46,160 --> 00:02:48,600 E che cosa ho intenzione di fare nel mio terminale finestra qui è ho intenzione di 58 00:02:48,600 --> 00:02:51,430 eseguire Clang piuttosto che fare, che automatizza tutti e quattro 59 00:02:51,430 --> 00:02:52,870 quei passi per noi. 60 00:02:52,870 --> 00:02:58,620 E ho intenzione di fare clang-S e poi hello.ce quindi immettere. 61 00:02:58,620 --> 00:03:00,590 >> E ho un prompt lampeggiante ancora una volta, che è buono. 62 00:03:00,590 --> 00:03:05,280 E ora in una finestra leggermente più grande, Ho intenzione di aprire gedit qui. 63 00:03:05,280 --> 00:03:09,610 E ho intenzione di aprire un file che, risulta, è chiamato hello.s questo 64 00:03:09,610 --> 00:03:11,870 che contiene linguaggio assembly Mi riferivo prima. 65 00:03:11,870 --> 00:03:15,060 E questo è ciò che si chiama il montaggio linguaggio, piuttosto basso livello 66 00:03:15,060 --> 00:03:18,470 istruzioni che la CPU Intel o quello che è che è dentro 67 00:03:18,470 --> 00:03:19,350 capisce. 68 00:03:19,350 --> 00:03:24,480 E mov è per il movimento. chiamata è per chiamando, una funzione di livello molto basso. 69 00:03:24,480 --> 00:03:26,380 sub è per sottrazione. 70 00:03:26,380 --> 00:03:30,370 >> Così, quando si dispone di una particolare CPU all'interno del computer, ciò che lo rende 71 00:03:30,370 --> 00:03:34,300 distinti, contro altre CPU sulla mercato, è che le istruzioni che 72 00:03:34,300 --> 00:03:39,460 comprende e spesso quanto efficiente è, come veloce è in esecuzione un po 'di 73 00:03:39,460 --> 00:03:40,380 di tali istruzioni. 74 00:03:40,380 --> 00:03:45,150 Ora, per di più su questo, si può prendere prossimo autunno CS61 al college. 75 00:03:45,150 --> 00:03:48,170 Ma qui abbiamo, ad esempio, alcuni identificatori che potrebbe apparire familiare. 76 00:03:48,170 --> 00:03:50,150 ciao.c è il nome del programma. 77 00:03:50,150 --> 00:03:51,070 >> . Del testo - 78 00:03:51,070 --> 00:03:54,190 non c'è molto di interessante solo ora, ricordare che il testo 79 00:03:54,190 --> 00:03:59,190 segmento, come di Lunedi, dove è in memoria il programma in realtà finisce. 80 00:03:59,190 --> 00:04:01,330 Ecco, questo è almeno vagamente familiare lì. 81 00:04:01,330 --> 00:04:03,730 Qui, naturalmente, è una menzione della nostra funzione principale. 82 00:04:03,730 --> 00:04:07,220 Scorrendo verso il basso, queste si riferiscono a cose detti registri, molto piccole porzioni di 83 00:04:07,220 --> 00:04:09,190 memoria all'interno della CPU reale. 84 00:04:09,190 --> 00:04:12,930 E se ho scorrere verso il basso, anche inoltre, vedo una sorta 85 00:04:12,930 --> 00:04:14,240 menzione indiretta di ASCII. 86 00:04:14,240 --> 00:04:17,120 E lì, in effetti, è quella stringa, ciao, virgola, mondo. 87 00:04:17,120 --> 00:04:20,079 >> Quindi, per farla breve, questo è stato accade per voi, automaticamente, 88 00:04:20,079 --> 00:04:22,140 sotto la cappa tutto questo tempo. 89 00:04:22,140 --> 00:04:26,450 E quello che sta accadendo è davvero una volta hai eseguito Clang, o per mezzo di 90 00:04:26,450 --> 00:04:29,150 Fai, che stai ricevendo prima, dal codice sorgente, il 91 00:04:29,150 --> 00:04:30,700 cosiddetto linguaggio assembly. 92 00:04:30,700 --> 00:04:35,210 Poi Clang sta convertendo questa assemblea lingua fino a zero e uno. 93 00:04:35,210 --> 00:04:38,340 E questa è la presentazione che abbiamo iniziato la nostra discussione nella Settimana 0 in - 94 00:04:38,340 --> 00:04:39,840 e poi Settimana 1 su. 95 00:04:39,840 --> 00:04:44,030 E poi finalmente, quelle zero e uno sono combinati con gli zeri e quelli 96 00:04:44,030 --> 00:04:47,190 da quelle librerie che stiamo prendendo per scontato come I / O standard o il 97 00:04:47,190 --> 00:04:50,010 String Biblioteca o anche la biblioteca CS50. 98 00:04:50,010 --> 00:04:54,200 >> Quindi, per dipingere questo quadro più visivamente, abbiamo hello.c. 99 00:04:54,200 --> 00:04:57,220 E, naturalmente, utilizza il printf funzionare per dire, ciao mondo. 100 00:04:57,220 --> 00:05:01,810 Il passo compilation prende il basso per il file che abbiamo appena visto hello.s, anche 101 00:05:01,810 --> 00:05:04,290 anche se questo è in genere eliminati automaticamente per voi. 102 00:05:04,290 --> 00:05:06,050 Ma questo è il codice assembly nel passaggio centrale. 103 00:05:06,050 --> 00:05:09,750 E poi, quando ci riuniamo il gruppo linguaggio, per così dire, che quando si 104 00:05:09,750 --> 00:05:10,830 ottenere quei zero e uno. 105 00:05:10,830 --> 00:05:13,920 Così abbiamo ingrandita in modo efficace oggi su quello che ci hai preso per scontato, 106 00:05:13,920 --> 00:05:16,430 significa andare codice sorgente al codice oggetto. 107 00:05:16,430 --> 00:05:18,850 >> Ma, infine, ora che la stessa immagine - cerchiamo di spingerlo verso 108 00:05:18,850 --> 00:05:20,020 lato sinistro. 109 00:05:20,020 --> 00:05:22,880 E notare che in cima c'è Ho accennato stdio.h. 110 00:05:22,880 --> 00:05:25,030 Questo è un file che abbiamo incluso in quasi tutti i 111 00:05:25,030 --> 00:05:26,250 programmi che abbiamo scritto. 112 00:05:26,250 --> 00:05:28,830 E questo è il file il cui contenuto ottenere copia incollato, 113 00:05:28,830 --> 00:05:30,350 efficacemente in cima il tuo codice. 114 00:05:30,350 --> 00:05:34,170 Ma si scopre che, su un computer sistema da qualche parte, c'è probabilmente un 115 00:05:34,170 --> 00:05:39,150 File stdio.c che qualcuno ha scritto anni fa, che implementa tutte le 116 00:05:39,150 --> 00:05:41,870 funzioni che sono state dichiarate in stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Ora, in realtà probabilmente non è il il vostro Mac o PC o anche in 118 00:05:45,465 --> 00:05:47,660 CS50 apparecchio è un codice C grezzo. 119 00:05:47,660 --> 00:05:52,710 Qualcuno ha già compilato e incluso . O File di codice oggetto o. Un 120 00:05:52,710 --> 00:05:56,020 file, che si riferisce ad una libreria condivisa che è stato pre-installati e 121 00:05:56,020 --> 00:05:57,240 pre-compilato per voi. 122 00:05:57,240 --> 00:06:01,950 Ma supponiamo che esiste davvero sul nostro stdio.c informatica in parallelo 123 00:06:01,950 --> 00:06:02,650 con Clang. 124 00:06:02,650 --> 00:06:04,960 Il tuo codice è in corso di compilazione e assemblati. 125 00:06:04,960 --> 00:06:09,200 codice stdio.c s 'è in corso di compilazione e assemblato, in modo che questo ultimo 126 00:06:09,200 --> 00:06:13,730 passo, quaggiù, dobbiamo in qualche modo collegamento, per così dire, le zero e uno 127 00:06:13,730 --> 00:06:18,430 con le sue zero e uno in un unico semplice programma che in ultima analisi è 128 00:06:18,430 --> 00:06:20,540 chiamato semplicemente Ciao. 129 00:06:20,540 --> 00:06:23,340 >> Ecco, questo è tutta la magia che è sta accadendo finora. 130 00:06:23,340 --> 00:06:26,430 E continuerà a prendere queste processi per scontato, ma si rendono conto 131 00:06:26,430 --> 00:06:28,750 c'è un sacco di dettagli piccanti succedendo lì sotto. 132 00:06:28,750 --> 00:06:31,920 E questo è ciò che rende il vostro computer con Intel inside 133 00:06:31,920 --> 00:06:33,940 particolarmente distinti. 134 00:06:33,940 --> 00:06:37,020 >> Quindi, su questa nota, se si desidera unirsi a noi per il pranzo questo Venerdì, fare andare 135 00:06:37,020 --> 00:06:41,570 al solito posto cs50.net/rsvp, 13:15 questo Venerdì. 136 00:06:41,570 --> 00:06:43,400 E ora qualche annuncio. 137 00:06:43,400 --> 00:06:44,670 Così abbiamo una buona notizia. 138 00:06:44,670 --> 00:06:45,970 E abbiamo una brutta notizia. 139 00:06:45,970 --> 00:06:47,260 Inizia con una buona notizia qui. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Geme] 142 00:06:54,510 --> 00:06:54,710 >> D'accordo. 143 00:06:54,710 --> 00:06:56,670 Beh, è ​​tecnicamente una vacanza, così non è tanto un regalo da noi. 144 00:06:56,670 --> 00:06:58,030 Ma poi la brutta notizia, naturalmente. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Geme] 147 00:07:01,880 --> 00:07:03,530 >> Ho passato un sacco di tempo su queste animazioni. 148 00:07:03,530 --> 00:07:04,690 >> [Risata] 149 00:07:04,690 --> 00:07:07,000 >> Ci sarà una sessione di revisione il prossimo Lunedi. 150 00:07:07,000 --> 00:07:08,340 Sta andando essere a 05:30. 151 00:07:08,340 --> 00:07:11,210 Vi ricordo di tutti questi dettagli via e-mail sul corso di 152 00:07:11,210 --> 00:07:13,470 sito web in appena un paio di giorni di tempo. 153 00:07:13,470 --> 00:07:16,610 Esso sarà filmato e reso disponibile poco dopo. 154 00:07:16,610 --> 00:07:19,200 Quindi, se non si può fare che Lunedi slot di notte, non ti preoccupare. 155 00:07:19,200 --> 00:07:22,270 Sezioni prossima settimana sarà anche concentrarsi sulla revisione per il quiz. 156 00:07:22,270 --> 00:07:25,670 Se la vostra sezione è il Lunedi, che è anzi vacanza universitaria, ci sarà 157 00:07:25,670 --> 00:07:26,920 ancora incontrare nella sezione. 158 00:07:26,920 --> 00:07:28,890 Se semplicemente non può fare che sezione perché si sta andando 159 00:07:28,890 --> 00:07:29,860 via, va bene. 160 00:07:29,860 --> 00:07:33,710 Partecipare a una Domenica o Martedì o sezione tune-in alla sezione di Jason, che è 161 00:07:33,710 --> 00:07:35,110 disponibile on-line. 162 00:07:35,110 --> 00:07:37,490 >> Quindi, altre cattive notizie. 163 00:07:37,490 --> 00:07:41,960 Quindi, secondo il piano di studi, abbiamo lezione Venerdì prossimo. 164 00:07:41,960 --> 00:07:43,690 Ma la buona notizia - 165 00:07:43,690 --> 00:07:44,860 chiaramente, ho speso troppo tempo su questo. 166 00:07:44,860 --> 00:07:45,280 >> [Risata] 167 00:07:45,280 --> 00:07:47,140 >> Noi provvederemo ad annullare le lezioni di venerdì prossimo. 168 00:07:47,140 --> 00:07:50,590 In modo che sarà un regalo per noi, in modo da può davvero avere un bel sollievo in 169 00:07:50,590 --> 00:07:52,990 tra questa settimana e due settimane quindi. 170 00:07:52,990 --> 00:07:57,460 Quindi no lezioni prossima settimana, solo una piccola piccolo quiz, per il quale si dovrebbe essere 171 00:07:57,460 --> 00:07:59,030 diventando sempre più eccitato. 172 00:07:59,030 --> 00:08:03,870 >> Quindi cerchiamo di ora la nostra attenzione al qualcosa che è davvero più visiva 173 00:08:03,870 --> 00:08:06,990 e più emozionante e per preparare il terreno per ciò che sta per essere all'orizzonte 174 00:08:06,990 --> 00:08:08,420 in appena un paio di settimane di tempo. 175 00:08:08,420 --> 00:08:12,160 Dopo il primo quiz, si passerà alla concentrare i nostri set problema ad un altro 176 00:08:12,160 --> 00:08:16,710 problema specifico dominio, che di forensics o di sicurezza in generale. 177 00:08:16,710 --> 00:08:19,550 >> Infatti, la tradizione con questo problema set è per me uno dei 178 00:08:19,550 --> 00:08:24,850 Teaching Fellow o CA di attraversare campus prendendo alcune fotografie di 179 00:08:24,850 --> 00:08:29,450 identificabili ma non ovvie persone, luoghi, o cose, poi ogni anno mi 180 00:08:29,450 --> 00:08:34,520 qualche modo riescono a cancellare accidentalmente o danneggiare la scheda digitale 181 00:08:34,520 --> 00:08:35,720 che è all'interno della nostra macchina fotografica. 182 00:08:35,720 --> 00:08:36,860 Ma niente di grave. 183 00:08:36,860 --> 00:08:39,200 Posso andare avanti e collegarlo che nel mio computer. 184 00:08:39,200 --> 00:08:43,010 Posso fare una immagine forense di esso, in modo di parlare, copiando gli zeri e 185 00:08:43,010 --> 00:08:46,830 quelli fuori di quella della scheda di memoria, sia la sua una scheda SD o una scheda compact flash o 186 00:08:46,830 --> 00:08:48,100 quello che state a conoscenza. 187 00:08:48,100 --> 00:08:49,300 E poi siamo in grado di consegnare quello fuori. 188 00:08:49,300 --> 00:08:53,190 >> E così la sfida del futuro, tra le altre cose per voi, sarà quello di scrivere 189 00:08:53,190 --> 00:08:58,630 Codice C che recupera un intero gruppo di JPEG per me e rivelate saranno 190 00:08:58,630 --> 00:09:00,190 quelle persone, luoghi o cose. 191 00:09:00,190 --> 00:09:03,340 E faremo anche parliamo, in questo problema impostare e nei giorni a venire, circa 192 00:09:03,340 --> 00:09:04,440 grafica più in generale. 193 00:09:04,440 --> 00:09:06,140 Li abbiamo usati, un corso, per scoppiare. 194 00:09:06,140 --> 00:09:09,080 Ma hai sorta di dato per scontato Esiste questi concetti di alto livello 195 00:09:09,080 --> 00:09:10,680 di rettangoli e ovali. 196 00:09:10,680 --> 00:09:12,450 Ma sotto il cofano ci sono pixel. 197 00:09:12,450 --> 00:09:14,370 E hai dovuto iniziare pensando a quelli. 198 00:09:14,370 --> 00:09:18,800 Oppure si per p-set 4 devono pensare circa il divario tra i mattoncini, come 199 00:09:18,800 --> 00:09:21,990 rapidamente si sta palla si muove attraverso schermo per uscire. 200 00:09:21,990 --> 00:09:24,830 Quindi non vi è questa nozione di puntini sullo schermo che è 201 00:09:24,830 --> 00:09:26,290 entrare in gioco già. 202 00:09:26,290 --> 00:09:29,430 >> Ora, ciò che si vede, però, è quello che si ottiene sullo schermo di un computer. 203 00:09:29,430 --> 00:09:33,680 Se hai mai visto qualcosa di buono o cattiva televisione, le probabilità sono che praticamente 204 00:09:33,680 --> 00:09:36,280 trattare il pubblico come technophobes che in realtà non 205 00:09:36,280 --> 00:09:37,630 so molto di informatica. 206 00:09:37,630 --> 00:09:40,840 E quindi è molto facile per la polizia detective per dire, vero 207 00:09:40,840 --> 00:09:41,710 pulire che per me? 208 00:09:41,710 --> 00:09:42,710 O migliorare, giusto? 209 00:09:42,710 --> 00:09:45,550 Migliorare è come la parola buzz in più nessuno show alla criminalità. 210 00:09:45,550 --> 00:09:49,240 E la realtà è che se si prende un immagine sfocata di un sospetto che fa 211 00:09:49,240 --> 00:09:51,620 qualcosa di brutto, non è possibile basta valorizzarlo. 212 00:09:51,620 --> 00:09:53,080 Non si può ingrandire infinitamente. 213 00:09:53,080 --> 00:09:56,350 Non si può vedere nel luccichio di qualcuno di occhio che ha commesso tale 214 00:09:56,350 --> 00:09:59,860 crimine particolare, nonostante l' prevalenza di questo in tv. 215 00:09:59,860 --> 00:10:04,110 >> E così con che cerchiamo di motivare tale imminente problema impostato con uno sguardo al 216 00:10:04,110 --> 00:10:05,765 alcuni spettacoli con il quale si potrebbe essere familiare. 217 00:10:05,765 --> 00:10:06,500 >> [RIPRODUZIONE VIDEO] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Ora, cerchiamo di ottenere una buona occhiata a voi. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Aspetta. 222 00:10:17,766 --> 00:10:18,658 Run che torna. 223 00:10:18,658 --> 00:10:19,550 >> -Aspetta un attimo. 224 00:10:19,550 --> 00:10:21,580 Andate a destra. 225 00:10:21,580 --> 00:10:21,800 >> -Ci. 226 00:10:21,800 --> 00:10:22,690 Blocca questo. 227 00:10:22,690 --> 00:10:23,692 >> Schermo intero. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Blocca questo. 230 00:10:24,154 --> 00:10:25,140 >> -Stringere il che, va bene? 231 00:10:25,140 --> 00:10:27,090 >> -Vettore in su quel ragazzo dalla ruota posteriore. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom in proprio qui in questo luogo. 233 00:10:29,730 --> 00:10:33,700 >> -Con la giusta attrezzatura, il immaginata può essere ampliato e affilata. 234 00:10:33,700 --> 00:10:34,490 >> -Che cosa? 235 00:10:34,490 --> 00:10:35,870 >> -E 'un programma di valorizzazione. 236 00:10:35,870 --> 00:10:36,793 >> -Riesci a chiarire che fino qualsiasi? 237 00:10:36,793 --> 00:10:38,560 >> -Non lo so. 238 00:10:38,560 --> 00:10:39,090 Cerchiamo di valorizzarlo. 239 00:10:39,090 --> 00:10:41,690 >> Sezione A-6-Enhance. 240 00:10:41,690 --> 00:10:43,510 >> -Ho migliorato il dettaglio e - 241 00:10:43,510 --> 00:10:44,456 >> -Penso che ci sia abbastanza per migliorare. 242 00:10:44,456 --> 00:10:45,402 Rilasciarlo per il mio schermo. 243 00:10:45,402 --> 00:10:47,300 >> -Migliora la riflessione nel suo occhio. 244 00:10:47,300 --> 00:10:49,330 >> -Corriamo questo attraverso miglioramento video. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, si può migliorare questo? 246 00:10:50,340 --> 00:10:52,320 >> -Aspetta. 247 00:10:52,320 --> 00:10:54,290 >> -Ho lavorato su questa riflessione. 248 00:10:54,290 --> 00:10:55,560 >> -Qualcuno riflessione. 249 00:10:55,560 --> 00:10:56,440 >> -Riflessione. 250 00:10:56,440 --> 00:10:57,940 >> -C'è una riflessione del volto dell'uomo. 251 00:10:57,940 --> 00:10:58,860 >> -La riflessione. 252 00:10:58,860 --> 00:10:59,710 >> -C'è una riflessione. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom in sullo specchio. 254 00:11:00,900 --> 00:11:03,500 >> -Si può vedere un riflesso. 255 00:11:03,500 --> 00:11:04,700 >> -Si può migliorare l'immagine da qui? 256 00:11:04,700 --> 00:11:05,700 >> -Riesci a migliorare proprio qui? 257 00:11:05,700 --> 00:11:06,500 >> -Riesci a valorizzarlo? 258 00:11:06,500 --> 00:11:07,380 >> -Riesci a valorizzarlo? 259 00:11:07,380 --> 00:11:08,190 >> -Possiamo migliorare questo? 260 00:11:08,190 --> 00:11:08,940 >> -Riesci a valorizzarlo? 261 00:11:08,940 --> 00:11:10,280 >> -Aspetta un attimo, ti permettono di migliorare. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom in sulla porta. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Risata] 266 00:11:13,197 --> 00:11:14,360 >> -Muoversi dentro 267 00:11:14,360 --> 00:11:15,100 >> -Aspetta, stop. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Sospenderla. 270 00:11:16,290 --> 00:11:19,390 >> -Ruota a 75 gradi circa la verticale per favore. 271 00:11:19,390 --> 00:11:19,886 >> [Risata] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, e di nuovo alla parte sulla porta. 273 00:11:24,350 --> 00:11:26,330 >> -Hai una immagine enhancer che può bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Forse possiamo usare il Pradeep Sen Metodo di vedere nelle finestre. 275 00:11:28,990 --> 00:11:30,680 >> -Questo software è lo stato dell'arte. 276 00:11:30,680 --> 00:11:31,676 >> -Il valore di icona è spenta. 277 00:11:31,676 --> 00:11:34,166 >> -Con la giusta combinazione di algoritmi. 278 00:11:34,166 --> 00:11:38,399 >> -Ha preso algoritmi di illuminazione a il livello successivo e li possono utilizzare per 279 00:11:38,399 --> 00:11:38,648 migliorare questa fotografia. 280 00:11:38,648 --> 00:11:42,050 >> -Lock sulla e allargare l'asse z. 281 00:11:42,050 --> 00:11:42,760 >> -Migliora. 282 00:11:42,760 --> 00:11:43,060 >> -Migliora. 283 00:11:43,060 --> 00:11:43,760 >> -Migliora. 284 00:11:43,760 --> 00:11:45,010 >> -Congelare e migliorare. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [FINE RIPRODUZIONE VIDEO] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: Così Problem Set 5 è quello che ci aspetta lì. 288 00:11:51,470 --> 00:11:55,260 Quindi dovremo presto ottenere una migliore comprensione di quando e perché si può 289 00:11:55,260 --> 00:11:57,300 e la nostra non può migliorare in questo modo. 290 00:11:57,300 --> 00:12:00,090 Ma prima, facciamo tornare la nostra attenzione ad alcuni dei blocchi di costruzione saremo 291 00:12:00,090 --> 00:12:02,250 devono essere in grado di raccontare quella storia. 292 00:12:02,250 --> 00:12:05,580 >> Quindi ricordiamo che abbiamo pareggiato questa immagine su Lunedi e un po 'la scorsa settimana. 293 00:12:05,580 --> 00:12:09,970 E questo descrive il layout delle cose nella memoria del computer quando 294 00:12:09,970 --> 00:12:11,000 l'uso di alcuni programmi. 295 00:12:11,000 --> 00:12:14,310 Il segmento Tech fino in alto, richiamo, si riferisce per gli zeri reali e quelli 296 00:12:14,310 --> 00:12:16,000 che compongono il programma. 297 00:12:16,000 --> 00:12:19,340 C'è, al di sotto di questo, alcuni inizializzate o dati non inizializzati, che in genere 298 00:12:19,340 --> 00:12:22,910 si riferisce a cose come costanti o stringhe o variabili globali che hanno 299 00:12:22,910 --> 00:12:24,200 stato dichiarato in anticipo. 300 00:12:24,200 --> 00:12:26,500 C'è il mucchio, ma verremo torna a che in un po '. 301 00:12:26,500 --> 00:12:27,410 >> E poi c'è la pila. 302 00:12:27,410 --> 00:12:30,660 Molto simile a una pila di vassoi in mensa, questo è dove la memoria diventa 303 00:12:30,660 --> 00:12:33,610 stratificato e stratificato ogni qualvolta si fa quello che in un programma? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Che cosa è l'uso dello stack per? 306 00:12:37,730 --> 00:12:39,320 >> Sì? 307 00:12:39,320 --> 00:12:40,000 >> Chiamata di funzione. 308 00:12:40,000 --> 00:12:42,890 Ogni volta che si chiama una funzione, è dato a scheggia di memoria per la sua 309 00:12:42,890 --> 00:12:45,020 variabili locali o suoi parametri. 310 00:12:45,020 --> 00:12:48,810 E pittoricamente, vediamo che con ogni funzione successiva chiamata, quando A 311 00:12:48,810 --> 00:12:52,520 Chiamate Chiamate B C D chiamate, hanno ottenere strati nello stack. 312 00:12:52,520 --> 00:12:55,630 E all'interno di ciascuna di queste fette di memoria è essenzialmente un ambito unico 313 00:12:55,630 --> 00:12:58,590 per tale funzione, che, naturalmente, è problematico se si desidera a portata di mano 314 00:12:58,590 --> 00:13:01,850 da una funzione all'altra Un pezzo di dati che si desidera esso 315 00:13:01,850 --> 00:13:03,500 di mutare o cambiare. 316 00:13:03,500 --> 00:13:08,060 >> Così che cosa è stata la nostra soluzione per consentire Una funzione rappresentata da una pila 317 00:13:08,060 --> 00:13:11,390 inquadrare cambiare la memoria interna di un altro stack frame? 318 00:13:11,390 --> 00:13:14,590 Come quelle due parlano tra loro? 319 00:13:14,590 --> 00:13:18,510 Così per mezzo di puntatori o indirizzi, che, di nuovo, proprio dove nel descrivere 320 00:13:18,510 --> 00:13:22,280 memoria, per mezzo di uno specifico numero morso, la particolare 321 00:13:22,280 --> 00:13:23,830 valore può essere trovato. 322 00:13:23,830 --> 00:13:26,860 Quindi, ricordare l'ultima volta troppo abbiamo continuato la storia e guardato un 323 00:13:26,860 --> 00:13:28,280 abbastanza programma buggy. 324 00:13:28,280 --> 00:13:32,900 E questo programma è bacato per pochi motivi, ma il più preoccupante è 325 00:13:32,900 --> 00:13:34,620 perché non riesce a controllare che cosa? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Gia ', non riesce a controllare l'input. 328 00:13:40,450 --> 00:13:41,870 Siamo spiacenti? 329 00:13:41,870 --> 00:13:43,880 >> Se si tratta di più di 12 caratteri. 330 00:13:43,880 --> 00:13:47,260 Quindi, molto elegantemente, quando si chiama memcopy, che, come suggerisce il nome, appena 331 00:13:47,260 --> 00:13:50,630 memoria copie dal suo secondo argomento nel suo primo argomento. 332 00:13:50,630 --> 00:13:54,730 Il terzo argomento, molto elegantemente, è controllato per assicurarsi che non si 333 00:13:54,730 --> 00:13:59,400 copiare più che, in questo caso, la lunghezza di bar, numero di caratteri, 334 00:13:59,400 --> 00:14:03,810 nella destinazione, che è presente serie C. Ma il problema è che ciò che 335 00:14:03,810 --> 00:14:07,230 se C in sé non è abbastanza grande per gestire questo? 336 00:14:07,230 --> 00:14:09,900 Hai intenzione di copiare il numero di byte che ti è stata data. 337 00:14:09,900 --> 00:14:13,040 Ma che cosa è in realtà hanno più byte di quello che hai spazio per? 338 00:14:13,040 --> 00:14:16,770 >> Ebbene, questo programma molto stupidamente solo procede ciecamente a prendere qualunque cosa che sia 339 00:14:16,770 --> 00:14:20,650 dato, ciao backslash 0 è grande se la stringa è breve 340 00:14:20,650 --> 00:14:22,040 sufficiente, come cinque caratteri. 341 00:14:22,040 --> 00:14:26,470 Ma se in realtà è 12 caratteri o 1.200 caratteri, abbiamo visto l'ultima volta 342 00:14:26,470 --> 00:14:29,380 che si sta solo andando a tutto sovrascrivere la memoria che 343 00:14:29,380 --> 00:14:30,470 non appartiene a voi. 344 00:14:30,470 --> 00:14:34,390 E peggiore dei casi, se si sovrascrive che parte rossa lì che abbiamo chiamato il 345 00:14:34,390 --> 00:14:35,380 indirizzo di ritorno - 346 00:14:35,380 --> 00:14:38,370 questo è solo dove il computer automaticamente, per voi, dietro il 347 00:14:38,370 --> 00:14:43,130 scene, si ripone un valore a 32 bit che ricorda a quale indirizzo si dovrebbe 348 00:14:43,130 --> 00:14:47,080 tornare quando foo, questa altra funzione, è fatto esecuzione. 349 00:14:47,080 --> 00:14:49,320 E 'una briciola di pane di sorta a cui si ritorna. 350 00:14:49,320 --> 00:14:52,490 Se si sovrascrive che, potenzialmente, se sei il cattivo, può potrebbe 351 00:14:52,490 --> 00:14:54,750 potenzialmente assumere computer di qualcuno. 352 00:14:54,750 --> 00:14:58,020 E avrete sicuramente crash nella maggior parte dei casi. 353 00:14:58,020 --> 00:15:01,690 >> Ora questo problema è stato esacerbato solo come abbiamo iniziato a parlare di memoria 354 00:15:01,690 --> 00:15:03,010 gestione più generale. 355 00:15:03,010 --> 00:15:07,150 E malloc, per l'allocazione della memoria, è un funzione che possiamo usare per allocare 356 00:15:07,150 --> 00:15:11,260 memoria quando non sappiamo in anticipo che potremmo aver bisogno di un po 'di. 357 00:15:11,260 --> 00:15:13,960 Così, per esempio, se torno all'apparecchio qui. 358 00:15:13,960 --> 00:15:21,010 E io apro dall'ultima volta hello2.c, richiamare questo programma, che sembrava 359 00:15:21,010 --> 00:15:23,500 un po 'di qualcosa come questo, solo tre linee - 360 00:15:23,500 --> 00:15:27,940 indicare il vostro nome, allora il nome della stringa, a sinistra, uguale getstring. 361 00:15:27,940 --> 00:15:29,690 E poi abbiamo stamparlo, nome dell'utente. 362 00:15:29,690 --> 00:15:31,170 >> Quindi questo è stato un semplice programma eccellente. 363 00:15:31,170 --> 00:15:34,870 Per essere chiari, mi permetta di andare avanti e fare ciao-2. 364 00:15:34,870 --> 00:15:36,680 Io vado a fare punti barra ciao-2. 365 00:15:36,680 --> 00:15:37,750 Dica il suo nome - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Invio. 368 00:15:38,840 --> 00:15:39,540 Ciao Davide. 369 00:15:39,540 --> 00:15:41,060 Sembra funzionare bene. 370 00:15:41,060 --> 00:15:43,140 Ma ciò che sta realmente accadendo sotto cappa qui? 371 00:15:43,140 --> 00:15:44,670 Prima di tutto staccare alcuni strati. 372 00:15:44,670 --> 00:15:48,380 String è solo un sinonimo che abbiamo capito per che cosa? 373 00:15:48,380 --> 00:15:49,110 Char stella. 374 00:15:49,110 --> 00:15:52,740 Quindi cerchiamo di rendere un po 'più arcana ma tecnicamente più corretto che questo 375 00:15:52,740 --> 00:15:55,570 è una stella char, il che significa che nome, sì, è una variabile. 376 00:15:55,570 --> 00:15:59,920 Ma ciò che i negozi name è l'indirizzo del un char, che si sente un po 'strano 377 00:15:59,920 --> 00:16:01,050 perché sto ricevendo indietro una stringa. 378 00:16:01,050 --> 00:16:03,580 Sto tornando multipla caratteri non un char. 379 00:16:03,580 --> 00:16:07,400 >> Ma, naturalmente, è necessario solo il primo indirizzo di char di ricordare dove l' 380 00:16:07,400 --> 00:16:08,870 stringa insieme è perché perché? 381 00:16:08,870 --> 00:16:12,700 Come si fa a capire se la fine del la stringa è conoscere l'inizio? 382 00:16:12,700 --> 00:16:13,630 Il backslash zero. 383 00:16:13,630 --> 00:16:17,260 Quindi, con questi due indizi a capire prima l'inizio e la fine di 384 00:16:17,260 --> 00:16:20,280 qualsiasi stringa sono, fintanto che sono adeguatamente formato con quello nullo 385 00:16:20,280 --> 00:16:22,110 Terminator, che backslash zero. 386 00:16:22,110 --> 00:16:24,520 >> Ma questo sta chiamando GetString. 387 00:16:24,520 --> 00:16:28,020 E si scopre che getstring tutto questo tempo è stato gentile di 388 00:16:28,020 --> 00:16:28,820 barare per noi. 389 00:16:28,820 --> 00:16:32,460 E 'stato fatto questo lavoro, per essere sicuri, ottenendo una stringa dall'utente. 390 00:16:32,460 --> 00:16:34,580 Ma dov'è che la memoria stati provenienti da? 391 00:16:34,580 --> 00:16:38,440 Se torniamo alla foto qui e applicare la definizione di un semplice 392 00:16:38,440 --> 00:16:42,610 momento fa, che lo stack è dove memoria va quando le funzioni sono chiamate, 393 00:16:42,610 --> 00:16:45,370 da questa logica, quando si chiama GetString, e poi digito 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Invio, dove è D-A-V-I-D backslash zero memorizzato, basato sulla 395 00:16:50,900 --> 00:16:53,480 storia che noi abbiamo detto fino ad ora? 396 00:16:53,480 --> 00:16:55,190 >> Sembrerebbe essere in la pila, giusto? 397 00:16:55,190 --> 00:16:58,120 Quando si chiama ottenere stringa si ottiene un piccola fetta di memoria sullo stack. 398 00:16:58,120 --> 00:17:01,630 Quindi è ovvio che il D-A-V-I-D backslash zero viene memorizzato 399 00:17:01,630 --> 00:17:02,770 lì nella pila. 400 00:17:02,770 --> 00:17:07,680 Ma aspettate un minuto, GetString restituisce tale stringa, per così dire, il che significa 401 00:17:07,680 --> 00:17:11,700 è vassoio della mensa è preso dallo stack. 402 00:17:11,700 --> 00:17:14,560 E abbiamo detto l'ultima volta che non appena un funzione ritorna, e si prende quello 403 00:17:14,560 --> 00:17:20,109 vassoio, per così dire, dallo stack, ciò si può assumere circa i resti di 404 00:17:20,109 --> 00:17:21,819 che la memoria? 405 00:17:21,819 --> 00:17:25,160 I sorta di loro ha ridisegnato come punti interrogativi perché effettivamente diventano 406 00:17:25,160 --> 00:17:26,250 valori sconosciuti. 407 00:17:26,250 --> 00:17:29,500 Essi possono essere riutilizzati quando alcuni funzione successiva è chiamata. 408 00:17:29,500 --> 00:17:31,870 >> In altre parole, se ci capita da memorizzare - 409 00:17:31,870 --> 00:17:34,350 Mi fai un disegno veloce qui alla pila. 410 00:17:34,350 --> 00:17:38,690 Se ci capita di essere disegnare il fondo del mio segmento di memoria, e diremo 411 00:17:38,690 --> 00:17:42,230 che questo è il luogo della memoria occupato da principale e forse arg c e 412 00:17:42,230 --> 00:17:46,790 arg V e qualsiasi altra cosa nel programma, quando GetString è chiamato, 413 00:17:46,790 --> 00:17:51,120 presumibilmente GetString ottiene un pezzo di memoria qui. 414 00:17:51,120 --> 00:17:53,940 E poi D-A-V-I-D qualche modo finisce in questa funzione. 415 00:17:53,940 --> 00:17:55,320 E ho intenzione di semplificare troppo. 416 00:17:55,320 --> 00:18:00,050 Ma supponiamo che il suo D-A-V-I-D backslash zero. 417 00:18:00,050 --> 00:18:03,500 Quindi questo molti byte sono utilizzati in la cornice per GetString. 418 00:18:03,500 --> 00:18:08,270 >> Ma appena ritorna GetString, abbiamo ha detto l'ultima volta che questa memoria su 419 00:18:08,270 --> 00:18:11,340 qui tutto diventa - woops! - 420 00:18:11,340 --> 00:18:14,270 tutto diventa effettivamente cancellati. 421 00:18:14,270 --> 00:18:17,220 E possiamo pensare a questo ora come questione segni perché chissà 422 00:18:17,220 --> 00:18:18,720 Che cosa sta per diventare di quella memoria. 423 00:18:18,720 --> 00:18:22,130 Anzi, io molto spesso chiamo funzioni diverso GetString. 424 00:18:22,130 --> 00:18:24,750 E non appena chiamo qualche altro funzione di GetString, forse non in 425 00:18:24,750 --> 00:18:28,860 questo particolare programma che abbiamo appena guardato a ma qualche altro, sicuramente qualche altra 426 00:18:28,860 --> 00:18:34,180 funzione potrebbe finire per essere dato questo punto successivo nella pila. 427 00:18:34,180 --> 00:18:39,410 >> Quindi non può essere che i negozi GetString D-A-V-I-D sullo stack perché vorrei 428 00:18:39,410 --> 00:18:41,040 perdere subito accesso ad esso. 429 00:18:41,040 --> 00:18:43,720 Ma sappiamo che GetString solo restituisce ciò? 430 00:18:43,720 --> 00:18:47,220 Non è tornare a mi sei caratteri. 431 00:18:47,220 --> 00:18:51,090 Che cosa è veramente tornando ha concludiamo l'ultima volta? 432 00:18:51,090 --> 00:18:52,480 L'indirizzo del primo. 433 00:18:52,480 --> 00:18:56,650 Così in qualche modo, quando hai chiamato GetString, è l'assegnazione di un pezzo di memoria per 434 00:18:56,650 --> 00:18:59,620 la stringa che il tipo di utenti e allora l'indirizzo di rinvio di esso. 435 00:18:59,620 --> 00:19:02,930 E si scopre che quando si vuole funzione per allocare la memoria in questo 436 00:19:02,930 --> 00:19:08,390 strada e tornare alla persona che ha chiamato tale funzione, l'indirizzo del 437 00:19:08,390 --> 00:19:11,870 che pezzo di memoria, è assolutamente non può metterlo nella pila al 438 00:19:11,870 --> 00:19:14,750 fondo, perché funzionale è solo andando a non diventare vostro molto 439 00:19:14,750 --> 00:19:17,800 rapidamente, quindi si può intuire dove stiamo probabilmente andando a buttare 440 00:19:17,800 --> 00:19:20,130 invece, il cosiddetto mucchio. 441 00:19:20,130 --> 00:19:25,290 >> Così tra il fondo della vostra memoria di layout e la parte superiore della vostra memoria del 442 00:19:25,290 --> 00:19:26,820 layout sono tutta una serie di segmenti. 443 00:19:26,820 --> 00:19:29,270 Uno è lo stack, e proprio sopra è il mucchio. 444 00:19:29,270 --> 00:19:33,680 Ed è solo un mucchio di diverso pezzo di memoria che non viene utilizzato per le funzioni di 445 00:19:33,680 --> 00:19:34,770 quando sono chiamati. 446 00:19:34,770 --> 00:19:38,100 E 'utilizzato per la memoria a lungo termine, quando vuoi una funzione da acchiappare 447 00:19:38,100 --> 00:19:42,700 memoria ed essere in grado di aggrapparsi a essa senza perdere il controllo su di esso. 448 00:19:42,700 --> 00:19:45,550 >> Ora si potrebbe forse subito vedere che questo non sia 449 00:19:45,550 --> 00:19:48,060 necessariamente un disegno perfetto. 450 00:19:48,060 --> 00:19:51,350 Come programma di memoria allocata la pila, o come si chiama di più e 451 00:19:51,350 --> 00:19:55,540 più funzioni, o come si alloca memoria sul mucchio con malloc fuori come 452 00:19:55,540 --> 00:20:00,690 GetString sta facendo, ciò che chiaramente sembra essere inevitabile problema? 453 00:20:00,690 --> 00:20:00,860 >> Giusto. 454 00:20:00,860 --> 00:20:03,150 Come il fatto che queste frecce siano rivolte l'una verso l'altra 455 00:20:03,150 --> 00:20:04,380 non fa ben sperare. 456 00:20:04,380 --> 00:20:08,630 E, in effetti, si potrebbe bloccarsi molto rapidamente un programma in qualsiasi numero di modi. 457 00:20:08,630 --> 00:20:12,050 In realtà, credo che potremmo avere una volta fatto questo accidentalmente. 458 00:20:12,050 --> 00:20:14,020 O se no, facciamolo deliberatamente ora. 459 00:20:14,020 --> 00:20:21,330 Lasciatemi andare avanti e scrivere super-velocemente un programma chiamato dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 E ora vado a qui e do acuto comprendono stdio.h. 461 00:20:26,730 --> 00:20:32,620 Facciamo dichiarare la funzione foo prende senza argomenti, che è 462 00:20:32,620 --> 00:20:34,040 denotata anche dal vuoto. 463 00:20:34,040 --> 00:20:37,830 >> E l'unica cosa foo sta per fare è chiamata foo, che probabilmente non è la 464 00:20:37,830 --> 00:20:39,100 più intelligente idea, ma tant'è. 465 00:20:39,100 --> 00:20:40,490 Ent void main. 466 00:20:40,490 --> 00:20:45,270 Ora l'unica cosa importante è andare fare è chiamare foo pure. 467 00:20:45,270 --> 00:20:51,050 E solo per i calci, ho intenzione di andare avanti qui e dire printf "Ciao da 468 00:20:51,050 --> 00:20:52,340 foo ". 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Quindi, se non ho commesso errori, Fai dontdothis dot barra. 471 00:21:00,160 --> 00:21:01,960 E facciamolo in una finestra più grande - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Andiamo. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 A quanto pare, si può fare questo. 478 00:21:13,100 --> 00:21:15,190 Dannazione. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Aspetta. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Abbiamo - 483 00:21:18,270 --> 00:21:20,110 Noi abbiamo usufruito con Make. 484 00:21:20,110 --> 00:21:22,050 >> [Sospira] 485 00:21:22,050 --> 00:21:25,110 >> Lo so, ma penso che appena cancellato quello. 486 00:21:25,110 --> 00:21:28,410 Uh, sì. 487 00:21:28,410 --> 00:21:30,660 Dannazione. 488 00:21:30,660 --> 00:21:32,640 Risolvere questo Rob. 489 00:21:32,640 --> 00:21:34,678 Che cosa? 490 00:21:34,678 --> 00:21:35,928 E 'molto semplice. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Sì, ci siamo rivolti ottimizzazione off. 493 00:21:47,360 --> 00:21:48,970 OK, stand bye. 494 00:21:48,970 --> 00:21:49,950 Ora mi sento meglio. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 D'accordo. 497 00:21:51,780 --> 00:21:53,430 >> Quindi cerchiamo di ricompilare questo - 498 00:21:53,430 --> 00:21:55,880 Farvi dontdothis. 499 00:21:55,880 --> 00:22:00,090 Potrebbe essere necessario rinominare questo a dothis.c in un attimo. 500 00:22:00,090 --> 00:22:00,710 Ecco fatto. 501 00:22:00,710 --> 00:22:01,240 Grazie. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Quindi il fatto che stavo stampando qualcosa era in realtà solo 504 00:22:05,480 --> 00:22:08,150 rallentando il processo che ci avrebbe raggiunto quel punto. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Accidenti! 507 00:22:08,870 --> 00:22:11,180 >> Così che cosa sta realmente accadendo? 508 00:22:11,180 --> 00:22:14,440 Il motivo c'è, proprio come un a parte, è fare qualsiasi cosa in termini di input e 509 00:22:14,440 --> 00:22:17,270 produzione tende ad essere più lento perché si necessario scrivere i caratteri a 510 00:22:17,270 --> 00:22:18,600 schermo, deve scorrere. 511 00:22:18,600 --> 00:22:21,720 Quindi, per farla breve, ho avuto in realtà accadde così impaziente, avremmo 512 00:22:21,720 --> 00:22:23,260 visto questo risultato finale pure. 513 00:22:23,260 --> 00:22:26,220 Ora che ho avuto cavalcata dei print-up, lo vediamo subito. 514 00:22:26,220 --> 00:22:28,410 Allora, perché sta succedendo questo. 515 00:22:28,410 --> 00:22:31,300 Ebbene, la semplice spiegazione, naturalmente, foo è che probabilmente non dovrebbe 516 00:22:31,300 --> 00:22:32,500 essere che si fa chiamare. 517 00:22:32,500 --> 00:22:34,470 >> Ora, in termini generali, questa è la ricorsione. 518 00:22:34,470 --> 00:22:36,970 E abbiamo pensato un paio di settimane fa ricorsiva è buono. 519 00:22:36,970 --> 00:22:40,330 La ricorsione è questo magico modo di esprimere se stessi super-succintamente. 520 00:22:40,330 --> 00:22:41,400 E funziona proprio. 521 00:22:41,400 --> 00:22:45,060 Ma c'è una caratteristica fondamentale di tutti i programmi ricorsivi di cui abbiamo parlato 522 00:22:45,060 --> 00:22:48,260 circa ed esaminato finora, che era che avevano una cosa? 523 00:22:48,260 --> 00:22:52,610 Un caso di base, che è stato un po 'duro coded caso che detto in alcune situazioni 524 00:22:52,610 --> 00:22:56,210 non chiamare pippo, che è chiaramente non è il caso qui. 525 00:22:56,210 --> 00:22:58,920 >> Così che cosa sta realmente accadendo in termini di questa immagine? 526 00:22:58,920 --> 00:23:01,790 Beh, quando Main chiama foo, esso ottiene una fetta di memoria. 527 00:23:01,790 --> 00:23:04,150 Quando si chiama pippo pippo, diventa una fetta di memoria. 528 00:23:04,150 --> 00:23:06,430 Quando si chiama pippo pippo, ottiene una fetta. 529 00:23:06,430 --> 00:23:07,080 Si ottiene una fetta. 530 00:23:07,080 --> 00:23:08,120 Si ottiene una fetta. 531 00:23:08,120 --> 00:23:09,460 Perché foo è mai tornando. 532 00:23:09,460 --> 00:23:12,160 Stiamo mai cancellare uno di quelli fotogrammi dalla pila. 533 00:23:12,160 --> 00:23:15,930 Quindi stiamo soffiando attraverso il cumulo, non parlare di chissà che altro, e 534 00:23:15,930 --> 00:23:19,600 stiamo eccedere i limiti del nostro cosiddetto segmento della memoria. 535 00:23:19,600 --> 00:23:21,790 Errore andare segmentazione falso. 536 00:23:21,790 --> 00:23:24,110 >> Quindi la soluzione è chiaramente non farlo. 537 00:23:24,110 --> 00:23:28,830 Ma l'implicazione più grande è che, sì, non vi è assolutamente certo limite, 538 00:23:28,830 --> 00:23:32,470 anche se non è ben definita, di come molte funzioni è possibile chiamare in un 539 00:23:32,470 --> 00:23:34,970 programma, quante volte una funzione può chiamare se stesso. 540 00:23:34,970 --> 00:23:38,430 Quindi, anche se abbiamo fatto predicare ricorsione come questa cosa potenzialmente magico un 541 00:23:38,430 --> 00:23:41,870 paio di settimane fa per il sigma funzione, e quando avremo i dati 542 00:23:41,870 --> 00:23:45,270 strutture e CS50, vedrai altro applicazioni per esso, non è 543 00:23:45,270 --> 00:23:46,500 necessariamente la cosa migliore. 544 00:23:46,500 --> 00:23:50,070 Perché se una funzione chiama se stessa, si chiama, anche se c'è una base 545 00:23:50,070 --> 00:23:54,860 caso, se non si preme tale caso base per 1.000 chiamate o 10.000 chiamate, da 546 00:23:54,860 --> 00:23:58,800 allora si potrebbe avere a corto di camera sul cosiddetto stack e hit 547 00:23:58,800 --> 00:24:00,400 alcuni altri segmenti di memoria. 548 00:24:00,400 --> 00:24:03,950 Quindi anche questo è un disegno trade-off tra eleganza e tra 549 00:24:03,950 --> 00:24:06,920 robustezza della vostra particolare attuazione. 550 00:24:06,920 --> 00:24:10,780 >> Quindi, c'è un altro aspetto negativo o Un altro punto a quello che abbiamo 551 00:24:10,780 --> 00:24:11,720 fatto finora. 552 00:24:11,720 --> 00:24:12,980 Quando ho chiamato getstring - 553 00:24:12,980 --> 00:24:15,120 mi permetta di andare di nuovo in ciao-2. 554 00:24:15,120 --> 00:24:18,170 Si noti che sto chiamando GetString, che restituisce un indirizzo. 555 00:24:18,170 --> 00:24:20,730 E si pretende oggi di indirizzo è dal mucchio. 556 00:24:20,730 --> 00:24:24,480 E ora sto stampando l' stringa a tale indirizzo. 557 00:24:24,480 --> 00:24:27,000 Ma non abbiamo mai chiamato il opposto di GetString. 558 00:24:27,000 --> 00:24:30,850 Non abbiamo mai avuto a calll una funzione come ungetstring, dove la mano indietro 559 00:24:30,850 --> 00:24:31,610 tale memoria. 560 00:24:31,610 --> 00:24:33,250 Ma francamente che probabilmente avrebbe dovuto essere. 561 00:24:33,250 --> 00:24:37,390 Perché se noi continuiamo a chiedere il computer per la memoria, per mezzo di uno come 562 00:24:37,390 --> 00:24:40,830 getstring ma mai dare indietro, sicuramente anche questo è destinato a portare a 563 00:24:40,830 --> 00:24:42,970 problemi di cui siamo a corto di memoria. 564 00:24:42,970 --> 00:24:46,140 >> E infatti, siamo in grado di cercare questi problemi con il nuovo strumento il cui utilizzo 565 00:24:46,140 --> 00:24:47,640 è un po 'criptico per digitare. 566 00:24:47,640 --> 00:24:50,960 Ma mi permetta di andare avanti e schizzi in su sullo schermo in un attimo. 567 00:24:50,960 --> 00:24:56,940 Ho intenzione di andare avanti e correre Valgrind con il parametro il cui primo comando 568 00:24:56,940 --> 00:25:00,260 argomento della riga è il nome di quel programma ciao-2. 569 00:25:00,260 --> 00:25:02,650 E purtroppo è uscita è atrocemente 570 00:25:02,650 --> 00:25:04,290 complesso per nessuna buona ragione. 571 00:25:04,290 --> 00:25:06,280 Così noi vediamo tutto quel casino. 572 00:25:06,280 --> 00:25:07,530 David è dichiarare il mio nome. 573 00:25:07,530 --> 00:25:09,760 Ecco, questo è il programma effettivamente in esecuzione. 574 00:25:09,760 --> 00:25:11,180 Ed ora arriviamo questa uscita. 575 00:25:11,180 --> 00:25:13,400 >> Così Valgrind è simile in spirito di GDB. 576 00:25:13,400 --> 00:25:14,950 Non è un debugger per sé. 577 00:25:14,950 --> 00:25:16,270 Ma è un controllo della memoria. 578 00:25:16,270 --> 00:25:20,140 E 'un programma che verrà eseguito il vostro programmare e ti dirà se hai chiesto un 579 00:25:20,140 --> 00:25:23,860 computer per la memoria e mai consegnato lo indietro, in modo da significa che avete 580 00:25:23,860 --> 00:25:24,570 una perdita di memoria. 581 00:25:24,570 --> 00:25:26,240 E perdite di memoria tendono ad essere cattivo. 582 00:25:26,240 --> 00:25:29,120 E si è utenti di computer hanno probabilmente sentito questo, se si dispone di un 583 00:25:29,120 --> 00:25:30,300 Mac o un PC. 584 00:25:30,300 --> 00:25:33,730 Hai mai usato il computer per mentre e non riavviato in diversi 585 00:25:33,730 --> 00:25:36,820 giorni, o hai appena avuto un sacco di programmi in esecuzione, e la cosa dannatamente 586 00:25:36,820 --> 00:25:42,360 rallenta un brusco stop, o almeno è super fastidioso da usare, perché 587 00:25:42,360 --> 00:25:44,350 tutto ciò che ha ottenuto appena super slow. 588 00:25:44,350 --> 00:25:46,260 >> Ora che può essere un qualsiasi numero di ragioni. 589 00:25:46,260 --> 00:25:49,600 Potrebbe essere un ciclo infinito, un bug in codice di qualcuno, o, più semplicemente, 590 00:25:49,600 --> 00:25:53,250 potrebbe significare che si sta utilizzando più memoria, o cercando di, che il vostro 591 00:25:53,250 --> 00:25:54,920 computer è in realtà. 592 00:25:54,920 --> 00:25:57,770 E forse c'è un bug in qualche programma che continuare a chiedere per la memoria. 593 00:25:57,770 --> 00:26:02,480 Browser per anni sono stati noti per questo, chiedendo più e più memoria 594 00:26:02,480 --> 00:26:03,870 ma mai restituirlo. 595 00:26:03,870 --> 00:26:07,220 Sicuramente, se si ha solo un numero finito quantità di memoria, non si può chiedere 596 00:26:07,220 --> 00:26:09,990 infinite volte per alcuni di quella memoria. 597 00:26:09,990 --> 00:26:13,070 >> E così quello che vedete qui, anche se ancora una volta l'uscita di Valgrind è 598 00:26:13,070 --> 00:26:17,490 inutilmente complesso di uno sguardo prima, questa è la parte interessante. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 in uso all'uscita. 601 00:26:20,060 --> 00:26:22,810 Così qui è la quantità di memoria è stata in uso nel mucchio alla 602 00:26:22,810 --> 00:26:24,300 ora il mio programma è uscito - 603 00:26:24,300 --> 00:26:27,280 a quanto pare sei byte in un blocco. 604 00:26:27,280 --> 00:26:28,710 Quindi ho intenzione di sventolare le mie mani a che un blocco è. 605 00:26:28,710 --> 00:26:31,270 Pensate che è solo un pezzo, un più parola tecnica per pezzo. 606 00:26:31,270 --> 00:26:33,140 Ma sei byte - 607 00:26:33,140 --> 00:26:36,870 quali sono i sei byte che erano ancora in uso? 608 00:26:36,870 --> 00:26:37,390 >> Esattamente. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D backslash zero cinque lettera nome più il terminatore null. 610 00:26:41,520 --> 00:26:46,350 Quindi questo programma valgrind notato che ho chiesto per sei byte, a quanto pare, da 611 00:26:46,350 --> 00:26:48,950 modo di GetString, ma mai ha dato loro indietro. 612 00:26:48,950 --> 00:26:52,030 Ed infatti, questo potrebbe non essere così ovvio se il mio programma non è di tre 613 00:26:52,030 --> 00:26:53,590 linee, ma è 300 linee. 614 00:26:53,590 --> 00:26:56,920 Così possiamo effettivamente dare un altro comando argomento della riga di Valgrind a 615 00:26:56,920 --> 00:26:58,290 renderlo più prolisso. 616 00:26:58,290 --> 00:26:59,760 E 'un po' fastidioso da ricordare. 617 00:26:59,760 --> 00:27:01,580 Ma se lo faccio - 618 00:27:01,580 --> 00:27:01,930 vediamo. 619 00:27:01,930 --> 00:27:03,540 Delle perdite - 620 00:27:03,540 --> 00:27:05,030 È stato trapelare - 621 00:27:05,030 --> 00:27:07,580 anche io non mi ricordo quello che è fuori mano. 622 00:27:07,580 --> 00:27:08,550 >> - Leak-controllo è uguale a pieno. 623 00:27:08,550 --> 00:27:10,180 Sì, grazie. 624 00:27:10,180 --> 00:27:12,520 - Leak-controllo è uguale a pieno. 625 00:27:12,520 --> 00:27:13,800 Invio. 626 00:27:13,800 --> 00:27:14,940 Stesso programma è in esecuzione. 627 00:27:14,940 --> 00:27:16,180 Digitare nel David di nuovo. 628 00:27:16,180 --> 00:27:17,660 Ora vedo un po 'più in dettaglio. 629 00:27:17,660 --> 00:27:20,890 Ma sotto il riepilogo heap, che è identico a quattro - ah, 630 00:27:20,890 --> 00:27:22,120 questo è il genere di bello. 631 00:27:22,120 --> 00:27:25,460 Ora Valgrind è in realtà guardando un po 'più difficile nel mio codice. 632 00:27:25,460 --> 00:27:29,580 E sta dicendo che, a quanto pare, malloc in linea - 633 00:27:29,580 --> 00:27:30,580 abbiamo zoom out. 634 00:27:30,580 --> 00:27:31,980 Alla linea - 635 00:27:31,980 --> 00:27:32,930 non vediamo quello che la linea che è. 636 00:27:32,930 --> 00:27:35,110 Ma malloc è il primo colpevole. 637 00:27:35,110 --> 00:27:38,630 C'è un blog in malloc. 638 00:27:38,630 --> 00:27:39,810 >> D'accordo? 639 00:27:39,810 --> 00:27:40,450 OK, no. 640 00:27:40,450 --> 00:27:40,940 Giusto? 641 00:27:40,940 --> 00:27:42,520 Ho chiamato GetString. 642 00:27:42,520 --> 00:27:44,460 getstring apparentemente chiama malloc. 643 00:27:44,460 --> 00:27:47,800 Quindi cosa riga di codice è apparentemente in colpa per aver 644 00:27:47,800 --> 00:27:49,050 assegnato questa memoria? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Supponiamo che chi ha scritto malloc è stato in giro abbastanza a lungo che è 647 00:27:55,540 --> 00:27:56,390 non è colpa loro. 648 00:27:56,390 --> 00:27:57,520 Quindi è probabilmente la mia. 649 00:27:57,520 --> 00:28:02,000 getString in cs50.c - e questo è un file da qualche parte sul computer - 650 00:28:02,000 --> 00:28:05,210 in linea 286 sembra essere il colpevole. 651 00:28:05,210 --> 00:28:08,140 Ora supponiamo che il CS50 è stata in giro per la discreta quantità di tempo, in modo da 652 00:28:08,140 --> 00:28:09,720 anche noi siamo infallibili. 653 00:28:09,720 --> 00:28:14,080 E così probabilmente non è in GetString che il bug si trova, ma piuttosto in 654 00:28:14,080 --> 00:28:17,810 linea ciao-2.c 18. 655 00:28:17,810 --> 00:28:20,670 >> Quindi diamo un'occhiata a ciò che era linea 18. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 In qualche modo questa linea non è necessariamente buggy, di per sé, ma è la ragione 658 00:28:27,130 --> 00:28:28,630 dietro quella perdita di memoria. 659 00:28:28,630 --> 00:28:32,140 Così super semplice, quale sarebbe intuitivamente essere la soluzione qui? 660 00:28:32,140 --> 00:28:34,710 Se stiamo chiedendo per la memoria, non sono mai stati dando indietro, e che sembra essere una 661 00:28:34,710 --> 00:28:37,940 problema, perché nel corso del tempo il mio computer potrebbe esaurire la memoria, potrebbe rallentare 662 00:28:37,940 --> 00:28:42,110 verso il basso, le cose brutte possono accadere, beh, qual è la soluzione semplice e intuitiva? 663 00:28:42,110 --> 00:28:43,140 Basta dare indietro. 664 00:28:43,140 --> 00:28:44,770 >> Come si fa a liberare la memoria? 665 00:28:44,770 --> 00:28:49,970 Beh, per fortuna è abbastanza semplice per dire solo il nome libero. 666 00:28:49,970 --> 00:28:51,260 E non abbiamo mai fatto prima. 667 00:28:51,260 --> 00:28:55,890 Ma si può essenzialmente pensare libero come l'opposto di malloc. 668 00:28:55,890 --> 00:28:58,030 libero è l'opposto di allocazione della memoria. 669 00:28:58,030 --> 00:28:59,540 Così ora mi permetta di ricompilare questo. 670 00:28:59,540 --> 00:29:02,050 Fai ciao-2. 671 00:29:02,050 --> 00:29:04,620 Lasciami correre di nuovo. ciao-2 David. 672 00:29:04,620 --> 00:29:07,290 Così sembra funzionare in esattamente nello stesso modo. 673 00:29:07,290 --> 00:29:11,180 Ma se torno a Valgrind e rieseguire quello stesso comando sulla mia nuova 674 00:29:11,180 --> 00:29:14,720 compilato programma, digitando a mio nome come prima - 675 00:29:14,720 --> 00:29:15,370 Nizza. 676 00:29:15,370 --> 00:29:16,760 Riassunto Heap - 677 00:29:16,760 --> 00:29:17,740 in uso in uscita - 678 00:29:17,740 --> 00:29:19,370 zero byte in blocchi zero. 679 00:29:19,370 --> 00:29:21,840 E questo è super bello, tutto blocchi di heap sono stati liberati. 680 00:29:21,840 --> 00:29:23,480 Nessuna perdita sono possibili. 681 00:29:23,480 --> 00:29:27,200 >> Quindi fino a venire, non con Problema Set 4, ma con Set Problema 5, i forensics 682 00:29:27,200 --> 00:29:30,740 e poi, anche questo diventerà un misura della correttezza della vostra 683 00:29:30,740 --> 00:29:33,630 programma, anche se non si dispone di o non hanno perdite di memoria. 684 00:29:33,630 --> 00:29:36,900 Ma, per fortuna, non solo si può ragionare attraverso di loro intuitivamente, che 685 00:29:36,900 --> 00:29:40,430 è, senza dubbio, facile per piccoli programmi ma più difficile per i programmi più grandi, 686 00:29:40,430 --> 00:29:43,860 Valgrind, per quei programmi più grandi, può aiutare a identificare 687 00:29:43,860 --> 00:29:45,360 il problema particolare. 688 00:29:45,360 --> 00:29:47,500 >> Ma c'è un altro problema che potrebbero sorgere. 689 00:29:47,500 --> 00:29:51,245 Permettetemi di aprire questo file di qui, che è, ancora, un po 'semplice esempio. 690 00:29:51,245 --> 00:29:53,760 Ma concentriamoci su ciò che questo programma fa. 691 00:29:53,760 --> 00:29:55,190 Questo si chiama memory.c. 692 00:29:55,190 --> 00:29:58,380 Postiamo questo entro oggi nella zip del codice sorgente di oggi. 693 00:29:58,380 --> 00:30:01,610 E notare che ho una funzione chiamata f che non ha argomenti e 694 00:30:01,610 --> 00:30:02,800 restituisce nulla. 695 00:30:02,800 --> 00:30:07,240 In linea 20, sto dichiarando apparentemente una puntatore ad un int e chiamandolo x. 696 00:30:07,240 --> 00:30:09,570 Sto assegnando è il ritorno valore di malloc. 697 00:30:09,570 --> 00:30:14,590 E tanto per essere chiari, quanti byte sono Probabilmente tornando da malloc 698 00:30:14,590 --> 00:30:17,080 in questa situazione? 699 00:30:17,080 --> 00:30:18,040 >> Probabilmente 40. 700 00:30:18,040 --> 00:30:18,840 Dove si ottiene che da? 701 00:30:18,840 --> 00:30:22,410 Beh, se vi ricordate che un int è spesso 4 byte, almeno è in 702 00:30:22,410 --> 00:30:25,110 elettrodomestico, 10 volte 4 è ovviamente 40. 703 00:30:25,110 --> 00:30:28,920 Così malloc restituisce un indirizzo di un pezzo di memoria e di archiviazione che 704 00:30:28,920 --> 00:30:30,800 affrontare in ultima analisi, in x. 705 00:30:30,800 --> 00:30:32,570 Quindi, per essere chiari, cosa allora sta accadendo? 706 00:30:32,570 --> 00:30:34,990 Beh, lasciatemi passare indietro a nostra immagine qui. 707 00:30:34,990 --> 00:30:38,150 Lasciatemi non solo disegnare il fondo del mio memoria del computer, lasciami andare avanti e 708 00:30:38,150 --> 00:30:42,990 disegnare l'intero rettangolo che rappresenta tutta la mia RAM. 709 00:30:42,990 --> 00:30:44,790 >> Diremo che la risma è sul fondo. 710 00:30:44,790 --> 00:30:47,010 E c'è un segmento di testo in i dati non inizializzati. 711 00:30:47,010 --> 00:30:49,880 Ma io sto solo andando a quelli astratti altre cose di distanza, come dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Sto solo andando a fare riferimento a questo come il mucchio in alto. 713 00:30:53,470 --> 00:30:57,070 E poi in fondo a questa immagine, a rappresentare principale, io vado 714 00:30:57,070 --> 00:30:59,880 per dargli una memoria fette in pila. 715 00:30:59,880 --> 00:31:03,150 Per f, ho intenzione di dargli una fetta di memoria sullo stack. 716 00:31:03,150 --> 00:31:05,140 Ora, ho avuto modo di consultare il mio nuovamente il codice sorgente. 717 00:31:05,140 --> 00:31:07,170 Quali sono le variabili locali per principale? 718 00:31:07,170 --> 00:31:10,710 Apparentemente nulla, in modo che la fetta è efficacemente vuota o addirittura non così grande 719 00:31:10,710 --> 00:31:11,600 come ho disegnato esso. 720 00:31:11,600 --> 00:31:15,730 Ma in f, ho una variabile locale, che si chiama x. 721 00:31:15,730 --> 00:31:20,410 Quindi ho intenzione di andare avanti e dare f un pezzo di memoria, definendolo x. 722 00:31:20,410 --> 00:31:24,680 >> E ora malloc di 10 volte 4, Così malloc 40, dov'è che 723 00:31:24,680 --> 00:31:25,430 memoria provenienti da? 724 00:31:25,430 --> 00:31:27,530 Noi non abbiamo disegnato un quadro come questo prima. 725 00:31:27,530 --> 00:31:31,140 Ma supponiamo che sia effettivamente provenienti da qui, così uno, 726 00:31:31,140 --> 00:31:33,170 due, tre, quattro, cinque. 727 00:31:33,170 --> 00:31:34,680 E ora ho bisogno di 40 di questi. 728 00:31:34,680 --> 00:31:37,540 Quindi mi limiterò a fare punti, punto, punto di suggerire che c'è ancora di più la memoria 729 00:31:37,540 --> 00:31:39,350 tornando dal mucchio. 730 00:31:39,350 --> 00:31:40,710 Ora, qual è l'indirizzo? 731 00:31:40,710 --> 00:31:42,620 Scegliamo il nostro arbitrario affrontare come sempre - 732 00:31:42,620 --> 00:31:46,310 Ox123, anche se è probabilmente andando di essere qualcosa di completamente diverso. 733 00:31:46,310 --> 00:31:50,420 Questo è l'indirizzo del primo byte in ricordo che mi sto chiedendo malloc per. 734 00:31:50,420 --> 00:31:53,630 >> Così, in breve, la linea 20 una volta eseguito, ciò che è letteralmente 735 00:31:53,630 --> 00:31:57,170 memorizzati all'interno di x qui? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 E il bue non è interessante. 739 00:32:01,550 --> 00:32:03,200 Significa solo che qui c'è un numero esadecimale. 740 00:32:03,200 --> 00:32:06,490 Ma ciò che è fondamentale è che quello che ho negozio in x, che è una variabile locale. 741 00:32:06,490 --> 00:32:10,260 Ma il tipo di dati, ancora una volta, è un indirizzo di un int. 742 00:32:10,260 --> 00:32:12,710 Beh, io vado a memorizzare Ox123. 743 00:32:12,710 --> 00:32:16,610 Ma ancora una volta, se questo è un po 'troppo complicato inutilmente, se ho scorrere 744 00:32:16,610 --> 00:32:21,490 indietro, possiamo astrarre questa via piuttosto ragionevole e giusto dire che x è un 745 00:32:21,490 --> 00:32:23,910 puntatore a quel pezzo di memoria. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Ora la questione a portata di mano è il seguente - 748 00:32:26,230 --> 00:32:29,910 linea 21, si scopre, è bacato. 749 00:32:29,910 --> 00:32:31,160 Perché? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Siamo spiacenti? 752 00:32:36,930 --> 00:32:38,640 Non ha - 753 00:32:38,640 --> 00:32:40,390 dire che ancora una volta. 754 00:32:40,390 --> 00:32:41,240 Beh, non è libero. 755 00:32:41,240 --> 00:32:42,350 Ecco, questo è il secondo, ma. 756 00:32:42,350 --> 00:32:45,000 Quindi c'è un altro ma specificamente alla riga 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Esattamente. 759 00:32:50,040 --> 00:32:54,980 Questa semplice linea di codice è solo un buffer overflow, un sovraccarico del buffer. 760 00:32:54,980 --> 00:32:57,050 Un buffer significa solo un pezzo di memoria. 761 00:32:57,050 --> 00:33:01,520 Ma quel pezzo di memoria è di dimensioni 10, 10 numeri interi, il che significa che se noi 762 00:33:01,520 --> 00:33:05,350 indice in esso utilizzando lo zucchero sintattico di notazione degli array, la piazza 763 00:33:05,350 --> 00:33:09,220 parentesi, si ha accesso a x staffa 0 x staffa 1 x, 764 00:33:09,220 --> 00:33:10,390 Staffa dot, dot, dot. 765 00:33:10,390 --> 00:33:13,270 x staffa 9 è il più grande. 766 00:33:13,270 --> 00:33:17,680 Quindi se faccio x staffa 10, dove In realtà sto andando a memoria? 767 00:33:17,680 --> 00:33:19,120 >> Beh, se ho 10 int - 768 00:33:19,120 --> 00:33:21,070 diamo in realtà disegnare tutti di qui questi fuori. 769 00:33:21,070 --> 00:33:22,700 Così che era il primo di cinque. 770 00:33:22,700 --> 00:33:24,660 Ecco gli altri cinque int. 771 00:33:24,660 --> 00:33:29,580 Quindi x staffa 0 è qui. x staffa 1 è qui. x staffa 9 è qui. x staffa 772 00:33:29,580 --> 00:33:37,960 10 è qui, il che significa che vi sto dicendo, in linea 21, il computer per mettere il 773 00:33:37,960 --> 00:33:39,400 numero dove? 774 00:33:39,400 --> 00:33:42,010 Il numero 0 dove? 775 00:33:42,010 --> 00:33:43,380 Beh, è ​​0, sì. 776 00:33:43,380 --> 00:33:45,460 Ma solo il fatto che il suo 0 è una specie di coincidenza. 777 00:33:45,460 --> 00:33:47,140 Potrebbe essere il numero 50, per quello che importa. 778 00:33:47,140 --> 00:33:50,480 Ma stiamo cercando di mettere in x staffa 10, che è dove questo 779 00:33:50,480 --> 00:33:53,700 punto di domanda è disegnato, che non è una buona cosa. 780 00:33:53,700 --> 00:33:57,070 Questo programma potrebbe molto bene bloccarsi come risultato. 781 00:33:57,070 --> 00:33:59,400 >> Ora, andiamo avanti e vediamo se questo è, infatti, quello che succede. 782 00:33:59,400 --> 00:34:02,600 Fare memoria, poiché il file si chiama memory.c. 783 00:34:02,600 --> 00:34:05,950 Andiamo avanti e gestita la memoria di programma. 784 00:34:05,950 --> 00:34:08,239 Così siamo stati fortunati, in realtà, a quanto pare. 785 00:34:08,239 --> 00:34:09,340 Siamo stati fortunati. 786 00:34:09,340 --> 00:34:11,060 Ma vediamo se ora corriamo Valgrind. 787 00:34:11,060 --> 00:34:14,170 A prima vista, il mio programma potrebbe sembrano essere perfettamente corrette. 788 00:34:14,170 --> 00:34:18,010 Ma lasciatemi correre Valgrind con il - Leak-controllo è uguale a pieno sulla memoria. 789 00:34:18,010 --> 00:34:20,110 >> E adesso quando eseguo questo - 790 00:34:20,110 --> 00:34:21,030 interessante. 791 00:34:21,030 --> 00:34:26,800 Scrivere non valido di dimensione 4 a linea 21 di memory.c. 792 00:34:26,800 --> 00:34:29,284 Linea 21 di memory.c è quale? 793 00:34:29,284 --> 00:34:30,340 Oh, interessante. 794 00:34:30,340 --> 00:34:31,080 Ma aspetta. 795 00:34:31,080 --> 00:34:32,389 Dimensione 4, qual è quello che fa riferimento a? 796 00:34:32,389 --> 00:34:34,969 Ho solo fatto uno scritto, ma è di dimensione 4. 797 00:34:34,969 --> 00:34:36,889 Perché è 4? 798 00:34:36,889 --> 00:34:39,280 E 'perché è un int, che è, di nuovo, quattro byte. 799 00:34:39,280 --> 00:34:42,510 Così Valgrind trovato un bug che ho, guardando il mio codice, non lo fece. 800 00:34:42,510 --> 00:34:45,040 E forse il vostro TF volesse o no. 801 00:34:45,040 --> 00:34:48,469 Che però Valgrind per certo scoperto che Abbiamo fatto un errore lì, anche 802 00:34:48,469 --> 00:34:52,719 anche se siamo stati fortunati, e il computer ha deciso, eh, non sto andando in crash 803 00:34:52,719 --> 00:34:57,470 solo perché si è toccato un byte, uno valore della memoria di int che non hai 804 00:34:57,470 --> 00:34:58,550 in realtà proprio. 805 00:34:58,550 --> 00:35:00,380 >> Beh, che altro è bacato qui. 806 00:35:00,380 --> 00:35:01,180 Indirizzo - 807 00:35:01,180 --> 00:35:03,190 questo è un indirizzo in cerca pazzo in esadecimale. 808 00:35:03,190 --> 00:35:06,890 Questo significa che solo un posto nel mucchio è zero byte dopo un blocco di dimensione 40 809 00:35:06,890 --> 00:35:07,620 è allocato. 810 00:35:07,620 --> 00:35:10,610 Permettetemi di zoom out qui e vedere se questo è un po 'più utile. 811 00:35:10,610 --> 00:35:11,410 Interessante. 812 00:35:11,410 --> 00:35:15,600 40 byte sono definitivamente persi in perdita record 1 di 1. 813 00:35:15,600 --> 00:35:17,840 Anche in questo caso, più parole che è utile qui. 814 00:35:17,840 --> 00:35:21,350 Ma sulla base delle linee evidenziate, dove dovrei probabilmente concentrare la mia 815 00:35:21,350 --> 00:35:24,070 l'attenzione per un altro bug? 816 00:35:24,070 --> 00:35:26,570 Sembra una linea 20 di memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Quindi, se torniamo alla linea 20, che è il uno che si è identificato in precedenza. 818 00:35:30,990 --> 00:35:33,030 E non è necessariamente buggy. 819 00:35:33,030 --> 00:35:35,160 Ma noi abbiamo questo invertito i suoi effetti. 820 00:35:35,160 --> 00:35:38,790 Allora, come faccio a correggere almeno uno di questi errori? 821 00:35:38,790 --> 00:35:42,240 Che cosa potevo fare, dopo la linea 21? 822 00:35:42,240 --> 00:35:47,110 Ho potuto fare senza x, così è di restituire la memoria. 823 00:35:47,110 --> 00:35:49,230 E come faccio a risolvere questo bug? 824 00:35:49,230 --> 00:35:52,120 Devo assolutamente andare più lontano di 0. 825 00:35:52,120 --> 00:35:53,670 Quindi, mi permetta di provare e ri-eseguire questo. 826 00:35:53,670 --> 00:35:56,080 Siamo spiacenti, sicuramente più lontano di 9. 827 00:35:56,080 --> 00:35:57,510 Fai la memoria. 828 00:35:57,510 --> 00:36:00,650 Permettetemi di rieseguire Valgrind in una finestra più grande. 829 00:36:00,650 --> 00:36:01,580 E ora guarda. 830 00:36:01,580 --> 00:36:02,250 Nizza. 831 00:36:02,250 --> 00:36:03,270 Tutti i blocchi di heap sono stati liberati. 832 00:36:03,270 --> 00:36:04,270 Nessuna perdita sono possibili. 833 00:36:04,270 --> 00:36:07,520 E fino qui sopra, non c'è alcuna menzione non più del diritto invalido. 834 00:36:07,520 --> 00:36:09,820 >> Solo per ottenere avidi, e ti permette di vedere se un'altra dimostrazione 835 00:36:09,820 --> 00:36:11,050 non va come previsto - 836 00:36:11,050 --> 00:36:12,560 Ho avuto la fortuna di un momento fa. 837 00:36:12,560 --> 00:36:15,530 Ed il fatto che questo è 0 è forse inutilmente fuorviante. 838 00:36:15,530 --> 00:36:20,650 Diciamo solo che fare 50, un po 'arbitrario numero, fare memoria della memoria dot barra - 839 00:36:20,650 --> 00:36:21,410 ancora avere fortuna. 840 00:36:21,410 --> 00:36:22,510 Non c'è niente di crash. 841 00:36:22,510 --> 00:36:26,150 Supponiamo che io faccio solo qualcosa di veramente sciocco, e lo faccio 100. 842 00:36:26,150 --> 00:36:30,360 Lasciatemi Remake di memoria, dot memoria barra - 843 00:36:30,360 --> 00:36:31,075 ottenuto di nuovo fortunato. 844 00:36:31,075 --> 00:36:32,800 Come circa 1.000? 845 00:36:32,800 --> 00:36:35,370 int là, grosso modo, dove dovrei essere? 846 00:36:35,370 --> 00:36:37,410 Fai la memoria - 847 00:36:37,410 --> 00:36:38,570 dannazione. 848 00:36:38,570 --> 00:36:39,920 >> [Risata] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Cerchiamo di non pasticciare più in giro. 851 00:36:43,920 --> 00:36:45,120 Eseguire di nuovo la memoria. 852 00:36:45,120 --> 00:36:45,840 Ecco fatto. 853 00:36:45,840 --> 00:36:46,410 D'accordo. 854 00:36:46,410 --> 00:36:52,500 Quindi, a quanto pare è indice di 100.000 int là dove si dovrebbe essere stato in 855 00:36:52,500 --> 00:36:54,410 la memoria, le cose brutte accadono. 856 00:36:54,410 --> 00:36:56,430 Quindi questo non è ovviamente un disco, regola velocemente. 857 00:36:56,430 --> 00:36:58,190 Ero un po 'usando prova ed errori per arrivarci. 858 00:36:58,190 --> 00:37:02,230 Ma questo è perché, per farla breve, la memoria del computer è anche diviso 859 00:37:02,230 --> 00:37:03,580 in queste cose chiamati segmenti. 860 00:37:03,580 --> 00:37:07,260 E a volte, il computer in realtà ha dato un po 'più di memoria 861 00:37:07,260 --> 00:37:08,400 di quello che chiedi. 862 00:37:08,400 --> 00:37:12,170 Ma per l'efficienza, è solo più facile da ottenere più memoria, ma solo dirvi 863 00:37:12,170 --> 00:37:13,780 che stai ricevendo una porzione di esso. 864 00:37:13,780 --> 00:37:16,370 >> E se sei fortunato a volte, Pertanto, si potrebbe essere in grado di toccare 865 00:37:16,370 --> 00:37:17,795 memoria che non appartiene a voi. 866 00:37:17,795 --> 00:37:21,860 Tu non hai la garanzia che ciò che il valore metti ci sarà stare lì, perché 867 00:37:21,860 --> 00:37:25,080 il computer pensa ancora che non è tuo, ma non sta andando necessariamente 868 00:37:25,080 --> 00:37:29,910 per toccare altro segmento di memoria nella computer e di indurre un errore come 869 00:37:29,910 --> 00:37:31,710 questa qui. 870 00:37:31,710 --> 00:37:32,060 D'accordo. 871 00:37:32,060 --> 00:37:37,240 Tutte le domande poi sulla memoria? 872 00:37:37,240 --> 00:37:37,590 >> D'accordo. 873 00:37:37,590 --> 00:37:40,610 Diamo uno sguardo qui, quindi, a qualcosa che hai preso per 874 00:37:40,610 --> 00:37:48,361 concesso per un bel po 'di tempo, che è in questo file chiamato cs50.h. 875 00:37:48,361 --> 00:37:49,420 Quindi questo è un file. 876 00:37:49,420 --> 00:37:51,130 Questi sono solo un mucchio di commenti sulla parte superiore. 877 00:37:51,130 --> 00:37:53,900 E si potrebbe avere guardato questo se si curiosato sull'apparecchio. 878 00:37:53,900 --> 00:37:57,000 Ma si scopre che tutto il tempo, quando abbiamo usato per usare stringa come 879 00:37:57,000 --> 00:38:01,130 sinonimo, il mezzo con cui abbiamo dichiarato che era sinonimo di questo 880 00:38:01,130 --> 00:38:03,990 parola chiave typedef, per la definizione del tipo. 881 00:38:03,990 --> 00:38:07,500 E stiamo essenzialmente dicendo: facciamo stringa sinonimo di stella char. 882 00:38:07,500 --> 00:38:11,190 Che il mezzo con cui la pila creato queste ruote di formazione noto come 883 00:38:11,190 --> 00:38:12,040 la stringa. 884 00:38:12,040 --> 00:38:14,830 >> Ora qui è solo un prototipo per getchar. 885 00:38:14,830 --> 00:38:17,350 Potremmo aver visto prima, ma che è infatti ciò che fa. getchar 886 00:38:17,350 --> 00:38:19,070 non ha argomenti, restituisce un char. 887 00:38:19,070 --> 00:38:21,340 getDouble non ha argomenti, Restituisce un valore Double. 888 00:38:21,340 --> 00:38:24,440 getFloat non ha argomenti, restituisce un galleggiante, e così via. 889 00:38:24,440 --> 00:38:27,270 getint è qui. getlonglong è qui dentro. 890 00:38:27,270 --> 00:38:28,820 E getstring è qui. 891 00:38:28,820 --> 00:38:29,420 E questo è tutto. 892 00:38:29,420 --> 00:38:33,080 Questa linea viola è un altro preprocessore direttiva, a causa della 893 00:38:33,080 --> 00:38:35,550 hashtag all'inizio di esso. 894 00:38:35,550 --> 00:38:35,870 >> D'accordo. 895 00:38:35,870 --> 00:38:38,380 Così ora lasciami andare in cs50.c. 896 00:38:38,380 --> 00:38:40,400 E non parliamo troppo a lungo su questo. 897 00:38:40,400 --> 00:38:43,280 Ma per darvi un assaggio di ciò che è andata avanti tutto questo 898 00:38:43,280 --> 00:38:46,434 tempo, lasciami andare a - 899 00:38:46,434 --> 00:38:48,250 facciamolo getchar. 900 00:38:48,250 --> 00:38:51,050 Così getchar è per lo più commenti. 901 00:38:51,050 --> 00:38:52,060 Ma sembra che questo. 902 00:38:52,060 --> 00:38:54,800 Quindi questa è la funzione reale getchar che siamo stati 903 00:38:54,800 --> 00:38:56,055 dando per scontato esista. 904 00:38:56,055 --> 00:38:59,370 E anche se non abbiamo ancora usare questo che spesso, se mai, è almeno 905 00:38:59,370 --> 00:39:00,470 relativamente semplice. 906 00:39:00,470 --> 00:39:02,580 Quindi vale la pena di prendere una rapido sguardo qui. 907 00:39:02,580 --> 00:39:06,540 >> Così getchar ha un ciclo infinito, deliberatamente in modo apparentemente. 908 00:39:06,540 --> 00:39:10,050 Chiede poi - e questo è una specie di bella riutilizzo del codice che abbiamo scritto noi stessi. 909 00:39:10,050 --> 00:39:11,220 Chiede GetString. 910 00:39:11,220 --> 00:39:12,460 Perché ciò che lo fa significa ottenere un char? 911 00:39:12,460 --> 00:39:14,730 Beh, si potrebbe anche cercare di ottenere una intera linea di testo dall'utente e 912 00:39:14,730 --> 00:39:16,940 poi basta guardare uno di quei personaggi. 913 00:39:16,940 --> 00:39:19,170 In linea 60, ecco un po 'di po di un controllo di integrità. 914 00:39:19,170 --> 00:39:21,610 Se getstring restituito null, cerchiamo di non procedere. 915 00:39:21,610 --> 00:39:22,820 Qualcosa è andato storto. 916 00:39:22,820 --> 00:39:28,120 >> Ora, questo è un po 'fastidioso, ma convenzionale in C. char max probabilmente 917 00:39:28,120 --> 00:39:29,960 rappresenta quello che è appena in base al suo nome? 918 00:39:29,960 --> 00:39:31,670 E 'una costante. 919 00:39:31,670 --> 00:39:36,040 È come il valore numerico della grande char si può rappresentare con 920 00:39:36,040 --> 00:39:40,370 un morso, che è probabilmente il numero 255, che è il più grande numero che si 921 00:39:40,370 --> 00:39:42,720 rappresentare otto bit, partendo da zero. 922 00:39:42,720 --> 00:39:47,460 Così ho uso questo, in questa funzione, per scrivere questo codice, solo perché 923 00:39:47,460 --> 00:39:51,753 se qualcosa va storto in getchar ma il suo scopo nella vita è quello di restituire una 924 00:39:51,753 --> 00:39:54,830 char, è necessario essere in qualche modo in grado per segnalare all'utente che 925 00:39:54,830 --> 00:39:55,840 qualcosa è andato storto. 926 00:39:55,840 --> 00:39:56,970 Non possiamo restituire null. 927 00:39:56,970 --> 00:39:58,480 Si scopre che è un puntatore nullo. 928 00:39:58,480 --> 00:40:01,030 E ancora, getchar ha per restituire un char. 929 00:40:01,030 --> 00:40:04,760 >> Quindi la convenzione, se qualcosa va sbagliato, sei tu, il programmatore, o in 930 00:40:04,760 --> 00:40:08,160 questo caso, io con la libreria, ho avuto un solo decidere arbitrariamente, se 931 00:40:08,160 --> 00:40:12,230 qualcosa va storto, ho intenzione di restituire il numero 255, che è veramente 932 00:40:12,230 --> 00:40:17,240 significa che possiamo non, l'utente non può digitare il carattere rappresentato dal 933 00:40:17,240 --> 00:40:21,410 numero 255, perché abbiamo avuto un rubarlo come un cosiddetto valore sentinella 934 00:40:21,410 --> 00:40:23,410 rappresentare un problema. 935 00:40:23,410 --> 00:40:27,010 Ora si scopre che il personaggio 255 non è qualcosa che si può digitare su 936 00:40:27,010 --> 00:40:28,380 la tastiera, quindi è un grosso problema. 937 00:40:28,380 --> 00:40:30,910 L'utente non si accorge che Ho rubato questo personaggio. 938 00:40:30,910 --> 00:40:34,620 Ma se mai vedere in pagine di manuale su un sistema informatico qualche riferimento ad un 939 00:40:34,620 --> 00:40:38,560 tutti i tappi costante come questo che dice: in caso di errore di questa costante forza 940 00:40:38,560 --> 00:40:42,720 essere restituito, tutto qui qualche fatto umano anni fa è stato arbitrariamente deciso di 941 00:40:42,720 --> 00:40:45,680 restituire questo valore speciale e chiamare una costante nel caso in cui 942 00:40:45,680 --> 00:40:46,840 qualcosa va storto. 943 00:40:46,840 --> 00:40:48,580 >> Ora la magia accade quaggiù. 944 00:40:48,580 --> 00:40:52,600 In primo luogo, sto dichiarando in linea 67 due personaggi, C1 e C2. 945 00:40:52,600 --> 00:40:57,080 E poi, in linea di 68, c'è in realtà una riga di codice che ricorda 946 00:40:57,080 --> 00:41:01,140 il nostro amico printf, dato che non avere cento Cs tra virgolette. 947 00:41:01,140 --> 00:41:06,490 A meno di notare quello che sta succedendo qui. sscanf significa scansione stringa - 948 00:41:06,490 --> 00:41:11,690 si intende eseguire la scansione di un formattata stringa, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Che cosa vuol dire? 950 00:41:12,590 --> 00:41:16,310 Vuol dire che si passa a sscanf una stringa. 951 00:41:16,310 --> 00:41:18,420 E la linea è qualunque l'utente poll 952 00:41:18,420 --> 00:41:23,520 Si passa a sscanf una stringa di formato come ciò che dice a scanf quali sono 953 00:41:23,520 --> 00:41:25,870 si spera che l'utente ha digitato dentro 954 00:41:25,870 --> 00:41:29,730 È quindi passa-in gli indirizzi dei due blocchi di memoria, in questo caso, 955 00:41:29,730 --> 00:41:31,150 perché ho due segnaposto. 956 00:41:31,150 --> 00:41:34,610 Quindi ho intenzione di dare l'indirizzo C1 e l'indirizzo di C2. 957 00:41:34,610 --> 00:41:37,700 >> E ricordate che vi darà una funzione del indirizzo di una variabile, che cosa è 958 00:41:37,700 --> 00:41:38,950 l'implicazione? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Ciò può farlo funzionare come risultato di dargli l'indirizzo di un 961 00:41:45,050 --> 00:41:48,170 variabile, al contrario di la variabile stessa? 962 00:41:48,170 --> 00:41:49,450 Si può cambiare, giusto? 963 00:41:49,450 --> 00:41:53,250 Se tu avessi qualcuno una mappa a un fisico indirizzo, possono andare lì e fare 964 00:41:53,250 --> 00:41:54,750 quello che vogliono a tale indirizzo. 965 00:41:54,750 --> 00:41:55,800 Stessa idea qui. 966 00:41:55,800 --> 00:41:59,950 Se passiamo ad sscanf, l'indirizzo di due blocchi di memoria, anche questi piccoli 967 00:41:59,950 --> 00:42:03,585 piccoli blocchi di memoria, C1 e C2, ma diciamo che l'indirizzo di essi, 968 00:42:03,585 --> 00:42:05,170 sscanf può cambiare. 969 00:42:05,170 --> 00:42:08,530 >> Quindi lo scopo di sscanf nella vita, se leggiamo la pagina di manuale, è quello di leggere ciò che il 970 00:42:08,530 --> 00:42:13,420 utente digitato, speranza per l'utente debba digitato un carattere e forse 971 00:42:13,420 --> 00:42:16,470 un altro personaggio, e ciò che l'utente digitato, il primo carattere va 972 00:42:16,470 --> 00:42:19,310 qui, il secondo personaggio va qui. 973 00:42:19,310 --> 00:42:22,470 Ora, per inciso, questo, e si farebbe so solo questo dalla documentazione, 974 00:42:22,470 --> 00:42:25,570 il fatto che ho messo uno spazio vuoto ci significa solo che non mi interessa se 975 00:42:25,570 --> 00:42:28,440 l'utente preme la barra spaziatrice pochi volte prima che lui o lei prende un 976 00:42:28,440 --> 00:42:30,400 carattere, ho intenzione di ignorare qualsiasi spazio bianco. 977 00:42:30,400 --> 00:42:32,510 In modo che, lo so da la documentazione. 978 00:42:32,510 --> 00:42:36,570 >> Il fatto che ci sia una seconda% c seguito da uno spazio bianco è in realtà 979 00:42:36,570 --> 00:42:37,410 intenzionale. 980 00:42:37,410 --> 00:42:41,190 Voglio essere in grado di rilevare se l'utente avvitato o non ha collaborato. 981 00:42:41,190 --> 00:42:45,630 Quindi spero che l'utente ha digitato solo in un carattere, quindi spero 982 00:42:45,630 --> 00:42:50,640 che sscanf è solo andare a restituire il valore 1, perché, ancora una volta, se ho letto 983 00:42:50,640 --> 00:42:55,400 la documentazione, lo scopo di sscanf in vita è di tornare al numero di 984 00:42:55,400 --> 00:42:59,170 variabili che sono stati riempiti con l'input dell'utente. 985 00:42:59,170 --> 00:43:02,270 >> Ho superato in due variabili indirizzi, C1 e C2. 986 00:43:02,270 --> 00:43:06,420 Spero, però, che solo uno dei loro viene ucciso, perché se sscanf 987 00:43:06,420 --> 00:43:11,130 restituisce 2, che cosa è presumibilmente l'implicazione logica? 988 00:43:11,130 --> 00:43:14,600 Che l'utente non ha Dammi solo un personaggio come ho detto o lei. 989 00:43:14,600 --> 00:43:17,860 Probabilmente digitati almeno due caratteri. 990 00:43:17,860 --> 00:43:22,430 Quindi, se io invece non ho avuto il secondo % C, ho appena avuto uno, che 991 00:43:22,430 --> 00:43:25,370 francamente sarebbe più intuitivo approccio, credo che un primo colpo d'occhio, 992 00:43:25,370 --> 00:43:30,220 non si sta andando ad essere in grado di rilevare se l'utente è stato ti dà di più 993 00:43:30,220 --> 00:43:31,780 ingresso di quello che in realtà voleva. 994 00:43:31,780 --> 00:43:34,100 Quindi questa è una forma implicita di controllo degli errori. 995 00:43:34,100 --> 00:43:35,640 >> Ma notate che cosa faccio qui. 996 00:43:35,640 --> 00:43:39,970 Una volta che sono sicuro che l'utente mi ha dato uno carattere, ho liberare la linea, facendo 997 00:43:39,970 --> 00:43:44,450 il contrario di GetString, che a sua volta usa malloc, e poi torno 998 00:43:44,450 --> 00:43:51,030 C1, il personaggio che speravo l' utente fornito e solo a condizione. 999 00:43:51,030 --> 00:43:54,680 Quindi una rapida solo intravisto, ma tutte le domande su getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Torneremo ad alcuni degli altri. 1002 00:43:59,590 --> 00:44:03,770 >> Beh, mi permetta di andare avanti e di fare questo - Supponiamo ora, solo per motivare il nostro 1003 00:44:03,770 --> 00:44:08,910 discussione in una settimana più il tempo, questo è un file chiamato structs.h. 1004 00:44:08,910 --> 00:44:11,440 E di nuovo, questo è solo un assaggio di qualcosa che si trova avanti. 1005 00:44:11,440 --> 00:44:13,090 Ma si noti che un sacco di questo è commenti. 1006 00:44:13,090 --> 00:44:17,440 Quindi, mi permetta di evidenziare solo la parte interessante per ora. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 c'è ancora quella stessa parola chiave. 1009 00:44:19,700 --> 00:44:23,100 typedef si usa per dichiarare stringa come tipo di dati speciale. 1010 00:44:23,100 --> 00:44:27,490 È possibile utilizzare typedef per creare nuovo di zecca i tipi di dati che non esistevano quando 1011 00:44:27,490 --> 00:44:28,570 C è stato inventato. 1012 00:44:28,570 --> 00:44:32,520 Per esempio, int viene con C. char viene fornito con doppia C. viene con C. Ma 1013 00:44:32,520 --> 00:44:34,000 non c'è alcuna idea di uno studente. 1014 00:44:34,000 --> 00:44:37,230 E tuttavia sarebbe molto utile per essere grado di scrivere un programma che memorizza 1015 00:44:37,230 --> 00:44:40,440 in una variabile, il numero ID di uno studente, il loro nome e la loro casa. 1016 00:44:40,440 --> 00:44:42,890 In altre parole, tre pezzi dei dati, come un int e un 1017 00:44:42,890 --> 00:44:44,420 stringa e un'altra stringa. 1018 00:44:44,420 --> 00:44:48,220 >> Con typedef, che cosa è abbastanza potente su questo e la parola chiave per sturct 1019 00:44:48,220 --> 00:44:53,660 struttura, è il programmatore nel 2013, può effettivamente definire il proprio il 1020 00:44:53,660 --> 00:44:57,530 i tipi di dati che non esistevano anni fa ma che soddisfare i vostri scopi. 1021 00:44:57,530 --> 00:45:01,910 Ed ecco, in linee di 13 a 19, stiamo dichiarando un nuovo tipo di dati, come 1022 00:45:01,910 --> 00:45:04,320 un int, ma chiamandolo studente. 1023 00:45:04,320 --> 00:45:09,310 E all'interno di questa variabile sta per essere tre cose - un int, una stringa, 1024 00:45:09,310 --> 00:45:09,930 e una stringa. 1025 00:45:09,930 --> 00:45:13,040 Così si può pensare a ciò che è veramente accaduto qui, anche se questo è un 1026 00:45:13,040 --> 00:45:17,160 po 'una semplificazione per l'oggi, uno studente sta essenzialmente 1027 00:45:17,160 --> 00:45:19,450 a guardare come questo. 1028 00:45:19,450 --> 00:45:22,580 Sua intenzione di essere un pezzo di memoria con un ID, un nome 1029 00:45:22,580 --> 00:45:25,580 campo, e un campo di casa. 1030 00:45:25,580 --> 00:45:30,670 E saremo in grado di utilizzare tali pezzi di memoria e accedervi come segue. 1031 00:45:30,670 --> 00:45:38,870 >> Se entro in struct0.c, ecco un relativamente lungo, ma seguendo una 1032 00:45:38,870 --> 00:45:42,630 modello, di codice che usa questo nuovo trucco. 1033 00:45:42,630 --> 00:45:45,790 Quindi, in primo luogo, vorrei richiamare la vostra attenzione per le parti interessanti fino in alto. 1034 00:45:45,790 --> 00:45:49,670 Sharp definisce gli studenti 3, dichiara una costanti chiamati gli studenti e aventi causa 1035 00:45:49,670 --> 00:45:53,450 arbitrariamente il numero 3, proprio così ho tre studenti che utilizzano 1036 00:45:53,450 --> 00:45:54,830 questo programma per ora. 1037 00:45:54,830 --> 00:45:55,960 Arriva principale. 1038 00:45:55,960 --> 00:45:58,860 E notate, come faccio a dichiarare una serie di studenti? 1039 00:45:58,860 --> 00:46:00,480 Beh, mi basta usare la stessa sintassi. 1040 00:46:00,480 --> 00:46:02,110 La parola studente è ovviamente nuovo. 1041 00:46:02,110 --> 00:46:04,790 Ma gli studenti, classe, studenti staffa. 1042 00:46:04,790 --> 00:46:06,720 >> Così, purtroppo, ci sono un sacco di riutilizzo dei termini qui. 1043 00:46:06,720 --> 00:46:07,660 Questo è solo un numero. 1044 00:46:07,660 --> 00:46:09,040 Quindi questo è come dire tre. 1045 00:46:09,040 --> 00:46:11,430 Classe è proprio quello che voglio per chiamare la variabile. 1046 00:46:11,430 --> 00:46:12,840 Potrei chiamarlo studenti. 1047 00:46:12,840 --> 00:46:15,880 Ma classe, questa non è una classe in un oggetto Java tipo di strada orientata. 1048 00:46:15,880 --> 00:46:17,220 E 'solo una classe di studenti. 1049 00:46:17,220 --> 00:46:20,590 E il tipo di dati di ogni elemento in tale matrice è studente. 1050 00:46:20,590 --> 00:46:23,040 Quindi questo è un po 'diverso e dal dire qualcosa 1051 00:46:23,040 --> 00:46:25,250 come questo, è solo - 1052 00:46:25,250 --> 00:46:29,500 Sto dicendo dammi tre studenti e chiamare quella classe array. 1053 00:46:29,500 --> 00:46:29,800 >> D'accordo. 1054 00:46:29,800 --> 00:46:30,680 Ora qui è un quattro loop. 1055 00:46:30,680 --> 00:46:33,480 Familiare di questo ragazzo - iterate da zero su un massimo di tre. 1056 00:46:33,480 --> 00:46:35,160 Ed ecco il nuovo pezzo di sintassi. 1057 00:46:35,160 --> 00:46:37,710 Il programma sta per spingere me, l'umano, per dare uno studente 1058 00:46:37,710 --> 00:46:39,200 ID, che è un int. 1059 00:46:39,200 --> 00:46:44,650 Ed ecco la sintassi con cui è possibile memorizzare qualcosa nel campo ID di 1060 00:46:44,650 --> 00:46:48,630 classe posizione staffa I. Quindi questa sintassi non è nuova. 1061 00:46:48,630 --> 00:46:51,450 Questo significa che appena mi danno l'ottava studente della classe. 1062 00:46:51,450 --> 00:46:52,940 Ma questo simbolo è nuovo. 1063 00:46:52,940 --> 00:46:56,320 Fino ad ora, abbiamo non può usato dot, almeno in codice come questo. 1064 00:46:56,320 --> 00:47:01,490 Questo significa andare alla struttura nota come uno studente e mettere qualcosa lì. 1065 00:47:01,490 --> 00:47:05,670 Analogamente, in questa prossima riga, 31, vada avanti e mettere tutto ciò che l'utente digita 1066 00:47:05,670 --> 00:47:10,530 per un nome qui e quello che fanno per un casa, la stessa cosa, andare avanti e 1067 00:47:10,530 --> 00:47:13,230 metterlo in. casa. 1068 00:47:13,230 --> 00:47:15,955 >> Così che cosa fa questo programma in ultima analisi, che fare? 1069 00:47:15,955 --> 00:47:17,220 Si può vedere un piccolo teaser lì. 1070 00:47:17,220 --> 00:47:24,780 Lasciami andare avanti e ne faccio struct 0 dot barra struct 0, ID dello studente 1, 1071 00:47:24,780 --> 00:47:28,250 dire David Mather, studente ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, studente ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 e l'unica cosa che questo programma ha fatto, che è proprio del tutto arbitraria, è 1075 00:47:38,380 --> 00:47:40,980 Volevo fare qualcosa con questi dati, ora che mi ci hai insegnato a 1076 00:47:40,980 --> 00:47:43,450 utilizzare le strutture, è che ho appena avuto questo ciclo in più qui. 1077 00:47:43,450 --> 00:47:45,260 Ho scorrere gli array di studenti. 1078 00:47:45,260 --> 00:47:49,170 Ho usato il nostro, amico forse ormai familiare, stringa di confronto, stircomp a 1079 00:47:49,170 --> 00:47:53,780 controllo è la casa di ottava studente pari a Mather? 1080 00:47:53,780 --> 00:47:56,760 E se è così, basta stampare qualcosa arbitrariamente come, sì, lo è. 1081 00:47:56,760 --> 00:47:59,430 Ma ancora una volta, solo dandomi opportunità di utilizzare e riutilizzare e 1082 00:47:59,430 --> 00:48:02,270 riutilizzare questa nuova notazione del punto. 1083 00:48:02,270 --> 00:48:03,250 >> Quindi chi se ne frega, giusto? 1084 00:48:03,250 --> 00:48:06,270 Venendo con un programma di studente è alquanto arbitraria, ma si scopre 1085 00:48:06,270 --> 00:48:09,800 che siamo in grado di fare cose utili con questo, ad esempio come segue. 1086 00:48:09,800 --> 00:48:14,600 Si tratta di una struttura molto più complicata in C. E 'ottenuto una dozzina o più campi, 1087 00:48:14,600 --> 00:48:15,880 un po 'criptico nome. 1088 00:48:15,880 --> 00:48:20,110 Ma se hai mai sentito parlare di una grafica formato di file chiamato bitmap, BMP, esso 1089 00:48:20,110 --> 00:48:22,830 scopre che il formato di file bitmap praticamente sembra che questo. 1090 00:48:22,830 --> 00:48:24,200 E 'un po' stupida faccina sorridente. 1091 00:48:24,200 --> 00:48:27,840 E 'una piccola immagine che ho zoomato su abbastanza grande in modo che ho potuto vedere ogni 1092 00:48:27,840 --> 00:48:30,410 dei singoli punti o pixel. 1093 00:48:30,410 --> 00:48:33,800 Ora, a quanto pare siamo in grado di rappresentare un punto nero con, ad esempio, il numero 0. 1094 00:48:33,800 --> 00:48:35,520 E un punto bianco con il numero 1. 1095 00:48:35,520 --> 00:48:39,140 >> Quindi, in altre parole, se si vuole disegnare un Faccina sorridente e salvare l'immagine in un 1096 00:48:39,140 --> 00:48:42,680 calcolatore, è sufficiente memorizzare zeri e quelli che sembrano come questo, dove, 1097 00:48:42,680 --> 00:48:45,250 ancora una volta, quelli sono di colore bianco e zeri sono neri. 1098 00:48:45,250 --> 00:48:48,290 E insieme, se effettivamente avete un cingersi di uni e zeri, si ha un 1099 00:48:48,290 --> 00:48:51,030 griglia di pixel, e se si stabiliscono fuori, si ha un simpatico 1100 00:48:51,030 --> 00:48:52,560 piccola faccina sorridente. 1101 00:48:52,560 --> 00:48:58,150 Ora, formato di file bitmap, BMP, è efficacemente che sotto il cofano, 1102 00:48:58,150 --> 00:49:00,970 ma con più pixel sot che si può effettivamente rappresentare i colori. 1103 00:49:00,970 --> 00:49:05,170 >> Ma quando si hanno più sofisticato formati di file come BMP e JPEG e GIF 1104 00:49:05,170 --> 00:49:09,360 con la quale si potrebbe avere familiarità, quelli file su disco in genere non solo 1105 00:49:09,360 --> 00:49:13,760 avere zero e uno per i pixel, ma hanno alcuni metadati, come pure - 1106 00:49:13,760 --> 00:49:16,960 meta nel senso che non è realmente dati ma è utile avere. 1107 00:49:16,960 --> 00:49:21,370 Quindi questi campi qui sono implicando, e vedremo più in dettaglio in P-set 1108 00:49:21,370 --> 00:49:25,810 5, che prima gli zeri e quelli che rappresentare i pixel in un'immagine, 1109 00:49:25,810 --> 00:49:29,110 c'è un mucchio di metadati come la dimensione dell'immagine e la 1110 00:49:29,110 --> 00:49:30,250 larghezza dell'immagine. 1111 00:49:30,250 --> 00:49:32,910 E accorgo che sto strappando via un po 'di cose arbitrarie qui - 1112 00:49:32,910 --> 00:49:34,260 larghezza e altezza. 1113 00:49:34,260 --> 00:49:36,160 Numero di bit e alcune altre cose. 1114 00:49:36,160 --> 00:49:37,840 Quindi c'è un po 'di metadati in un file. 1115 00:49:37,840 --> 00:49:41,470 >> Ma per capire come i file sono disposti in questo modo, si può effettivamente 1116 00:49:41,470 --> 00:49:45,890 poi manipolare le immagini, recuperare le immagini dal disco, ridimensionare le immagini. 1117 00:49:45,890 --> 00:49:47,560 Ma non si può necessariamente migliorare la loro. 1118 00:49:47,560 --> 00:49:48,480 Avevo bisogno di una fotografia. 1119 00:49:48,480 --> 00:49:52,840 Così sono tornato a RJ qui, che hai visto sullo schermo un po 'di tempo fa. 1120 00:49:52,840 --> 00:49:57,160 E se apro Keynote qui, questo è cosa succede se si tenta di ingrandire e 1121 00:49:57,160 --> 00:49:59,380 migliorare RJ. 1122 00:49:59,380 --> 00:50:01,480 Lui non sta facendo di meglio davvero. 1123 00:50:01,480 --> 00:50:06,240 Ora Keynote è una specie di sfocatura è un po ', solo a sorvolare l' 1124 00:50:06,240 --> 00:50:11,040 fatto che RJ non ottiene particolarmente maggiore quando si esegue lo zoom dentro 1125 00:50:11,040 --> 00:50:13,310 E se farlo in questo modo, vedere le piazze? 1126 00:50:13,310 --> 00:50:15,490 Sì, si può sicuramente vedere le piazze su un proiettore. 1127 00:50:15,490 --> 00:50:17,690 >> Questo è quello che si ottiene quando a migliorare. 1128 00:50:17,690 --> 00:50:22,570 Ma per capire come il nostro RJ o la Faccina sorridente è implementato ci lascerà 1129 00:50:22,570 --> 00:50:24,950 effettivamente scrivere codice che manipola queste cose. 1130 00:50:24,950 --> 00:50:29,970 E ho pensato di finire in questa nota, con 55 secondi di un esaltano questo è, 1131 00:50:29,970 --> 00:50:31,230 Oso, diciamo piuttosto fuorviante. 1132 00:50:31,230 --> 00:50:32,990 >> [RIPRODUZIONE VIDEO] 1133 00:50:32,990 --> 00:50:34,790 >> -Sta mentendo. 1134 00:50:34,790 --> 00:50:38,310 Su che cosa, non lo so. 1135 00:50:38,310 --> 00:50:41,200 >> -Allora, cosa sappiamo? 1136 00:50:41,200 --> 00:50:45,280 >> -Che a 9:15 Ray Santoya era al bancomat. 1137 00:50:45,280 --> 00:50:47,830 >> -Quindi la domanda è che cosa ci faceva alle 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Ripresa la nove millimetri a qualcosa. 1139 00:50:50,750 --> 00:50:52,615 Forse ha visto il cecchino. 1140 00:50:52,615 --> 00:50:54,760 >> -O è stato lavorare con lui. 1141 00:50:54,760 --> 00:50:56,120 >> -Aspetta. 1142 00:50:56,120 --> 00:50:57,450 Torna indietro di una. 1143 00:50:57,450 --> 00:50:58,700 >> -Che cosa vedi? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Portare la faccia in su, a schermo intero. 1146 00:51:09,490 --> 00:51:09,790 >> -I suoi occhiali. 1147 00:51:09,790 --> 00:51:11,040 >> -C'è una riflessione. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Questa è la squadra di baseball Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Questo è il loro logo. 1151 00:51:24,530 --> 00:51:27,040 >> -E sta parlando con chiunque sia indossare quella giacca. 1152 00:51:27,040 --> 00:51:27,530 >> [FINE RIPRODUZIONE VIDEO] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. MALAN: Questo sarà essere impostato Problema 5. 1154 00:51:29,180 --> 00:51:30,720 Ci vediamo la settimana prossima. 1155 00:51:30,720 --> 00:51:32,330 >> SPEAKER MALE: Al prossimo CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Grilli] 1157 00:51:39,240 --> 00:51:41,270 >> [MUSIC PLAYING]