1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Săptămâna 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Universitatea Harvard] 3 00:00:04,860 --> 00:00:07,260 [Acest lucru este CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Acest lucru este CS50, Săptămâna 5. 5 00:00:09,740 --> 00:00:12,900 Astăzi și în această săptămână, vom introduce un pic de lumea de criminalistica 6 00:00:12,900 --> 00:00:14,850 în contextul problemei Set 4. 7 00:00:14,850 --> 00:00:18,480 Astazi va fi o prelegere prescurtată, deoarece exista un eveniment special aici după aceea. 8 00:00:18,480 --> 00:00:21,940 Deci, vom lua o privire si tachineze atât studenților, cât și părinților deopotrivă azi 9 00:00:21,940 --> 00:00:24,600 cu unele din lucrurile care sunt pe orizont. 10 00:00:24,600 --> 00:00:29,050 >> Printre ei, începând de luni, va avea o colegii ceva mai multe. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard si MIT noua inițiativă de on-line pentru OpenCourseWare și mai mult, 12 00:00:32,980 --> 00:00:36,730 se lanseaza pe campusul Harvard pe luni, ceea ce înseamnă vin luni 13 00:00:36,730 --> 00:00:40,930 va avea, ca de ultima numaratoare, 86000 colegii suplimentare 14 00:00:40,930 --> 00:00:43,680 care vor urma, împreună cu prelegeri CS50 și secțiuni 15 00:00:43,680 --> 00:00:45,890 și walkthroughs și seturi de probleme. 16 00:00:45,890 --> 00:00:51,870 Și ca parte a acest lucru, vor deveni membri ai clasei inaugurala a CS50, iar acum CS50x. 17 00:00:51,870 --> 00:00:56,150 Ca parte a acestui acum, dau seama că vor exista unele upsides, de asemenea. 18 00:00:56,150 --> 00:01:00,620 Pentru a obține gata pentru asta, pentru numărul masiv de studenți, 19 00:01:00,620 --> 00:01:03,820 este suficient să spunem că, deși avem 108 TFS și CAS, 20 00:01:03,820 --> 00:01:07,560 nu e destul de bun elev-profesor raportului odată ce ne-am lovit 80.000 dintre elevi. 21 00:01:07,560 --> 00:01:09,830 Noi nu vom fi triat problemă atât de multe seturi manual, 22 00:01:09,830 --> 00:01:13,050 astfel introdus în această săptămână în setul problema va fi CS50 Cec, 23 00:01:13,050 --> 00:01:15,410 care va fi un utilitar de linie de comandă în cadrul aparatului 24 00:01:15,410 --> 00:01:17,880 că veți obține odată ce ați fi actualizat în cursul acestui week-end. 25 00:01:17,880 --> 00:01:21,030 Veți fi capabil de a rula o comandă, check50, pe PSET ta, 26 00:01:21,030 --> 00:01:24,770 și veți primi feedback imediat cu privire la faptul program este corectă sau incorectă 27 00:01:24,770 --> 00:01:27,980 în conformitate cu caietul de sarcini diferite de design care le-am furnizat. 28 00:01:27,980 --> 00:01:30,310 Mai mult pe faptul că în caietul de sarcini set de probleme. 29 00:01:30,310 --> 00:01:34,220 Cele colegii CS50x vor folosi aceasta, de asemenea. 30 00:01:34,220 --> 00:01:36,170 >> Set problema 4 este totul despre criminalistica, 31 00:01:36,170 --> 00:01:38,630 și acest lucru a fost foarte inspirat PSET de unele lucruri in viata reala 32 00:01:38,630 --> 00:01:41,210 care atunci când am fost în facultate, am internat pentru o vreme 33 00:01:41,210 --> 00:01:45,270 cu biroul lui Middlesex County District Attorney de a face locul de muncă medico-legale 34 00:01:45,270 --> 00:01:47,660 cu lor investigator medico-legale de plumb. 35 00:01:47,660 --> 00:01:50,280 Ceea ce acest constituit, așa cum cred că am menționat câteva săptămâni trecut, 36 00:01:50,280 --> 00:01:52,720 este poliția în masă de stat sau de alte persoane ar putea veni în, 37 00:01:52,720 --> 00:01:56,150 le-ar drop off lucruri, cum ar fi hard disk-uri și CD-uri și dischete și cum ar fi, 38 00:01:56,150 --> 00:01:58,770 și apoi obiectivul de birou criminalistica a fost de a stabili 39 00:01:58,770 --> 00:02:01,470 dacă a existat sau nu a fost o dovadă de un anumit fel. 40 00:02:01,470 --> 00:02:04,730 Acest lucru a fost de Investigații Speciale Unitatea, asa ca a fost alb-guler a criminalității. 41 00:02:04,730 --> 00:02:10,949 A fost un fel mult mai ingrijoratoare de crime, ceva care implică un fel de mass-media digitale. 42 00:02:10,949 --> 00:02:16,450 Se pare că nu, că multe persoane a scrie un e-mail spunând: "Am făcut-o." 43 00:02:16,450 --> 00:02:20,490 Deci destul de des, aceste căutări medico-legale nu sa prezentat tot ceea ce mult rod, 44 00:02:20,490 --> 00:02:22,820 dar, uneori, oamenii ar scrie e-mailuri astfel. 45 00:02:22,820 --> 00:02:25,240 Asa ca, uneori, eforturile au fost răsplătite. 46 00:02:25,240 --> 00:02:31,210 >> Dar, pentru a duce până la această PSET medico-legale, vom fi introducerea în pset4 un pic de grafică. 47 00:02:31,210 --> 00:02:35,410 Luați, probabil, aceste lucruri de la sine - JPEG, GIF, și cum ar fi - în aceste zile. 48 00:02:35,410 --> 00:02:38,320 Dar, dacă într-adevăr crezi despre asta, o imagine, la fel ca fata lui Rob, 49 00:02:38,320 --> 00:02:41,270 ar putea fi modelată ca o succesiune de puncte sau pixeli. 50 00:02:41,270 --> 00:02:43,380 În cazul de fata lui Rob, există tot felul de culori, 51 00:02:43,380 --> 00:02:46,760 și am început să vedem de puncte individuale, altfel cunoscut sub numele de pixeli, 52 00:02:46,760 --> 00:02:48,610 odată ce am început pentru a mări inch 53 00:02:48,610 --> 00:02:54,660 Dar dacă ne simplifica lumea un pic și spun doar că acest lucru aici este Rob în alb și negru, 54 00:02:54,660 --> 00:02:57,490 pentru a reprezenta alb-negru, putem folosi doar binar. 55 00:02:57,490 --> 00:03:01,660 Și dacă vom folosi binar, 1 sau 0, putem exprima această imagine același 56 00:03:01,660 --> 00:03:06,140 din față zâmbitoare lui Rob cu acest model de biți. 57 00:03:06,140 --> 00:03:12,100 11000011 reprezintă alb, alb, negru, negru, negru, negru, alb, alb. 58 00:03:12,100 --> 00:03:16,150 Și așa nu e un salt imens, apoi să începem să discutăm despre fotografii pline de culoare, 59 00:03:16,150 --> 00:03:18,600 lucruri pe care le-ați vedea pe Facebook sau de a lua cu un aparat de fotografiat digital. 60 00:03:18,600 --> 00:03:21,410 Dar cu siguranță atunci când vine vorba de culori, ai nevoie de mai mulți biți. 61 00:03:21,410 --> 00:03:25,690 Și destul de comună în lumea de fotografii este de a utiliza, nu 1-bit color, 62 00:03:25,690 --> 00:03:29,560 deoarece acest lucru sugerează, dar 24-bit color, în cazul în care veți obține de fapt, milioane de culori. 63 00:03:29,560 --> 00:03:32,250 Deci, ca în cazul în care am mărită pe ochi lui Rob, 64 00:03:32,250 --> 00:03:36,370 că a fost orice număr de milioane de posibilități diferite colorate. 65 00:03:36,370 --> 00:03:39,040 Deci vom introduce acest set de probleme, în 4, precum și în walkthrough, 66 00:03:39,040 --> 00:03:43,370 care va avea loc azi la ora 3:30 în loc de 2:30 de obicei, din cauza curs de vineri aici. 67 00:03:43,370 --> 00:03:46,620 Dar video va fi online, ca de obicei mâine. 68 00:03:46,620 --> 00:03:48,820 >> Vom introduce, de asemenea, vă într-un alt format de fișier. 69 00:03:48,820 --> 00:03:51,270 Acest lucru este în mod deliberat menit să se uite intimidant la început, 70 00:03:51,270 --> 00:03:55,670 dar aceasta este doar o documentație pentru o struct C. 71 00:03:55,670 --> 00:03:58,940 Se pare că de ani în urmă Microsoft a ajutat la popularizarea acest format 72 00:03:58,940 --> 00:04:05,150 numit formatul de fișier bitmap, bmp, iar acest lucru a fost un super format simplu, colorat fișier grafic 73 00:04:05,150 --> 00:04:10,150 care a fost folosit de ceva timp și, uneori, încă de wallpapere pe desktop. 74 00:04:10,150 --> 00:04:14,760 Dacă credeți că inapoi la Windows XP și dealurile și cerul albastru, 75 00:04:14,760 --> 00:04:17,170 care a fost de obicei o imagine BMP sau bitmap. 76 00:04:17,170 --> 00:04:19,959 Bitmap sunt distractive pentru noi, deoarece acestea au complexitate un pic mai mult. 77 00:04:19,959 --> 00:04:22,610 Nu e chiar așa de simplu ca această grilă de 0s și 1s. 78 00:04:22,610 --> 00:04:27,510 În schimb, aveți lucruri, cum ar fi un antet la începutul unui fișier. 79 00:04:27,510 --> 00:04:31,990 Deci, cu alte cuvinte, în interiorul unui fișier. BMP este o grămadă de 0s și 1s, 80 00:04:31,990 --> 00:04:34,910 dar există unele 0s suplimentare și 1s acolo. 81 00:04:34,910 --> 00:04:38,220 Și se pare că ceea ce am, probabil, luat de la sine de ani de zile - 82 00:04:38,220 --> 00:04:45,170 formate de fișiere, cum ar fi doc sau.. xls sau MP3,. mp4,. indiferent de formate de fișier 83 00:04:45,170 --> 00:04:48,480 că sunteți familiarizați cu - ceea ce înseamnă chiar și pentru a fi un format de fișier, 84 00:04:48,480 --> 00:04:52,480 pentru că la sfârșitul zilei, toate aceste dosare putem folosi avem doar 0s și 1s. 85 00:04:52,480 --> 00:04:56,810 Și poate cei 0s și 1s reprezintă ABC prin ASCII sau similare, 86 00:04:56,810 --> 00:04:58,820 dar la sfarsitul zilei, este încă doar 0s și 1s. 87 00:04:58,820 --> 00:05:02,100 Deci, oamenii pur și simplu să decidă ocazional pentru a inventa un nou format de fișier 88 00:05:02,100 --> 00:05:06,420 în cazul în care acestea standardiza ce modele de biți va însemna, de fapt. 89 00:05:06,420 --> 00:05:09,220 Și în acest caz aici, oameni buni care a proiectat formatul de fișier de tip bitmap 90 00:05:09,220 --> 00:05:15,620 a declarat că, la prima octet într-un fișier bitmap, cum noteaza cu 0 compensare acolo, 91 00:05:15,620 --> 00:05:18,940 acolo va fi un nume criptic bfType variabilă numită, 92 00:05:18,940 --> 00:05:23,080 care tocmai vine de tip de fișier bitmap, ce tip de fișier bitmap este aceasta. 93 00:05:23,080 --> 00:05:27,700 Puteți deduce, probabil, din al doilea rând că diferența 2, numărul de octet 2, 94 00:05:27,700 --> 00:05:33,740 are un model de 0s și 1s care reprezintă ceea ce? Dimensiunea de ceva. 95 00:05:33,740 --> 00:05:35,310 Și merge mai departe de acolo. 96 00:05:35,310 --> 00:05:37,410 Deci, în set de probleme 4, veți fi umblat prin unele dintre aceste lucruri. 97 00:05:37,410 --> 00:05:39,520 Noi nu se va termina pese de toate acestea. 98 00:05:39,520 --> 00:05:47,510 Dar observați că începe să se interesant în jurul valorii de 54 byte: rgbtBlue, verde și roșu. 99 00:05:47,510 --> 00:05:52,110 Dacă ați auzit vreodată acronimul RGB - rosu, verde, albastru - aceasta este o referire la faptul că 100 00:05:52,110 --> 00:05:54,610 deoarece se pare că vă puteți picta toate culorile curcubeului 101 00:05:54,610 --> 00:05:58,180 cu o combinatie de rosu si albastru si verde. 102 00:05:58,180 --> 00:06:03,320 Și, de fapt, părinții din sală s-ar putea aminti unele dintre cele mai vechi proiectoare. 103 00:06:03,320 --> 00:06:05,890 Aceste zile, veți vedea doar o lumină strălucitoare care vine dintr-un obiectiv, 104 00:06:05,890 --> 00:06:09,800 dar înapoi în ziua în care ați avut lentila roșie, lentile albastre, iar lentila verde, 105 00:06:09,800 --> 00:06:13,380 și împreună au ca scop un ecran și a format o imagine colorată. 106 00:06:13,380 --> 00:06:16,270 Și destul de des, școli medii și licee ar avea aceste lentile 107 00:06:16,270 --> 00:06:19,720 vreodată atât de ușor Askew, asa ca au fost un fel de a vedea imagini duble sau triple. 108 00:06:19,720 --> 00:06:24,100 Dar asta a fost ideea. Ai avut lumină roșie și verde și albastru pictura o imagine. 109 00:06:24,100 --> 00:06:26,590 Și că același principiu este folosit în calculatoare. 110 00:06:26,590 --> 00:06:30,230 >> Deci, printre provocările atunci pentru tine, în problema Set 4 sunt mergi la a fi câteva lucruri. 111 00:06:30,230 --> 00:06:34,800 Una este de a redimensiona o imagine, de fapt, să ia într-un model de 0s și 1s, 112 00:06:34,800 --> 00:06:40,200 dau seama care bucăți de 0s și 1s reprezintă ceea ce într-o structură de acest fel, 113 00:06:40,200 --> 00:06:43,630 și dau apoi cum să reproducă pixeli - cele roșii, de blues, Grupul Verzilor - 114 00:06:43,630 --> 00:06:46,660 în interiorul, astfel că, atunci când o imagine arata ca acest lucru inițial, 115 00:06:46,660 --> 00:06:49,210 s-ar putea arata ca acest loc după aceea. 116 00:06:49,210 --> 00:06:53,640 Printre alte provocări prea va fi ca vei fi pronunțată o imagine medico-legale 117 00:06:53,640 --> 00:06:56,030 a unui fișier real de la un aparat de fotografiat digital. 118 00:06:56,030 --> 00:06:58,960 Și cu privire la acest aparat de fotografiat, o dată la un moment dat, erau o grămadă de fotografii. 119 00:06:58,960 --> 00:07:03,760 Problema este că accidental șterse sau au avut imaginea corupt cumva. 120 00:07:03,760 --> 00:07:05,750 Se întâmplă lucruri rele cu camere digitale. 121 00:07:05,750 --> 00:07:09,150 Și așa am copiat rapid toate off 0s și 1s de acel card pentru tine, 122 00:07:09,150 --> 00:07:13,610 salvat-le pe toate într-un singur fișier mare, iar apoi le vom preda la tine în Problemă Set 4 123 00:07:13,610 --> 00:07:19,320 astfel încât să puteți scrie un program în C, cu care să recupereze toate aceste JPEG-urile, în mod ideal. 124 00:07:19,320 --> 00:07:23,330 Și se pare că JPEG, chiar dacă ele sunt un fel de format de fișier complexă - 125 00:07:23,330 --> 00:07:26,360 ei sunt mult mai complexe decât acest chip zâmbitor aici - 126 00:07:26,360 --> 00:07:31,160 se dovedește că fiecare JPEG începe cu aceleași modele de 0s și 1s. 127 00:07:31,160 --> 00:07:35,630 Deci, folosind, în cele din urmă, o buclă în timp ce pentru o buclă sau sau similare, 128 00:07:35,630 --> 00:07:38,880 puteți itera peste tot 0s și 1s în această imagine medico-legale, 129 00:07:38,880 --> 00:07:43,150 și de fiecare dată când vezi modelul specială care este definită în caietul de sarcini set de probleme, 130 00:07:43,150 --> 00:07:47,880 puteți presupune aici este, cu o probabilitate foarte mare, începutul unei JPEG. 131 00:07:47,880 --> 00:07:51,230 Și, de îndată ce veți găsi același model un numar de bytes 132 00:07:51,230 --> 00:07:55,430 sau kilobytes sau megaocteți mai târziu, puteți presupune aici este un al doilea JPEG, 133 00:07:55,430 --> 00:07:57,380 fotografie am luat dupa prima. 134 00:07:57,380 --> 00:08:01,370 Permiteți-mi să vă opriți din citit ca primul dosar, începe să scrie acest nou unul, 135 00:08:01,370 --> 00:08:06,310 și de ieșire a programului tau pentru pset4 va fi la fel de multe ca 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 Și dacă nu e 50 JPEG, aveti un pic de o buclă. 137 00:08:09,270 --> 00:08:12,490 Dacă aveți un număr infinit de imagini JPEG, aveți o buclă infinită. 138 00:08:12,490 --> 00:08:14,910 Așa că prea va fi destul de un caz comun. 139 00:08:14,910 --> 00:08:16,600 Deci, asta e ceea ce e la orizont. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 în spatele nostru, pe seama mea de e-mail care în mod invariabil există oameni care sunt atât fericiți, 141 00:08:21,310 --> 00:08:23,640 un fel de neutru, și trist în jurul valorii de 0 Timp Quiz. 142 00:08:23,640 --> 00:08:26,800 Și vă rugăm să nu ajungă la mine, capul TF Zamyla, TF ta, 143 00:08:26,800 --> 00:08:31,180 sau unul dintre AC pe care știi, dacă doriți, pentru a discuta modul în care au decurs lucrurile. 144 00:08:31,180 --> 00:08:35,539 >> Deci, pentru a impresiona părinții aici, în sală, ceea ce este biblioteca CS50? 145 00:08:36,429 --> 00:08:40,390 [Râsete] Bine de locuri de muncă. 146 00:08:40,390 --> 00:08:48,340 Care e biblioteca CS50? Da. >> [Elev] E un set de pre-scris de cod [neauzit] 147 00:08:48,340 --> 00:08:49,750 Bine, bine. 148 00:08:49,750 --> 00:08:53,240 Este un set de pre-scris de cod pe care am scris personal, care vi le oferim, 149 00:08:53,240 --> 00:08:55,030 care oferă unele funcționalități comune, 150 00:08:55,030 --> 00:08:59,020 chestii ca adu-mi un șir de caractere, adu-mi un int - toate funcțiile care sunt listate aici. 151 00:08:59,020 --> 00:09:02,260 >> Începând de acum, vom începe să ia într-adevăr aceste roți de formare oprit. 152 00:09:02,260 --> 00:09:05,050 Vom începe să ia un șir de la tine, 153 00:09:05,050 --> 00:09:08,870 care amintesc a fost doar un sinonim pentru ceea ce efectiv tip de date? [Mai multe >> studenții] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Pentru părinți, că a fost, probabil, [face un sunet whooshing]. Asta e bine. 155 00:09:12,730 --> 00:09:17,550 * Char vom începe pentru a vedea pe ecran toate mai mult cu cât vom elimina string din vocabularul nostru, 156 00:09:17,550 --> 00:09:19,730 cel puțin atunci când vine vorba de a scrie, de fapt cod. 157 00:09:19,730 --> 00:09:22,840 În mod similar, ne vom opri folosind unele dintre aceste funcții la fel de mult 158 00:09:22,840 --> 00:09:25,280 deoarece programele noastre sunt mergi la a lua mai sofisticate. 159 00:09:25,280 --> 00:09:28,480 , Mai degrabă decât să scrieți programe care stau acolo cu o clipește prompt, 160 00:09:28,480 --> 00:09:31,870 de așteptare pentru utilizator să tastați ceva, veți primi intrări dvs. de altă parte. 161 00:09:31,870 --> 00:09:35,490 De exemplu, veți le obține dintr-o serie de biți de pe hard disc. 162 00:09:35,490 --> 00:09:38,580 Vei primi în schimb ei în viitor de la o conexiune de rețea, 163 00:09:38,580 --> 00:09:40,230 unele site-ul undeva. 164 00:09:40,230 --> 00:09:44,110 >> Așa că haideți să coaja înapoi acest strat pentru prima dată și trageți în sus Aparatura CS50 165 00:09:44,110 --> 00:09:49,010 și acest fișier numit cs50.h, care ai fost #, inclusiv de săptămâni, 166 00:09:49,010 --> 00:09:51,140 dar hai sa vedem de fapt ce e înăuntru de acest lucru. 167 00:09:51,140 --> 00:09:54,430 În partea de sus a fișierului în albastru este doar o grămadă de comentarii: 168 00:09:54,430 --> 00:09:57,050 informații privind garanția și licențiere. 169 00:09:57,050 --> 00:09:59,050 Aceasta este un fel de paradigmă comune în software-ul 170 00:09:59,050 --> 00:10:01,580 pentru că o mulțime de software in aceste zile este ceea ce se numeste open source, 171 00:10:01,580 --> 00:10:05,220 ceea ce înseamnă că cineva a scris codul și a făcut-o în mod liber la dispoziție 172 00:10:05,220 --> 00:10:10,470 nu doar pentru a rula și de a folosi, dar pentru a citi de fapt și modifice și să se integreze în munca ta. 173 00:10:10,470 --> 00:10:14,660 Deci, asta e ceea ce ai folosit, software-ul open source, deși într-o formă foarte mic. 174 00:10:14,660 --> 00:10:18,560 Dacă aș defilați în jos trecut de comentariile, însă, vom începe pentru a vedea unele lucruri mult mai familiare. 175 00:10:18,560 --> 00:10:25,010 Comunicarea din partea de sus aici, că dosarul cs50.h include o grămadă de fișiere antet. 176 00:10:25,010 --> 00:10:28,560 Cele mai multe dintre acestea, nu am văzut până acum, dar unul este familiar. 177 00:10:28,560 --> 00:10:32,270 Care dintre acestea am văzut, chiar dacă pentru scurt timp, până în prezent? >> [Elev] biblioteca Standard. 178 00:10:32,270 --> 00:10:35,810 Da, biblioteca standard. stdlib.h are malloc. 179 00:10:35,810 --> 00:10:38,320 Odată ce am început să vorbim despre alocarea dinamică a memoriei, 180 00:10:38,320 --> 00:10:41,650 care ne vom întoarce la săptămâna viitoare, precum și, am început inclusiv acel fișier. 181 00:10:41,650 --> 00:10:46,640 Se pare că bool și adevărat și fals, nu există de fapt în sine C 182 00:10:46,640 --> 00:10:49,440 excepția cazului în care ați inclus acest fisier aici. 183 00:10:49,440 --> 00:10:52,710 Noi am fost de câteva săptămâni, inclusiv stdbool.h 184 00:10:52,710 --> 00:10:55,620 astfel încât să puteți utiliza noțiunea de. bool, adevărat sau fals 185 00:10:55,620 --> 00:10:58,620 Fără acest lucru, va trebui să-l sortați de fals și de a folosi un int 186 00:10:58,620 --> 00:11:02,610 și doar presupune că arbitrar 0 este falsă și 1 este adevărat. 187 00:11:02,610 --> 00:11:07,150 Dacă vom defila în jos în continuare, aici este definiția noastră a unui șir. 188 00:11:07,150 --> 00:11:11,390 Se pare că, așa cum am spus înainte, că în cazul în care aceasta este steaua nu contează cu adevărat. 189 00:11:11,390 --> 00:11:13,720 Puteți avea chiar tot în jurul valorii de spațiu. 190 00:11:13,720 --> 00:11:16,740 Am acest semestru au fost l promoveze ca acest lucru să se clarifice 191 00:11:16,740 --> 00:11:18,620 că steaua are de a face cu tipul, 192 00:11:18,620 --> 00:11:21,700 dar la fel de comună seama, daca nu putin mai comune, 193 00:11:21,700 --> 00:11:24,430 este de a pus-o acolo, dar funcțional e același lucru. 194 00:11:24,430 --> 00:11:27,720 Dar acum, dacă citim mai departe în jos, haideți să aruncăm o privire la GetInt 195 00:11:27,720 --> 00:11:32,190 deoarece am folosit ca, probabil, înainte de orice altceva în acest semestru. 196 00:11:32,190 --> 00:11:37,440 Aici este GetInt. Aceasta este ceea ce? >> [Elev] Un prototip. Aceasta >> este doar un prototip. 197 00:11:37,440 --> 00:11:41,410 De multe ori, ne-am pus prototipuri la topuri ale noastre. Fișiere c, 198 00:11:41,410 --> 00:11:46,690 dar puteți pune, de asemenea, prototipuri în fișiere antet, fișiere h., ca cel de aici 199 00:11:46,690 --> 00:11:50,840 astfel încât, atunci când scrie unele funcții pe care doriți alte persoane să poată utiliza, 200 00:11:50,840 --> 00:11:53,550 care este exact cazul cu biblioteca CS50, 201 00:11:53,550 --> 00:11:57,040 nu numai în aplicare funcțiile în ceva de genul cs50.c, 202 00:11:57,040 --> 00:12:02,790 ai pus, de asemenea, prototipurile nu la partea de sus a acelui fișier, dar la partea de sus a unui fișier antet. 203 00:12:02,790 --> 00:12:07,170 Apoi, acel fișier header este ceea ce prietenii și colegii includ 204 00:12:07,170 --> 00:12:09,760 cu # include în propriul lor cod. 205 00:12:09,760 --> 00:12:12,210 Deci, tot acest timp, ați fost, inclusiv toate aceste prototipuri, 206 00:12:12,210 --> 00:12:16,580 efectiv la partea de sus a fișierului, dar prin intermediul acestui mecanism # include, 207 00:12:16,580 --> 00:12:20,070 care, în esență, copii și paste acest fișier în propria voastră. 208 00:12:20,070 --> 00:12:23,070 Iată unele documente destul de detaliate. 209 00:12:23,070 --> 00:12:25,640 Ne-am luat destul de mult pentru a acordat ca GetInt devine un int, 210 00:12:25,640 --> 00:12:27,640 dar se pare că există unele cazuri de colt. 211 00:12:27,640 --> 00:12:31,810 Ce se întâmplă dacă utilizatorul tipuri într-un număr care este mult prea mare, o quintillion, 212 00:12:31,810 --> 00:12:35,490 că doar nu poate încăpea în interiorul unui int? Care este comportamentul așteptat? 213 00:12:35,490 --> 00:12:38,020 În mod ideal, e previzibil. 214 00:12:38,020 --> 00:12:40,280 Deci, în acest caz, dacă ai citit, de fapt amendă de imprimare, 215 00:12:40,280 --> 00:12:44,500 veți vedea de fapt că, dacă linia nu poate fi citit, acest INT_MAX întoarce. 216 00:12:44,500 --> 00:12:48,320 Nu ne-am vorbit despre asta, dar bazate pe capitalizarea ei, ceea ce este, probabil,? 217 00:12:48,320 --> 00:12:50,640 [Elev] O constantă. >> E o constantă. 218 00:12:50,640 --> 00:12:54,770 E o constantă de construcții care este, probabil, a declarat intr-unul din aceste fișiere header 219 00:12:54,770 --> 00:13:00,090 care-i treaba mare în dosar, și INT_MAX este, probabil, ceva de genul aproximativ 2 miliarde de euro, 220 00:13:00,090 --> 00:13:04,990 ideea fiind că, deoarece avem nevoie de pentru a semnifica faptul că într-un fel ceva nu a mers bine, 221 00:13:04,990 --> 00:13:10,700 ne, da, au numere de 4 miliarde la dispoziția noastră: -2 miliarde EUR, pe de până la 2 miliarde de euro, da sau de a lua. 222 00:13:10,700 --> 00:13:14,710 Ei bine, ceea ce este comun în programarea este furi doar unul dintre aceste numere, 223 00:13:14,710 --> 00:13:18,920 Poate 0, poate 2 miliarde de euro, poate -2000000000, 224 00:13:18,920 --> 00:13:23,280 astfel încât să petreci una dintre valorile posibile, astfel încât să vă puteți angaja în lume 225 00:13:23,280 --> 00:13:26,820 că, dacă ceva nu merge bine, voi reveni această valoare super-mare. 226 00:13:26,820 --> 00:13:31,030 Dar tu nu vrei ceva de utilizatorul tastarea criptic ca ... 234, un număr foarte mare. 227 00:13:31,030 --> 00:13:34,060 Ai generalizeze în schimb ca o constantă. 228 00:13:34,060 --> 00:13:38,060 Deci, într-adevăr, dacă au fost anal în ultimele săptămâni, în orice moment te-a sunat GetInt, 229 00:13:38,060 --> 00:13:42,900 ar fi trebuit sa verificat cu o condiție în cazul în care a făcut tipul de utilizator în INT_MAX, 230 00:13:42,900 --> 00:13:46,590 sau, mai precis, a făcut GetInt INT_MAX retur, deoarece în cazul în care a făcut-o, 231 00:13:46,590 --> 00:13:51,830 că înseamnă, de fapt nu l-au tastați. Ceva a mers greșit în acest caz. 232 00:13:51,830 --> 00:13:56,080 Deci, asta este ceea ce, în general, cunoscut sub numele de o valoare santinelă, ceea ce înseamnă doar speciale. 233 00:13:56,080 --> 00:13:58,120 >> Să acum transforma in fisierul. C.. 234 00:13:58,120 --> 00:14:01,340 Dosarul C a existat în aparatul de ceva timp. 235 00:14:01,340 --> 00:14:06,840 Și, de fapt, aparatul dispune de aceasta pre-compilat pentru tine în chestia aia l-am numit cod obiect, 236 00:14:06,840 --> 00:14:09,540 dar pur si simplu nu conteaza pentru tine în cazul în care aceasta se datorează faptului că sistemul știe 237 00:14:09,540 --> 00:14:11,730 în acest caz, în cazul în care aceasta este: aparatul. 238 00:14:11,730 --> 00:14:17,400 Să defilați în jos pentru a GetInt acum și a vedea cum GetInt a lucrat in tot acest timp. 239 00:14:17,400 --> 00:14:19,460 Aici avem comentarii similare din înainte. 240 00:14:19,460 --> 00:14:21,660 Lasă-mă să mări doar pe porțiunea codul. 241 00:14:21,660 --> 00:14:23,900 Și ceea ce avem pentru GetInt este următorul. 242 00:14:23,900 --> 00:14:25,700 Este nevoie de nici o introducere. 243 00:14:25,700 --> 00:14:29,510 Aceasta returnează un int, în timp ce (adevărat), așa că avem o buclă infinită în mod deliberat, 244 00:14:29,510 --> 00:14:33,180 dar probabil vom iesi din aceasta într-un fel sau să se întoarcă din cadrul acestei. 245 00:14:33,180 --> 00:14:34,870 >> Să vedem cum funcționează. 246 00:14:34,870 --> 00:14:39,240 Ne pare să fie utilizând getString în această primă linie în interiorul buclei, 166. 247 00:14:39,240 --> 00:14:43,780 Acest lucru este acum bună practică, deoarece în ce condiții ar putea reveni getString 248 00:14:43,780 --> 00:14:47,660 specială cheie NULL? >> [Elev] În cazul în care ceva nu merge bine. 249 00:14:47,660 --> 00:14:51,630 În cazul în care ceva nu merge bine. Și ce ar putea merge prost, atunci când apelați ceva de genul getString? 250 00:14:54,960 --> 00:14:57,640 Da. >> [Elev] malloc nu reușește să dea de Ints. 251 00:14:57,640 --> 00:14:59,150 Da. Poate malloc eșuează. 252 00:14:59,150 --> 00:15:03,190 Undeva sub capota, getString este de asteptare malloc, care alocă memorie, 253 00:15:03,190 --> 00:15:06,020 care permite magazin de calculatoare toate caracterele 254 00:15:06,020 --> 00:15:07,750 faptul că utilizatorul tastează în tastatură. 255 00:15:07,750 --> 00:15:11,590 Și să presupunem utilizatorul a avut o mulțime de timp liber și scris mai mult, de exemplu, 256 00:15:11,590 --> 00:15:16,160 peste 2 miliarde de caractere în, mai multe caractere decât calculatorul are chiar memorie RAM. 257 00:15:16,160 --> 00:15:19,250 GetString trebuie să fie în măsură pentru a semnifica asta pentru tine. 258 00:15:19,250 --> 00:15:22,560 Chiar dacă acesta este un caz super, super-colț mai puțin frecvente, 259 00:15:22,560 --> 00:15:24,340 trebuie să fie cumva capabil să se ocupe de acest lucru, 260 00:15:24,340 --> 00:15:28,750 și așa getString, dacă ne-am întors și citiți documentația sa, face în schimb NULL fapt. 261 00:15:28,750 --> 00:15:34,460 Deci, acum, dacă nu reușește, prin returnarea getString NULL, GetInt va eșua, prin returnarea INT_MAX 262 00:15:34,460 --> 00:15:37,690 doar ca o santinelă. Acestea sunt doar convenții umane. 263 00:15:37,690 --> 00:15:41,450 Singura cale ar trebui să știi asta e caz este prin citirea documentației. 264 00:15:41,450 --> 00:15:45,040 >> Să defilați în jos pentru a în cazul în care este, de fapt int ajuns. 265 00:15:45,040 --> 00:15:51,160 Dacă aș defilați în jos un pic mai departe, în linie 170, avem un comentariu de mai sus aceste linii. 266 00:15:51,160 --> 00:15:55,100 Ne pronunțăm într-un int 172, n, și un char, C, și apoi această nouă funcție, 267 00:15:55,100 --> 00:15:58,930 pe care unii dintre voi au dat peste înainte, sscanf. 268 00:15:58,930 --> 00:16:00,870 Acest lucru vine de la scanf șir. 269 00:16:00,870 --> 00:16:05,700 Cu alte cuvinte, da-mi un șir și o voi scana pentru piese de informații de interes. 270 00:16:05,700 --> 00:16:07,360 Ce înseamnă asta? 271 00:16:07,360 --> 00:16:11,800 Să presupunem că am tip în, literalmente, 123 la tastatură și apoi apăsați Enter. 272 00:16:11,800 --> 00:16:16,470 Care este tipul de date de 123 atunci când sa întors de getString? >> [Elev] String. 273 00:16:16,470 --> 00:16:18,380 Este, evident, un șir de caractere, nu? Am un șir de caractere. 274 00:16:18,380 --> 00:16:23,220 Deci, 123 este într-adevăr, citat-citatul, 123 cu 0 \, la sfârșitul anului acesta. 275 00:16:23,220 --> 00:16:27,110 Asta nu este un int. Asta nu e un număr. Se pare ca un număr, dar acesta nu este de fapt. 276 00:16:27,110 --> 00:16:29,080 Deci, ce are GetInt trebuie să fac? 277 00:16:29,080 --> 00:16:35,750 Ea are de a scana acel șir la stânga la dreapta - 123 \ 0 - si cumva converti la un întreg real. 278 00:16:35,750 --> 00:16:37,850 Ai putea da seama cum să facă acest lucru. 279 00:16:37,850 --> 00:16:41,450 Dacă credeți că inapoi la pset2, ai probabil ai un pic confortabil cu Cezar 280 00:16:41,450 --> 00:16:44,820 sau Vigenere, astfel încât să puteți repeta peste un șir de caractere, puteți converti caractere la Ints. 281 00:16:44,820 --> 00:16:46,710 Dar naiba, e o mulțime de muncă. 282 00:16:46,710 --> 00:16:49,860 De ce nu suna ca o funcție sscanf care face asta pentru tine? 283 00:16:49,860 --> 00:16:54,230 Deci, sscanf așteaptă un argument - în acest caz numit linie, care este un șir de caractere. 284 00:16:54,230 --> 00:17:01,840 Ai specificați apoi, în ghilimele, foarte similar cu printf, ceea ce vă așteptați să vedeți în acest șir. 285 00:17:01,840 --> 00:17:09,000 Și ce vreau să spun aici este că se așteaptă să vadă un număr zecimal și poate un caracter. 286 00:17:09,000 --> 00:17:12,000 Și vom vedea de ce acesta este cazul într-o clipă. 287 00:17:12,000 --> 00:17:15,869 Și se dovedește că această notație este acum amintește de lucruri am început să vorbim despre 288 00:17:15,869 --> 00:17:17,619 doar peste o săptămână în urmă. 289 00:17:17,619 --> 00:17:21,740 Ce este & N și C & faci pentru noi aici? >> [Elev] Adresa de n și adresa de c.. 290 00:17:21,740 --> 00:17:25,400 Da. Se dă-mi adresa lui n și adresa c.. De ce este așa de important? 291 00:17:25,400 --> 00:17:30,220 Știi că, cu funcții în C, puteți reveni întotdeauna o valoare sau nici o valoare, la toate. 292 00:17:30,220 --> 00:17:34,530 Puteți returna un int, un șir, un float, char o, indiferent, sau vă puteți întoarce nule, 293 00:17:34,530 --> 00:17:38,030 dar vă puteți întoarce doar un singur lucru maxim. 294 00:17:38,030 --> 00:17:42,760 Dar aici vrem să-mi întoarcă sscanf poate un int, un număr zecimal, 295 00:17:42,760 --> 00:17:46,220 și, de asemenea, o. char, și vă voi explica de ce char într-un moment 296 00:17:46,220 --> 00:17:51,460 Tu vrei eficient sscanf să se întoarcă două lucruri, dar asta nu e doar posibil, în C. 297 00:17:51,460 --> 00:17:55,200 Puteți lucra în jurul valorii de faptul că prin trecerea în două adrese 298 00:17:55,200 --> 00:17:57,370 deoarece de îndată ce vă dai o funcție două adrese, 299 00:17:57,370 --> 00:18:00,470 ce pot face această funcție cu ele? >> [Elev] Trimite un mesaj pentru aceste adrese. 300 00:18:00,470 --> 00:18:02,010 Se poate scrie la acele adrese. 301 00:18:02,010 --> 00:18:05,770 Aveți posibilitatea să utilizați operațiunea stele și du-te acolo, la fiecare dintre aceste adrese. 302 00:18:05,770 --> 00:18:11,260 E un fel de acest mecanism de back-door, dar foarte comun pentru modificarea valorilor variabilelor 303 00:18:11,260 --> 00:18:14,870 mai mult decât un singur loc - în acest caz, două. 304 00:18:14,870 --> 00:18:21,340 Acum observați Sunt de verificare pentru == 1 și apoi se întoarce n cazul în care nu, de fapt, evaluează la true. 305 00:18:21,340 --> 00:18:26,170 Deci, ce se întâmplă? Punct de vedere tehnic, tot ce doresc cu adevărat să se întâmple în GetInt este aceasta. 306 00:18:26,170 --> 00:18:30,740 Dorim să elimine, ca să spunem așa, ne-o dorim pentru a citi șir - citat-unquote 123 - 307 00:18:30,740 --> 00:18:34,560 și în cazul în care se pare ca exista un numar acolo, ceea ce ne spune sscanf pentru a face 308 00:18:34,560 --> 00:18:38,190 este pus acest număr - 123 - în această variabilă N pentru mine. 309 00:18:38,190 --> 00:18:42,090 Deci, de ce atunci am avea acest fapt, precum și? 310 00:18:42,090 --> 00:18:48,220 Care este rolul sscanf spui că s-ar putea obține, de asemenea un caracter aici? 311 00:18:48,220 --> 00:18:53,470 [Răspuns studentul nu pot fi auzite] >> Un punct zecimal, de fapt ar putea funcționa. 312 00:18:53,470 --> 00:18:56,330 Să susțin că gandit pentru un moment. Ce altceva? 313 00:18:56,330 --> 00:18:59,270 [Elev] Ar putea fi NULL. Bine >> gândire. Ar putea fi caracterul nul. 314 00:18:59,270 --> 00:19:01,660 Nu e de fapt în acest caz. Da. >> [Elev] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Sau lasă-mă să generalizăm și mai mult. 316 00:19:04,340 --> 00:19:06,640 C% este doar pentru verificarea erorilor. 317 00:19:06,640 --> 00:19:09,300 Noi nu vrem să existe un personaj după numărul, 318 00:19:09,300 --> 00:19:11,870 dar ce-mi permite să fac este următorul. 319 00:19:11,870 --> 00:19:18,210 Se pare că sscanf, pe lângă stocarea valorilor din n și c, în acest exemplu aici, 320 00:19:18,210 --> 00:19:24,890 ceea ce, de asemenea, nu este returnează numărul de variabile pus valorile inch 321 00:19:24,890 --> 00:19:30,260 Deci, dacă tastați doar în 123, atunci numai% d este de gând să se potrivească, 322 00:19:30,260 --> 00:19:33,880 și numai n este stocat, cu o valoare cum ar fi 123, 323 00:19:33,880 --> 00:19:35,640 și nimic nu se pune în c. 324 00:19:35,640 --> 00:19:37,620 C rămâne o valoare de gunoi, ca să spunem așa - 325 00:19:37,620 --> 00:19:40,730 gunoi, pentru că niciodată nu a fost inițializat la o anumită valoare. 326 00:19:40,730 --> 00:19:45,520 Deci, în acest caz, sscanf returnează 1 deoarece am populat 1 a acestor indicii, 327 00:19:45,520 --> 00:19:50,190 caz în care o mare, am o int, asa ca am elibera linia pentru a elibera memorie 328 00:19:50,190 --> 00:19:54,000 că de fapt getString alocate, și apoi mă întorc n, 329 00:19:54,000 --> 00:19:58,500 altceva dacă ați întrebat vreodată în cazul în care vine de la declarația Retry, vine chiar de aici. 330 00:19:58,500 --> 00:20:04,390 Deci, dacă, prin contrast, de tip I în 123foo - doar câteva ordine aleatoare a textului - 331 00:20:04,390 --> 00:20:08,490 sscanf se va vedea numărul, numărul, numărul, f, 332 00:20:08,490 --> 00:20:16,410 și se va pune în 123 n; se va pune f în c și apoi să se întoarcă 2. 333 00:20:16,410 --> 00:20:20,640 Deci avem, folosind doar definiția de bază a comportamentului lui sscanf, un mod foarte simplu - 334 00:20:20,640 --> 00:20:23,900 bine, complex la prima vedere, dar, la sfârșitul zilei mecanismului destul de simplu - 335 00:20:23,900 --> 00:20:28,320 de a spune este acolo un int și dacă da, este ca singurul lucru pe care-am găsit? 336 00:20:28,320 --> 00:20:29,860 Și spațiu aici este deliberată. 337 00:20:29,860 --> 00:20:34,000 Dacă ați citit documentația pentru sscanf, ea vă spune că, dacă includ o bucată de spații albe 338 00:20:34,000 --> 00:20:38,810 la începutul sau la sfârșitul, sscanf prea va permite utilizatorului, indiferent de motiv, 339 00:20:38,810 --> 00:20:41,860 pentru a lovi bara de spațiu și 123, care va fi legitim. 340 00:20:41,860 --> 00:20:44,150 Tu nu va țipa la utilizatorul doar pentru că au lovit bara de spațiu 341 00:20:44,150 --> 00:20:48,640 la începutul sau la sfârșitul, care este doar un pic mai user-friendly. 342 00:20:48,640 --> 00:20:52,300 >> Orice întrebări Apoi, pe GetInt? Da. >> [Elev] Ce se întâmplă dacă ai pus doar într-o char? 343 00:20:52,300 --> 00:20:54,030 Bună întrebare. 344 00:20:54,030 --> 00:20:59,890 Ce se întâmplă dacă ai tastat într-un char cum ar fi f, apăsați Enter fără a introduce vreodată 123? 345 00:20:59,890 --> 00:21:02,420 Ce părere aveți comportamentul această linie de cod ar fi atunci? 346 00:21:02,420 --> 00:21:04,730 [Răspuns studentul neauzit] 347 00:21:04,730 --> 00:21:08,790 Da, așa sscanf poate acoperi că prea, deoarece, în acest caz, nu este de gând să umple N sau C. 348 00:21:08,790 --> 00:21:15,310 O să se întoarcă în locul 0, caz în care mă prinde, de asemenea, faptul că scenariul 349 00:21:15,310 --> 00:21:18,750 deoarece valoarea anticipată vreau este 1. 350 00:21:18,750 --> 00:21:22,000 Vreau doar unul și numai un singur lucru să fie umplut. Bună întrebare. 351 00:21:22,000 --> 00:21:24,290 >> Altele? Bine. 352 00:21:24,290 --> 00:21:26,250 >> Să nu mergem prin toate funcțiile de aici, 353 00:21:26,250 --> 00:21:29,500 dar una care pare a fi, probabil, de interesul rămas să getString 354 00:21:29,500 --> 00:21:32,790 deoarece se dovedește că GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 toate punt o mulțime de funcționalități lor de a getString. 356 00:21:36,260 --> 00:21:39,750 Deci, haideți să aruncăm o privire la modul în care el este pus în aplicare aici. 357 00:21:39,750 --> 00:21:43,630 Asta arata un complex pic, dar se utilizează aceleași fundamentele 358 00:21:43,630 --> 00:21:45,670 că am început să vorbim despre săptămâna trecută. 359 00:21:45,670 --> 00:21:49,490 În getString, care ia nici un argument ca pe void aici 360 00:21:49,490 --> 00:21:53,730 și-l întoarce un șir, eu am aparent de declarare a unei coarde numit tampon. 361 00:21:53,730 --> 00:21:56,270 Nu știu cu adevărat ce se întâmplă să fie utilizate pentru încă, dar vom vedea. 362 00:21:56,270 --> 00:21:58,390 Se pare ca capacitatea este implicit 0. 363 00:21:58,390 --> 00:22:01,350 Nu este destul de sigur că în cazul în care acest lucru se întâmplă, nu, sigur că ceea ce n este de gând să fie utilizate pentru încă, 364 00:22:01,350 --> 00:22:03,590 dar acum din ce in ce un pic mai interesant. 365 00:22:03,590 --> 00:22:06,520 În conformitate 243, noi declarăm un int, c. 366 00:22:06,520 --> 00:22:08,800 Aceasta este un fel de detaliu prost. 367 00:22:08,800 --> 00:22:15,820 Un caracter este de 8 biți, 8 biți și poate stoca câte valori diferite? >> [Elev] 256. 256 >>. 368 00:22:15,820 --> 00:22:20,730 Problema este dacă doriți să aveți 256 de caractere ASCII diferite, care nu sunt 369 00:22:20,730 --> 00:22:23,340 , dacă credeți înapoi - și acest lucru nu este ceva să memoreze. 370 00:22:23,340 --> 00:22:25,710 Dar, dacă credeți că inapoi la tabela ASCII mare am avut săptămâni în urmă, 371 00:22:25,710 --> 00:22:30,600 au existat, în acest caz, 128 sau 256 de caractere ASCII. 372 00:22:30,600 --> 00:22:32,940 Am folosit toate modelele de până 0s și 1s. 373 00:22:32,940 --> 00:22:36,210 Asta este o problemă în cazul în care doriți să fie în măsură să detecteze o eroare 374 00:22:36,210 --> 00:22:40,190 pentru că, dacă utilizați deja 256 de valori pentru personajele tale, 375 00:22:40,190 --> 00:22:43,050 nu ai de gând cu adevărat înainte, deoarece acum nu ai nici o modalitate de a spune, 376 00:22:43,050 --> 00:22:46,270 acest lucru nu este un personaj legit, aceasta este un mesaj eronat. 377 00:22:46,270 --> 00:22:50,270 Deci, ce face lumea pe care o folosesc este mai mare valoarea următoare, ceva ca un int, 378 00:22:50,270 --> 00:22:54,720 astfel încât să aveți un număr nebun de biți, 32, 4 miliarde de valori posibile 379 00:22:54,720 --> 00:22:58,860 astfel încât să puteți ajunge pur și simplu prin utilizarea în esență, 257 din ele, 380 00:22:58,860 --> 00:23:01,720 1 din care are o semnificație specială ca o eroare. 381 00:23:01,720 --> 00:23:03,120 >> Deci, hai sa vedem cum funcționează. 382 00:23:03,120 --> 00:23:07,760 În conformitate 246, am această buclă în timp ce de mare, care este de asteptare fgetc, 383 00:23:07,760 --> 00:23:11,090 f fisier sensul, așa getc, și apoi stdin. 384 00:23:11,090 --> 00:23:15,520 Se pare ca aceasta este doar mod mai precis de a spune citite de intrare de la tastatură. 385 00:23:15,520 --> 00:23:19,300 Standard tastatură mijloace de intrare, de ieșire standard de mijloace ecran, 386 00:23:19,300 --> 00:23:23,310 și eroarea standard, pe care le vom vedea în pset4, înseamnă că ecranul 387 00:23:23,310 --> 00:23:27,490 dar o parte specială a ecranului, astfel încât nu este confundat cu producția efectivă 388 00:23:27,490 --> 00:23:30,750 care ați intenționat să imprimați. Dar mai mult pe faptul că, în viitor. 389 00:23:30,750 --> 00:23:34,440 Deci, fgetc înseamnă doar citi un caracter de la tastatură și păstrați-l în cazul în care? 390 00:23:34,440 --> 00:23:37,350 Depozitați-l în c. 391 00:23:37,350 --> 00:23:41,360 Și apoi atunci a verifica - deci eu sunt, folosind doar cateva conjuncțiilor booleene aici - 392 00:23:41,360 --> 00:23:46,000 verificați că acesta nu este egal cu - \ n, astfel încât utilizatorul a lovit Enter, vrem să se oprească la acel moment, 393 00:23:46,000 --> 00:23:49,850 sfârșitul bucla - și am dori, de asemenea pentru a verifica pentru EOF constanta specială, 394 00:23:49,850 --> 00:23:53,610 care, dacă știți sau ghici, ceea ce nu se stea? >> [Elev] Sfârșitul de fișier. Sfârșit >> de fișier. 395 00:23:53,610 --> 00:23:56,560 Acest lucru este un nonsens, deoarece un fel de, dacă mă tastarea la tastatura, 396 00:23:56,560 --> 00:23:58,870 nu există cu adevărat nici un fișier nu implicat în acest lucru, 397 00:23:58,870 --> 00:24:01,150 dar acest lucru este doar sorta de termen generic folosit pentru a înțelege 398 00:24:01,150 --> 00:24:04,220 că nimic altceva nu vine de la degetele omului. 399 00:24:04,220 --> 00:24:06,460 EOF - sfârșitul fișierului. 400 00:24:06,460 --> 00:24:09,920 Ca o paranteza, dacă v-ați lovit vreodată de control D la tastatură, nu, care le-ar avea încă - 401 00:24:09,920 --> 00:24:15,230 v-ați lovit de control C - Controlul D trimite această constantă special numit EOF. 402 00:24:15,230 --> 00:24:19,850 Deci, acum avem doar niște alocare de memorie dinamică. 403 00:24:19,850 --> 00:24:23,440 >> Deci, în cazul în care (n + 1> capacitate). Acum voi explica nr. 404 00:24:23,440 --> 00:24:26,100 N este doar cât de multe bytes sunt în prezent în tampon, 405 00:24:26,100 --> 00:24:28,620 șir că ești în prezent, construirea de utilizator. 406 00:24:28,620 --> 00:24:33,450 Dacă aveți mai multe caractere din buffer-ul dvs. decât aveți capacitatea în tampon, 407 00:24:33,450 --> 00:24:37,410 intuitiv ceea ce trebuie să facem, atunci se aloce o capacitate mai mare. 408 00:24:37,410 --> 00:24:43,330 Așa că am de gând să răsfoiesc peste unele dintre aritmetice aici și să se concentreze doar pe această funcție aici. 409 00:24:43,330 --> 00:24:46,070 Știi ce malloc este sau sunt, în general, de cel puțin familiare. 410 00:24:46,070 --> 00:24:48,970 Ia ghici ce-o face realloc. >> [Elev] Adaugă memorie. 411 00:24:48,970 --> 00:24:52,920 Nu e destul de adăugarea de memorie. Acesta realocă de memorie, după cum urmează. 412 00:24:52,920 --> 00:24:57,220 Dacă există încă loc la sfârșitul șir pentru a vă oferi mai mult de faptul că memoria 413 00:24:57,220 --> 00:25:00,000 decât a fost inițial ți-o dă, atunci veți obține că memorie suplimentară. 414 00:25:00,000 --> 00:25:03,460 Astfel încât puteți să vă păstrați doar punerea de caractere șir de spate în spate la spate în spate. 415 00:25:03,460 --> 00:25:05,830 Dar dacă asta nu e cazul pentru ca ai asteptat prea mult timp 416 00:25:05,830 --> 00:25:07,940 și ceva aleatoriu a fost plopped în memorie acolo 417 00:25:07,940 --> 00:25:10,290 dar nu e de memorie suplimentar aici, e în regulă. 418 00:25:10,290 --> 00:25:13,100 Realloc este de gând să facă tot grea pentru tine, 419 00:25:13,100 --> 00:25:16,750 muta șirul ați citit în astfel departe de aici, a pus-o acolo jos, 420 00:25:16,750 --> 00:25:19,460 și să dea apoi pista de ceva mai mult de la acel moment. 421 00:25:19,460 --> 00:25:22,550 >> Deci, cu un val de mana, permiteți-mi să spun că ceea ce face getString 422 00:25:22,550 --> 00:25:26,330 este că începe cu un tampon mic, poate unul singur caracter, 423 00:25:26,330 --> 00:25:30,820 și dacă utilizatorul tipurile din două caractere, getString sfârșește asteptare realloc și spune 424 00:25:30,820 --> 00:25:33,150 un caracter nu era de ajuns, dă-mi două caractere. 425 00:25:33,150 --> 00:25:35,950 Apoi, dacă ai citit prin logica bucla, o să spună 426 00:25:35,950 --> 00:25:39,600 utilizatorul tastat în 3 caractere;-mi dau acum nu 2, dar 4 caractere, 427 00:25:39,600 --> 00:25:42,320 atunci da-mi 8, atunci dă-mi 16 și 32. 428 00:25:42,320 --> 00:25:45,000 Faptul că am dublarea capacității de fiecare dată 429 00:25:45,000 --> 00:25:48,570 înseamnă că buffer-ul nu este de gând să crească încet, o să crească super rapid. 430 00:25:48,570 --> 00:25:51,380 Și ce ar putea fi avantajul de asta? 431 00:25:51,380 --> 00:25:54,600 De ce am dublarea dimensiunea buffer 432 00:25:54,600 --> 00:25:58,020 chiar dacă utilizatorul ar putea avea nevoie doar de un caracter suplimentar de la tastatură? 433 00:25:58,020 --> 00:26:01,750 [Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] Nu trebuie să-l crească la fel de des. 434 00:26:01,750 --> 00:26:03,300 Exact. Nu trebuie să-l crească la fel de des. 435 00:26:03,300 --> 00:26:05,510 Și acest lucru este doar un fel de acoperire ai pariurile aici, 436 00:26:05,510 --> 00:26:10,850 ideea fiind că nu doriți să apelați realloc o mulțime, pentru că tinde să fie lent. 437 00:26:10,850 --> 00:26:12,910 Orice moment să vă întreb sistemul de operare pentru memorie, 438 00:26:12,910 --> 00:26:16,990 după cum veți vedea în curând într-un set de probleme în viitor, aceasta tinde să ia ceva timp. 439 00:26:16,990 --> 00:26:20,010 Minimizând astfel că suma de timp, chiar dacă îți pierzi spațiu, 440 00:26:20,010 --> 00:26:21,900 tinde să fie un lucru bun. 441 00:26:21,900 --> 00:26:24,060 >> Dar dacă citim prin partea finală a getString aici - 442 00:26:24,060 --> 00:26:27,950 și înțelegerea din nou de fiecare singură linie aici nu este atât de importantă astăzi - 443 00:26:27,950 --> 00:26:30,530 observa că în cele din urmă solicită din nou malloc 444 00:26:30,530 --> 00:26:33,880 și-l alocă exact așa cum octeți multe de care are nevoie pentru șirul 445 00:26:33,880 --> 00:26:38,060 și apoi aruncă prin apel gratuit tampon excesiv de mare 446 00:26:38,060 --> 00:26:40,080 în cazul în care într-adevăr s-au dublat de prea multe ori. 447 00:26:40,080 --> 00:26:42,730 Deci, pe scurt, că e modul în care getString a lucrat in tot acest timp. 448 00:26:42,730 --> 00:26:47,060 Tot ce nu se citește câte un caracter la un moment dat din nou și din nou și din nou, 449 00:26:47,060 --> 00:26:50,750 și de fiecare dată când are nevoie de memorie suplimentară, aceasta solicită să se stabilească sistemul de operare pentru ea 450 00:26:50,750 --> 00:26:53,670 sunand la realloc. 451 00:26:53,670 --> 00:26:57,890 >> Alte întrebări? Bine. 452 00:26:57,890 --> 00:26:59,270 >> Un atac. 453 00:26:59,270 --> 00:27:04,060 Acum că am înțeles indicii sau cel puțin sunt din ce în ce familiarizați cu pointeri, 454 00:27:04,060 --> 00:27:06,700 să ia în considerare modul în care toată lumea începe să se prăbușească 455 00:27:06,700 --> 00:27:10,030 dacă nu apara destul de contradictorii împotriva utilizatorilor, 456 00:27:10,030 --> 00:27:11,850 oameni care încearcă să hack în sistemul dvs., 457 00:27:11,850 --> 00:27:16,890 oameni care încearcă să fure software-ul dvs. prin ocolirea un cod de înregistrare 458 00:27:16,890 --> 00:27:19,090 că acestea ar putea avea altfel de tip inch 459 00:27:19,090 --> 00:27:22,990 >> Aruncati o privire la acest exemplu aici, care este la doar cod C care are o funcție principală la partea de jos 460 00:27:22,990 --> 00:27:26,380 care apelează o funcție foo. Și pentru ce se trece la foo? 461 00:27:26,380 --> 00:27:29,680 [Elev] Un singur argument. >> [Malan] Un singur argument. 462 00:27:29,680 --> 00:27:33,450 Deci, argv [1], ceea ce înseamnă că primul cuvânt tastat de utilizator de la linia de comandă 463 00:27:33,450 --> 00:27:36,360 după a.out sau orice program este numit. 464 00:27:36,360 --> 00:27:41,680 Deci, foo în partea de sus ia într-o char *. Dar char * este doar ceea ce? >> [Elev] Un șir. 465 00:27:41,680 --> 00:27:43,350 [Malan] Un șir, deci nu e nimic nou aici. 466 00:27:43,350 --> 00:27:45,420 Că șirul este arbitrar fiind numit bar. 467 00:27:45,420 --> 00:27:51,430 În această linie de aici, char c [12]; intr-un fel de semi-tehnic limba engleză, ceea ce se face această linie? 468 00:27:51,430 --> 00:27:55,220 [Elev] O serie de - Array >> a? >> [Elev] Caractere. >> Caractere. 469 00:27:55,220 --> 00:27:58,870 Dă-mi un tablou de 12 caractere. Așa că am putea numi asta un tampon. 470 00:27:58,870 --> 00:28:02,920 Se numește punct de vedere tehnic C, dar un tampon în programare înseamnă doar o grămadă de spațiu 471 00:28:02,920 --> 00:28:04,800 pe care le puteți pune niște chestii inch 472 00:28:04,800 --> 00:28:07,940 Apoi în cele din urmă, nu ne-am memcpy folosit înainte, dar puteți ghici, probabil, ceea ce face. 473 00:28:07,940 --> 00:28:10,480 Se copiază memoria. Ce face? 474 00:28:10,480 --> 00:28:19,270 Se copiază aparent bar, intrare său, în C, dar numai până la lungimea de bare. 475 00:28:19,270 --> 00:28:24,930 Dar există un bug aici. >> [Elev] Ai nevoie de caracterul sizeof. Bine >>. 476 00:28:24,930 --> 00:28:30,860 Punct de vedere tehnic, ar trebui să facem cu adevărat strlen (bar) * sizeof (char)). Asta e corect. 477 00:28:30,860 --> 00:28:33,930 Dar, în cel mai rău caz aici, să presupunem că that - 478 00:28:33,930 --> 00:28:35,950 Bine. Apoi, există două bug-uri. 479 00:28:35,950 --> 00:28:39,160 Deci, sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Să facem acest lucru un pic mai larg. 481 00:28:41,290 --> 00:28:44,910 Deci, acum, există încă un bug, care este ceea ce? >> [Elevului răspunsul neauzit] 482 00:28:44,910 --> 00:28:46,990 Verificați pentru ce? >> [Elev] Verifica pentru NULL. 483 00:28:46,990 --> 00:28:50,270 Noi ar trebui să fie, în general, verificarea NULL, deoarece se întâmplă lucruri rele 484 00:28:50,270 --> 00:28:53,200 atunci când indicatorul este NULL, deoarece s-ar putea sfârși prin a merge acolo, 485 00:28:53,200 --> 00:28:57,630 și nu ar trebui să fie niciodată de gând să NULL prin dereferencing cu operatorul stea. 486 00:28:57,630 --> 00:29:01,050 Deci asta e bine. Și ce altceva facem? În mod logic, e un defect aici. 487 00:29:01,050 --> 00:29:04,450 [Elev] Verificați dacă argc este> = la 2. 488 00:29:04,450 --> 00:29:10,550 Deci, verificați dacă este argc> = 2. Ok, deci sunt trei bug-uri în acest program aici. 489 00:29:10,550 --> 00:29:16,630 Suntem acum a verifica dacă utilizatorul efectiv introdus în nimic în argv [1]. Bine. 490 00:29:16,630 --> 00:29:20,950 Deci, ce e bug treia? Da. >> [Elev] C ar putea să nu fie suficient de mare. 491 00:29:20,950 --> 00:29:23,320 Bine. Am verificat un scenariu. 492 00:29:23,320 --> 00:29:29,520 Noi implicit verificat nu copiați mai multă memorie decât ar depăși lungimea de bara. 493 00:29:29,520 --> 00:29:32,510 Deci, dacă șirul de utilizator introdus este de 10 de caractere în lungime, 494 00:29:32,510 --> 00:29:36,020 acest lucru este spunând copia numai 10 caractere. Și asta e în regulă. 495 00:29:36,020 --> 00:29:39,940 Dar ce se întâmplă dacă utilizatorul tastat într-un cuvânt, la promptul ca un cuvânt 20-caractere? 496 00:29:39,940 --> 00:29:44,900 Aceasta spune copie 20 de caractere de la barul în ce? 497 00:29:44,900 --> 00:29:49,750 C, altfel cunoscut sub numele tampon noastră, ceea ce înseamnă că a scris doar datele 498 00:29:49,750 --> 00:29:52,540 la 8 locații octet care nu vă aparțin, 499 00:29:52,540 --> 00:29:54,870 și nu le dețin în sensul că niciodată nu le-ai alocat. 500 00:29:54,870 --> 00:30:00,370 Deci, asta este ceea ce, în general, cunoscut sub numele de atac buffer overflow sau atac tampon depășire. 501 00:30:00,370 --> 00:30:05,580 Și e un atac în sensul că, dacă utilizatorul sau programul care este de asteptare funcția 502 00:30:05,580 --> 00:30:10,490 face acest lucru cu rea intenție, ceea ce de fapt se întâmplă în continuare ar putea fi de fapt destul de rău. 503 00:30:10,490 --> 00:30:12,450 >> Deci, haideți să aruncăm o privire la această imagine aici. 504 00:30:12,450 --> 00:30:16,060 Această imagine reprezintă stiva de memorie. 505 00:30:16,060 --> 00:30:19,580 Amintiți-vă că de fiecare dată când apelați o funcție te acest cadru mic pe stivă 506 00:30:19,580 --> 00:30:21,520 și apoi altul și apoi altul și altul. 507 00:30:21,520 --> 00:30:24,300 Și astfel acum, am doar un fel de abstracte acestea ca dreptunghiuri 508 00:30:24,300 --> 00:30:26,290 fie pe bord sau pe ecran aici. 509 00:30:26,290 --> 00:30:30,580 Dar, dacă ne apropia pe una dintre aceste dreptunghiuri, atunci când apelați un foo funcție, 510 00:30:30,580 --> 00:30:35,880 se dovedește că există mai mult pe interiorul teancul de acel cadru, în acest dreptunghi 511 00:30:35,880 --> 00:30:40,060 mult decât x și y, iar a și b, asa cum am facut vorbim despre swap. 512 00:30:40,060 --> 00:30:44,410 Se pare că există unele detalii de nivel inferior, printre care adresa expeditorului. 513 00:30:44,410 --> 00:30:49,550 Deci, se dovedește atunci când solicită principal foo, principala trebuie sa informeze foo 514 00:30:49,550 --> 00:30:53,520 ce adresa principală este în memoria calculatorului 515 00:30:53,520 --> 00:30:57,770 deoarece în caz contrar, imediat după foo se face de executare, la fel ca în acest caz aici, 516 00:30:57,770 --> 00:31:00,830 Odată ce ați ajunge la acest bretele închis cret, la sfârșitul anului foo, 517 00:31:00,830 --> 00:31:05,310 cum naiba nu foo știe unde controlul programului ar trebui să meargă? 518 00:31:05,310 --> 00:31:08,970 Se pare că răspunsul la această întrebare este, în acest dreptunghi roșu aici. 519 00:31:08,970 --> 00:31:12,670 Aceasta reprezintă un pointer, și este de până la computer pentru a stoca temporar 520 00:31:12,670 --> 00:31:17,030 pe stiva așa-numita adresa principale, astfel încât, cât mai curând foo se face de executare, 521 00:31:17,030 --> 00:31:21,120 calculatorul știe unde și ce linie în principal pentru a reveni la. 522 00:31:21,120 --> 00:31:23,940 Indicatorul frame Salvat se referă în mod similar cu acest lucru. 523 00:31:23,940 --> 00:31:26,310 Barul char * aici reprezintă ceea ce? 524 00:31:26,310 --> 00:31:31,350 Acum, acest segment albastru aici este cadrul foo lui. Ce este bara? 525 00:31:31,570 --> 00:31:35,010 Bar este doar argument pentru funcția de foo. 526 00:31:35,010 --> 00:31:37,500 Deci, acum ne-am întors la fel de familiar imaginii. 527 00:31:37,500 --> 00:31:39,850 Există mai multe lucruri și mai multe distrageri pe ecran, 528 00:31:39,850 --> 00:31:43,380 dar acest segment este de culoare albastru deschis doar ceea ce am fost de desen pe tablă 529 00:31:43,380 --> 00:31:45,790 pentru ceva de genul swap. Acesta este cadrul pentru foo. 530 00:31:45,790 --> 00:31:51,490 Și singurul lucru în ea acum este barul, care este acest parametru. 531 00:31:51,490 --> 00:31:55,220 Dar ce altceva ar trebui să fie în stivă în conformitate cu acest cod aici? 532 00:31:55,220 --> 00:31:57,760 [Elev] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Noi ar trebui să vedeți, de asemenea, 12 patrate de memorie alocate unei variabile numita C, 534 00:32:02,810 --> 00:32:04,970 și într-adevăr, avem că pe ecran. 535 00:32:04,970 --> 00:32:08,480 Foarte de sus este c [0], iar apoi autorul acestei diagrame 536 00:32:08,480 --> 00:32:11,850 nu sa deranjat desen toate pătrate, dar există într-adevăr, există 12 537 00:32:11,850 --> 00:32:16,590 pentru că dacă te uiți la dreapta jos, c [11], dacă numeri de la 0 este octetul 12 astfel. 538 00:32:16,590 --> 00:32:18,400 Dar aici e problema. 539 00:32:18,400 --> 00:32:22,390 În ce direcție se c în creștere? 540 00:32:22,390 --> 00:32:27,080 Un fel de sus în jos în cazul în care începe de la partea de sus și partea de jos creste la. 541 00:32:27,080 --> 00:32:30,110 Ea nu arata ca am plecat noi înșine pista de mult aici, la toate. 542 00:32:30,110 --> 00:32:32,090 Ne-am pictat un fel de noi înșine într-un colț, 543 00:32:32,090 --> 00:32:36,940 și că, C [11] este dreptul de până împotriva bar, care este dreptul de până împotriva indicatorul frame Salvat, 544 00:32:36,940 --> 00:32:39,960 care este dreptul de până împotriva Adresă de returnare. Nu e nici o camera mai mult. 545 00:32:39,960 --> 00:32:42,810 Deci, ce e implicație, apoi, dacă o dai în bară 546 00:32:42,810 --> 00:32:46,500 si tu incearca sa citesti 20 bytes într-un buffer de 12 byte? 547 00:32:46,500 --> 00:32:50,060 În cazul în care sunt cele 8 octeți suplimentare de gând să mergi? >> [Elev] Inside - 548 00:32:50,060 --> 00:32:53,200 În interiorul orice altceva, dintre care unele sunt foarte importante. 549 00:32:53,200 --> 00:32:57,260 Și cel mai important lucru, potențial, este caseta roșie acolo, adresa expeditorului, 550 00:32:57,260 --> 00:33:03,560 pentru că presupunem că vă fie accidental sau adversarially suprascrie aceste 4 octeți, 551 00:33:03,560 --> 00:33:07,260 că adresa indicatorul, nu doar cu gunoaie, dar cu un număr de 552 00:33:07,260 --> 00:33:09,810 care se întâmplă să reprezinte o adresă reală în memorie. 553 00:33:09,810 --> 00:33:13,880 Care este implicarea, în mod logic? >> [Elev] Funcția este de gând să se întoarcă la un alt loc. 554 00:33:13,880 --> 00:33:15,250 Exact. 555 00:33:15,250 --> 00:33:19,170 Când se întoarce foo și hit-uri care bretele cret, programul este de gând să procedeze 556 00:33:19,170 --> 00:33:25,060 nu pentru a reveni la principal, se va reveni la orice adresă este în cutie roșie. 557 00:33:25,060 --> 00:33:28,600 >> În cazul înregistrării software-ului eluda, 558 00:33:28,600 --> 00:33:32,260 Ce se întâmplă dacă adresa pe care a fost returnat este funcția care în mod normal este chemat 559 00:33:32,260 --> 00:33:35,690 după ce ați plătit pentru software-ul și introduse codul de inregistrare? 560 00:33:35,690 --> 00:33:39,870 Aveți posibilitatea să sortați de truc calculatorului în care nu merg aici, ci merge aici. 561 00:33:39,870 --> 00:33:45,100 Sau daca esti cu adevarat inteligent, un adversar poate tastezi in la tastatură, de exemplu, 562 00:33:45,100 --> 00:33:50,690 nu este un cuvânt real, nu 20 de caractere, dar să presupunem că el sau ea de fapt tipurile din 563 00:33:50,690 --> 00:33:52,770 unele caractere care reprezintă codul. 564 00:33:52,770 --> 00:33:55,320 Și nu va fi cod C, este de fapt va fi caracterele 565 00:33:55,320 --> 00:33:59,290 care reprezintă cod mașină, 0s și 1s. 566 00:33:59,290 --> 00:34:01,290 Dar să presupunem că acestea sunt suficient de inteligent pentru a face acest lucru, 567 00:34:01,290 --> 00:34:06,500 pentru a lipi cumva în ceva promptul getString care este în esență cod compilat, 568 00:34:06,500 --> 00:34:09,980 iar ultimele 4 octeți suprascrie acea adresă retur. 569 00:34:09,980 --> 00:34:13,360 Și ce adresă are ca intrare face? 570 00:34:13,360 --> 00:34:18,630 Este de fapt stochează în acest dreptunghi roșu adresa primul octet de tampon. 571 00:34:18,630 --> 00:34:23,070 Deci, va trebui să fie cu adevărat inteligent, iar acest lucru este o mulțime de studiu și de eroare pentru oameni răi acolo, 572 00:34:23,070 --> 00:34:25,639 dar dacă vă puteți da seama cât de mare acest buffer este 573 00:34:25,639 --> 00:34:28,820 astfel încât octeți în ultimele câteva intrare le furnizați la programul de 574 00:34:28,820 --> 00:34:33,540 se întâmplă să fie echivalentă cu adresa de start de tampon, puteți face acest lucru. 575 00:34:33,540 --> 00:34:39,320 Dacă spunem că în mod normal, salut și \ 0, asta e ceea ce se termină până în tampon. 576 00:34:39,320 --> 00:34:44,420 Dar dacă suntem mai inteligent și am umple acel buffer cu ceea ce vom numi generic codul de atac - 577 00:34:44,420 --> 00:34:48,860 AAA, atac, atac, atac - în cazul în care acest lucru este doar ceva care face ceva rău, 578 00:34:48,860 --> 00:34:51,820 ce se intampla daca esti cu adevarat inteligent, s-ar putea face acest lucru. 579 00:34:51,820 --> 00:34:58,610 În caseta roșie aici este o secvență de numere - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Observați că se potrivește cu numărul pe care-i treaba aici. 581 00:35:01,610 --> 00:35:04,430 E în ordine inversă, dar mai multe despre aceasta altă dată. 582 00:35:04,430 --> 00:35:08,140 Observați că această adresă de retur a fost în mod deliberat modificat 583 00:35:08,140 --> 00:35:12,020 la egal adresa aici, nu adresa de principal. 584 00:35:12,020 --> 00:35:17,500 Deci, dacă cel rău este super inteligent, el sau ea este de gând să includă în acest cod de atac 585 00:35:17,500 --> 00:35:20,930 ceva de genul ștergeți toate fișierele utilizatorului sau copiați parolele 586 00:35:20,930 --> 00:35:24,680 sau să creați un cont de utilizator pe care le pot autentifica, apoi să - nimic, la toate. 587 00:35:24,680 --> 00:35:26,950 >> Și acest lucru este atât pericolul și puterea lui C. 588 00:35:26,950 --> 00:35:29,840 Pentru că ai acces la memorie prin pointeri 589 00:35:29,840 --> 00:35:32,520 și, prin urmare, puteți scrie orice vrei în memoria unui computer, 590 00:35:32,520 --> 00:35:35,080 puteti face un calculator face orice vrei 591 00:35:35,080 --> 00:35:39,550 pur și simplu prin faptul că sari în jurul valorii de în spațiul său de memorie proprie. 592 00:35:39,550 --> 00:35:44,650 Și așa la această zi atât de multe programe și site-uri atât de multe încât sunt compromise 593 00:35:44,650 --> 00:35:46,200 fierbe în jos la oameni care profită de acest lucru. 594 00:35:46,200 --> 00:35:50,760 Și acest lucru ar putea parea un atac sofisticat super, dar nu pornește întotdeauna așa. 595 00:35:50,760 --> 00:35:53,560 Realitatea este că ceea ce oamenii răi vor face de obicei, este, 596 00:35:53,560 --> 00:35:58,200 indiferent dacă este un program la o linie de comandă sau a unui program de GUI sau un site web, 597 00:35:58,200 --> 00:35:59,940 începi furnizarea de prostii. 598 00:35:59,940 --> 00:36:03,980 Tastați într-un cuvânt cu adevărat mare în câmpul de căutare și apăsați pe Enter, 599 00:36:03,980 --> 00:36:05,780 și vă așteptați să vedeți dacă site-ul se blochează 600 00:36:05,780 --> 00:36:09,990 sau astepti pentru a vedea dacă programul se manifestă unele mesaj de eroare 601 00:36:09,990 --> 00:36:14,330 pentru că, dacă ai noroc ca tipul cel rău și vă oferim unele de intrare nebun 602 00:36:14,330 --> 00:36:18,980 că blochează programul, asta înseamnă programator nu a anticipa comportamentul rău, 603 00:36:18,980 --> 00:36:23,630 ceea ce înseamnă că puteți, probabil, cu un efort destul de, studiu și destul de eroare, 604 00:36:23,630 --> 00:36:26,650 dau seama cum să ducă un atac mult mai precis. 605 00:36:26,650 --> 00:36:31,410 Deci, la fel de mult o parte din securitate nu este doar evitarea acestor atacuri totul 606 00:36:31,410 --> 00:36:34,100 dar să le detecteze și de fapt, se uită la Busteni 607 00:36:34,100 --> 00:36:36,780 și văzând ce avea intrări nebuni oameni tastate in site-ul dvs., 608 00:36:36,780 --> 00:36:38,960 ce termeni de căutare au oamenii introdus în site-ul dvs. 609 00:36:38,960 --> 00:36:42,870 în speranța de a debordant-un buffer. 610 00:36:42,870 --> 00:36:45,500 Și toate astea se reduce la elementele de bază a ceea ce este simplu o matrice 611 00:36:45,500 --> 00:36:49,080 și ce înseamnă să aloce și de a folosi memoria. 612 00:36:49,080 --> 00:36:51,710 >> Legat de faptul că, atunci este de asemenea prezenta. 613 00:36:51,710 --> 00:36:54,280 Hai arunca o privire doar în interiorul unui hard disk nou. 614 00:36:54,280 --> 00:36:58,440 Vă amintiți de la o săptămână sau două în urmă că, atunci când trageți fișierele în coșul de reciclare sau coș de gunoi, 615 00:36:58,440 --> 00:37:03,710 ce se intampla? >> [Elev] Nimic. Absolut nimic >>, nu? 616 00:37:03,710 --> 00:37:05,740 În cele din urmă, dacă aveți puțin spațiu pe disc, 617 00:37:05,740 --> 00:37:08,190 Windows sau Mac OS va începe ștergerea fișierelor pentru tine. 618 00:37:08,190 --> 00:37:10,390 Dar, dacă vă trageți ceva acolo, care nu este deloc sigur. 619 00:37:10,390 --> 00:37:13,800 Toate colegul tău de cameră sau un prieten sau membru de familie trebuie să faceți este să faceți dublu clic pe și, voila, 620 00:37:13,800 --> 00:37:16,310 există toate fișierele schematice pe care ați încercat să le ștergeți. 621 00:37:16,310 --> 00:37:19,590 Cei mai mulți dintre noi, cel puțin știu că trebuie să faceți clic dreapta sau Control clic 622 00:37:19,590 --> 00:37:22,310 și gol coșul de gunoi sau ceva de genul asta. 623 00:37:22,310 --> 00:37:25,000 Dar chiar și atunci, care nu face destul truc 624 00:37:25,000 --> 00:37:28,010 pentru că ceea ce se întâmplă atunci când aveți un fișier de pe hard disk 625 00:37:28,010 --> 00:37:32,770 care reprezintă o parte sau un document Word JPEG, iar acest lucru reprezintă hard disk, 626 00:37:32,770 --> 00:37:35,350 și să spunem că această țeapă aici reprezintă acel dosar, 627 00:37:35,350 --> 00:37:38,390 si este compus dintr-o grămadă de 0s și 1s. 628 00:37:38,390 --> 00:37:42,470 Ce se întâmplă atunci când nu vă trageți numai acel fișier în coșul de gunoi poate sau coșul de gunoi 629 00:37:42,470 --> 00:37:48,020 dar, de asemenea, goliți-l? Un fel de nimic. 630 00:37:48,020 --> 00:37:49,640 Nu e absolut nimic acum. 631 00:37:49,640 --> 00:37:54,290 Acum e doar nimic pentru că ceva se întâmplă în formă de tabel. 632 00:37:54,290 --> 00:37:58,370 Deci, există un fel de bază de date sau tabel în interiorul memoriei unui computer 633 00:37:58,370 --> 00:38:03,850 care are în esență, o coloană pentru fișiere "nume și o coloană pentru fișierele" Locul de amplasare, 634 00:38:03,850 --> 00:38:07,720 în cazul în care aceasta ar putea fi locatia 123, doar un număr aleatoriu. 635 00:38:07,720 --> 00:38:14,560 Deci, am putea avea ceva de genul x.jpeg și locația 123. 636 00:38:14,560 --> 00:38:18,800 Ce se întâmplă atunci când goliți de fapt, gunoiul? 637 00:38:18,800 --> 00:38:20,330 Asta dispare. 638 00:38:20,330 --> 00:38:23,610 Dar ceea ce nu merge mai departe este de 0s și 1s. 639 00:38:23,610 --> 00:38:26,270 >> Deci, ce e, apoi conexiunea la pset4? 640 00:38:26,270 --> 00:38:31,240 Ei bine, cu pset4, doar pentru că am șters accidental card flash compact 641 00:38:31,240 --> 00:38:35,750 care a avut toate aceste fotografii sau doar pentru că de ghinion a devenit corupt 642 00:38:35,750 --> 00:38:38,000 nu înseamnă că 0s și 1s nu sunt încă acolo. 643 00:38:38,000 --> 00:38:40,410 Poate câteva dintre ele sunt pierdute pentru că ceva a fost corupt 644 00:38:40,410 --> 00:38:43,320 în sensul că unii au devenit 0s 1s 1s și a devenit 0s. 645 00:38:43,320 --> 00:38:47,240 Lucruri rele se pot întâmpla din cauza software-ului sau hardware-ul defect buggy. 646 00:38:47,240 --> 00:38:50,370 Dar multe dintre aceste biți, poate chiar 100% dintre ei, sunt încă acolo. 647 00:38:50,370 --> 00:38:55,050 E doar faptul că calculatorul sau aparatul foto nu știe unde a început JPEG1 648 00:38:55,050 --> 00:38:56,910 și în cazul în care JPEG2 început. 649 00:38:56,910 --> 00:39:01,070 Dar dacă tu, programator, știu cu un pic de pricepere în cazul în care aceste JPEG sunt 650 00:39:01,070 --> 00:39:06,010 sau ceea ce arata ca, astfel încât să puteți analiza JPEG 0s și 1s și spun, JPEG, 651 00:39:06,010 --> 00:39:09,440 puteți scrie un program cu esență, doar o buclă în timp ce pentru sau 652 00:39:09,440 --> 00:39:12,820 care recupereaza fiecare dintre aceste fișiere. 653 00:39:12,820 --> 00:39:16,030 Deci, lecția, atunci este de a începe ștergerea în siguranță fișierele 654 00:39:16,030 --> 00:39:18,340 dacă doriți, pentru a evita asta cu totul. Da. 655 00:39:18,340 --> 00:39:21,010 >> [Elev] Cum se spune pe computer 656 00:39:21,010 --> 00:39:23,550 că aveți mai multă memorie decât ai făcut-o înainte? 657 00:39:23,550 --> 00:39:27,820 Au mai multă memorie decât ai făcut-o înainte - >> [elev] Mai multă memorie disponibilă. 658 00:39:27,820 --> 00:39:29,630 Oh. Bună întrebare. 659 00:39:29,630 --> 00:39:32,360 Deci, de ce atunci, după golirea de gunoi nu computerul să vă spun 660 00:39:32,360 --> 00:39:34,910 că aveți mai mult spațiu liber decât ai făcut-o înainte? 661 00:39:34,910 --> 00:39:36,770 Într-un cuvânt, pentru că minte. 662 00:39:36,770 --> 00:39:40,740 Mai multe punct de vedere tehnic, voi aveti mai mult spațiu pentru că acum ați spus 663 00:39:40,740 --> 00:39:43,680 poti pune alte lucruri în cazul în care dosarul a fost odata. 664 00:39:43,680 --> 00:39:45,450 Dar asta nu inseamna ca bitii de gând departe, 665 00:39:45,450 --> 00:39:48,590 și asta nu inseamna ca bitii sunt schimbate la toate 0s, de exemplu, 666 00:39:48,590 --> 00:39:50,150 pentru protecția dumneavoastră. 667 00:39:50,150 --> 00:39:54,640 Deci, prin contrast, dacă ștergeți în siguranță fișierele sau fizic distruge aparatul, 668 00:39:54,640 --> 00:39:57,300 că într-adevăr este singura cale, uneori, în jurul valorii de asta. 669 00:39:57,300 --> 00:40:02,020 >> Deci, de ce să nu lăsăm pe această notă semi-înfricoșător, iar noi te vom vedea pe luni. 670 00:40:02,020 --> 00:40:07,000 [Aplauze] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]