1 00:00:00,000 --> 00:00:10,970 >> [Redarea muzicii] 2 00:00:10,970 --> 00:00:12,536 >> David J. MALAN: În regulă. 3 00:00:12,536 --> 00:00:13,392 >> [Râsete] 4 00:00:13,392 --> 00:00:14,240 >> Bine ai venit înapoi. 5 00:00:14,240 --> 00:00:14,990 Aceasta este CS50. 6 00:00:14,990 --> 00:00:16,890 Iar acest final de săptămână cinci. 7 00:00:16,890 --> 00:00:20,020 Și până acum, ne-am cam fost luați de la sine că există 8 00:00:20,020 --> 00:00:23,480 există acest compilator, zăngănit, pe care le-am fost invocat prin intermediul acestui 9 00:00:23,480 --> 00:00:27,100 alt instrument numit face că într-un fel convertește magic codul sursă 10 00:00:27,100 --> 00:00:31,350 în cod obiect, de zerouri și cele care computerele dvs. CPU, Central 11 00:00:31,350 --> 00:00:33,410 unitate de procesare, de fapt înțelege. 12 00:00:33,410 --> 00:00:36,770 Dar se pare că există un număr care este întâmplă sub capotă, în 13 00:00:36,770 --> 00:00:38,690 între intrare și ieșire. 14 00:00:38,690 --> 00:00:41,800 >> Și aș vrea să propun ca am trup că într-un pic mai în detaliu în 15 00:00:41,800 --> 00:00:45,130 aceste patru etape, au ceva numit pre-procesare, ceva 16 00:00:45,130 --> 00:00:48,300 numit compilare, pe care le-am văzut, ceva numit asamblare, și 17 00:00:48,300 --> 00:00:49,420 ceva numit de legătură. 18 00:00:49,420 --> 00:00:53,270 Deci, până în prezent, în unele dintre noastre programe, am avut ascuțite include. 19 00:00:53,270 --> 00:00:56,650 Mai recent am avut ceva ascuțit definește pentru constante. 20 00:00:56,650 --> 00:01:00,660 Deci, se dovedește că acele lucruri pe care sunt precedate de simbolul hash sau 21 00:01:00,660 --> 00:01:04,150 simbolul lira sunt pre-procesor directive. 22 00:01:04,150 --> 00:01:07,960 Asta e doar un mod fantezist de a spune că e o linie de cod care este de fapt 23 00:01:07,960 --> 00:01:12,280 convertit în altceva înainte calculator chiar să încerce să convertească dvs. 24 00:01:12,280 --> 00:01:13,800 Programul de la zero si unu. 25 00:01:13,800 --> 00:01:19,000 >> De exemplu, ascuțit include standardul I / O. H, destul de mult înseamnă doar du-te 26 00:01:19,000 --> 00:01:24,010 înainte, apuca conținutul fișierelor stdio.h și lipiți-le acolo. 27 00:01:24,010 --> 00:01:25,880 Deci, nu zero si unu la acel moment încă. 28 00:01:25,880 --> 00:01:27,470 Este într-adevăr doar o schimbare. 29 00:01:27,470 --> 00:01:30,790 Și că a făcut în așa-numitul etapa de pre-procesare, atunci când 30 00:01:30,790 --> 00:01:34,230 rula de fapt zăngănit sau specific A face în cele mai multe cazuri. 31 00:01:34,230 --> 00:01:36,950 Deci, tot acest lucru sa întâmplat Primul mod automat până acum. 32 00:01:36,950 --> 00:01:38,800 >> Apoi vine etapa de compilare. 33 00:01:38,800 --> 00:01:40,920 Dar am fost simplificat compilare. 34 00:01:40,920 --> 00:01:45,060 Elaborarea unui program înseamnă cu adevărat să ia-o de la ceva de genul C, 35 00:01:45,060 --> 00:01:48,430 codul sursă ne-am scris, în jos la ceva numit de asamblare. 36 00:01:48,430 --> 00:01:52,900 Limbaj de asamblare este un nivel mai mic limbaj care, din fericire, nu vom 37 00:01:52,900 --> 00:01:55,480 are ocazia de mult la scriu acest semestru. 38 00:01:55,480 --> 00:01:59,100 Dar este la cel mai scăzut nivel din sensul că începe literalmente scris 39 00:01:59,100 --> 00:02:04,270 adăuga și scade si se multiplica și încărcați de memorie și de a salva de memorie, 40 00:02:04,270 --> 00:02:08,259 instrucțiuni foarte de bază pe care un calculator, sub capota, 41 00:02:08,259 --> 00:02:09,639 de fapt înțelege. 42 00:02:09,639 --> 00:02:14,930 >> În cele din urmă, asamblare reușește să limbi la zero și cele pe care le-am fost 43 00:02:14,930 --> 00:02:16,190 descriind până acum. 44 00:02:16,190 --> 00:02:19,270 Și într-adevăr în cele din urmă, există așa-numitul care leagă fază, pe care le vom 45 00:02:19,270 --> 00:02:22,360 a se vedea într-o clipă, care combină zerouri dvs. și cei cu zero și 46 00:02:22,360 --> 00:02:24,870 cele ale altor oameni înainte de le-ați creat. 47 00:02:24,870 --> 00:02:26,660 >> Deci, să ia în considerare acest program super-simplu. 48 00:02:26,660 --> 00:02:27,560 Acesta a fost de la Săptămâna 1. 49 00:02:27,560 --> 00:02:29,610 Pur și simplu a declarat, Hello World, de pe ecran. 50 00:02:29,610 --> 00:02:30,920 Am alergat prin acest zăngănit. 51 00:02:30,920 --> 00:02:33,200 Sau am alergat-o prin Asigurați- care a fugit zăngănit. 52 00:02:33,200 --> 00:02:36,170 Și scoase la momentul în care unele zero si unu. 53 00:02:36,170 --> 00:02:38,100 Dar se pare că nu există o etapă intermediară. 54 00:02:38,100 --> 00:02:40,460 Dacă mă duc pe aici - oops, nu Vreau să-l văd încă. 55 00:02:40,460 --> 00:02:44,800 Dacă merg aici la aparat meu și am deschide hello.c, aici 56 00:02:44,800 --> 00:02:46,160 este că același program. 57 00:02:46,160 --> 00:02:48,600 Și ceea ce am de gând să fac în terminalul meu Fereastra aici este am de gând să 58 00:02:48,600 --> 00:02:51,430 rula răsune mai degrabă decât a face, care automatizează toate cele patru 59 00:02:51,430 --> 00:02:52,870 aceste măsuri pentru noi. 60 00:02:52,870 --> 00:02:58,620 Și am de gând să fac să răsune-S și apoi hello.c și apoi introduceți. 61 00:02:58,620 --> 00:03:00,590 >> Și primesc o promptă clipește din nou, ceea ce este bine. 62 00:03:00,590 --> 00:03:05,280 Și acum într-o fereastră ușor mai mare, Am de gând să deschidă gedit aici. 63 00:03:05,280 --> 00:03:09,610 Și am de gând să deschidă un fișier care, se dovedeste, este numit hello.s acest 64 00:03:09,610 --> 00:03:11,870 conține că limbaj de asamblare Am menționat mai devreme. 65 00:03:11,870 --> 00:03:15,060 Și aceasta este ceea ce se numește Adunarea limba, nivel relativ scăzut 66 00:03:15,060 --> 00:03:18,470 instrucțiunile care procesorul Intel sau orice ar fi care este în interiorul 67 00:03:18,470 --> 00:03:19,350 înțelege. 68 00:03:19,350 --> 00:03:24,480 MOV și este pentru a muta. apel este pentru apel, o funcție de nivel foarte scăzut. 69 00:03:24,480 --> 00:03:26,380 Sub este de scădere. 70 00:03:26,380 --> 00:03:30,370 >> Deci, atunci când aveți un anumit procesor interior a computerului, ceea ce face 71 00:03:30,370 --> 00:03:34,300 distincte, comparativ cu alte procesoare de pe de piață, este ceea ce instrucțiuni se 72 00:03:34,300 --> 00:03:39,460 înțelege și de multe ori cât de eficient este, cât de repede este la executarea unor 73 00:03:39,460 --> 00:03:40,380 din aceste instrucțiuni. 74 00:03:40,380 --> 00:03:45,150 Acum, pentru mai mult pe acest lucru, puteți lua următor CS61 toamna la facultate. 75 00:03:45,150 --> 00:03:48,170 Dar aici avem, de exemplu, câteva identificatori care ar putea arata familiar. 76 00:03:48,170 --> 00:03:50,150 hello.c este numele programului. 77 00:03:50,150 --> 00:03:51,070 >> . Text - 78 00:03:51,070 --> 00:03:54,190 nu e mult de interes acolo chiar acum, amintesc că textul 79 00:03:54,190 --> 00:03:59,190 segment, ca de luni, este în cazul în memorie programul de fapt sfârșește. 80 00:03:59,190 --> 00:04:01,330 Așa că, cel puțin vag familiar acolo. 81 00:04:01,330 --> 00:04:03,730 Aici, desigur, este o mențiune funcției nostru principal. 82 00:04:03,730 --> 00:04:07,220 Defilare în jos, acestea se referă la lucruri numitele registre, bucăți foarte mici de 83 00:04:07,220 --> 00:04:09,190 memorie în interiorul procesorului real. 84 00:04:09,190 --> 00:04:12,930 Și dacă derulați în jos chiar în plus, văd un fel 85 00:04:12,930 --> 00:04:14,240 mențiune indirectă a ASCII. 86 00:04:14,240 --> 00:04:17,120 Și acolo, într-adevăr, este că șir, Bună ziua, virgulă, lumea. 87 00:04:17,120 --> 00:04:20,079 >> Deci, pe scurt, acest lucru a fost întâmplă pentru tine, în mod automat, 88 00:04:20,079 --> 00:04:22,140 sub capota tot acest timp. 89 00:04:22,140 --> 00:04:26,450 Și ce sa întâmplat într-adevăr este o dată ați alerga răsune, sau prin 90 00:04:26,450 --> 00:04:29,150 Face, vei primi în primul rând, din codul sursă, 91 00:04:29,150 --> 00:04:30,700 așa-numita limbaj de asamblare. 92 00:04:30,700 --> 00:04:35,210 Apoi răsune este transformarea acestei asamblare Limba până la zero si unu. 93 00:04:35,210 --> 00:04:38,340 Și aceasta este diapozitiv pe care am început discuția noastră în Săptămâna 0 la - 94 00:04:38,340 --> 00:04:39,840 și apoi Săptămâna 1 pe. 95 00:04:39,840 --> 00:04:44,030 Și apoi în final, aceste zerouri și cele sunt combinate cu zero si unu 96 00:04:44,030 --> 00:04:47,190 din acele biblioteci care le-am luat pentru a acordat ca standard I / O sau 97 00:04:47,190 --> 00:04:50,010 Șir Biblioteca sau chiar CS50 biblioteca. 98 00:04:50,010 --> 00:04:54,200 >> Deci, pentru a picta acest tablou mai mult vizual, avem hello.c. 99 00:04:54,200 --> 00:04:57,220 Și, desigur, folosește printf funcționează să spun, salut lume. 100 00:04:57,220 --> 00:05:01,810 Pas compilatie este nevoie de până la că fișierul am văzut doar hello.s, chiar 101 00:05:01,810 --> 00:05:04,290 însă care este de obicei șterse în mod automat pentru tine. 102 00:05:04,290 --> 00:05:06,050 Dar asta e codul de asamblare în etapa de mijloc. 103 00:05:06,050 --> 00:05:09,750 Și atunci când vom asambla asamblare limba, ca să spunem așa, atunci te 104 00:05:09,750 --> 00:05:10,830 obține cele zero si unu. 105 00:05:10,830 --> 00:05:13,920 Deci, ne-am mărit în mod eficient de azi pe ceea ce ne-am luat de la sine, 106 00:05:13,920 --> 00:05:16,430 înseamnă a merge codul sursă față de codul obiect. 107 00:05:16,430 --> 00:05:18,850 >> Dar în cele din urmă, acum că aceeași imagine - haideți să-l împinge pe la 108 00:05:18,850 --> 00:05:20,020 în partea stângă. 109 00:05:20,020 --> 00:05:22,880 Și rețineți că în partea de sus acolo Am menționat stdio.h. 110 00:05:22,880 --> 00:05:25,030 Acesta este un fișier pe care l-am inclus în aproape toate 111 00:05:25,030 --> 00:05:26,250 programe pe care le-am scris. 112 00:05:26,250 --> 00:05:28,830 Și asta e fișierului al cărui conținut Ia copia lipit, 113 00:05:28,830 --> 00:05:30,350 în mod eficient varful codul. 114 00:05:30,350 --> 00:05:34,170 Dar se pare că, pe un calculator Sistemul de undeva, există probabil un 115 00:05:34,170 --> 00:05:39,150 fișier stdio.c că cineva a scris ani Acum că pune în aplicare toate 116 00:05:39,150 --> 00:05:41,870 Funcțiile care au fost declarate în stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Acum, în realitate nu este, probabil, pe Mac sau PC-ul sau chiar în 118 00:05:45,465 --> 00:05:47,660 CS50 aparat este un cod C crud. 119 00:05:47,660 --> 00:05:52,710 Cineva deja compilat și inclus . O fișier de cod obiect sau. O 120 00:05:52,710 --> 00:05:56,020 dosar, care se referă la o bibliotecă partajată care a fost pre-instalate și 121 00:05:56,020 --> 00:05:57,240 pre-compilate pentru tine. 122 00:05:57,240 --> 00:06:01,950 Dar să presupunem că într-adevăr există pe stdio.c nostru de calculator în paralel 123 00:06:01,950 --> 00:06:02,650 cu zăngănit. 124 00:06:02,650 --> 00:06:04,960 Codul dvs. a fost compilat și asamblate. 125 00:06:04,960 --> 00:06:09,200 Cod stdio.c 's este compilat și asamblate, astfel încât această ultimul 126 00:06:09,200 --> 00:06:13,730 pas, aici jos, trebuie să cumva link-ul, ca să spunem așa, zerouri dvs. și cei 127 00:06:13,730 --> 00:06:18,430 cu zero si unu sale într-un singur program simplu, care în cele din urmă este 128 00:06:18,430 --> 00:06:20,540 numit doar Buna ziua. 129 00:06:20,540 --> 00:06:23,340 >> Deci, asta e tot de magie care este sa întâmplat până acum. 130 00:06:23,340 --> 00:06:26,430 Și va continua să ia aceste procese pentru a acordat, dar dau seama 131 00:06:26,430 --> 00:06:28,750 există o mulțime de detalii picante merge pe dedesubt acolo. 132 00:06:28,750 --> 00:06:31,920 Și aceasta este ceea ce face dvs. calculator cu procesor Intel interior 133 00:06:31,920 --> 00:06:33,940 în special distinct. 134 00:06:33,940 --> 00:06:37,020 >> Astfel, pe această notă, dacă doriți să alaturi de noi pentru masa de prânz vinerea aceasta, se duc 135 00:06:37,020 --> 00:06:41,570 la locul cs50.net/rsvp obișnuit, 13:15 vineri. 136 00:06:41,570 --> 00:06:43,400 Și acum câteva anunțuri. 137 00:06:43,400 --> 00:06:44,670 Deci, avem o veste bună. 138 00:06:44,670 --> 00:06:45,970 Și avem niște vești proaste. 139 00:06:45,970 --> 00:06:47,260 Începe cu o veste bună aici. 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 >> Bine. 143 00:06:54,710 --> 00:06:56,670 Ei bine, este punct de vedere tehnic o vacanță, astfel încât nu este atât de mult un cadou de la noi. 144 00:06:56,670 --> 00:06:58,030 Dar apoi vestea proastă desigur. 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 >> Mi-am petrecut o mulțime de timp pe aceste animații. 148 00:07:03,530 --> 00:07:04,690 >> [Râsete] 149 00:07:04,690 --> 00:07:07,000 >> Va exista o sesiune comentariu aceasta vine luni. 150 00:07:07,000 --> 00:07:08,340 Acesta va fi la ora 05:30. 151 00:07:08,340 --> 00:07:11,210 Noi vă va aminti de toate aceste detalii prin e-mail pe cursul de 152 00:07:11,210 --> 00:07:13,470 site-ul în doar câteva zile de timp. 153 00:07:13,470 --> 00:07:16,610 Acesta va fi filmat și pus la dispoziția la scurt timp după aceea. 154 00:07:16,610 --> 00:07:19,200 Deci, dacă nu puteți face că luni slot de noapte, nu vă faceți griji. 155 00:07:19,200 --> 00:07:22,270 Secțiunile în această săptămână vine va fi, de asemenea, se concentreze pe analiza de test. 156 00:07:22,270 --> 00:07:25,670 În cazul în care secțiune este de luni, care este într-adevăr vacanță universitate, vom 157 00:07:25,670 --> 00:07:26,920 îndeplinesc în continuare în secțiunea. 158 00:07:26,920 --> 00:07:28,890 Dacă pur și simplu nu se poate face ca secțiune pentru că ai de gând 159 00:07:28,890 --> 00:07:29,860 departe, asta e bine. 160 00:07:29,860 --> 00:07:33,710 Participa la o zi de duminică sau marți secțiune sau ton, în secțiunea lui Jason, care este 161 00:07:33,710 --> 00:07:35,110 disponibil on-line. 162 00:07:35,110 --> 00:07:37,490 >> Deci, mai multe vești proaste. 163 00:07:37,490 --> 00:07:41,960 Deci, în conformitate cu programa, avem prelegere vinerea viitoare. 164 00:07:41,960 --> 00:07:43,690 Dar vestea bună - 165 00:07:43,690 --> 00:07:44,860 în mod clar, am petrecut prea mult timp pe aceasta. 166 00:07:44,860 --> 00:07:45,280 >> [Râsete] 167 00:07:45,280 --> 00:07:47,140 >> Vom anula lângă cursurile de vineri. 168 00:07:47,140 --> 00:07:50,590 Astfel că va fi un cadou pentru noi, astfel încât să poate avea într-adevăr un răgaz frumos în 169 00:07:50,590 --> 00:07:52,990 între această săptămână și două de săptămâni, prin urmare. 170 00:07:52,990 --> 00:07:57,460 Deci, nu prelegeri săptămâna viitoare, doar o mică test mic, pentru care ar trebui să fie 171 00:07:57,460 --> 00:07:59,030 ce în ce mai entuziasmat. 172 00:07:59,030 --> 00:08:03,870 >> Așa că haideți să ne îndreptăm acum atenția asupra ceva care este într-adevăr mai mult vizual 173 00:08:03,870 --> 00:08:06,990 și mai interesant și pentru a seta scena pentru ceea ce va fi la orizont 174 00:08:06,990 --> 00:08:08,420 în doar câteva săptămâni de timp. 175 00:08:08,420 --> 00:08:12,160 Dupa primul test, vom transforma concentra de seturi problema noastră la un alt 176 00:08:12,160 --> 00:08:16,710 problemă specifică domeniului, acela al criminalistica sau de securitate în general. 177 00:08:16,710 --> 00:08:19,550 >> De fapt, tradiția cu această problemă Setul este pentru mine una din 178 00:08:19,550 --> 00:08:24,850 predare colegi sau AC a mers pe jos peste campus luarea unor fotografii ale 179 00:08:24,850 --> 00:08:29,450 oameni evidente identificabile, dar nu, locuri sau lucruri, atunci in fiecare an am 180 00:08:29,450 --> 00:08:34,520 reuși cumva să ștergeți accidental sau la deteriorarea cardului digital media 181 00:08:34,520 --> 00:08:35,720 care este în interiorul din camera noastră. 182 00:08:35,720 --> 00:08:36,860 Dar nu e mare lucru. 183 00:08:36,860 --> 00:08:39,200 Eu pot merge mai departe și conectați că în calculatorul meu. 184 00:08:39,200 --> 00:08:43,010 Eu pot face o imagine medico-legale de ea, așa de a vorbi, prin copierea zerouri și 185 00:08:43,010 --> 00:08:46,830 Cei de pe acea cartelă de memorie, dacă de un card SD sau card compact flash sau 186 00:08:46,830 --> 00:08:48,100 indiferent ca esti familiarizat cu. 187 00:08:48,100 --> 00:08:49,300 Și atunci putem preda asta. 188 00:08:49,300 --> 00:08:53,190 >> Și astfel provocarea înainte, printre altele, lucruri pentru tine, va fi de a scrie 189 00:08:53,190 --> 00:08:58,630 Cod C, care recupereaza o grămadă de JPEG pentru mine și a arătat vor fi 190 00:08:58,630 --> 00:09:00,190 acei oameni, locuri sau lucruri. 191 00:09:00,190 --> 00:09:03,340 Și vom vorbi de asemenea, în această problemă stabilit și în zilele următoare, despre 192 00:09:03,340 --> 00:09:04,440 grafica mai general. 193 00:09:04,440 --> 00:09:06,140 Noi le-am folosit, un curs, pentru izbucni. 194 00:09:06,140 --> 00:09:09,080 Dar ai un fel de luate pentru a acordat există aceste noțiuni la nivel înalt 195 00:09:09,080 --> 00:09:10,680 de dreptunghiuri și ovale. 196 00:09:10,680 --> 00:09:12,450 Dar sub capota există pixeli. 197 00:09:12,450 --> 00:09:14,370 Și a trebuit să înceapă gândesc la ele. 198 00:09:14,370 --> 00:09:18,800 Sau va pentru p-set 4 trebuie să se gândească despre decalajul dintre cărămizi, cum 199 00:09:18,800 --> 00:09:21,990 repede te mingea se deplasează pe ecranului pentru izbucni. 200 00:09:21,990 --> 00:09:24,830 Deci, nu există această noțiune a puncte de pe ecran care este 201 00:09:24,830 --> 00:09:26,290 intrat deja în joc. 202 00:09:26,290 --> 00:09:29,430 >> Acum, ceea ce vezi, însă, este ceea ce te pe un ecran de computer. 203 00:09:29,430 --> 00:09:33,680 Dacă ați privit vreodată ceva bun sau TV rău, șansele sunt destul de mult 204 00:09:33,680 --> 00:09:36,280 trata publicul ca technophobes care nu prea 205 00:09:36,280 --> 00:09:37,630 știu prea multe despre calcul. 206 00:09:37,630 --> 00:09:40,840 Și astfel este foarte ușor pentru poliție detectiv să spun, nu-i asa 207 00:09:40,840 --> 00:09:41,710 curat asta pentru mine? 208 00:09:41,710 --> 00:09:42,710 Sau spori, nu? 209 00:09:42,710 --> 00:09:45,550 Spori este ca și cum cuvântul Buzz în cele mai multe orice spectacol legate de crima. 210 00:09:45,550 --> 00:09:49,240 Iar realitatea este, dacă luați o foarte imagine neclara a unui suspect face 211 00:09:49,240 --> 00:09:51,620 ceva rău, nu puteți doar spori ea. 212 00:09:51,620 --> 00:09:53,080 Nu se poate mări la infinit. 213 00:09:53,080 --> 00:09:56,350 Nu se poate vedea în licărire a cuiva ochi care a comis că 214 00:09:56,350 --> 00:09:59,860 special, a criminalității, în ciuda Prevalența acestui la TV. 215 00:09:59,860 --> 00:10:04,110 >> Și astfel, cu care să motiveze care problema viitoare set cu o privire la 216 00:10:04,110 --> 00:10:05,765 unele spectacole cu care s-ar putea să fie familiarizat. 217 00:10:05,765 --> 00:10:06,500 >> [Redare video] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Acum, sa trecem o privire bine la tine. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> L-Stai. 222 00:10:17,766 --> 00:10:18,658 Rulați-o înapoi. 223 00:10:18,658 --> 00:10:19,550 >> -Stai un minut. 224 00:10:19,550 --> 00:10:21,580 La dreapta. 225 00:10:21,580 --> 00:10:21,800 >> -Acolo. 226 00:10:21,800 --> 00:10:22,690 Freeze asta. 227 00:10:22,690 --> 00:10:23,692 >> Screen-complet. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Freeze asta. 230 00:10:24,154 --> 00:10:25,140 >> Strângeți-up pe care, da? 231 00:10:25,140 --> 00:10:27,090 >> Vector-in pe tipul ăla de roata din spate. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom in chiar aici, pe acest loc. 233 00:10:29,730 --> 00:10:33,700 >> -Cu echipamentul potrivit, ca imagini poate fi extinsă și ascuțit. 234 00:10:33,700 --> 00:10:34,490 >> -Ce-i asta? 235 00:10:34,490 --> 00:10:35,870 >> -Este un program de îmbunătățire. 236 00:10:35,870 --> 00:10:36,793 >> -Poți clar că la orice? 237 00:10:36,793 --> 00:10:38,560 >> -Nu stiu. 238 00:10:38,560 --> 00:10:39,090 Să-l consolideze. 239 00:10:39,090 --> 00:10:41,690 >> -Consolidarea secțiunea A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Am îmbunătățit detaliu și - 241 00:10:43,510 --> 00:10:44,456 >> -Cred că e de ajuns pentru a spori. 242 00:10:44,456 --> 00:10:45,402 Eliberați-l la ecranul meu. 243 00:10:45,402 --> 00:10:47,300 >> -Consolidarea reflecție în ochii ei. 244 00:10:47,300 --> 00:10:49,330 >> -Să facem acest lucru prin Caracteristici superioare video. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, poți îmbunătăți acest lucru? 246 00:10:50,340 --> 00:10:52,320 >> -Stai. 247 00:10:52,320 --> 00:10:54,290 >> -Am lucrat la această reflecție. 248 00:10:54,290 --> 00:10:55,560 >> -Cineva reflecție a lui. 249 00:10:55,560 --> 00:10:56,440 >> -Reflecție. 250 00:10:56,440 --> 00:10:57,940 >> -E o reflexie din fața omului. 251 00:10:57,940 --> 00:10:58,860 >> -Reflecție. 252 00:10:58,860 --> 00:10:59,710 >> -E o reflexie. 253 00:10:59,710 --> 00:11:00,900 >> -Mări oglinda. 254 00:11:00,900 --> 00:11:03,500 >> -Puteți vedea o reflecție. 255 00:11:03,500 --> 00:11:04,700 >> -Poți să consolideze imaginea de aici? 256 00:11:04,700 --> 00:11:05,700 >> -Poți să-l spori chiar aici? 257 00:11:05,700 --> 00:11:06,500 >> -Poți să-l consolideze? 258 00:11:06,500 --> 00:11:07,380 >> -Poți să-l consolideze? 259 00:11:07,380 --> 00:11:08,190 >> -Putem îmbunătăți acest lucru? 260 00:11:08,190 --> 00:11:08,940 >> -Poți să-l consolideze? 261 00:11:08,940 --> 00:11:10,280 >> -Stai o secundă, voi spori. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom in pe ușă. 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 >> [Râsete] 266 00:11:13,197 --> 00:11:14,360 >> Mutați-inch 267 00:11:14,360 --> 00:11:15,100 >> -Stai, oprește-te. 268 00:11:15,100 --> 00:11:15,740 >> Oprește-te. 269 00:11:15,740 --> 00:11:16,290 >> L-pauză. 270 00:11:16,290 --> 00:11:19,390 >> -Rotiți cu 75 de grade în jurul vertical te rog. 271 00:11:19,390 --> 00:11:19,886 >> [Râsete] 272 00:11:19,886 --> 00:11:24,350 >> Oprește-te, și înapoi la partea despre usa din nou. 273 00:11:24,350 --> 00:11:26,330 >> -Ai o imagine potențiator care poate bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Poate putem folosi Pradeep Sen metoda de a vedea în ferestre. 275 00:11:28,990 --> 00:11:30,680 >> -Acest software este stare de arta. 276 00:11:30,680 --> 00:11:31,676 >> -Valoarea icoana este oprit. 277 00:11:31,676 --> 00:11:34,166 >> -Cu dreptul de asociere de algoritmi. 278 00:11:34,166 --> 00:11:38,399 >> -A luat algoritmi de iluminare la nivelul următor și le pot folosi pentru a 279 00:11:38,399 --> 00:11:38,648 spori această fotografie. 280 00:11:38,648 --> 00:11:42,050 >> -Lock pe mări și z-axa. 281 00:11:42,050 --> 00:11:42,760 >> -Enhance. 282 00:11:42,760 --> 00:11:43,060 >> -Enhance. 283 00:11:43,060 --> 00:11:43,760 >> -Enhance. 284 00:11:43,760 --> 00:11:45,010 >> -Îngheț și de a spori. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END redare video] 287 00:11:47,910 --> 00:11:51,470 >> David J. MALAN: Set de problemă, astfel 5 este ceea ce ne așteaptă acolo. 288 00:11:51,470 --> 00:11:55,260 Deci, vom avea în curând o mai bună înțelegere de când și de ce puteți 289 00:11:55,260 --> 00:11:57,300 și a noastră nu poate spori în acest fel. 290 00:11:57,300 --> 00:12:00,090 Dar, mai întâi, să se întoarcă atenția noastră la unele dintre pietrele de temelie vom 291 00:12:00,090 --> 00:12:02,250 trebuie să fie în măsură să spună povestea. 292 00:12:02,250 --> 00:12:05,580 >> Astfel amintesc că am desenat această imagine pe Luni și un pic de săptămâna trecută. 293 00:12:05,580 --> 00:12:09,970 Și aceasta descrie aspectul de lucruri în memoria computerului atunci când 294 00:12:09,970 --> 00:12:11,000 care rulează un alt program. 295 00:12:11,000 --> 00:12:14,310 Segmentul Tech până sus, rechemare, se referă la zerourile reale și cele 296 00:12:14,310 --> 00:12:16,000 care compun programul dumneavoastră. 297 00:12:16,000 --> 00:12:19,340 Există, de mai jos, care, ceva inițializat sau date neinițializate, care de obicei 298 00:12:19,340 --> 00:12:22,910 se referă la lucruri cum ar fi constante sau siruri de caractere sau variabile globale care au 299 00:12:22,910 --> 00:12:24,200 fost declarate în prealabil. 300 00:12:24,200 --> 00:12:26,500 Există grămadă, dar vom veni înapoi la faptul că într-un pic. 301 00:12:26,500 --> 00:12:27,410 >> Și apoi există stiva. 302 00:12:27,410 --> 00:12:30,660 Mai mult ca un teanc de tăvi în cafenea, acest lucru este în cazul în care memoria devine 303 00:12:30,660 --> 00:12:33,610 stratificat și stratificat ori de câte ori faci ceea ce într-un program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Care este utilizarea stiva pentru? 306 00:12:37,730 --> 00:12:39,320 >> Da? 307 00:12:39,320 --> 00:12:40,000 >> Call of funcției. 308 00:12:40,000 --> 00:12:42,890 De fiecare dată când a apela o funcție, e acordată așchie de memorie pentru ușurința 309 00:12:42,890 --> 00:12:45,020 variabile locale sau parametrii săi. 310 00:12:45,020 --> 00:12:48,810 Și pictural, vom vedea că, cu fiecare Funcția succesive numit, atunci când o 311 00:12:48,810 --> 00:12:52,520 apeluri B apeluri C apeluri D, ele te stratificat pe stiva. 312 00:12:52,520 --> 00:12:55,630 Și în fiecare dintre aceste felii de Memoria este în esență un scop unic 313 00:12:55,630 --> 00:12:58,590 pentru această funcție, care, desigur, este problematic dacă vrei să dai 314 00:12:58,590 --> 00:13:01,850 la o funcție la alta O bucată de date pe care îl doriți 315 00:13:01,850 --> 00:13:03,500 pentru a evolua sau schimba. 316 00:13:03,500 --> 00:13:08,060 >> Deci, ce a fost soluția noastră pentru a permite O funcție reprezentată de unul stivă 317 00:13:08,060 --> 00:13:11,390 cadrul pentru modificarea memoriei interior de un alt cadru stivă? 318 00:13:11,390 --> 00:13:14,590 Cum cei doi vorbesc cu una de alta? 319 00:13:14,590 --> 00:13:18,510 Astfel de mod de indicii sau adrese, care, din nou, doar în cazul în care descrie în 320 00:13:18,510 --> 00:13:22,280 memorie, prin intermediul unui anumit numărul de muscatura, special 321 00:13:22,280 --> 00:13:23,830 Valoarea poate fi găsit. 322 00:13:23,830 --> 00:13:26,860 Deci, amintesc ultima dată prea am continuat povestea și se uită la un 323 00:13:26,860 --> 00:13:28,280 destul program de buggy. 324 00:13:28,280 --> 00:13:32,900 Și acest program este buggy pentru câteva motive, dar cel mai îngrijorătoare este 325 00:13:32,900 --> 00:13:34,620 pentru că nu reușește să verificați ce? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Da, nu reușește să verificați de intrare. 328 00:13:40,450 --> 00:13:41,870 Îmi pare rău? 329 00:13:41,870 --> 00:13:43,880 >> Daca este mai mult de 12 caractere. 330 00:13:43,880 --> 00:13:47,260 Deci, foarte inteligent, atunci când se solicită memcopy, care, așa cum sugerează și numele, doar 331 00:13:47,260 --> 00:13:50,630 copii de memorie de la al doilea argument în primul argument. 332 00:13:50,630 --> 00:13:54,730 Al treilea argument, foarte inteligent, este verificate pentru a vă asigura că nu 333 00:13:54,730 --> 00:13:59,400 copia mai mult, în acest caz, lungimea de bar, numărul de caractere, 334 00:13:59,400 --> 00:14:03,810 în destinație, care este aceasta matrice C. Dar problema este că ceea ce 335 00:14:03,810 --> 00:14:07,230 dacă C în sine nu este suficient de mare să se ocupe de asta? 336 00:14:07,230 --> 00:14:09,900 Te duci pentru a copia numărul de bytes că ați fost dat. 337 00:14:09,900 --> 00:14:13,040 Dar ce au de fapt mai mult bytes decât aveți spațiu pentru? 338 00:14:13,040 --> 00:14:16,770 >> Ei bine, acest program foarte prostește doar orbește purcede să ia orice e 339 00:14:16,770 --> 00:14:20,650 având în vedere, salut backslash 0 este mare în cazul în care șirul este scurt 340 00:14:20,650 --> 00:14:22,040 destul de, cum ar fi de cinci caractere. 341 00:14:22,040 --> 00:14:26,470 Dar dacă e de fapt 12 caractere sau 1.200 de caractere, am văzut ultima oară 342 00:14:26,470 --> 00:14:29,380 ca esti doar de gând să complet suprascrie memorie 343 00:14:29,380 --> 00:14:30,470 nu-ți aparține. 344 00:14:30,470 --> 00:14:34,390 Și cel mai rău caz, dacă vă suprascrie că Partea roșu acolo că am numit 345 00:14:34,390 --> 00:14:35,380 reveni adresa - 346 00:14:35,380 --> 00:14:38,370 aceasta este doar în cazul în care computerul în mod automat, pentru tine, în spatele 347 00:14:38,370 --> 00:14:43,130 scene, inveleste departe o valoare pe 32 de biți, care amintește-l la ce adresă ar trebui 348 00:14:43,130 --> 00:14:47,080 se întoarcă atunci când foo, această altă funcție, se face executare. 349 00:14:47,080 --> 00:14:49,320 Este un miez de pâine de felul la care se întoarce. 350 00:14:49,320 --> 00:14:52,490 Dacă vă suprascrie care, potențial, dacă tu ești tipul rău, poate ar putea 351 00:14:52,490 --> 00:14:54,750 ar putea prelua computerul cuiva. 352 00:14:54,750 --> 00:14:58,020 Și veți mai sigur prăbuși l în cele mai multe cazuri. 353 00:14:58,020 --> 00:15:01,690 >> Acum, această problemă a fost doar exacerbată așa cum am început să vorbim despre memorie 354 00:15:01,690 --> 00:15:03,010 management general. 355 00:15:03,010 --> 00:15:07,150 Și malloc, pentru alocarea de memorie, este un Funcția pe care le putem folosi pentru a aloca 356 00:15:07,150 --> 00:15:11,260 de memorie atunci când nu știm în avans pe care am putea avea nevoie de ceva. 357 00:15:11,260 --> 00:15:13,960 Deci, de exemplu, dacă mă duc înapoi a aparatului aici. 358 00:15:13,960 --> 00:15:21,010 Și am deschis de la ultima hello2.c timp, amintesc acest program de aici, care a analizat 359 00:15:21,010 --> 00:15:23,500 ceva ca aceasta, doar trei linii - 360 00:15:23,500 --> 00:15:27,940 Spuneți-vă numele, apoi numele șir, pe stânga, egal getstring. 361 00:15:27,940 --> 00:15:29,690 Și apoi l-am imprimați, numele utilizatorului. 362 00:15:29,690 --> 00:15:31,170 >> Deci asta a fost un program foarte simplu. 363 00:15:31,170 --> 00:15:34,870 Pentru a fi clar, lasă-mă să merg mai departe și să salut-2. 364 00:15:34,870 --> 00:15:36,680 Am de gând să fac dot slash salut-2. 365 00:15:36,680 --> 00:15:37,750 Spuneți-vă numele - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Bună David. 369 00:15:39,540 --> 00:15:41,060 Se pare că funcționează bine. 370 00:15:41,060 --> 00:15:43,140 Dar ce se întâmplă cu adevărat pe sub capota aici? 371 00:15:43,140 --> 00:15:44,670 În primul rând haideți să coaja înapoi câteva straturi. 372 00:15:44,670 --> 00:15:48,380 String este doar un sinonim ne-am a dat seama pentru ce? 373 00:15:48,380 --> 00:15:49,110 Stele char. 374 00:15:49,110 --> 00:15:52,740 Deci, haideți să-l un pic mai Arcane dar mai corect punct de vedere tehnic că această 375 00:15:52,740 --> 00:15:55,570 este o stea char, ceea ce înseamnă că numele, da, este o variabilă. 376 00:15:55,570 --> 00:15:59,920 Dar ceea ce magazine nume este adresa de un caracter, care se simte un pic ciudat 377 00:15:59,920 --> 00:16:01,050 pentru că mă întorc un șir. 378 00:16:01,050 --> 00:16:03,580 Primesc inapoi multiple caractere nu un char. 379 00:16:03,580 --> 00:16:07,400 >> Dar, desigur, ai nevoie doar de prima adresa lui Char să-și amintească unde 380 00:16:07,400 --> 00:16:08,870 șir întreg se datorează faptului că de ce? 381 00:16:08,870 --> 00:16:12,700 Cum iti dai seama unde la sfârșitul anului șirul este cunoașterea început? 382 00:16:12,700 --> 00:16:13,630 Zero backslash. 383 00:16:13,630 --> 00:16:17,260 Deci, cu aceste două indicii îți dai seama înainte de începutul și sfârșitul 384 00:16:17,260 --> 00:16:20,280 orice șir sunt, atât timp cât acestea sunt corespunzător format cu care nul 385 00:16:20,280 --> 00:16:22,110 terminator, care la zero backslash. 386 00:16:22,110 --> 00:16:24,520 >> Dar acest lucru este de asteptare getstring. 387 00:16:24,520 --> 00:16:28,020 Și se pare că getstring în tot acest timp a fost un fel de 388 00:16:28,020 --> 00:16:28,820 inseala pentru noi. 389 00:16:28,820 --> 00:16:32,460 A făcut acest lucru, pentru a fi sigur, obținerea unui șir de la utilizator. 390 00:16:32,460 --> 00:16:34,580 Dar unde-i că memoria au venit de la? 391 00:16:34,580 --> 00:16:38,440 Dacă ne întoarcem la imaginea de aici și se aplică definiția de la doar o 392 00:16:38,440 --> 00:16:42,610 în urmă clipă, că stiva este cazul Memoria merge atunci când funcțiile sunt numite, 393 00:16:42,610 --> 00:16:45,370 prin care logica, atunci când apelați getstring, și apoi am tastați 394 00:16:45,370 --> 00:16:50,900 D-O-V-I-D Se precizează, dacă este D-A-V-I-D backslash zero, stocate, bazată pe 395 00:16:50,900 --> 00:16:53,480 Povestea ne-am ne-a spus acum? 396 00:16:53,480 --> 00:16:55,190 >> S-ar părea să fie în stiva, nu? 397 00:16:55,190 --> 00:16:58,120 Atunci când apelați obține șir veți obține o felie de memorie pe stiva. 398 00:16:58,120 --> 00:17:01,630 Deci, este evident motivul pentru care D-A-V-I-D este stocat backslash la zero 399 00:17:01,630 --> 00:17:02,770 acolo în stivă. 400 00:17:02,770 --> 00:17:07,680 Dar stai un minut, getstring revine că șir, ca să spunem așa, ceea ce înseamnă 401 00:17:07,680 --> 00:17:11,700 e tava de la cantina este luat de pe stivă. 402 00:17:11,700 --> 00:17:14,560 Și am spus data trecută că de îndată ce un returnează funcția, și vă voi lua ca 403 00:17:14,560 --> 00:17:20,109 tavă, ca să spunem așa, de pe stiva, ceea ce puteți asuma despre resturile de 404 00:17:20,109 --> 00:17:21,819 că memoria? 405 00:17:21,819 --> 00:17:25,160 Am un fel de ele redesenat ca semne de întrebare deoarece ele devin în mod eficient 406 00:17:25,160 --> 00:17:26,250 Valorile necunoscute. 407 00:17:26,250 --> 00:17:29,500 Ele pot fi refolosite atunci când unele Funcția următoare este numit. 408 00:17:29,500 --> 00:17:31,870 >> Cu alte cuvinte, dacă se întâmplă să fie stocarea - 409 00:17:31,870 --> 00:17:34,350 Voi desena o imagine rapidă aici a stivei. 410 00:17:34,350 --> 00:17:38,690 Dacă se întâmplă să fie de desen în partea de jos din segmentul meu de memorie, și vom spune 411 00:17:38,690 --> 00:17:42,230 că acesta este locul de memorie ocupate de principal și poate arg c și 412 00:17:42,230 --> 00:17:46,790 arg V și orice altceva în program, atunci când getstring este numit, 413 00:17:46,790 --> 00:17:51,120 probabil getstring devine o bucată de memorie aici. 414 00:17:51,120 --> 00:17:53,940 Apoi D-A-V-I-D cumva ajunge în această funcție. 415 00:17:53,940 --> 00:17:55,320 Și am de gând să simplificăm. 416 00:17:55,320 --> 00:18:00,050 Dar să presupunem că ei D-A-V-I-D backslash zero. 417 00:18:00,050 --> 00:18:03,500 Deci, acest lucru de multe biți sunt utilizate în cadru pentru getstring. 418 00:18:03,500 --> 00:18:08,270 >> Dar, de îndată ce se întoarce getstring, am a spus ultima oară că această memorie peste 419 00:18:08,270 --> 00:18:11,340 aici totul devine - woops! - 420 00:18:11,340 --> 00:18:14,270 totul devine șterse în mod eficient. 421 00:18:14,270 --> 00:18:17,220 Și ne putem gândi la asta acum ca întrebare semne că cine știe 422 00:18:17,220 --> 00:18:18,720 ce va deveni din ce memorie. 423 00:18:18,720 --> 00:18:22,130 Într-adevăr, eu numesc foarte des funcții altele decât getstring. 424 00:18:22,130 --> 00:18:24,750 Și, de îndată ce eu numesc un alt Funcția de getstring, poate nu în 425 00:18:24,750 --> 00:18:28,860 acest program special, ne-am uitat la, dar pentru alte, cu siguranță o altă 426 00:18:28,860 --> 00:18:34,180 Funcția s-ar putea sfârși prin a fi dat acest loc viitoare în stivă. 427 00:18:34,180 --> 00:18:39,410 >> Deci, nu se poate ca magazinele getstring D-A-V-I-D de pe stiva pentru că mi-ar 428 00:18:39,410 --> 00:18:41,040 pierde imediat acces la ea. 429 00:18:41,040 --> 00:18:43,720 Dar noi știm că ele getstring returnează numai ce? 430 00:18:43,720 --> 00:18:47,220 Nu este revenirea la ma șase caractere. 431 00:18:47,220 --> 00:18:51,090 Ceea ce este cu adevărat revenirea a putem concluziona ultima dată? 432 00:18:51,090 --> 00:18:52,480 Adresa primului. 433 00:18:52,480 --> 00:18:56,650 Deci într-un fel, când ai sunat getstring, este alocarea unui segment de memorie pentru 434 00:18:56,650 --> 00:18:59,620 șir că utilizatorii de tip și adresa apoi se întorc din el. 435 00:18:59,620 --> 00:19:02,930 Și se pare că atunci când doriți să funcționeze de a aloca memorie în acest 436 00:19:02,930 --> 00:19:08,390 cale și a reveni la persoana care a sunat că funcția, adresa 437 00:19:08,390 --> 00:19:11,870 ca segment de memorie, vă absolut nu se poate pune în stivă la 438 00:19:11,870 --> 00:19:14,750 partea de jos, pentru ca funcțional este doar de gând să nu devină a ta foarte 439 00:19:14,750 --> 00:19:17,800 rapid, astfel încât să puteți ghici, probabil, în cazul în care Probabil suntem de gând să-l arunce 440 00:19:17,800 --> 00:19:20,130 în schimb, așa-numitul grămadă. 441 00:19:20,130 --> 00:19:25,290 >> Deci, între partea de jos a memoriei dumneavoastră structura și partea de sus a memoriei dumneavoastră 442 00:19:25,290 --> 00:19:26,820 layout-ul sunt o grămadă de segmente. 443 00:19:26,820 --> 00:19:29,270 Unul este stiva, și dreapta de mai sus este grămadă. 444 00:19:29,270 --> 00:19:33,680 Și grămadă este doar o bucată diferit de memorie care nu este utilizată pentru funcțiile de 445 00:19:33,680 --> 00:19:34,770 atunci când acestea sunt numite. 446 00:19:34,770 --> 00:19:38,100 Este folosit pentru memoria pe termen lung, atunci când vrei o funcție pentru a apuca unele 447 00:19:38,100 --> 00:19:42,700 memorie și să fie capabil să stea pe ea fără a pierde controlul asupra acesteia. 448 00:19:42,700 --> 00:19:45,550 >> Acum, ai putea, probabil, imediat vedea că acest lucru nu este 449 00:19:45,550 --> 00:19:48,060 neapărat un design perfect. 450 00:19:48,060 --> 00:19:51,350 Ca programul de memorie alocată pe stiva, sau ca te sun mai mult și 451 00:19:51,350 --> 00:19:55,540 mai multe funcții, sau ca tine aloca memorie pe heap cu malloc off ca 452 00:19:55,540 --> 00:20:00,690 getstring este de a face, ceea ce în mod clar pare a fi o problemă inevitabilă? 453 00:20:00,690 --> 00:20:00,860 >> Dreapta. 454 00:20:00,860 --> 00:20:03,150 Cum ar fi faptul că aceste săgeți sunt orientate unul spre altul 455 00:20:03,150 --> 00:20:04,380 nu este de bun augur. 456 00:20:04,380 --> 00:20:08,630 Și într-adevăr, am putea prăbuși foarte repede un program în orice număr de moduri. 457 00:20:08,630 --> 00:20:12,050 De fapt, cred că am putea avea făcut acest lucru accidental o dată. 458 00:20:12,050 --> 00:20:14,020 Sau, dacă nu, să o facem în mod deliberat acum. 459 00:20:14,020 --> 00:20:21,330 Lasă-mă să merg mai departe și scrie foarte repede un program numit dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Și acum voi merge în aici și nu ascuțite includ stdio.h. 461 00:20:26,730 --> 00:20:32,620 Să declare funcția de foo are nici un argument, care este 462 00:20:32,620 --> 00:20:34,040 notat de asemenea de gol. 463 00:20:34,040 --> 00:20:37,830 >> Și singurul lucru foo este de gând să faceți este să apel foo, care, probabil, nu este 464 00:20:37,830 --> 00:20:39,100 mai deștept ideea, dar așa să fie. 465 00:20:39,100 --> 00:20:40,490 Ent principal nule. 466 00:20:40,490 --> 00:20:45,270 Acum, singurul lucru principal se va să faceți este să sunați foo, de asemenea. 467 00:20:45,270 --> 00:20:51,050 Și doar pentru lovituri, am de gând să merg mai departe aici și spune printf "Bună ziua de la 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 Deci, dacă nu am face orice greșeli, Face dontdothis punct slash. 471 00:21:00,160 --> 00:21:01,960 Și să o facem într-o fereastră mai mare - 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 Haide. 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 Aparent, puteți face acest lucru. 478 00:21:13,100 --> 00:21:15,190 La naiba. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Așteaptă. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Am - 483 00:21:18,270 --> 00:21:20,110 Noi l-am folosi cu face. 484 00:21:20,110 --> 00:21:22,050 >> [Sighs] 485 00:21:22,050 --> 00:21:25,110 >> Știu, dar cred că doar șterse care. 486 00:21:25,110 --> 00:21:28,410 Uh, da. 487 00:21:28,410 --> 00:21:30,660 La naiba. 488 00:21:30,660 --> 00:21:32,640 Rezolva acest Rob. 489 00:21:32,640 --> 00:21:34,678 Ce? 490 00:21:34,678 --> 00:21:35,928 Este foarte simplu. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Da, ne-am întors de optimizare off. 493 00:21:47,360 --> 00:21:48,970 OK, stau la revedere. 494 00:21:48,970 --> 00:21:49,950 Acum mă simt mai bine. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Bine. 497 00:21:51,780 --> 00:21:53,430 >> Așa că haideți să recompilați acest lucru - 498 00:21:53,430 --> 00:21:55,880 Asigurați-vă dontdothis. 499 00:21:55,880 --> 00:22:00,090 S-ar putea avea pentru a redenumi acest lucru dothis.c într-o clipă. 500 00:22:00,090 --> 00:22:00,710 Acolo mergem. 501 00:22:00,710 --> 00:22:01,240 Mulțumesc. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Deci, faptul că am fost de imprimare ceva a fost de fapt doar 504 00:22:05,480 --> 00:22:08,150 încetinirea procesului prin care ar fi ajuns la acel punct. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Pfiu! 507 00:22:08,870 --> 00:22:11,180 >> Deci, ce se întâmplă de fapt pe? 508 00:22:11,180 --> 00:22:14,440 Motivul pentru care există, la fel cum o parte, este fac nimic în termeni de intrare și 509 00:22:14,440 --> 00:22:17,270 ieșire tinde să fie mai lent, deoarece Trebuie să scrie caractere pentru a 510 00:22:17,270 --> 00:22:18,600 ecran, are pentru a defila. 511 00:22:18,600 --> 00:22:21,720 Deci, pe scurt, a avut de fapt am sa întâmplat atât de nerăbdător, am avea 512 00:22:21,720 --> 00:22:23,260 văzut acest rezultat final, de asemenea. 513 00:22:23,260 --> 00:22:26,220 Acum, că am plimbare de imprimare-up-uri, vom vedea imediat. 514 00:22:26,220 --> 00:22:28,410 Deci, de ce se întâmplă asta. 515 00:22:28,410 --> 00:22:31,300 Ei bine, explicația simplă, desigur, este că foo, probabil, nu ar trebui 516 00:22:31,300 --> 00:22:32,500 fi de asteptare sine. 517 00:22:32,500 --> 00:22:34,470 >> Acum, în termeni generali, aceasta este recursivă. 518 00:22:34,470 --> 00:22:36,970 Și ne-am gândit de câteva săptămâni în urmă recursiv este bun. 519 00:22:36,970 --> 00:22:40,330 Recursivitatea este în acest fel magic de te exprima foarte succint. 520 00:22:40,330 --> 00:22:41,400 Și pur și simplu funcționează. 521 00:22:41,400 --> 00:22:45,060 Dar există o caracteristică cheie a tuturor programele recursive care am vorbit 522 00:22:45,060 --> 00:22:48,260 despre și se uită la până acum, care a fost că au avut ce? 523 00:22:48,260 --> 00:22:52,610 Un caz de bază, care a fost un greu codificate cazul în care a spus, în anumite situații 524 00:22:52,610 --> 00:22:56,210 nu suna foo, care este în mod clar nu este cazul aici. 525 00:22:56,210 --> 00:22:58,920 >> Deci, ce se întâmplă cu adevărat în ceea ce privește această imagine? 526 00:22:58,920 --> 00:23:01,790 Ei bine, atunci când principalul numește foo, se devine o felie de memorie. 527 00:23:01,790 --> 00:23:04,150 Când foo numește foo, acesta devine o felie de memorie. 528 00:23:04,150 --> 00:23:06,430 Când foo numește foo, acesta devine o felie. 529 00:23:06,430 --> 00:23:07,080 Ea devine o felie. 530 00:23:07,080 --> 00:23:08,120 Ea devine o felie. 531 00:23:08,120 --> 00:23:09,460 Deoarece foo nu se întoarce. 532 00:23:09,460 --> 00:23:12,160 Noi nu suntem ștergerea unul dintre cei cadre din stivă. 533 00:23:12,160 --> 00:23:15,930 Deci, suntem suflare prin grămadă, nu pentru a menționa cine știe ce altceva, și 534 00:23:15,930 --> 00:23:19,600 vom depăși limitele noastre așa-numita segment de memorie. 535 00:23:19,600 --> 00:23:21,790 Eroare merge segmentare false. 536 00:23:21,790 --> 00:23:24,110 >> Deci, soluția este în mod evident, nu face asta. 537 00:23:24,110 --> 00:23:28,830 Dar implicația mai mare este că, da, există absolut unele limite, 538 00:23:28,830 --> 00:23:32,470 chiar dacă nu este bine definit, cu privire la modul multe funcții, puteți apela la un 539 00:23:32,470 --> 00:23:34,970 Programul, de câte ori o funcție se poate apela. 540 00:23:34,970 --> 00:23:38,430 Deci, chiar dacă am făcut predica recursivitate ca acest lucru ar putea magic o 541 00:23:38,430 --> 00:23:41,870 câteva săptămâni în urmă pentru sigma funcția, și când vom obține date 542 00:23:41,870 --> 00:23:45,270 structuri și CS50, veți vedea alte aplicații pentru ea, nu e 543 00:23:45,270 --> 00:23:46,500 neapărat cel mai bun lucru. 544 00:23:46,500 --> 00:23:50,070 Pentru că dacă o funcție în sine numește, apeluri în sine, chiar dacă există o bază 545 00:23:50,070 --> 00:23:54,860 caz, dacă nu a lovit acest caz de bază pentru 1.000 de apeluri sau 10.000 de apeluri, prin 546 00:23:54,860 --> 00:23:58,800 atunci este posibil să fi rămas fără cameră pe așa-zisa ta stivă și a lovit 547 00:23:58,800 --> 00:24:00,400 alte segmente de memorie. 548 00:24:00,400 --> 00:24:03,950 Deci, acesta este de asemenea un design de compromis între eleganță și între 549 00:24:03,950 --> 00:24:06,920 robustețea special dvs. punere în aplicare. 550 00:24:06,920 --> 00:24:10,780 >> Deci, există un alt dezavantaj sau un alt prins la ceea ce am 551 00:24:10,780 --> 00:24:11,720 făcut până acum. 552 00:24:11,720 --> 00:24:12,980 Când am sunat getstring - 553 00:24:12,980 --> 00:24:15,120 lasă-mă să mă întorc la salut-2. 554 00:24:15,120 --> 00:24:18,170 Observați că am sunat getstring, care se întoarce o adresă. 555 00:24:18,170 --> 00:24:20,730 Și am pretind astăzi că adresa este din morman. 556 00:24:20,730 --> 00:24:24,480 Și acum am imprimarea șir la acea adresa. 557 00:24:24,480 --> 00:24:27,000 Dar nu am numit vizavi de getstring. 558 00:24:27,000 --> 00:24:30,850 Noi nu am avut de a calll o funcție ca ungetstring, în cazul în care mâna înapoi 559 00:24:30,850 --> 00:24:31,610 că memoria. 560 00:24:31,610 --> 00:24:33,250 Dar sincer am, probabil, ar fi fost. 561 00:24:33,250 --> 00:24:37,390 Pentru că dacă ne tot întreabă pe calculator pentru memorie, cu titlu de cineva ca 562 00:24:37,390 --> 00:24:40,830 getstring dar nu-l dau înapoi, cu siguranță care este de asemenea obligat să ducă la 563 00:24:40,830 --> 00:24:42,970 problemele prin care am alerga afară de memorie. 564 00:24:42,970 --> 00:24:46,140 >> Și, de fapt, ne putem uita la aceste probleme cu nou instrument a cărui utilizare 565 00:24:46,140 --> 00:24:47,640 este un pic criptic de tip. 566 00:24:47,640 --> 00:24:50,960 Dar lasă-mă să merg mai departe și stropiți-l pe ecran în doar o clipă. 567 00:24:50,960 --> 00:24:56,940 Am de gând să merg mai departe și a alerga Valgrind cu parametrul a carui prima comanda 568 00:24:56,940 --> 00:25:00,260 Argumentul linie este numele din care programul de salut-2. 569 00:25:00,260 --> 00:25:02,650 Și, din păcate, este de ieșire este atroce 570 00:25:02,650 --> 00:25:04,290 complex pentru nici un motiv bun. 571 00:25:04,290 --> 00:25:06,280 Deci, vom vedea tot ce mizerie. 572 00:25:06,280 --> 00:25:07,530 David este un stat numele meu. 573 00:25:07,530 --> 00:25:09,760 Deci asta e programul de fapt de funcționare. 574 00:25:09,760 --> 00:25:11,180 Și acum avem această ieșire. 575 00:25:11,180 --> 00:25:13,400 >> Deci Valgrind este similară în spirit de GDB. 576 00:25:13,400 --> 00:25:14,950 Nu este un program de depanare în sine. 577 00:25:14,950 --> 00:25:16,270 Dar este un verificator de memorie. 578 00:25:16,270 --> 00:25:20,140 Este un program care va rula dvs. programa și să vă spun dacă ați întrebat o 579 00:25:20,140 --> 00:25:23,860 calculator de memorie și nu-l predat înapoi, astfel ceea ce înseamnă că aveți 580 00:25:23,860 --> 00:25:24,570 o scurgere de memorie. 581 00:25:24,570 --> 00:25:26,240 Și pierderi de memorie tind să fie rău. 582 00:25:26,240 --> 00:25:29,120 Și tu este utilizatorii de calculatoare au probabil simțit acest lucru, dacă aveți un 583 00:25:29,120 --> 00:25:30,300 Mac sau un PC. 584 00:25:30,300 --> 00:25:33,730 Ați folosit vreodata computerul pentru timp și nu repornită în mai multe 585 00:25:33,730 --> 00:25:36,820 zile, sau tocmai ai primit o mulțime de programele care rulează, și nimic 586 00:25:36,820 --> 00:25:42,360 încetinește la o oprire măcinare, sau cel puțin este foarte enervant de a utiliza, deoarece 587 00:25:42,360 --> 00:25:44,350 tot ceea ce tocmai a fost foarte lent. 588 00:25:44,350 --> 00:25:46,260 >> Acum, că poate fi orice număr de motive. 589 00:25:46,260 --> 00:25:49,600 Ar putea fi o buclă infinită, un bug în Codul cuiva, sau, mai simplu, ea 590 00:25:49,600 --> 00:25:53,250 ar putea însemna că utilizați mai mult memorie, sau încercarea de a, decât dvs. 591 00:25:53,250 --> 00:25:54,920 calculator de fapt are. 592 00:25:54,920 --> 00:25:57,770 Și poate că e un bug într-un program de că tot întreabă de memorie. 593 00:25:57,770 --> 00:26:02,480 Browsere de ani, au fost cunoscute pentru acest lucru, cere pentru mai mult și mai mult memorie 594 00:26:02,480 --> 00:26:03,870 dar nu-l predarea înapoi. 595 00:26:03,870 --> 00:26:07,220 Cu siguranță, dacă aveți doar un finit cantitatea de memorie, nu poți cere 596 00:26:07,220 --> 00:26:09,990 infinit de multe ori pentru unele dintre care memorie. 597 00:26:09,990 --> 00:26:13,070 >> Și astfel ceea ce vedeți aici, chiar dacă din nou ieșire Valgrind este 598 00:26:13,070 --> 00:26:17,490 inutil de complexă a privi la în primul rând, aceasta este partea interesantă. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 în utilizare la ieșire. 601 00:26:20,060 --> 00:26:22,810 Deci, aici este cantitatea de memorie a fost în uz în grămadă, la 602 00:26:22,810 --> 00:26:24,300 timp programul meu a ieșit - 603 00:26:24,300 --> 00:26:27,280 aparent șase octeți într-un bloc. 604 00:26:27,280 --> 00:26:28,710 Așa că am de gând să val mâinile mele la ceea ce un bloc este. 605 00:26:28,710 --> 00:26:31,270 Gândiți-vă de ea este doar o bucată, o mai cuvânt tehnic pentru bucată. 606 00:26:31,270 --> 00:26:33,140 Dar șase bytes - 607 00:26:33,140 --> 00:26:36,870 care sunt cele șase octeți care erau încă în uz? 608 00:26:36,870 --> 00:26:37,390 >> Exact. 609 00:26:37,390 --> 00:26:41,520 D-O-V-I-D backslash la zero, cinci litere Numele plus nul Terminator. 610 00:26:41,520 --> 00:26:46,350 Deci, acest program de Valgrind observat că am a cerut timp de șase bytes, se pare, de 611 00:26:46,350 --> 00:26:48,950 mod de getstring, dar nu le-a dat înapoi. 612 00:26:48,950 --> 00:26:52,030 Și, de fapt, aceasta ar putea să nu fie atât de evident, în cazul în care programul meu nu este de trei 613 00:26:52,030 --> 00:26:53,590 linii, dar este de 300 de linii. 614 00:26:53,590 --> 00:26:56,920 Deci, putem da de fapt, o altă comandă argument linie de Valgrind la 615 00:26:56,920 --> 00:26:58,290 face mai detaliată. 616 00:26:58,290 --> 00:26:59,760 Este un pic enervant să-și amintească. 617 00:26:59,760 --> 00:27:01,580 Dar dacă fac - 618 00:27:01,580 --> 00:27:01,930 să vedem. 619 00:27:01,930 --> 00:27:03,540 Leak - 620 00:27:03,540 --> 00:27:05,030 A fost scurgeri - 621 00:27:05,030 --> 00:27:07,580 chiar nu-mi amintesc ceea ce este oprit manual. 622 00:27:07,580 --> 00:27:08,550 >> - Scurgeri de verificare egal plin. 623 00:27:08,550 --> 00:27:10,180 Da, mulțumesc. 624 00:27:10,180 --> 00:27:12,520 - Scurgeri de verificare egal plin. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Același program se execută. 627 00:27:14,940 --> 00:27:16,180 Tastați în David din nou. 628 00:27:16,180 --> 00:27:17,660 Acum, văd un pic mai în detaliu. 629 00:27:17,660 --> 00:27:20,890 Dar sub rezumat grămadă, care este identic cu patru - ah, 630 00:27:20,890 --> 00:27:22,120 aceasta este un fel de frumos. 631 00:27:22,120 --> 00:27:25,460 Acum Valgrind este, de fapt în căutarea un pic mai greu în codul meu. 632 00:27:25,460 --> 00:27:29,580 Și se spune că, aparent, malloc la linie - 633 00:27:29,580 --> 00:27:30,580 am micșora. 634 00:27:30,580 --> 00:27:31,980 La linie - 635 00:27:31,980 --> 00:27:32,930 nu vedem ce linie este. 636 00:27:32,930 --> 00:27:35,110 Dar malloc este primul vinovat. 637 00:27:35,110 --> 00:27:38,630 Există un blog în malloc. 638 00:27:38,630 --> 00:27:39,810 >> În regulă? 639 00:27:39,810 --> 00:27:40,450 OK, nu. 640 00:27:40,450 --> 00:27:40,940 Dreapta? 641 00:27:40,940 --> 00:27:42,520 Am sunat getstring. 642 00:27:42,520 --> 00:27:44,460 getstring pare că apelurile malloc. 643 00:27:44,460 --> 00:27:47,800 Deci, ceea ce este aparent linie de cod de vina pentru a avea 644 00:27:47,800 --> 00:27:49,050 alocate această memorie? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Să presupunem că cine a scris malloc a fost în jurul suficient de mult timp că este 647 00:27:55,540 --> 00:27:56,390 nu este vina lor. 648 00:27:56,390 --> 00:27:57,520 Deci, este, probabil, a mea. 649 00:27:57,520 --> 00:28:02,000 getstring în cs50.c - pentru ca este o depună undeva pe computer - 650 00:28:02,000 --> 00:28:05,210 în linie 286 pare a fi vinovat. 651 00:28:05,210 --> 00:28:08,140 Acum, să presupunem că CS50 a fost în jurul valorii de cantitate decenta de timp, astfel încât 652 00:28:08,140 --> 00:28:09,720 noi suntem infailibili. 653 00:28:09,720 --> 00:28:14,080 Și deci nu este, probabil, în getstring că bug-ul se afla, ci mai degrabă în 654 00:28:14,080 --> 00:28:17,810 linie de salut-2.c 18. 655 00:28:17,810 --> 00:28:20,670 >> Deci, haideți să aruncăm o privire la ceea ce a fost ca linia 18. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Într-un fel această linie nu este neapărat buggy, în sine, dar acesta este motivul 658 00:28:27,130 --> 00:28:28,630 spatele scurgere de memorie. 659 00:28:28,630 --> 00:28:32,140 Deci super-pur și simplu, ceea ce ar fi intuitiv fi soluția aici? 660 00:28:32,140 --> 00:28:34,710 Dacă cerem de memorie, nu au fost niciodată dându-i înapoi, și care pare a fi o 661 00:28:34,710 --> 00:28:37,940 problema, deoarece a lungul timpului computerul meu s-ar putea alerga afară de memorie, s-ar putea încetini 662 00:28:37,940 --> 00:28:42,110 jos, lucruri rele s-ar putea întâmpla, de asemenea, ceea ce este o solutie simpla intuitiv? 663 00:28:42,110 --> 00:28:43,140 Dă-l înapoi. 664 00:28:43,140 --> 00:28:44,770 >> Cum te elibera acea memorie? 665 00:28:44,770 --> 00:28:49,970 Ei bine, din fericire este destul de simplu a spus numele gratuit. 666 00:28:49,970 --> 00:28:51,260 Și n-am mai făcut asta înainte. 667 00:28:51,260 --> 00:28:55,890 Dar vă puteți gândi în esență, de fără ca opusul malloc. 668 00:28:55,890 --> 00:28:58,030 gratuit este opusul alocarea de memorie. 669 00:28:58,030 --> 00:28:59,540 Deci, acum lasă-mă să recompilați asta. 670 00:28:59,540 --> 00:29:02,050 Face salut-2. 671 00:29:02,050 --> 00:29:04,620 Lasă-mă să-l rulați din nou. salut-2 David. 672 00:29:04,620 --> 00:29:07,290 Deci, se pare să funcționeze în exact în același mod. 673 00:29:07,290 --> 00:29:11,180 Dar dacă mă întorc la Valgrind și re-rula că aceeași comandă pe nou-mea 674 00:29:11,180 --> 00:29:14,720 compilat programul, dactilografiere în numele meu ca înainte - 675 00:29:14,720 --> 00:29:15,370 frumos. 676 00:29:15,370 --> 00:29:16,760 Sumar Heap - 677 00:29:16,760 --> 00:29:17,740 în utilizare la ieșire - 678 00:29:17,740 --> 00:29:19,370 octeți zero în blocuri zero. 679 00:29:19,370 --> 00:29:21,840 Și acest lucru este foarte frumos, toate blocuri grămadă au fost eliberați. 680 00:29:21,840 --> 00:29:23,480 Nu sunt posibile scurgeri. 681 00:29:23,480 --> 00:29:27,200 >> Deci, venind, nu cu un set Problema 4, dar cu Set Problema 5, criminalistica 682 00:29:27,200 --> 00:29:30,740 și mai departe, și aceasta va deveni o măsură de corectitudinea dvs. 683 00:29:30,740 --> 00:29:33,630 Programul, indiferent dacă sau nu aveți sau nu au pierderi de memorie. 684 00:29:33,630 --> 00:29:36,900 Dar din fericire, nu numai că puteți raționa prin ei intuitiv, care 685 00:29:36,900 --> 00:29:40,430 este, fără îndoială, ușor pentru programe mici dar mai greu pentru programe mari, 686 00:29:40,430 --> 00:29:43,860 Valgrind, pentru aceste programe mari, vă poate ajuta să identificați 687 00:29:43,860 --> 00:29:45,360 problemă deosebită. 688 00:29:45,360 --> 00:29:47,500 >> Dar există o altă problemă care ar putea apărea. 689 00:29:47,500 --> 00:29:51,245 Lasă-mă să deschid acest fișier aici, care este, din nou, un exemplu oarecum simplu. 690 00:29:51,245 --> 00:29:53,760 Dar să ne concentrăm pe ceea ce acest program nu. 691 00:29:53,760 --> 00:29:55,190 Aceasta se numește memory.c. 692 00:29:55,190 --> 00:29:58,380 Vom posta acest astăzi, mai târziu, în zip de cod sursă de astăzi. 693 00:29:58,380 --> 00:30:01,610 Și observa că am o funcție numită f care nu ia argumente și 694 00:30:01,610 --> 00:30:02,800 returneaza nimic. 695 00:30:02,800 --> 00:30:07,240 În linia 20, eu sunt aparent declararea pointer la un int și numindu-l x. 696 00:30:07,240 --> 00:30:09,570 Sunt atribuirea este revenirea Valoarea de malloc. 697 00:30:09,570 --> 00:30:14,590 Și ca să fie clar, cât de multe bytes sunt Probabil că mă întorc de la malloc 698 00:30:14,590 --> 00:30:17,080 în această situație? 699 00:30:17,080 --> 00:30:18,040 >> Probabil 40. 700 00:30:18,040 --> 00:30:18,840 De unde ai scos asta? 701 00:30:18,840 --> 00:30:22,410 Ei bine, dacă vă amintiți că un int este de multe ori 4 bytes, cel puțin acesta este în 702 00:30:22,410 --> 00:30:25,110 Aparatul, de 10 ori 4 este, evident, 40. 703 00:30:25,110 --> 00:30:28,920 Deci, malloc se intoarce o adresa de o bucată de memorie și stocare care 704 00:30:28,920 --> 00:30:30,800 abordeze în cele din urmă în x. 705 00:30:30,800 --> 00:30:32,570 Astfel încât să fie clar, ceea ce atunci se întâmplă? 706 00:30:32,570 --> 00:30:34,990 Ei bine, lasă-mă să comutați înapoi pentru imaginea noastră aici. 707 00:30:34,990 --> 00:30:38,150 Permiteți-mi să nu trage doar partea de jos a mea memoria calculatorului, lasă-mă să merg mai departe și 708 00:30:38,150 --> 00:30:42,990 trage tot dreptunghi care reprezinta toate de RAM meu. 709 00:30:42,990 --> 00:30:44,790 >> Vom spune că stiva este pe partea de jos. 710 00:30:44,790 --> 00:30:47,010 Și există un segment de text în datele neinițializate. 711 00:30:47,010 --> 00:30:49,880 Dar eu sunt doar de gând să celor abstract alte lucruri pe departe la fel de dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Mă voi referi la această ca grămadă în partea de sus. 713 00:30:53,470 --> 00:30:57,070 Și apoi în partea de jos a acestui tablou, să reprezinte principala, am de gând 714 00:30:57,070 --> 00:30:59,880 să-i dea o memorie felii pe stivă. 715 00:30:59,880 --> 00:31:03,150 Pentru f, am de gând să-i dea o felie de memorie pe stiva. 716 00:31:03,150 --> 00:31:05,140 Acum, am să consulte mea codul sursă din nou. 717 00:31:05,140 --> 00:31:07,170 Care sunt variabilele locale de principal? 718 00:31:07,170 --> 00:31:10,710 Aparent nimic, astfel încât felie este eficient gol sau nu chiar la fel de mare 719 00:31:10,710 --> 00:31:11,600 așa cum l-am desenat. 720 00:31:11,600 --> 00:31:15,730 Dar, în f, am o variabilă locală, care se numește x. 721 00:31:15,730 --> 00:31:20,410 Așa că am de gând să merg mai departe și să f o bucată de memorie, numindu-l x. 722 00:31:20,410 --> 00:31:24,680 >> Și acum malloc de 10 ori 4, Deci malloc 40, unde e 723 00:31:24,680 --> 00:31:25,430 memorie vine de la? 724 00:31:25,430 --> 00:31:27,530 Noi nu am desenat o imagine înainte ca aceasta. 725 00:31:27,530 --> 00:31:31,140 Dar să presupunem că este eficient vine de aici, așa unul, 726 00:31:31,140 --> 00:31:33,170 doi, trei, patru, cinci. 727 00:31:33,170 --> 00:31:34,680 Și acum am nevoie de 40 dintre acestea. 728 00:31:34,680 --> 00:31:37,540 Așa că voi face doar punct, punct, punct care să sugereze că există chiar mai mult memorie 729 00:31:37,540 --> 00:31:39,350 întorc din zona de lucru. 730 00:31:39,350 --> 00:31:40,710 Acum, ceea ce este adresa? 731 00:31:40,710 --> 00:31:42,620 Să alegem arbitrar nostru abordeze ca întotdeauna - 732 00:31:42,620 --> 00:31:46,310 Ox123, chiar dacă este probabil că va să fie ceva complet diferit. 733 00:31:46,310 --> 00:31:50,420 Asta e adresa primului octet din de memorie pe care am cer malloc pentru. 734 00:31:50,420 --> 00:31:53,630 >> Deci, în linie scurt, o dată 20 execută, ceea ce este literalmente 735 00:31:53,630 --> 00:31:57,170 stocate în interiorul de x aici? 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 Și Ox este neinteresant. 739 00:32:01,550 --> 00:32:03,200 Aceasta înseamnă doar aici este o număr hexazecimal. 740 00:32:03,200 --> 00:32:06,490 Dar ceea ce este esențial este că ceea ce am magazin în x, care este o variabilă locală. 741 00:32:06,490 --> 00:32:10,260 Dar tipul de date, din nou, este o adresă de un int. 742 00:32:10,260 --> 00:32:12,710 Ei bine, am de gând pentru a stoca Ox123. 743 00:32:12,710 --> 00:32:16,610 Dar, din nou, în cazul în care este un pic prea complicat inutil, dacă am defila 744 00:32:16,610 --> 00:32:21,490 înapoi, putem abstract această distanță destul de rezonabil și să spun doar că x este o 745 00:32:21,490 --> 00:32:23,910 pointer la acea bucată de memorie. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Acum, întrebarea la mână este următoarea - 748 00:32:26,230 --> 00:32:29,910 linia 21, se pare, este buggy. 749 00:32:29,910 --> 00:32:31,160 De ce? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Îmi pare rău? 752 00:32:36,930 --> 00:32:38,640 Ea nu are - 753 00:32:38,640 --> 00:32:40,390 spune că o dată mai mult. 754 00:32:40,390 --> 00:32:41,240 Ei bine, nu gratuit. 755 00:32:41,240 --> 00:32:42,350 Deci, asta e de-a doua, dar. 756 00:32:42,350 --> 00:32:45,000 Deci, există un alt dar special la linia 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Exact. 759 00:32:50,040 --> 00:32:54,980 Această simplă linie de cod este doar o buffer overflow, o depășire tampon. 760 00:32:54,980 --> 00:32:57,050 Un tampon înseamnă doar o bucată de memorie. 761 00:32:57,050 --> 00:33:01,520 Dar că segment de memorie este de dimensiune 10, 10 numere întregi, ceea ce înseamnă că dacă 762 00:33:01,520 --> 00:33:05,350 index în ea folosind zahăr sintactic de notație matrice, pătrat 763 00:33:05,350 --> 00:33:09,220 paranteze, aveți acces la x suport 0 x suport 1 x, 764 00:33:09,220 --> 00:33:10,390 Suport punct, punct, punct. 765 00:33:10,390 --> 00:33:13,270 x suport 9 este cel mai mare. 766 00:33:13,270 --> 00:33:17,680 Deci, dacă am face x suport 10, în cazul în care Sunt de fapt merge în memorie? 767 00:33:17,680 --> 00:33:19,120 >> Ei bine, dacă am 10 Int - 768 00:33:19,120 --> 00:33:21,070 să atragă de fapt, toate de astea aici. 769 00:33:21,070 --> 00:33:22,700 Astfel că a fost primul cinci. 770 00:33:22,700 --> 00:33:24,660 Iată celelalte cinci int. 771 00:33:24,660 --> 00:33:29,580 Deci x suport 0 este aici. x suport 1 este aici. x suport 9 este aici. x suport 772 00:33:29,580 --> 00:33:37,960 10 este aici, ceea ce înseamnă că spun, în linia 21, calculatorul pentru a pune 773 00:33:37,960 --> 00:33:39,400 Numărul unde? 774 00:33:39,400 --> 00:33:42,010 Numărul 0 unde? 775 00:33:42,010 --> 00:33:43,380 Ei bine, e 0, da. 776 00:33:43,380 --> 00:33:45,460 Ci doar faptul că 0 său este un fel de coincidență. 777 00:33:45,460 --> 00:33:47,140 Acesta ar putea fi numărul 50, pentru toate ne pasă. 778 00:33:47,140 --> 00:33:50,480 Dar noi încercăm să-l pună la x suport 10, care este în cazul în care acest lucru 779 00:33:50,480 --> 00:33:53,700 semn de întrebare este tras, care nu este un lucru bun. 780 00:33:53,700 --> 00:33:57,070 Acest program ar putea foarte bine prăbuși ca un rezultat. 781 00:33:57,070 --> 00:33:59,400 >> Acum, să mergem mai departe și să vedem dacă acest lucru este, într-adevăr, ceea ce se întâmplă. 782 00:33:59,400 --> 00:34:02,600 Face de memorie, deoarece fișierul se numește memory.c. 783 00:34:02,600 --> 00:34:05,950 Să mergem mai departe și a alerga memoria program. 784 00:34:05,950 --> 00:34:08,239 Așa că am avut noroc, de fapt, se pare. 785 00:34:08,239 --> 00:34:09,340 Am avut noroc. 786 00:34:09,340 --> 00:34:11,060 Dar să vedem dacă vom rula acum Valgrind. 787 00:34:11,060 --> 00:34:14,170 La prima vedere, programul meu s-ar putea par a fi perfect corect. 788 00:34:14,170 --> 00:34:18,010 Dar permiteți-mi să ruleze Valgrind cu - Scurgeri de verificare egal plin de pe memorie. 789 00:34:18,010 --> 00:34:20,110 >> Iar acum, când am rula acest - 790 00:34:20,110 --> 00:34:21,030 interesant. 791 00:34:21,030 --> 00:34:26,800 Invalid scrie de dimensiune 4 la Linia 21 de memory.c. 792 00:34:26,800 --> 00:34:29,284 Linia 21 de memory.c este care unul? 793 00:34:29,284 --> 00:34:30,340 Oh, interesant. 794 00:34:30,340 --> 00:34:31,080 Dar așteptați. 795 00:34:31,080 --> 00:34:32,389 Dimensiunea 4, ceea ce este ca referindu-se la? 796 00:34:32,389 --> 00:34:34,969 Eu doar am o scrie, dar este de dimensiune 4. 797 00:34:34,969 --> 00:34:36,889 De ce este 4? 798 00:34:36,889 --> 00:34:39,280 Este pentru că este un int, care este, din nou, patru bytes. 799 00:34:39,280 --> 00:34:42,510 Deci, Valgrind găsit un bug care am, uite la codul meu, nu. 800 00:34:42,510 --> 00:34:45,040 Și poate TF ta ar fi sau nu ar fi. 801 00:34:45,040 --> 00:34:48,469 Ce Dar Valgrind pentru sigur constatat că am făcut o greșeală acolo, chiar 802 00:34:48,469 --> 00:34:52,719 deși am avut noroc, iar computerul a decis, nu-i așa, nu am de gând să se prăbușească 803 00:34:52,719 --> 00:34:57,470 doar pentru că ai atins un octet, o valoare Int de memorie care nu 804 00:34:57,470 --> 00:34:58,550 de fapt propriu. 805 00:34:58,550 --> 00:35:00,380 >> Ei bine, ce altceva este buggy aici. 806 00:35:00,380 --> 00:35:01,180 Adresa - 807 00:35:01,180 --> 00:35:03,190 aceasta este o adresă în căutarea nebun în hexazecimal. 808 00:35:03,190 --> 00:35:06,890 Asta înseamnă că undeva în grămadă este octeți zero, după un bloc de dimensiune 40 809 00:35:06,890 --> 00:35:07,620 este alocat. 810 00:35:07,620 --> 00:35:10,610 Lasă-mă să micșorați aici și vezi dacă acest lucru este un pic mai util. 811 00:35:10,610 --> 00:35:11,410 Interesant. 812 00:35:11,410 --> 00:35:15,600 40 bytes sunt cu siguranta pierdut în evidență pierdere 1 din 1. 813 00:35:15,600 --> 00:35:17,840 Din nou, mai multe cuvinte decât este util aici. 814 00:35:17,840 --> 00:35:21,350 Dar bazate pe liniile evidențiate, unde ar trebui să se concentreze, probabil mea 815 00:35:21,350 --> 00:35:24,070 atenție pentru un alt bug? 816 00:35:24,070 --> 00:35:26,570 Se pare ca o linie de 20 de memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Deci, dacă ne întoarcem la linia 20, care este unul care ați identificat mai devreme. 818 00:35:30,990 --> 00:35:33,030 Și nu este neapărat buggy. 819 00:35:33,030 --> 00:35:35,160 Dar am această inversat efectele sale. 820 00:35:35,160 --> 00:35:38,790 Deci, cum pot corecta cel puțin una dintre aceste greșeli? 821 00:35:38,790 --> 00:35:42,240 Ce aș putea face după linia 21? 822 00:35:42,240 --> 00:35:47,110 Am putea face fără a x, deci este pentru a da înapoi ca memoria. 823 00:35:47,110 --> 00:35:49,230 Și cum pot rezolva această problemă? 824 00:35:49,230 --> 00:35:52,120 Eu ar trebui să meargă cu siguranta nu mai departe decât 0. 825 00:35:52,120 --> 00:35:53,670 Deci, lasă-mă să încerc și re-rula acest lucru. 826 00:35:53,670 --> 00:35:56,080 Ne pare rău, du-te cu siguranta nu mai departe decât 9. 827 00:35:56,080 --> 00:35:57,510 Face memorie. 828 00:35:57,510 --> 00:36:00,650 Lasă-mă să reluare Valgrind într-o fereastră mai mare. 829 00:36:00,650 --> 00:36:01,580 Și acum uite. 830 00:36:01,580 --> 00:36:02,250 Frumos. 831 00:36:02,250 --> 00:36:03,270 Toate blocurile grămadă fost eliberați. 832 00:36:03,270 --> 00:36:04,270 Nu sunt posibile scurgeri. 833 00:36:04,270 --> 00:36:07,520 Și deasupra aici, nu e nici o mențiune mai mult de drept invalid. 834 00:36:07,520 --> 00:36:09,820 >> Doar pentru a obține lacomi, și hai să vedea dacă o altă demonstrație 835 00:36:09,820 --> 00:36:11,050 nu merge așa cum este prevăzut - 836 00:36:11,050 --> 00:36:12,560 Eu am noroc acum o clipă. 837 00:36:12,560 --> 00:36:15,530 Și faptul că aceasta este 0 este probabil inutil înșelătoare. 838 00:36:15,530 --> 00:36:20,650 Hai să facem doar 50, o oarecum arbitrară număr, face memorie punct memorie slash - 839 00:36:20,650 --> 00:36:21,410 încă avea noroc. 840 00:36:21,410 --> 00:36:22,510 Nimic nu crashing. 841 00:36:22,510 --> 00:36:26,150 Să presupunem că am face ceva cu adevărat prostesc, iar eu fac 100. 842 00:36:26,150 --> 00:36:30,360 Permiteți-mi refac memoria, dot memorie slash - 843 00:36:30,360 --> 00:36:31,075 am din nou noroc. 844 00:36:31,075 --> 00:36:32,800 Ce zici de 1.000 de? 845 00:36:32,800 --> 00:36:35,370 int dincolo de, aproximativ, unde ar trebui să fiu? 846 00:36:35,370 --> 00:36:37,410 Face memorie - 847 00:36:37,410 --> 00:36:38,570 la naiba. 848 00:36:38,570 --> 00:36:39,920 >> [Râsete] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Să nu mai mizerie în jurul valorii. 851 00:36:43,920 --> 00:36:45,120 Reluare de memorie. 852 00:36:45,120 --> 00:36:45,840 Acolo mergem. 853 00:36:45,840 --> 00:36:46,410 Bine. 854 00:36:46,410 --> 00:36:52,500 Deci, se pare că tu indicele 100.000 int dincolo de cazul în care ar fi fost în 855 00:36:52,500 --> 00:36:54,410 memorie, se întâmplă lucruri rele. 856 00:36:54,410 --> 00:36:56,430 Astfel încât aceasta nu este în mod evident o regulă tare, repede. 857 00:36:56,430 --> 00:36:58,190 Am fost un fel de a folosi proces și eroare pentru a ajunge acolo. 858 00:36:58,190 --> 00:37:02,230 Dar acest lucru se datorează faptului că, pe scurt, memoria computerului este, de asemenea, divizat 859 00:37:02,230 --> 00:37:03,580 în aceste lucruri numite segmente. 860 00:37:03,580 --> 00:37:07,260 Și, uneori, computerul de fapt, a dat un pic mai mult memorie 861 00:37:07,260 --> 00:37:08,400 decât vă întreb pentru. 862 00:37:08,400 --> 00:37:12,170 Dar, pentru eficiență, este mai ușor să obține mai mult de memorie, dar vă spun doar 863 00:37:12,170 --> 00:37:13,780 că vei primi o parte din ea. 864 00:37:13,780 --> 00:37:16,370 >> Și dacă ai noroc, uneori, prin urmare, s-ar putea fi capabil de a atinge 865 00:37:16,370 --> 00:37:17,795 memorie care nu-ți aparține. 866 00:37:17,795 --> 00:37:21,860 Nu ai nici o garanție că ceea ce valoare ai pus acolo va rămâne acolo, pentru că 867 00:37:21,860 --> 00:37:25,080 calculatorul încă crede că nu este a ta, dar nu este neapărat va 868 00:37:25,080 --> 00:37:29,910 a lovit un alt segment de memorie în calculator și induce o greșeală ca 869 00:37:29,910 --> 00:37:31,710 asta aici. 870 00:37:31,710 --> 00:37:32,060 Bine. 871 00:37:32,060 --> 00:37:37,240 Orice întrebări, atunci pe memorie? 872 00:37:37,240 --> 00:37:37,590 >> Bine. 873 00:37:37,590 --> 00:37:40,610 Să aruncăm o privire aici, apoi, la ceva ce ne-am luat pentru 874 00:37:40,610 --> 00:37:48,361 acordată de ceva timp, care este în acest fișier numit cs50.h. 875 00:37:48,361 --> 00:37:49,420 Deci, acesta este un fișier. 876 00:37:49,420 --> 00:37:51,130 Acestea sunt doar o grămadă de comentarii sus. 877 00:37:51,130 --> 00:37:53,900 Și este posibil să fi uitat la acest lucru în cazul în care ai bagat în jurul pe aparat. 878 00:37:53,900 --> 00:37:57,000 Dar se pare că tot timpul, când am folosit pentru a folosi ca un șir 879 00:37:57,000 --> 00:38:01,130 sinonim, mijloacele prin care a declarat că a fost sinonim cu acest 880 00:38:01,130 --> 00:38:03,990 cuvinte cheie typedef, pentru definirea de tip. 881 00:38:03,990 --> 00:38:07,500 Și suntem în esență spune, face string un sinonim pentru stele char. 882 00:38:07,500 --> 00:38:11,190 Că mijloacele prin care stivă a creat aceste roți de formare cunoscut sub numele de 883 00:38:11,190 --> 00:38:12,040 șir. 884 00:38:12,040 --> 00:38:14,830 >> Acum, aici e doar un prototip pentru getchar. 885 00:38:14,830 --> 00:38:17,350 S-ar putea l-am văzut mai înainte, dar asta e într-adevăr ceea ce face. getchar 886 00:38:17,350 --> 00:38:19,070 ia nici un argument, returnează un char. 887 00:38:19,070 --> 00:38:21,340 getdouble ia nici un argument, returnează o dublă. 888 00:38:21,340 --> 00:38:24,440 getfloat nevoie de nici un argument, se întoarce un float, și așa mai departe. 889 00:38:24,440 --> 00:38:27,270 getint este aici. getlonglong este aici. 890 00:38:27,270 --> 00:38:28,820 Și getstring este aici. 891 00:38:28,820 --> 00:38:29,420 Și asta e tot. 892 00:38:29,420 --> 00:38:33,080 Această linie violet este un alt preprocesor Directiva din cauza 893 00:38:33,080 --> 00:38:35,550 hashtag de la începutul ei. 894 00:38:35,550 --> 00:38:35,870 >> Bine. 895 00:38:35,870 --> 00:38:38,380 Deci, acum lasă-mă să merg în cs50.c. 896 00:38:38,380 --> 00:38:40,400 Și nu vom vorbi prea mult pe acest lucru. 897 00:38:40,400 --> 00:38:43,280 Dar pentru a vă oferi o idee de ceea ce este fost întâmplă toate astea 898 00:38:43,280 --> 00:38:46,434 timp, lasă-mă să merg la - 899 00:38:46,434 --> 00:38:48,250 hai sa facem getchar. 900 00:38:48,250 --> 00:38:51,050 Deci, getchar este cea mai mare parte comentarii. 901 00:38:51,050 --> 00:38:52,060 Dar se pare ca aceasta. 902 00:38:52,060 --> 00:38:54,800 Deci, aceasta este funcția propriu-zisă getchar că am fost 903 00:38:54,800 --> 00:38:56,055 ia pentru a acordat exista. 904 00:38:56,055 --> 00:38:59,370 Și, chiar dacă nu ne-am folosi aceasta care de multe ori, dacă vreodată, este cel puțin 905 00:38:59,370 --> 00:39:00,470 relativ simplu. 906 00:39:00,470 --> 00:39:02,580 Deci, este în valoare de a lua o privire rapidă la aici. 907 00:39:02,580 --> 00:39:06,540 >> Deci, getchar are o bucla infinita, în mod deliberat atât de aparent. 908 00:39:06,540 --> 00:39:10,050 Apoi cheamă - și acest lucru este un fel de reutilizarea frumos de cod ne-am scris. 909 00:39:10,050 --> 00:39:11,220 Acesta solicită getstring. 910 00:39:11,220 --> 00:39:12,460 Pentru că ceea ce face înseamnă a obține un caracter? 911 00:39:12,460 --> 00:39:14,730 Ei bine, ai putea încerca la fel de bine pentru a obține o întreaga linie de text din partea utilizatorului și 912 00:39:14,730 --> 00:39:16,940 apoi uita-te la un de aceste caractere. 913 00:39:16,940 --> 00:39:19,170 În linia 60, aici e un pic bit de un control bun-simț. 914 00:39:19,170 --> 00:39:21,610 Dacă getstring întors nul, Să nu continua. 915 00:39:21,610 --> 00:39:22,820 Ceva a mers prost. 916 00:39:22,820 --> 00:39:28,120 >> Acum, acest lucru este oarecum enervant, dar convențional în C. char max, probabil, 917 00:39:28,120 --> 00:39:29,960 reprezintă ceea ce tocmai bazat pe numele său? 918 00:39:29,960 --> 00:39:31,670 Este o constantă. 919 00:39:31,670 --> 00:39:36,040 E ca și cum valoarea numerică a Cea mai mare char puteți reprezenta cu 920 00:39:36,040 --> 00:39:40,370 unul musca, care este, probabil, numărul 255, care este cel mai mare număr de tine 921 00:39:40,370 --> 00:39:42,720 reprezintă opt biți, pornind de la zero. 922 00:39:42,720 --> 00:39:47,460 Deci, am folosi acest, în această funcție, atunci când scris acest cod, numai pentru că 923 00:39:47,460 --> 00:39:51,753 în cazul în care ceva nu merge bine în getchar, dar scopul său în viață este de a returna o 924 00:39:51,753 --> 00:39:54,830 char, trebuie să fie cumva capabil să semnaleze utilizatorul care 925 00:39:54,830 --> 00:39:55,840 ceva a mers prost. 926 00:39:55,840 --> 00:39:56,970 Nu ne putem intoarce null. 927 00:39:56,970 --> 00:39:58,480 Se pare că nul este un pointer. 928 00:39:58,480 --> 00:40:01,030 Și din nou, getchar are pentru a reveni un char. 929 00:40:01,030 --> 00:40:04,760 >> Deci convenție, în cazul în care ceva nu merge greșit, este tu, programator, sau în 930 00:40:04,760 --> 00:40:08,160 acest caz, eu cu biblioteca, am avut o doar decide în mod arbitrar, în cazul în care 931 00:40:08,160 --> 00:40:12,230 ceva nu merge bine, am de gând să returneaza numarul 255, care este cu adevărat 932 00:40:12,230 --> 00:40:17,240 înseamnă că nu se poate, utilizatorul nu poate introduce caracterul reprezentat de 933 00:40:17,240 --> 00:40:21,410 numărul 255 pentru că am avut o fura ca un așa-numita valoare santinelă la 934 00:40:21,410 --> 00:40:23,410 reprezintă o problemă. 935 00:40:23,410 --> 00:40:27,010 Acum se dovedește că personajul 255 nu este ceva ce se poate introduce pe 936 00:40:27,010 --> 00:40:28,380 tastatură, asa ca nu e mare lucru. 937 00:40:28,380 --> 00:40:30,910 Utilizatorul nu observă că Am furat acest personaj. 938 00:40:30,910 --> 00:40:34,620 Dar dacă ați vedea vreodată în paginile de om pe o sistem informatic unii referire la un 939 00:40:34,620 --> 00:40:38,560 toate capacele constant ca asta, care spune, în cazul unor erori această putere constantă 940 00:40:38,560 --> 00:40:42,720 fi returnate, asta e tot un om a făcut cu ani în urmă a fost arbitrar a decis să 941 00:40:42,720 --> 00:40:45,680 returna această valoare deosebită și numesc o constantă în cazul în care 942 00:40:45,680 --> 00:40:46,840 ceva nu merge bine. 943 00:40:46,840 --> 00:40:48,580 >> Acum, magia se intampla aici. 944 00:40:48,580 --> 00:40:52,600 În primul rând, am declarat în linie 67 două personaje, C1 și C2. 945 00:40:52,600 --> 00:40:57,080 Și apoi în linie 68, nu există de fapt o linie de cod care este o reminiscență a 946 00:40:57,080 --> 00:41:01,140 prietenul nostru printf, având în vedere că are la suta Cs în ghilimele. 947 00:41:01,140 --> 00:41:06,490 Dar observați ce se întâmplă aici. sscanf înseamnă scanare string - 948 00:41:06,490 --> 00:41:11,690 înseamnă scana o formatat șir, sscanf Ergo. 949 00:41:11,690 --> 00:41:12,590 Ce înseamnă asta? 950 00:41:12,590 --> 00:41:16,310 Aceasta înseamnă că trece la sscanf un șir. 951 00:41:16,310 --> 00:41:18,420 Și linia este indiferent utilizatorul tastează inch 952 00:41:18,420 --> 00:41:23,520 Tu treci la sscanf un șir format ca aceasta spune că scanf care sunt 953 00:41:23,520 --> 00:41:25,870 Speri utilizatorul a tastat inch 954 00:41:25,870 --> 00:41:29,730 Apoi trece-in adresele de două bucăți de memorie, în acest caz, 955 00:41:29,730 --> 00:41:31,150 pentru că am doi substituenți. 956 00:41:31,150 --> 00:41:34,610 Așa că am de gând să-i dea adresa C1 și C2 adresa. 957 00:41:34,610 --> 00:41:37,700 >> Și amintesc că vă dau o funcție Adresa de unele variabile, ceea ce este 958 00:41:37,700 --> 00:41:38,950 implicația? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Ce se poate face, care funcționează ca un rezultat de a da o adresă a unui 961 00:41:45,050 --> 00:41:48,170 variabilă, spre deosebire de variabila în sine? 962 00:41:48,170 --> 00:41:49,450 Se poate schimba, nu? 963 00:41:49,450 --> 00:41:53,250 Dacă ați avut cineva o hartă a unui fizic adresa, ei pot merge acolo și de a face 964 00:41:53,250 --> 00:41:54,750 ceea ce isi doresc de la acea adresa. 965 00:41:54,750 --> 00:41:55,800 Aceeași idee aici. 966 00:41:55,800 --> 00:41:59,950 Dacă trecem la sscanf, adresa de doi bucăți de memorie, chiar și aceste mici 967 00:41:59,950 --> 00:42:03,585 bucăți mici de memorie, C1 și C2, dar ne spun că adresa lor, 968 00:42:03,585 --> 00:42:05,170 sscanf se poate schimba. 969 00:42:05,170 --> 00:42:08,530 >> Deci, scopul sscanf în viață, dacă citim pagina de om, este de a citi ceea ce 970 00:42:08,530 --> 00:42:13,420 utilizatorul tastat în, speranță pentru ca utilizatorul tastat într-un caracter și poate 971 00:42:13,420 --> 00:42:16,470 un alt personaj, și indiferent de utilizator tastat, primul caracter se 972 00:42:16,470 --> 00:42:19,310 aici, al doilea caracter merge aici. 973 00:42:19,310 --> 00:42:22,470 Acum, ca o paranteza, aceasta, și v-ar știu numai aceasta din documentația, 974 00:42:22,470 --> 00:42:25,570 faptul că am pus un spatiu gol acolo înseamnă doar că nu-mi pasă dacă 975 00:42:25,570 --> 00:42:28,440 utilizatorul lovește bara de spațiu câteva ori înainte de el sau ea are o 976 00:42:28,440 --> 00:42:30,400 caracter, am de gând să ignore orice spațiu alb. 977 00:42:30,400 --> 00:42:32,510 Așa că, eu știu de la documentația. 978 00:42:32,510 --> 00:42:36,570 >> Faptul că există o a doua% c urmat de spațiu alb este de fapt 979 00:42:36,570 --> 00:42:37,410 deliberat. 980 00:42:37,410 --> 00:42:41,190 Vreau să fie capabil să detecteze dacă utilizatorul greșit sau nu au cooperat. 981 00:42:41,190 --> 00:42:45,630 Deci, eu sunt în speranța că singurul utilizator tastat într-un singur caracter, de aceea sper 982 00:42:45,630 --> 00:42:50,640 care sscanf este doar de gând să se întoarcă valoarea 1, deoarece, din nou, în cazul în care am citit 983 00:42:50,640 --> 00:42:55,400 documentația, scopul sscanf în viață este de a reveni la numărul de 984 00:42:55,400 --> 00:42:59,170 variabile care au fost completate cu intrare de utilizator. 985 00:42:59,170 --> 00:43:02,270 >> Am trecut în două variabile adrese, C1 și C2. 986 00:43:02,270 --> 00:43:06,420 Sper, totuși, că doar unul dintre le este ucis pentru că dacă sscanf 987 00:43:06,420 --> 00:43:11,130 se întoarce 2, ceea ce este probabil implicarea logic? 988 00:43:11,130 --> 00:43:14,600 Că utilizatorul nu da-mi un personaj ca i-am spus sau ea. 989 00:43:14,600 --> 00:43:17,860 Probabil au tastat la cel puțin două caractere. 990 00:43:17,860 --> 00:43:22,430 Deci, dacă am loc nu am avut de-a doua % C, am avut una, care 991 00:43:22,430 --> 00:43:25,370 sincer ar fi mai intuitiv abordare, cred ca o prima vedere, 992 00:43:25,370 --> 00:43:30,220 nu sunteți de gând să fie în măsură să detecteze În cazul în care utilizatorul a fost oferindu-vă mai mult 993 00:43:30,220 --> 00:43:31,780 intrare decât ai vrut de fapt. 994 00:43:31,780 --> 00:43:34,100 Deci, aceasta este o formă implicită de verificarea erorilor. 995 00:43:34,100 --> 00:43:35,640 >> Dar observați ce fac aici. 996 00:43:35,640 --> 00:43:39,970 După ce am Sunt sigur că utilizatorul mi-a dat un caracter, am elibera linia, face 997 00:43:39,970 --> 00:43:44,450 opusă getstring, care la rândul său utilizează malloc, și apoi mă voi întoarce 998 00:43:44,450 --> 00:43:51,030 C1, personajul pe care am sperat utilizator oferit si numai cu conditia. 999 00:43:51,030 --> 00:43:54,680 Deci, un rapid zărit numai, dar întrebări cu privire la getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vom reveni la unii dintre ceilalți. 1002 00:43:59,590 --> 00:44:03,770 >> Ei bine, lasă-mă să merg mai departe și de a face acest lucru - Presupun că acum, doar pentru a motiva nostru 1003 00:44:03,770 --> 00:44:08,910 discuție într-o săptămână, plus timp, acest este un fișier numit structs.h. 1004 00:44:08,910 --> 00:44:11,440 Și din nou, acest lucru este doar un gust de ceva ce se află în fața. 1005 00:44:11,440 --> 00:44:13,090 Dar observați că o mulțime în acest sens este comentarii. 1006 00:44:13,090 --> 00:44:17,440 Deci, permiteți-mi să subliniez doar Partea interesanta pentru acum. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 există din nou același cuvânt cheie. 1009 00:44:19,700 --> 00:44:23,100 typedef le folosim pentru a declara șir ca un tip de date special. 1010 00:44:23,100 --> 00:44:27,490 Puteți folosi typedef pentru a crea nou tipuri de date care nu existau atunci când 1011 00:44:27,490 --> 00:44:28,570 C a fost inventat. 1012 00:44:28,570 --> 00:44:32,520 De exemplu, int vine cu C. char vine cu C. dublu vine cu C. Dar 1013 00:44:32,520 --> 00:44:34,000 nu exista nici o noțiune de un student. 1014 00:44:34,000 --> 00:44:37,230 Și totuși, ar fi destul de util pentru a fi capabil să scrie un program care stochează 1015 00:44:37,230 --> 00:44:40,440 într-o variabilă, număr de identificare unui student, numele lor, și casa lor. 1016 00:44:40,440 --> 00:44:42,890 Cu alte cuvinte, trei piese de date, cum ar fi un int și un 1017 00:44:42,890 --> 00:44:44,420 șir și un alt șir. 1018 00:44:44,420 --> 00:44:48,220 >> Cu typedef, ceea ce e destul de puternic despre acest lucru și sturct cuvinte cheie pentru 1019 00:44:48,220 --> 00:44:53,660 structura, tu, programator în 2013, se poate defini de fapt, propriul 1020 00:44:53,660 --> 00:44:57,530 tipuri de date care nu existau ani în urmă, dar care se potrivesc scopuri. 1021 00:44:57,530 --> 00:45:01,910 Și atât de aici, în liniile 13 și 19, ne declara un nou tip de date, cum ar fi 1022 00:45:01,910 --> 00:45:04,320 un int, dar numindu-l elev. 1023 00:45:04,320 --> 00:45:09,310 Iar în interiorul acestei variabile se va fi trei lucruri - un int, un șir, 1024 00:45:09,310 --> 00:45:09,930 și un șir. 1025 00:45:09,930 --> 00:45:13,040 Deci, vă puteți gândi la ceea ce este cu adevărat sa întâmplat aici, chiar dacă aceasta este o 1026 00:45:13,040 --> 00:45:17,160 bit de o simplificare pentru ziua de azi, un student este, în esență va 1027 00:45:17,160 --> 00:45:19,450 pentru a arata ca aceasta. 1028 00:45:19,450 --> 00:45:22,580 Sa mergi la a fi o bucată de memorie cu o identitate, un nume 1029 00:45:22,580 --> 00:45:25,580 teren, și un teren casă. 1030 00:45:25,580 --> 00:45:30,670 Și vom putea folosi aceste bucăți de memorie și accesați-le, după cum urmează. 1031 00:45:30,670 --> 00:45:38,870 >> Dacă mă duc în struct0.c, aici este o relativ lung, dar ca urmare a unei 1032 00:45:38,870 --> 00:45:42,630 model, de cod care folosește acest nou truc. 1033 00:45:42,630 --> 00:45:45,790 Deci, în primul rând, permiteți-mi să vă atrag atenția de interesante piese de sus. 1034 00:45:45,790 --> 00:45:49,670 Sharp definește elevii 3, declară un constante numite studenți și atribuie 1035 00:45:49,670 --> 00:45:53,450 ea arbitrar numărul 3, doar așa că am trei elevi care utilizează 1036 00:45:53,450 --> 00:45:54,830 acest program pentru acum. 1037 00:45:54,830 --> 00:45:55,960 Aici vine principal. 1038 00:45:55,960 --> 00:45:58,860 Și de notificare, cum declar o serie de studenți? 1039 00:45:58,860 --> 00:46:00,480 Ei bine, am folosi doar aceeași sintaxă. 1040 00:46:00,480 --> 00:46:02,110 Studentul Cuvântul este, evident, nou. 1041 00:46:02,110 --> 00:46:04,790 Dar studenți, clasa, elevii suport. 1042 00:46:04,790 --> 00:46:06,720 >> Deci, din păcate, există o mulțime de reutilizare a termenilor aici. 1043 00:46:06,720 --> 00:46:07,660 Acesta este doar un număr. 1044 00:46:07,660 --> 00:46:09,040 Deci, acest lucru este ca și cum spune trei. 1045 00:46:09,040 --> 00:46:11,430 Class este exact ceea ce vreau pentru a apela variabila. 1046 00:46:11,430 --> 00:46:12,840 Am putea numi studenți. 1047 00:46:12,840 --> 00:46:15,880 Dar clasă, aceasta nu este o clasă într-un Orientată Obiect fel Java de drum. 1048 00:46:15,880 --> 00:46:17,220 E doar o clasă de elevi. 1049 00:46:17,220 --> 00:46:20,590 Și tipul de date de fiecare element în care matrice este elev. 1050 00:46:20,590 --> 00:46:23,040 Deci, acest lucru este un pic diferit și de a spune ceva 1051 00:46:23,040 --> 00:46:25,250 ca aceasta, e doar - 1052 00:46:25,250 --> 00:46:29,500 Eu spun da-mi trei elevi și apela clasa matrice. 1053 00:46:29,500 --> 00:46:29,800 >> Bine. 1054 00:46:29,800 --> 00:46:30,680 Acum, aici e un patru buclă. 1055 00:46:30,680 --> 00:46:33,480 Acest tip familiar - itera de la zero până la trei. 1056 00:46:33,480 --> 00:46:35,160 Și aici e noua piesa de sintaxă. 1057 00:46:35,160 --> 00:46:37,710 Programul mă va solicita, uman, pentru a da un elev 1058 00:46:37,710 --> 00:46:39,200 ID, care este un int. 1059 00:46:39,200 --> 00:46:44,650 Și aici e sintaxa cu care puteți stoca ceva în câmpul ID de la 1060 00:46:44,650 --> 00:46:48,630 Clasa de locație suport I. Deci, aceasta sintaxa nu este nouă. 1061 00:46:48,630 --> 00:46:51,450 Acest lucru înseamnă doar da-mi de-a opta elev în clasa. 1062 00:46:51,450 --> 00:46:52,940 Dar acest simbol este nou. 1063 00:46:52,940 --> 00:46:56,320 Până acum, ne-am nu pot fi folosite punct, cel puțin în codul ca aceasta. 1064 00:46:56,320 --> 00:47:01,490 Acest lucru înseamnă du-te la struct cunoscut sub numele de un elev și a pus ceva acolo. 1065 00:47:01,490 --> 00:47:05,670 De asemenea, în această linie viitoare, 31, du-te înainte și pune orice tipuri de utilizatori 1066 00:47:05,670 --> 00:47:10,530 pentru un nume aici, și ceea ce fac ei pentru o casă, același lucru, mergeți mai departe și 1067 00:47:10,530 --> 00:47:13,230 pune-l in. casă. 1068 00:47:13,230 --> 00:47:15,955 >> Deci, ce are acest program în cele din urmă face? 1069 00:47:15,955 --> 00:47:17,220 Puteti vedea un pic teaser acolo. 1070 00:47:17,220 --> 00:47:24,780 Lasă-mă să merg mai departe și fac structs 0 dot slash struct 0, ID-ul studentului 1, 1071 00:47:24,780 --> 00:47:28,250 spune David Mather, student ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 și singurul lucru pe care acest program a făcut, care este doar complet arbitrar, este 1075 00:47:38,380 --> 00:47:40,980 Am vrut să fac ceva cu aceste date, Acum, că am ne-a învățat cum să 1076 00:47:40,980 --> 00:47:43,450 folosi structs, doar am avut această buclă în plus aici. 1077 00:47:43,450 --> 00:47:45,260 Am repeta peste serie de studenți. 1078 00:47:45,260 --> 00:47:49,170 Am folosit noastră, prieten, probabil, acum familiar, string comparație, stircomp la 1079 00:47:49,170 --> 00:47:53,780 Verificarea este casa a 8-a elevului egală cu Mather? 1080 00:47:53,780 --> 00:47:56,760 Și dacă este așa, doar imprima ceva arbitrar ca, da, este. 1081 00:47:56,760 --> 00:47:59,430 Dar, din nou, doar să-mi dea oportunități la utilizarea și reutilizarea și 1082 00:47:59,430 --> 00:48:02,270 reutilizarea acest nou punct notație. 1083 00:48:02,270 --> 00:48:03,250 >> Deci cui îi pasă, nu? 1084 00:48:03,250 --> 00:48:06,270 Vine cu un program de elev este oarecum arbitrară, dar se pare 1085 00:48:06,270 --> 00:48:09,800 că putem face lucruri utile cu aceasta, de exemplu, după cum urmează. 1086 00:48:09,800 --> 00:48:14,600 Aceasta este o struct mult mai complicată în C. Are o duzină sau mai multe domenii, 1087 00:48:14,600 --> 00:48:15,880 oarecum criptic pe nume. 1088 00:48:15,880 --> 00:48:20,110 Dar, dacă ați auzit vreodată de o grafică format de fișier numit bitmap, BMP, ea 1089 00:48:20,110 --> 00:48:22,830 se dovedește că formatul de fișier de tip bitmap destul de mult pare că acest lucru. 1090 00:48:22,830 --> 00:48:24,200 Este un pic stupid fata zambitoare. 1091 00:48:24,200 --> 00:48:27,840 Este o imagine mică pe care le-am mărit pe destul de mare, așa că am putut vedea fiecare 1092 00:48:27,840 --> 00:48:30,410 din puncte individuale sau pixeli. 1093 00:48:30,410 --> 00:48:33,800 Acum, se pare că ne poate reprezenta un punct negru cu, să zicem, numărul 0. 1094 00:48:33,800 --> 00:48:35,520 Și un punct alb cu numărul 1. 1095 00:48:35,520 --> 00:48:39,140 >> Deci, cu alte cuvinte, dacă doriți să atragă un Smiley Face și a salva ca imagine într-un 1096 00:48:39,140 --> 00:48:42,680 calculator, este suficient pentru a stoca zerouri și cele care arata ca aceasta, în cazul în care, 1097 00:48:42,680 --> 00:48:45,250 din nou, sunt cele alb și zerouri sunt negre. 1098 00:48:45,250 --> 00:48:48,290 Și împreună, dacă aveți în mod eficient o încinge de unu și zero, aveți un 1099 00:48:48,290 --> 00:48:51,030 grila de pixeli, și dacă ați pune le, aveți un drăguț 1100 00:48:51,030 --> 00:48:52,560 mic fata zambitoare. 1101 00:48:52,560 --> 00:48:58,150 Acum, formatul de fișier bitmap, BMP, este în mod eficient ca sub capota, 1102 00:48:58,150 --> 00:49:00,970 dar cu mai mulți pixeli sot pe care le poate reprezenta de fapt culorile. 1103 00:49:00,970 --> 00:49:05,170 >> Dar atunci când aveți mai sofisticate formate de fișiere, cum ar fi BMP și JPEG și GIF 1104 00:49:05,170 --> 00:49:09,360 cu care s-ar putea să fie familiarizat, cele fișiere de obicei nu numai pe disc 1105 00:49:09,360 --> 00:49:13,760 au zerouri și cele de pixeli, dar ei au unele metadate, precum și - 1106 00:49:13,760 --> 00:49:16,960 meta, în sensul că nu este într-adevăr Datele dar este util de a avea. 1107 00:49:16,960 --> 00:49:21,370 Deci, aceste domenii sunt aici implică, și vom vedea acest lucru în mai multe detalii în P-set 1108 00:49:21,370 --> 00:49:25,810 5, că înainte de zerouri și cele care reprezintă pixelii dintr-o imagine, 1109 00:49:25,810 --> 00:49:29,110 există o grămadă de metadate cum ar fi dimensiunea imaginii și 1110 00:49:29,110 --> 00:49:30,250 lățimea imaginii. 1111 00:49:30,250 --> 00:49:32,910 Și observa eu ​​sunt jumulire pe unele lucruri arbitrare aici - 1112 00:49:32,910 --> 00:49:34,260 lățime și înălțime. 1113 00:49:34,260 --> 00:49:36,160 Numărul de biți și alte câteva lucruri. 1114 00:49:36,160 --> 00:49:37,840 Deci, există unele metadate într-un fișier. 1115 00:49:37,840 --> 00:49:41,470 >> Ci prin intelegerea modului sunt prevăzute fișiere în acest fel, aveți posibilitatea de fapt, 1116 00:49:41,470 --> 00:49:45,890 apoi manipula imagini, recupera imagini de disc, redimensiona imagini. 1117 00:49:45,890 --> 00:49:47,560 Dar nu poți neapărat spori ele. 1118 00:49:47,560 --> 00:49:48,480 Am nevoie de o fotografie. 1119 00:49:48,480 --> 00:49:52,840 Așa că m-am dus înapoi la RJ aici, care te-a văzut pe ecran destul de ceva timp în urmă. 1120 00:49:52,840 --> 00:49:57,160 Și dacă am deschide Keynote aici, acest lucru este ce se întâmplă dacă încercați să mări și 1121 00:49:57,160 --> 00:49:59,380 spori RJ. 1122 00:49:59,380 --> 00:50:01,480 El nu din ce in ce mai bine cu adevărat. 1123 00:50:01,480 --> 00:50:06,240 Acum Keynote este un fel de interferență o pic, doar pentru luciu peste 1124 00:50:06,240 --> 00:50:11,040 Faptul că RJ nu se deosebit de îmbunătățită atunci când zoom inch 1125 00:50:11,040 --> 00:50:13,310 Și dacă o fac în acest fel, vezi pătrate? 1126 00:50:13,310 --> 00:50:15,490 Da, puteți vedea cu siguranta pătrate pe un proiector. 1127 00:50:15,490 --> 00:50:17,690 >> Asta e ceea ce obții atunci când a spori. 1128 00:50:17,690 --> 00:50:22,570 Dar în înțelegerea modului în RJ nostru sau Smiley Face este implementat ne va permite 1129 00:50:22,570 --> 00:50:24,950 de fapt scrie cod care manipulează aceste lucruri. 1130 00:50:24,950 --> 00:50:29,970 Și am crezut că voi ajunge la această notă, cu 55 secunde de un spori, care este, 1131 00:50:29,970 --> 00:50:31,230 Eu îndrăznesc, spun destul de înșelătoare. 1132 00:50:31,230 --> 00:50:32,990 >> [Redare video] 1133 00:50:32,990 --> 00:50:34,790 >> -Minte. 1134 00:50:34,790 --> 00:50:38,310 Despre ce, nu știu. 1135 00:50:38,310 --> 00:50:41,200 >> -Deci, ce știm? 1136 00:50:41,200 --> 00:50:45,280 >> -Asta la 9:15 Ray Santoya a fost la ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Deci, întrebarea este de ce făcea la 09:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Impuscaturi nouă milimetri la ceva. 1139 00:50:50,750 --> 00:50:52,615 Poate că el a văzut pe lunetist. 1140 00:50:52,615 --> 00:50:54,760 >> -Sau a fost de lucru cu el. 1141 00:50:54,760 --> 00:50:56,120 >> -Așteaptă. 1142 00:50:56,120 --> 00:50:57,450 Du-te înapoi unul. 1143 00:50:57,450 --> 00:50:58,700 >> -Ce vrei sa vezi? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Adu fața în sus, ecran complet. 1146 00:51:09,490 --> 00:51:09,790 >> -Lui ochelari. 1147 00:51:09,790 --> 00:51:11,040 >> -E o reflexie. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Asta e echipa de baseball Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Asta e logo-ul lor. 1151 00:51:24,530 --> 00:51:27,040 >> -Și vorbește cu oricine e va purta sacoul. 1152 00:51:27,040 --> 00:51:27,530 >> [END redare video] 1153 00:51:27,530 --> 00:51:29,180 >> David J. MALAN: Aceasta va fi stabilit Problema 5. 1154 00:51:29,180 --> 00:51:30,720 Vă vom vedea săptămâna viitoare. 1155 00:51:30,720 --> 00:51:32,330 >> SPEAKER BĂRBAȚI: La CS50 următoare. 1156 00:51:32,330 --> 00:51:39,240 >> [Greierii ciripind] 1157 00:51:39,240 --> 00:51:41,270 >> [Redarea muzicii]