1 00:00:00,000 --> 00:00:11,242 >> [Redarea muzicii] 2 00:00:11,242 --> 00:00:16,630 >> David J. MALAN: Bine este CS50 iar acest lucru este începutul săptămânii cinci. 3 00:00:16,630 --> 00:00:21,480 Așa că astăzi, sub perne de siguranta, nu veți găsi nimic. 4 00:00:21,480 --> 00:00:24,790 Dar de mai sus, ar trebui să găsiți acestea, un mic semn al aprecierii noastre pentru 5 00:00:24,790 --> 00:00:26,970 toate lucrările pe care le pune în joc de cincisprezece. 6 00:00:26,970 --> 00:00:30,290 Pur și simplu scoateți cerc mic de pe partea de jos pentru a începe joaca pentru 7 00:00:30,290 --> 00:00:31,680 restul de clasă. 8 00:00:31,680 --> 00:00:38,930 >> Astfel amintesc că, sau știți că problema stabilit patru, care a mers în acest week-end, 9 00:00:38,930 --> 00:00:40,340 implică scris un alt joc. 10 00:00:40,340 --> 00:00:43,740 Dar de data aceasta implică utilizarea unui interfață grafică real, nu un 11 00:00:43,740 --> 00:00:46,310 interfață textuale cum ar fi Jocul a fost Cincisprezece. 12 00:00:46,310 --> 00:00:50,210 Și jocul care se află în fața ta, Dacă nu ați văzut încă acest viitor, 13 00:00:50,210 --> 00:00:52,310 arata ceva ca acesta. 14 00:00:52,310 --> 00:00:55,170 Am de gând să meargă în terminalul meu Fereastra aici, în GDB. 15 00:00:55,170 --> 00:00:58,600 Și am de gând să merg mai departe și să rulați Soluția de personal, pe care le puteți accesa 16 00:00:58,600 --> 00:01:01,010 , după care rulează actualizare 50 ca de obicei. 17 00:01:01,010 --> 00:01:04,090 >> Dar am de gând să-l pună într-o mică Modul secret, un pic de Paște ou, 18 00:01:04,090 --> 00:01:08,480 așa-numita modul Dumnezeu, prin pune Dumnezeu în argv1. 19 00:01:08,480 --> 00:01:12,920 Și trebuie să urmeze propriile mele direcții, care rulează în propria mea 20 00:01:12,920 --> 00:01:14,220 Problema stabilit director. 21 00:01:14,220 --> 00:01:19,190 Deci, acum veți vedea o versiune completă de joc de Breakout. 22 00:01:19,190 --> 00:01:21,090 De fapt, acesta este modul NO-mâinile. 23 00:01:21,090 --> 00:01:24,850 Deci, e de fapt - 24 00:01:24,850 --> 00:01:26,470 uimit, deși s-ar putea fi - 25 00:01:26,470 --> 00:01:30,850 destul de banal pentru a pune în aplicare modul lui Dumnezeu în Breakout, spre deosebire de jocuri de cincisprezece ani, 26 00:01:30,850 --> 00:01:33,590 pe care unii dintre voi ar putea fi abordate pentru ediția hacker. 27 00:01:33,590 --> 00:01:37,890 >> În Breakout este suficient în Dumnezeu modul de a face pur și simplu ceea ce, 28 00:01:37,890 --> 00:01:41,220 intuitiv cu zbaturi? 29 00:01:41,220 --> 00:01:45,630 Doar face egal, indiferent de Poziția orizontală este de minge. 30 00:01:45,630 --> 00:01:49,220 Și, atâta timp cât faci acest lucru în lockstep cu mingea se deplasează acest joc va 31 00:01:49,220 --> 00:01:53,100 niciodată, niciodată, niciodată dor de minge și veți câștiga de fiecare dată. 32 00:01:53,100 --> 00:01:55,430 >> Dar, în ediția hacker această săptămână nu e mai mult decât doar modul lui Dumnezeu. 33 00:01:55,430 --> 00:01:56,720 Există o serie de alte caracteristici. 34 00:01:56,720 --> 00:01:58,140 Dintre acestea, lasere. 35 00:01:58,140 --> 00:02:01,070 Așa că, dacă aveți cu adevărat nerăbdător te poate începe trage in jos cărămizi 36 00:02:01,070 --> 00:02:02,120 și alte câteva. 37 00:02:02,120 --> 00:02:04,560 Iar pentru cei dintre voi care ar dori să calibra standard, comparativ cu hacker 38 00:02:04,560 --> 00:02:08,750 ediție, eu pot vedea că această săptămână Ediția hacker în mod deliberat este o 39 00:02:08,750 --> 00:02:12,830 puțin mai greu de realizat, spune, decât Dumnezeu Modul fost cu joc de Cincisprezece. 40 00:02:12,830 --> 00:02:15,300 >> Deci, dacă sunteți în căutarea pentru o întindere și sunteți în căutarea pentru unele distractiv suplimentare 41 00:02:15,300 --> 00:02:18,400 Caracteristici sa se arunca cu capul în cazul în care de interes. 42 00:02:18,400 --> 00:02:21,280 Acum, mai practic, lasă-mă să subliniez de un singur lucru, de asemenea. 43 00:02:21,280 --> 00:02:24,780 GDB, pe care unii dintre voi nu poate avea încă atins personal, ceea ce este bine. 44 00:02:24,780 --> 00:02:28,530 Dar acum este într-adevăr timp să te obișnuiești la acest lucru și confortabil cu acest instrument 45 00:02:28,530 --> 00:02:31,510 deoarece aceasta va face viața ta mult mai ușor, într-adevăr. 46 00:02:31,510 --> 00:02:34,900 >> Per prelegere lui Rob pe GDB un cuplu de săptămâni în urmă, reamintim 47 00:02:34,900 --> 00:02:36,810 că GDB este un program de depanare. 48 00:02:36,810 --> 00:02:41,230 Este un instrument care vă permite să rulați dvs. Programul dar rulați-l pas cu pas, linie 49 00:02:41,230 --> 00:02:45,680 de linie, astfel încât să puteți bagi nasul, astfel încât să vezi lucrurile se întâmplă, așa 50 00:02:45,680 --> 00:02:47,310 pe care le puteți imprima Valorile variabilelor. 51 00:02:47,310 --> 00:02:50,580 Pe scurt, vă oferă atât de mult mai mult putere decât printDef face. 52 00:02:50,580 --> 00:02:52,900 >> Acum, desigur, interfața este destul de arcane. 53 00:02:52,900 --> 00:02:55,180 Interfață alb-negru textual în cea mai mare parte. 54 00:02:55,180 --> 00:02:57,400 Comenzile sunt oarecum greu să-și amintească de la început. 55 00:02:57,400 --> 00:03:01,230 Dar, chiar dacă ar putea să vă luați jumătate o oră, o oră, pentru a pune ca avans 56 00:03:01,230 --> 00:03:02,940 investiții de timp în ea, ai încredere în mine. 57 00:03:02,940 --> 00:03:06,440 Desigur, până la sfârșitul semestrului se va salva un ordin de mărime mai 58 00:03:06,440 --> 00:03:07,600 timp decât atât. 59 00:03:07,600 --> 00:03:09,200 >> Deci, la începutul săptămânii se arunca cu capul inch 60 00:03:09,200 --> 00:03:13,200 Și în termeni de Breakout, știu că tu pot face acest lucru, atât timp cât aveți 61 00:03:13,200 --> 00:03:18,230 codul de distribuție sau propriul cod în curs de desfășurare în directorul Pst4. 62 00:03:18,230 --> 00:03:21,680 Să știți că puteți rula gdb. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> Acest lucru se va deschide o fereastră ca aceasta. 64 00:03:23,490 --> 00:03:25,530 Permiteți-mi să mă dau mai mult de o fereastră de terminal. 65 00:03:25,530 --> 00:03:27,770 Și atunci ce am de gând să merg mai departe și nu, nu este o rulați. 66 00:03:27,770 --> 00:03:30,690 Am de gând să se stabilească mai întâi un punct de pauză rechemare, care vă permite să întrerupeți 67 00:03:30,690 --> 00:03:32,500 executarea la un anumit loc. 68 00:03:32,500 --> 00:03:35,750 >> Doar pentru a menține lucrurile simple, am de gând pentru a sparge la linia una doar prin tastarea 69 00:03:35,750 --> 00:03:37,000 numărul unu. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Permiteți-mi, de fapt re-deschide această fereastră pentru că este obtinerea unui 72 00:03:43,250 --> 00:03:45,700 mic mic acolo. 73 00:03:45,700 --> 00:03:53,270 Deci, ceea ce am acum de gând să faci aici este dacă am deschide fereastra mea terminalului. 74 00:03:53,270 --> 00:03:53,910 Haide, acolo mergem. 75 00:03:53,910 --> 00:03:59,850 >> Deci, acum, dacă mă întorc la Dropbox, Pst4 și rulați gdb. / Breakout intra, observa 76 00:03:59,850 --> 00:04:02,600 Am de gând să rupă o pentru a seta un punct de pauză la linia unu. 77 00:04:02,600 --> 00:04:04,840 Și acum am de gând să merg înainte și tipul alerga. 78 00:04:04,840 --> 00:04:07,370 Și când o voi face, observa nimic pare să se întâmple. 79 00:04:07,370 --> 00:04:08,120 >> Nu e nici o fereastra pop-up. 80 00:04:08,120 --> 00:04:09,790 Nu e nici o grafică Interfața de utilizator încă. 81 00:04:09,790 --> 00:04:13,340 Dar e de înțeles că sunt literalmente la linia unu în programul meu. 82 00:04:13,340 --> 00:04:17,110 Și observați că am transmis rapid, în mod specific acum la 62, deoarece toate 83 00:04:17,110 --> 00:04:20,600 lucrurile la partea de sus a acestui fișier este lucruri cum ar fi comentariile și constante și 84 00:04:20,600 --> 00:04:22,460 neinteresante lucruri pentru acum. 85 00:04:22,460 --> 00:04:25,840 >> Deci acum sunt în interiorul principal, se pare, la linia 62. 86 00:04:25,840 --> 00:04:27,960 Și aceasta este doar de distribuție cod, amintesc. 87 00:04:27,960 --> 00:04:33,810 Dacă am deschis asta de a merge, în mod similar, în directorul meu caseta verticală în Pst4, 88 00:04:33,810 --> 00:04:35,450 în breakout.c. 89 00:04:35,450 --> 00:04:40,670 Și dacă derulați în jos și în jos și de jos, și lasă-mă să merg mai departe și porniți 90 00:04:40,670 --> 00:04:44,990 numerele mele de linie. 91 00:04:44,990 --> 00:04:50,300 >> Ceea ce voi vedea, dacă derulați în jos pentru a linia 62, este exact linia pe care 92 00:04:50,300 --> 00:04:50,910 ne-am oprit pe. 93 00:04:50,910 --> 00:04:53,720 Deci, această linie aici, 62, este unde suntem pe cale de a fi. 94 00:04:53,720 --> 00:04:57,470 Deci, acum, în GDB, dacă am merge mai departe și tastați Acum următor, introduceți-l va 95 00:04:57,470 --> 00:04:58,450 executa acea linie. 96 00:04:58,450 --> 00:05:00,610 Si voila, avem așa-numita fereastră g. 97 00:05:00,610 --> 00:05:02,800 Dacă familiarizati cu ceea ce un GWindow este, nu vă faceți griji. 98 00:05:02,800 --> 00:05:05,740 Spec. vă va prezenta la ea, ca precum și o serie de clipuri video walkthrough 99 00:05:05,740 --> 00:05:06,830 încorporate în spec.. 100 00:05:06,830 --> 00:05:08,610 >> Dar acum hai sa facem acest lucru o pic mai interesant. 101 00:05:08,610 --> 00:05:10,960 Permiteți-mi să mutați această fereastră de peste la partea un pic. 102 00:05:10,960 --> 00:05:13,480 Permiteți-mi să fac fereastra un pic mai mare, așa că am putea vedea mai mult. 103 00:05:13,480 --> 00:05:16,140 >> Și acum lasă-mă să merg mai departe și face în continuare din nou. 104 00:05:16,140 --> 00:05:17,550 Și acolo sunt cărămizi mele. 105 00:05:17,550 --> 00:05:20,490 Dacă scriu viitoare din nou acum vad mingea. 106 00:05:20,490 --> 00:05:23,520 Și dacă tastați viitoare din nou Acum văd cu zbaturi. 107 00:05:23,520 --> 00:05:26,690 >> Și din fericire, acest lucru nu este gedit într-adevăr cooperează arătându mine 108 00:05:26,690 --> 00:05:27,660 tot ce vreau. 109 00:05:27,660 --> 00:05:30,820 Dar acum, dacă eu fac în continuare din nou, viitor, din nou, eu sunt doar 110 00:05:30,820 --> 00:05:32,260 declararea unor variabile. 111 00:05:32,260 --> 00:05:34,750 Și eu pot imprima orice unul acestor tipi. 112 00:05:34,750 --> 00:05:37,170 Cărămizi imprimare, viața amprente. 113 00:05:37,170 --> 00:05:39,910 >> Și acum, dacă am continua să facă următoare, observa că voi fi 114 00:05:39,910 --> 00:05:40,870 interiorul a buclei. 115 00:05:40,870 --> 00:05:43,380 Dar codul se va executa exact așa cum mă aștept. 116 00:05:43,380 --> 00:05:45,810 Așa că atunci când am lovit această funcție, așteptați pentru Click, se va face 117 00:05:45,810 --> 00:05:46,830 este literalmente că. 118 00:05:46,830 --> 00:05:48,870 Așa că am părea să fi pierdut controlul peste program. 119 00:05:48,870 --> 00:05:50,480 >> GDB nu este să-mi dea un alt prompt. 120 00:05:50,480 --> 00:05:51,500 Dar nu vă faceți griji. 121 00:05:51,500 --> 00:05:53,720 Du-te la jocul meu, faceți clic pe undeva. 122 00:05:53,720 --> 00:05:56,270 >> Și voila, acum se trece la linia 86. 123 00:05:56,270 --> 00:05:59,460 Deci, din nou, e neprețuit, în cele din urmă, pentru probleme de depanare. 124 00:05:59,460 --> 00:06:03,050 Pentru ca poti sa pasesti prin Codul dvs., lucrurile tipări și mai mult, 125 00:06:03,050 --> 00:06:03,640 mult, mai mult. 126 00:06:03,640 --> 00:06:07,210 Dar pentru acum, aceste singure unelte ar trebui sa ai destul de mult. 127 00:06:07,210 --> 00:06:10,050 >> Deci noi suntem, desigur, a lua o privire la Grafica acum, toate dintr-o dată. 128 00:06:10,050 --> 00:06:12,350 Și acum lumea noastră devine un pic mult mai interesant. 129 00:06:12,350 --> 00:06:15,680 Și știți, probabil, de la o parte din clipuri video online pe care le au aceste 130 00:06:15,680 --> 00:06:18,280 pantaloni scurți care te-ai uitat ca parte a seturilor problemă. 131 00:06:18,280 --> 00:06:20,460 >> Și ei au fost împușcați, în mod deliberat, pe un fundal alb. 132 00:06:20,460 --> 00:06:23,380 Iar unele dintre ele au de predare Fellows desen un text pe 133 00:06:23,380 --> 00:06:25,490 ecran care este acoperit pe partea laterală a ei. 134 00:06:25,490 --> 00:06:27,760 Dar, desigur, acest lucru nu este tot ceea ce interesant în lumea reală. 135 00:06:27,760 --> 00:06:30,520 Aceasta este doar o sală de lectură cu o ecran alb mare și un fundal. 136 00:06:30,520 --> 00:06:33,330 Și uimitor nostru fel de echipa de productie a face ca totul să arate frumos 137 00:06:33,330 --> 00:06:36,620 după faptul de trunchiere din sau suprapunerea nimic 138 00:06:36,620 --> 00:06:37,840 facem sau nu vrem. 139 00:06:37,840 --> 00:06:41,560 >> Acum, doar pentru a motiva această săptămână și într-adevăr, unde puteți merge, în cele din urmă, 140 00:06:41,560 --> 00:06:42,560 cu informatică. 141 00:06:42,560 --> 00:06:44,260 Nu doar după ce problema stabilit patru. 142 00:06:44,260 --> 00:06:48,240 Dar, după un alt curs sau un întreg Curriculum-ul este uimitor ce poti 143 00:06:48,240 --> 00:06:51,090 face în aceste zile în ceea ce privește grafică, în special. 144 00:06:51,090 --> 00:06:53,440 >> Unii dintre voi s-ar putea fi văzut acest lucru care curge în jurul on-line. 145 00:06:53,440 --> 00:06:56,240 Dar m-am gândit eu aș arăta, pentru doar o câteva minute, o bucatica din ceea ce 146 00:06:56,240 --> 00:07:01,890 tehnologia informatică și de ce CGI, grafica pe calculator se poate face în aceste zile 147 00:07:01,890 --> 00:07:04,510 cu un cântec familiar și, probabil film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Tânără și frumoasă] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Este doar un pic uimitor, probabil, cât de 151 00:10:52,470 --> 00:10:52,857 omniprezent - 152 00:10:52,857 --> 00:10:57,040 >> [Aplauze] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Tocmai am descarcat. 154 00:10:59,230 --> 00:11:02,920 Dar este într-adevăr uimitor, cred, doar Cum Software-ul omniprezent și codul și 155 00:11:02,920 --> 00:11:04,230 instrumente de acest gen sunt cu adevărat. 156 00:11:04,230 --> 00:11:07,685 Deci, asta e un gust de direcție in care poti sa te duci. 157 00:11:07,685 --> 00:11:10,620 Oh, nu mai Appliance azi. 158 00:11:10,620 --> 00:11:14,640 Ei bine, asta e de fapt momentul tragic având în vedere punctul am încercat să fac. 159 00:11:14,640 --> 00:11:18,670 >> Bine, asa ca hai sa lanseze Fuziune din nou. 160 00:11:18,670 --> 00:11:20,800 Amintește-mi mai târziu. 161 00:11:20,800 --> 00:11:24,190 Bine, și ar trebui să au luat o e-mail ca o parte dacă nu ai luat o 162 00:11:24,190 --> 00:11:25,460 observa ca asta. 163 00:11:25,460 --> 00:11:29,940 În regulă, astfel amintesc că săptămâna trecută am început să coaja înapoi în acest 164 00:11:29,940 --> 00:11:31,380 cunoscut mai târziu ca șir. 165 00:11:31,380 --> 00:11:34,700 >> șir amintește un tip de date care este a declarat în CS50 biblioteca. 166 00:11:34,700 --> 00:11:37,740 Și este parte a roților de formare care va începe acum să decoleze. 167 00:11:37,740 --> 00:11:41,280 A fost un concept util devreme. 168 00:11:41,280 --> 00:11:43,750 Dar acum este mergi la a lua mai mult interesant și mai puternic pentru a 169 00:11:43,750 --> 00:11:48,330 a se vedea de fapt că sub capota, un șir este doar ceea ce, am spus? 170 00:11:48,330 --> 00:11:50,500 >> Da, așa că este un așa-numit char *. 171 00:11:50,500 --> 00:11:53,860 Și * nu denotă că nu există un fel de adresa implicate. 172 00:11:53,860 --> 00:11:58,690 Așa că atunci când spui char * sa spui doar o variabilă a cărui tip de date este o 173 00:11:58,690 --> 00:11:59,290 pointer acum. 174 00:11:59,290 --> 00:12:01,770 Faptul că nu e stea acolo înseamnă doar că se declară un 175 00:12:01,770 --> 00:12:03,020 așa-numita pointer. 176 00:12:03,020 --> 00:12:06,220 Și că indicatorul se va aparent stoca adresa, de 177 00:12:06,220 --> 00:12:07,810 Desigur, un char. 178 00:12:07,810 --> 00:12:08,960 >> Acum, de ce nu face acest sens? 179 00:12:08,960 --> 00:12:11,200 Ei bine, ceea ce este un șir sub capota? 180 00:12:11,200 --> 00:12:15,130 Ei bine, de ceva timp ne-am spus ca un șir sub capota este 181 00:12:15,130 --> 00:12:18,460 Tocmai h-e-l-l-o, de exemplu. 182 00:12:18,460 --> 00:12:21,585 >> Dar am vorbit despre acest lucru ca fiind, în esență, o matrice. 183 00:12:21,585 --> 00:12:25,410 Și o serie ar arata apoi un pic mai mult ca aceasta, cu fiecare dintre acestea 184 00:12:25,410 --> 00:12:26,460 a lua o muscatura. 185 00:12:26,460 --> 00:12:28,710 Și atunci am spus că nu e ceva special aici, 186 00:12:28,710 --> 00:12:31,270 backslash 0, sau null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Deci, tot acest timp, aceasta aici a fost un șir. 188 00:12:35,230 --> 00:12:38,320 Dar, de fapt, un șir este de fapt, o adresă. 189 00:12:38,320 --> 00:12:43,210 Și adrese, așa cum vom vedea, sunt de multe ori prefixate cu 0x prin convenție. 190 00:12:43,210 --> 00:12:44,540 Ce 0x denotă? 191 00:12:44,540 --> 00:12:45,970 Stie cineva? 192 00:12:45,970 --> 00:12:47,320 >> Deci, aceasta înseamnă doar hexazecimal. 193 00:12:47,320 --> 00:12:52,360 Deci, s-ar putea aminti, de fapt, de la Pst 1, cred, unul din warm-up 194 00:12:52,360 --> 00:12:55,740 întrebări de fapt despre notație hexazecimală, în plus față de 195 00:12:55,740 --> 00:12:57,100 binar și zecimal. 196 00:12:57,100 --> 00:13:00,460 Și motivația aici este că cu hexazecimal aveți 16 197 00:13:00,460 --> 00:13:01,770 cifre la dispoziția dumneavoastră. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, urmată prin a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> Și dacă te numeri pe toți cei în sus, veți obține un total de 16. 200 00:13:10,430 --> 00:13:13,200 Deci, acest lucru este în contrast cu zecimal, unde avem 10 201 00:13:13,200 --> 00:13:14,690 cifre, 0 prin noua. 202 00:13:14,690 --> 00:13:17,750 Este în contrast cu binar unde avem doar 0 și 1. 203 00:13:17,750 --> 00:13:21,450 >> Dar la sfârșitul zilei, puteți pur și simplu reprezenta aceleași numere, dar 204 00:13:21,450 --> 00:13:22,500 oarecum diferit. 205 00:13:22,500 --> 00:13:25,840 Și hexazecimal este comun pentru ca se pare - și vom vedea asta 206 00:13:25,840 --> 00:13:28,790 mai târziu, în cursul - chiar și atunci când ajungem pentru programare web, în ​​contextul 207 00:13:28,790 --> 00:13:32,100 HTML și codurile de culoare, hexazecimal este frumos. 208 00:13:32,100 --> 00:13:36,390 Pentru ca fiecare cifră, se dovedește, reprezinta patru biti perfect. 209 00:13:36,390 --> 00:13:39,280 Deci, doar un fel de linii de până frumos așa cum vom vedea în cele din urmă. 210 00:13:39,280 --> 00:13:44,720 Deci, acest lucru ar putea fi Ox123 sau ceva cum ar fi că, denotă adresa 123 211 00:13:44,720 --> 00:13:47,050 undeva în interiorul meu memoria calculatorului. 212 00:13:47,050 --> 00:13:50,600 >> Dar, desigur, unele probleme apar datorită acestui suport 213 00:13:50,600 --> 00:13:51,520 punere în aplicare. 214 00:13:51,520 --> 00:13:55,930 Și amintesc că am luat o lovitură de cuțit la de punere în aplicare o funcție ca asta - 215 00:13:55,930 --> 00:14:00,260 compara bord 0 punct c săptămâna trecută, că chiar dacă se parea ca a fost 216 00:14:00,260 --> 00:14:04,270 dreapta, pur și simplu nu a compara două șiruri corect. 217 00:14:04,270 --> 00:14:07,470 >> Am aruncat principal, și m-am aruncat departe de comentarii doar pentru a se concentreze asupra 218 00:14:07,470 --> 00:14:08,970 cod care este de interes aici. 219 00:14:08,970 --> 00:14:10,660 Și este în roșu, pentru că este buggy. 220 00:14:10,660 --> 00:14:11,670 Pentru ce motiv? 221 00:14:11,670 --> 00:14:15,890 >> Ei bine, partea de sus acolo când am declarat un șir, ce se întâmplă cu adevărat pe 222 00:14:15,890 --> 00:14:17,260 sub capota? 223 00:14:17,260 --> 00:14:19,530 Ei bine, lasă-mă să merg pe la ecran aici și trage asta. 224 00:14:19,530 --> 00:14:23,230 Așa că am declarat, din nou, string s getstring. 225 00:14:23,230 --> 00:14:26,640 >> Așa că am de gând să merg mai departe acum și trage e pentru ceea ce este cu adevărat. 226 00:14:26,640 --> 00:14:28,590 O să fie un pătrat aici. 227 00:14:28,590 --> 00:14:30,490 Și am de gând să pretindă că e 32 de biți. 228 00:14:30,490 --> 00:14:32,890 Cel puțin, de obicei, este, cel puțin pe CS50 229 00:14:32,890 --> 00:14:34,520 aparatul într-o mulțime de calculatoare. 230 00:14:34,520 --> 00:14:35,980 Am de gând să-l e numesc. 231 00:14:35,980 --> 00:14:39,070 >> Dar acum ne reamintim că numit getstring. 232 00:14:39,070 --> 00:14:41,430 Revine astfel getstring, Desigur, un șir. 233 00:14:41,430 --> 00:14:45,790 Dacă utilizatorul tastează în H-e-L-L-O intra șirul de salut devine întors. 234 00:14:45,790 --> 00:14:51,010 Și că șir, așa cum am spus, se termină undeva în memoria computerului 235 00:14:51,010 --> 00:14:53,240 cu un 0 backslash la sfârșitul anului. 236 00:14:53,240 --> 00:14:56,650 Voi desena acest lucru ca matrice - sau bloc contiguu de personaje - 237 00:14:56,650 --> 00:14:58,330 care este de fapt. 238 00:14:58,330 --> 00:15:01,790 >> Și acum, ce se getstring de fapt revenirea? 239 00:15:01,790 --> 00:15:04,340 Ceea ce a getstring fost revenirea tot acest timp? 240 00:15:04,340 --> 00:15:07,520 Ei bine, am spune, în săptămâni înainte, se returnează un șir. 241 00:15:07,520 --> 00:15:10,250 Dar mai mult de vedere tehnic, ceea ce face Getstring retur aparent? 242 00:15:10,250 --> 00:15:11,610 >> Audiența: O adresă. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: O adresă. 244 00:15:12,600 --> 00:15:16,630 În mod specific se returnează adresa de prima mușcătură, orice ar fi. 245 00:15:16,630 --> 00:15:18,830 Mă tot folosind una, două, trei pentru că este convenabil. 246 00:15:18,830 --> 00:15:21,380 >> Returnează adresa primului caracter în șir. 247 00:15:21,380 --> 00:15:23,510 Și am spus săptămâna trecută că că este suficientă. 248 00:15:23,510 --> 00:15:26,710 Pentru ca ne putem da seama întotdeauna unde capătul șirului doar prin 249 00:15:26,710 --> 00:15:30,150 iterarea peste ea, poate, cu o pentru buclă sau o buclă în timp sau ceva de genul 250 00:15:30,150 --> 00:15:34,990 că, în căutarea doar pentru "backslash 0", caracterul special Sentinel. 251 00:15:34,990 --> 00:15:37,220 >> Și atunci știm că șirul se întâmplă să fie de lungime - 252 00:15:37,220 --> 00:15:37,980 în acest caz - 253 00:15:37,980 --> 00:15:38,670 Cinci. 254 00:15:38,670 --> 00:15:43,800 Deci, punct de vedere tehnic ce face getstring se returnează Ox123 în acest caz. 255 00:15:43,800 --> 00:15:53,670 Și punct de vedere tehnic ceea ce se întâmplă atunci este pe care le stoca, în interiorul s, Ox123. 256 00:15:53,670 --> 00:15:56,460 La sfârșitul zilei, chiar dacă acest lucru este nou concept, indicii, sunt 257 00:15:56,460 --> 00:15:57,350 doar variabile. 258 00:15:57,350 --> 00:16:00,440 Dar se întâmplă pentru a stoca biți care reprezintă împreună o adresă. 259 00:16:00,440 --> 00:16:03,700 Deci, punct de vedere tehnic toate acestea se stocate în s este Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Dar noi, ca oameni - 261 00:16:04,680 --> 00:16:06,020 inclusiv azi înainte - 262 00:16:06,020 --> 00:16:09,290 sunt într-adevăr nu o să aibă grijă, de obicei, ce adresa reală este 263 00:16:09,290 --> 00:16:10,520 de unele bucată de memorie. 264 00:16:10,520 --> 00:16:14,040 Este doar la nivelul scăzut de detaliere a fi intelectual interesant. 265 00:16:14,040 --> 00:16:15,440 Așa că am de gând pentru a anula aceasta. 266 00:16:15,440 --> 00:16:19,810 Și în loc, la nivel mai înalt, spun doar că atunci când vorbim despre indicii 267 00:16:19,810 --> 00:16:22,170 Am de gând să atragă doar mai mult săgeată user-friendly, care transmite 268 00:16:22,170 --> 00:16:26,060 idee și același rezumate distanță de datele de ceea ce efectiv 269 00:16:26,060 --> 00:16:27,700 adresa de bază este. 270 00:16:27,700 --> 00:16:33,290 >> Acum, dacă ne întoarcem la codului, ceea ce sa întâmplat săptămâna trecută, dacă avem șirul t 271 00:16:33,290 --> 00:16:34,510 este egal cu getstring? 272 00:16:34,510 --> 00:16:38,630 Ei bine, dacă eu din nou, de tip în Hello de data aceasta am de gând pentru a obține 273 00:16:38,630 --> 00:16:40,460 un alt segment de memorie. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o bară oblică inversă 0. 275 00:16:44,820 --> 00:16:48,320 >> Dar, pentru că am sunat getstring a doua oară - 276 00:16:48,320 --> 00:16:51,100 și știu acest lucru de la uita la codul sursă pentru getstring - chiar 277 00:16:51,100 --> 00:16:54,350 deși este o coincidență faptul că salut a fost tastat în de două ori, getstring nu este 278 00:16:54,350 --> 00:16:55,890 O să încerc să optimizeze și de a fi inteligent. 279 00:16:55,890 --> 00:16:58,550 Este doar mergi la a lua o altă bucată de memorie de la calculator, care este 280 00:16:58,550 --> 00:16:59,640 va fi la o altă adresă. 281 00:16:59,640 --> 00:17:02,330 Să arbitrar spunem doar 456. 282 00:17:02,330 --> 00:17:04,079 >> Și atunci ce este de gând să se întoarcă? 283 00:17:04,079 --> 00:17:08,030 O să se întoarcă 456 și se păstrează într-t. 284 00:17:08,030 --> 00:17:12,010 Deci, ce se întâmplă cu adevărat, pe partea stângă este mai am o bucată 285 00:17:12,010 --> 00:17:14,260 de memorie, 32 biți de obicei. 286 00:17:14,260 --> 00:17:16,720 Și de acolo se va merge Ox456. 287 00:17:16,720 --> 00:17:20,140 Dar, din nou, eu nu sunt interesat de aceste anymore anumite numere. 288 00:17:20,140 --> 00:17:23,069 Mă duc la abstract trage-l ca o săgeată. 289 00:17:23,069 --> 00:17:25,202 >> Deci, aceasta este acum o nouă explicație. 290 00:17:25,202 --> 00:17:28,735 Dar e aceeasi idee exact care este se întâmplă tot acest timp. 291 00:17:28,735 --> 00:17:33,150 Și așa motiv, atunci, că această primă Versiunea de comparare a fost buggy 292 00:17:33,150 --> 00:17:34,480 săptămâna trecută este de ce? 293 00:17:34,480 --> 00:17:38,000 Când faceți dacă e egal cu egal t Ce ești tu cu adevărat 294 00:17:38,000 --> 00:17:40,550 sub capota compararea? 295 00:17:40,550 --> 00:17:41,910 >> Te compararea adreselor. 296 00:17:41,910 --> 00:17:47,950 Și doar intuitiv, în mod clar, Ox123 nu este de gând să egal Ox456. 297 00:17:47,950 --> 00:17:49,380 Aceste numere, aceste biți sunt doar diferite. 298 00:17:49,380 --> 00:17:53,220 >> Și astfel în mod constant, saptamana trecuta a spus tastați lucruri diferite, chiar dacă 299 00:17:53,220 --> 00:17:55,360 Cuvintele au fost Verbatim același. 300 00:17:55,360 --> 00:17:58,770 Așa că am rezolva această problemă. 301 00:17:58,770 --> 00:18:00,120 În termeni simpli, ceea ce a fost fix? 302 00:18:00,120 --> 00:18:02,110 >> Audiența: Folosiți o funcție. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Utilizați o funcție. 304 00:18:02,870 --> 00:18:05,190 Sau stelele sunt implicate cu siguranta, dar utilizează o funcție pentru a face ce? 305 00:18:05,190 --> 00:18:05,962 >> Audiența: Pentru a compara siruri de caractere. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Pentru a compara siruri de caractere. 307 00:18:07,390 --> 00:18:11,030 Deci, problema fundamentală aici a fost că am fost doar luând în considerare 308 00:18:11,030 --> 00:18:15,870 Calitatea șiruri să fie definite prin compararea adresele lor. 309 00:18:15,870 --> 00:18:18,540 Și, evident că e doar prost acum o dată ați înțeles ce se întâmplă 310 00:18:18,540 --> 00:18:19,510 sub capota. 311 00:18:19,510 --> 00:18:23,270 Pentru a compara cu adevărat siruri de caractere pentru a vedea dacă ele sunt egale în modul în care un om 312 00:18:23,270 --> 00:18:26,680 ar lua în considerare două șiruri să fie egal avem nevoie pentru a le compara caractere pentru 313 00:18:26,680 --> 00:18:28,070 caracter pentru caracter. 314 00:18:28,070 --> 00:18:30,020 >> Acum, am fi putut face acest lucru foarte plictisitor. 315 00:18:30,020 --> 00:18:32,240 Dar familiar, suntem folosind o buclă. 316 00:18:32,240 --> 00:18:36,050 Și tocmai compara e suport i împotriva t suport i. 317 00:18:36,050 --> 00:18:39,590 s suport I plus 1 împotriva t suport i plus 1, și așa mai departe, în interiorul 318 00:18:39,590 --> 00:18:40,580 un fel de buclă. 319 00:18:40,580 --> 00:18:44,950 Și dacă la fața locului oricare două personaje care diferă, sau dacă îmi dau seama că ooh, e este 320 00:18:44,950 --> 00:18:48,410 scurt decât t sau mai lungă decât t Pot spune imediat false, 321 00:18:48,410 --> 00:18:49,390 ei nu sunt la fel. 322 00:18:49,390 --> 00:18:55,370 >> Dar dacă mă prin e și t și spune același, același, același, același, la fel, sfârșitul 323 00:18:55,370 --> 00:18:58,520 ambele siruri de caractere, pot să spun adevărate, ele sunt egale. 324 00:18:58,520 --> 00:19:01,040 Ei bine, din fericire, de ani în urmă pe cineva a scris că cod pentru noi. 325 00:19:01,040 --> 00:19:03,790 >> Și au numit-o StrComp pentru șir comparație. 326 00:19:03,790 --> 00:19:11,900 Și, chiar dacă este un pic contra intuitiv, StrComp returnează 0 dacă cele 327 00:19:11,900 --> 00:19:14,520 două șiruri, s și t sunt aceleași. 328 00:19:14,520 --> 00:19:18,090 Dar se întoarce o valoare negativă dacă s ar trebui să vină înainte de t în ordine alfabetică sau 329 00:19:18,090 --> 00:19:20,610 valoare pozitivă dacă aceasta ar trebui să vină după t în ordine alfabetică. 330 00:19:20,610 --> 00:19:24,030 >> Deci, dacă vrei vreodată să rezolve ceva, se dovedește că StrComp este util. 331 00:19:24,030 --> 00:19:26,660 Pentru că nu spune doar da sau nu, egal sau nu. 332 00:19:26,660 --> 00:19:30,440 Acesta vă oferă un sentiment de comanda ca o putere dicționar. 333 00:19:30,440 --> 00:19:33,770 Deci StrComp, s virgulă t este egal adică 0 înseamnă că 334 00:19:33,770 --> 00:19:35,200 siruri de caractere sunt cu adevărat egale. 335 00:19:35,200 --> 00:19:38,680 Pentru că cine a scris această funcție ani în urmă, probabil folosit o buclă 336 00:19:38,680 --> 00:19:42,840 sau o buclă în timp sau ceva de genul asta a integra peste caracterele din nou 337 00:19:42,840 --> 00:19:45,270 și din nou și din nou. 338 00:19:45,270 --> 00:19:47,300 >> Dar două problemă a apărut aici. 339 00:19:47,300 --> 00:19:48,750 Acest lucru a fost copy0.c. 340 00:19:48,750 --> 00:19:51,680 Și două în roșu este pentru că este greșită. 341 00:19:51,680 --> 00:19:52,800 Și ce facem aici? 342 00:19:52,800 --> 00:19:54,310 Ei bine, în primul rând am sunat getstring. 343 00:19:54,310 --> 00:19:56,255 Și am păstrat valoarea returnată în s.. 344 00:19:56,255 --> 00:20:00,260 Așa că e destul de mult la fel ca și această parte de sus a imaginii. 345 00:20:00,260 --> 00:20:01,490 >> Dar ceea ce vine după asta? 346 00:20:01,490 --> 00:20:04,980 Ei bine, lasă-mă să merg mai departe și de a scăpa de o grămadă de aceasta. 347 00:20:04,980 --> 00:20:09,650 Vom înapoi în timp pentru care ne-am Trebuie s, care este acum în concordanță cu 348 00:20:09,650 --> 00:20:10,940 linia unu acolo. 349 00:20:10,940 --> 00:20:11,400 >> Am verificat. 350 00:20:11,400 --> 00:20:13,450 Dacă e egal egal cu 0. 351 00:20:13,450 --> 00:20:18,670 Acum, o notă rapidă, atunci când s-ar putea getstring returna 0? 352 00:20:18,670 --> 00:20:19,580 Nu este suficientă memorie. 353 00:20:19,580 --> 00:20:19,880 Dreapta? 354 00:20:19,880 --> 00:20:22,310 >> Este rar ca acest lucru se va întâmpla, cu siguranță pe un calculator care este 355 00:20:22,310 --> 00:20:24,740 primit sute de megabytes sau chiar gig-uri de memorie RAM. 356 00:20:24,740 --> 00:20:27,080 Dar ar putea, în teorie, întoarce 0, mai ales dacă 357 00:20:27,080 --> 00:20:28,080 Utilizatorul nu cooperează. 358 00:20:28,080 --> 00:20:31,640 Există modalități de a preface că nu au nimic introduse și truc 359 00:20:31,640 --> 00:20:34,100 Getstring în revenirea 0 în mod eficient. 360 00:20:34,100 --> 00:20:35,470 >> Deci, se va verifica pentru asta. 361 00:20:35,470 --> 00:20:39,430 Pentru că dacă oricare dintre voi au început să se, deja, defecte de segmentare - 362 00:20:39,430 --> 00:20:42,280 care a fost, probabil, o sursă de unele frustrare - 363 00:20:42,280 --> 00:20:46,150 acestea sunt aproape întotdeauna rezultatul de memorie legate de eroare. 364 00:20:46,150 --> 00:20:50,440 Cumva ai incurcat cu privire la o pointer, chiar dacă nu am dat seama 365 00:20:50,440 --> 00:20:51,530 a existat un pointer. 366 00:20:51,530 --> 00:20:55,260 Deci, s-ar putea fi indus de segmentare defecte ca mai devreme de o saptamana cu ajutorul 367 00:20:55,260 --> 00:21:02,100 ceva ca un pentru buclă sau un timp buclă și o serie de merge prea departe 368 00:21:02,100 --> 00:21:05,900 dincolo de limitele unor matrice care te a declarat, în două săptămâni, în 369 00:21:05,900 --> 00:21:06,690 special. 370 00:21:06,690 --> 00:21:09,220 >> S-ar putea fi făcut chiar în problema set patru cu Breakout. 371 00:21:09,220 --> 00:21:12,910 Chiar dacă, probabil, nu s-au văzut orice stele din codul de distributie pentru 372 00:21:12,910 --> 00:21:17,410 Breakout, se pare că cei GRect și astfel de lucruri Goval și alte, 373 00:21:17,410 --> 00:21:19,650 cei care sunt de fapt indicii sub capota. 374 00:21:19,650 --> 00:21:23,430 >> Dar, Stanford, ca și noi, un fel de piei care detaliu cel puțin pentru bibliotecile 375 00:21:23,430 --> 00:21:26,540 scopuri, mai mult ca noi pentru string și char *. 376 00:21:26,540 --> 00:21:30,060 Dar GRect și Goval și tuturor celor lucruri voi sunt sau vor fi utilizați 377 00:21:30,060 --> 00:21:32,630 această săptămână sunt în cele din urmă adrese de memorie. 378 00:21:32,630 --> 00:21:33,650 Pur si simplu nu-l știu. 379 00:21:33,650 --> 00:21:37,240 >> Deci, nu e de mirare, atunci, probabil, care s-ar putea excursie pe un 380 00:21:37,240 --> 00:21:38,580 defecte de segmentare. 381 00:21:38,580 --> 00:21:41,290 Dar ceea ce este interesant aici acum, dacă după ce vom verifica pentru 0 facem 382 00:21:41,290 --> 00:21:43,460 șir t devine e. 383 00:21:43,460 --> 00:21:44,690 Ei bine, lasă-mă să declare t. 384 00:21:44,690 --> 00:21:47,730 Am de gând să-l trage ca un pătrat, 32 de biți, acesta t numesc. 385 00:21:47,730 --> 00:21:49,740 Și apoi am de gând să fac primeste s. 386 00:21:49,740 --> 00:21:51,130 >> Ei bine, ce înseamnă asta? 387 00:21:51,130 --> 00:21:53,280 Ei bine, e un pic cam greu să se gândească despre aceasta imagine înțelept. 388 00:21:53,280 --> 00:21:55,025 Dar să ne gândim ceea ce este în interiorul de x? 389 00:21:55,025 --> 00:21:59,430 Ce este literalmente în interiorul această variabilă? 390 00:21:59,430 --> 00:22:01,500 Valoarea Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Deci, atunci când spun șir t devine e, că doar literalmente înseamnă ia numărul 392 00:22:05,815 --> 00:22:10,070 în s, care este Ox123 și a pus-o Ox123. 393 00:22:10,070 --> 00:22:13,740 Sau pictural, dacă am un fel de abstract departe de acest detaliu are 394 00:22:13,740 --> 00:22:16,600 Efectul de literalmente face aceasta, de asemenea. 395 00:22:16,600 --> 00:22:22,110 >> Deci, acum, cred că înapoi la săptămâna trecută, când am procedat la capitalist T. I 396 00:22:22,110 --> 00:22:23,800 a făcut T suport 0. 397 00:22:23,800 --> 00:22:27,150 Ei bine, T suport 0, chiar dacă este un pointer, aveți posibilitatea să-l ca și cum tratează 398 00:22:27,150 --> 00:22:29,220 este o matrice, cu un pătrat notație suport. 399 00:22:29,220 --> 00:22:31,550 >> Deci, unde este T suport 0? 400 00:22:31,550 --> 00:22:32,990 Ei bine, e h. 401 00:22:32,990 --> 00:22:36,800 Așa că atunci când vom folosi ca linie de cod, două superioară, care este în care c type.h 402 00:22:36,800 --> 00:22:38,460 fișier antet, acolo este declarat. 403 00:22:38,460 --> 00:22:44,410 Te valorificarea acest H. Dar de Desigur, asta e la fel h exact care este 404 00:22:44,410 --> 00:22:46,540 interiorul e, ca să spunem așa. 405 00:22:46,540 --> 00:22:51,930 Iar acum s-au schimbat sau valorificate atât în ​​original și 406 00:22:51,930 --> 00:22:53,120 așa-numita copie. 407 00:22:53,120 --> 00:22:56,620 Pentru că nu a făcut o copie în modul în care un om ar vrea să fie. 408 00:22:56,620 --> 00:22:59,710 >> Deci, ceea ce era fix aici, în copy1.c săptămâna trecută? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funcții, așa că am putea de fapt copia șir. 411 00:23:05,580 --> 00:23:08,700 Și fundamental, ce trebuie să ne face în scopul de a copia șirul? 412 00:23:08,700 --> 00:23:12,070 >> Ei bine, în această versiune verde, aici am O să-l nivel destul de redus face. 413 00:23:12,070 --> 00:23:14,260 Nu sunt de fapt funcții acestea ar putea ajuta cu asta. 414 00:23:14,260 --> 00:23:17,710 Dar cel mai de bază, și mai unul familiar, cel puțin, va fi în curând 415 00:23:17,710 --> 00:23:19,600 familiar pentru noi, este următoarea - 416 00:23:19,600 --> 00:23:21,910 astfel încât o pe prima linie de cod în verde acum. 417 00:23:21,910 --> 00:23:23,970 >> Am rescris e ca char *. 418 00:23:23,970 --> 00:23:25,250 Nu e nici o funcțională Diferența acolo. 419 00:23:25,250 --> 00:23:28,790 Am aruncat biblioteca CS50 și Eu l sun ceea ce este, un char *. 420 00:23:28,790 --> 00:23:31,640 >> Acum punct, punct, punct, pentru că s-au unele verificarea erorilor care nu este 421 00:23:31,640 --> 00:23:33,200 interesant să vorbesc despre nou. 422 00:23:33,200 --> 00:23:34,710 Deci, acum t este declarat. 423 00:23:34,710 --> 00:23:35,780 Acesta este de asemenea un char *. 424 00:23:35,780 --> 00:23:38,280 Așa că am tras un pic pătrat pe ecran ca înainte. 425 00:23:38,280 --> 00:23:41,870 >> Dar pe partea dreaptă, malloc, am spus este memoria aloca. 426 00:23:41,870 --> 00:23:44,130 Deci aloca unele bucată de memorie. 427 00:23:44,130 --> 00:23:48,830 Și cât de multe bytes avem de fapt Vreau să aloce, nu ți se pare? 428 00:23:48,830 --> 00:23:50,340 >> Ei bine, lungimea șirului de e. 429 00:23:50,340 --> 00:23:52,310 Deci, dacă e salut că este Va fi cinci. 430 00:23:52,310 --> 00:23:53,950 Vom spune h-e-L-L-o. 431 00:23:53,950 --> 00:23:55,090 Deci, cinci bytes. 432 00:23:55,090 --> 00:23:57,960 >> Dar apoi plus 1, de ce 1? 433 00:23:57,960 --> 00:23:58,830 0 caractere. 434 00:23:58,830 --> 00:24:03,640 Dacă nu ne lasă loc pentru acest tip am s-ar putea crea accidental o situație 435 00:24:03,640 --> 00:24:05,600 în cazul în care șirul este h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 Și apoi următorul getstring timp este numit și tip I în, de exemplu, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, calculatorul se întâmplă să cred că este de fapt 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-o-v-i-d, deoarece există nici o pauză între aceste cuvinte. 439 00:24:18,900 --> 00:24:19,810 >> Deci, avem nevoie de pauza. 440 00:24:19,810 --> 00:24:20,720 Deci, noi nu vrem cinci. 441 00:24:20,720 --> 00:24:22,100 Vrem șase bytes. 442 00:24:22,100 --> 00:24:23,110 >> Și bytes spun. 443 00:24:23,110 --> 00:24:25,220 Dar e marimea chiar timp de char. 444 00:24:25,220 --> 00:24:28,040 Punct de vedere tehnic char este aproape întotdeauna un singur octet. 445 00:24:28,040 --> 00:24:31,030 >> Dar doar pentru a face codul nostru portabil, ca să spunem așa, astfel că funcționează pe 446 00:24:31,030 --> 00:24:33,750 computere diferite, chiar dacă s-ar putea fi oarecum diferite sub 447 00:24:33,750 --> 00:24:36,590 capota, am de gând să generic spune dimensiunea de char, astfel încât 448 00:24:36,590 --> 00:24:37,660 codul meu funcționează întotdeauna. 449 00:24:37,660 --> 00:24:40,610 Și nu trebuie să-l recompilați doar pentru ca fac upgrade computerul meu sau de a folosi 450 00:24:40,610 --> 00:24:42,140 unele diferite platforme. 451 00:24:42,140 --> 00:24:45,300 >> Așa că am luat de 6 ori mai mare un caracter, care se întâmplă să fie 1. 452 00:24:45,300 --> 00:24:47,440 Asta înseamnă că malloc ar putea da-mi șase bytes. 453 00:24:47,440 --> 00:24:49,140 Ce este ca de fapt faci? 454 00:24:49,140 --> 00:24:52,810 Ei bine, lasă-mă să rostogolească înapoi în timp aici unde suntem în poveste. 455 00:24:52,810 --> 00:24:57,620 >> Deci, dacă mă întorc aici, am declarat un char * numit t. 456 00:24:57,620 --> 00:25:00,280 Am sunat acum malloc pentru șase bytes. 457 00:25:00,280 --> 00:25:06,400 Și acum am de gând să atragă cei șase bytes la fel ca matrice mai devreme. 458 00:25:06,400 --> 00:25:10,570 Dar eu de fapt, nu știu ce-i în interiorul acestui tablou. 459 00:25:10,570 --> 00:25:14,640 >> Dacă ați aloca memorie se dovedește că nu puteți avea încredere că există unele 460 00:25:14,640 --> 00:25:15,810 valoare cunoscută acolo. 461 00:25:15,810 --> 00:25:18,400 Aceasta ar putea fi fost folosite de ceva altceva, o altă funcție, un alt 462 00:25:18,400 --> 00:25:19,630 linie de cod pe care ai scris. 463 00:25:19,630 --> 00:25:22,870 Deci, vom numi, în general, aceste gunoi valorile și egal ei, poate, așa cum 464 00:25:22,870 --> 00:25:26,170 semne de întrebare, doar indicând faptul că noi Nu știu ce e de fapt acolo. 465 00:25:26,170 --> 00:25:30,390 Și asta nu e mare lucru, atât timp cât noi sunt destul de inteligent pentru a suprascrie cele 466 00:25:30,390 --> 00:25:34,550 Valorile de gunoi cu numere sau caractere pe care le pasă. 467 00:25:34,550 --> 00:25:36,340 >> Deci, în acest caz, ce am de gând să fac? 468 00:25:36,340 --> 00:25:38,670 Ei bine, codul linia mea de viitoare, am patru. 469 00:25:38,670 --> 00:25:41,350 int i lua 0, n devine Lungimea șir de s. 470 00:25:41,350 --> 00:25:42,750 Deci, un familiar pentru buclă. 471 00:25:42,750 --> 00:25:45,875 I este mai mică sau egală cu n, care de obicei este mai sus. 472 00:25:45,875 --> 00:25:47,500 >> Dar de data aceasta este deliberat. 473 00:25:47,500 --> 00:25:51,890 I + +, și apoi eu pur și simplu nu Nu suport i se e. 474 00:25:51,890 --> 00:25:56,320 Pentru ca poza mea arata ca acest lucru la acest moment, stocate în t este 475 00:25:56,320 --> 00:25:59,530 Adresa de care bucată aleator de memorie Valorile căror sunt necunoscute. 476 00:25:59,530 --> 00:26:03,030 Dar, de îndată ce eu fac t suportul 0 că mă pune aici. 477 00:26:03,030 --> 00:26:07,430 >> Și ceea ce se încheie până atrași acolo? 478 00:26:07,430 --> 00:26:08,740 Ne ajung punerea h.. 479 00:26:08,740 --> 00:26:11,170 Pentru că asta e ceea ce-i la s suport 0. 480 00:26:11,170 --> 00:26:14,300 Și apoi același lucru pentru e, și l, și l, și o. 481 00:26:14,300 --> 00:26:17,930 >> n, de ce m-am dus în sus prin un egal cu n? 482 00:26:17,930 --> 00:26:19,200 Datorită caracterului 0. 483 00:26:19,200 --> 00:26:23,580 Deci, doar pentru a fi clar, apoi, dacă am de fapt, șterge orice aceste gunoi 484 00:26:23,580 --> 00:26:28,870 Valorile sunt și apoi trage de fapt, în ceea ce ma astept, acest lucru este s suport 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plus că e urmă caracter nou. 486 00:26:32,440 --> 00:26:36,080 >> Iar acum, dacă am continuat trecut punct, punct, punct în această versiune corectă 487 00:26:36,080 --> 00:26:41,930 și capitalizată t suport 0 I ar fi, de Desigur, trebuie valorificarea doar acest 488 00:26:41,930 --> 00:26:47,050 tip de aici, care conceptual, a fost în cele din urmă scopul. 489 00:26:47,050 --> 00:26:48,040 Deci, asta e tot indicatorul este. 490 00:26:48,040 --> 00:26:51,430 >> Și ați fost le folosesc pentru săptămâni acum, în contextul siruri de caractere. 491 00:26:51,430 --> 00:26:53,530 Dar sub capota sunt un pic mai complex. 492 00:26:53,530 --> 00:26:57,520 Dar dacă te gândești la ele în acest forma picturala propun ca acestea sunt 493 00:26:57,520 --> 00:27:01,720 probabil, nu toate că înfricoșător ca acestea s-ar putea părea mai întâi la prima vedere, 494 00:27:01,720 --> 00:27:04,730 în special cu sintaxa astfel de noi. 495 00:27:04,730 --> 00:27:07,290 Orice întrebări cu privire la indicii, siruri de caractere, sau caractere? 496 00:27:07,290 --> 00:27:07,580 Da? 497 00:27:07,580 --> 00:27:09,252 >> Audiența: Poți să te întorci la [inaudibil]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Sigur. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> Audiența: Deci, cum vin în ultimul dumneavoastră linie, nu aveți o linie * t 501 00:27:19,525 --> 00:27:21,513 și o * s în linia? 502 00:27:21,513 --> 00:27:23,004 Nu aveți trimitere la - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ah, o întrebare foarte bună. 504 00:27:24,640 --> 00:27:26,800 De ce nu am o * t și o * e? 505 00:27:26,800 --> 00:27:30,340 Deoarece scurt, săptămâna trecută, cum ar fi în nostru schimba funcția, eu am spus că, atunci când 506 00:27:30,340 --> 00:27:33,350 le-ați luat un pointer mijloacele de care te duci acolo ca am facut 507 00:27:33,350 --> 00:27:36,590 fizic pe scenă, a fost de fapt utilizați operatorul stele. 508 00:27:36,590 --> 00:27:40,570 >> Se pare că acest pătrat-suport notația este ceea ce vom numi sintactic 509 00:27:40,570 --> 00:27:44,190 zahăr, care este doar un mod sexy de spunând notație e prescurtarea pentru 510 00:27:44,190 --> 00:27:45,950 exact ceea ce descrie. 511 00:27:45,950 --> 00:27:49,385 Dar e un pic mai intuitiv. 512 00:27:49,385 --> 00:27:53,510 Și la riscul de a face acest lucru pare mai mult complicata decat aceasta trebuie să fie, 513 00:27:53,510 --> 00:27:56,990 ceea ce se întâmplă cu adevărat aici este următoarea - 514 00:27:56,990 --> 00:28:01,450 Dacă spun * Nu înseamnă că merge la adresa stocată în t. 515 00:28:01,450 --> 00:28:04,350 >> Deci, literalmente, în cazul în care t este stocarea adresa care h 516 00:28:04,350 --> 00:28:07,300 inițial, * t înseamnă du-te aici. 517 00:28:07,300 --> 00:28:10,730 Acum, ceea ce nu t categorie de 0 înseamnă? 518 00:28:10,730 --> 00:28:11,560 Exact același lucru. 519 00:28:11,560 --> 00:28:13,510 E doar un pic mai ușor de utilizat prietenos pentru a scrie. 520 00:28:13,510 --> 00:28:14,430 >> Dar eu nu am terminat încă. 521 00:28:14,430 --> 00:28:17,800 Eu nu pot să spun doar * t * e primește. 522 00:28:17,800 --> 00:28:19,440 Pentru că ceea ce ar trebui sa fac atunci? 523 00:28:19,440 --> 00:28:22,950 Aș fi punerea h, h, h, h, h de-a lungul totul. 524 00:28:22,950 --> 00:28:22,995 Dreapta? 525 00:28:22,995 --> 00:28:26,020 >> Pentru ca * t este să mergeți la adresa din t. 526 00:28:26,020 --> 00:28:27,580 Dar suntem în interiorul unei bucle. 527 00:28:27,580 --> 00:28:32,150 Și ce valoare am incrementarea, desigur, pe fiecare iterație? 528 00:28:32,150 --> 00:28:32,690 Am. 529 00:28:32,690 --> 00:28:34,590 >> Dar există o oportunitate aici, nu? 530 00:28:34,590 --> 00:28:37,870 Chiar dacă acest lucru se simte ca și cum se face un pic mai sofisticat 531 00:28:37,870 --> 00:28:40,730 decât notația pătrat-suport ne-am folosit de ceva timp - 532 00:28:40,730 --> 00:28:43,840 permiteți-mi anula schimbarea mea h acolo - 533 00:28:43,840 --> 00:28:48,870 chiar dacă acest lucru este acum devine un pic crescator, ideea de bază, în cazul în care * t 534 00:28:48,870 --> 00:28:53,630 înseamnă aici si * t este doar du-te la adresa de t. 535 00:28:53,630 --> 00:28:54,990 >> Dar ceea ce a fost pe adresa de t? 536 00:28:54,990 --> 00:28:56,850 Numărul păstrăm cu ajutorul? 537 00:28:56,850 --> 00:29:00,540 Ca Ox456, să aduci înapoi doar de dragul discuției. 538 00:29:00,540 --> 00:29:05,380 Ei bine, dacă doriți să obțineți de la e din t șir, doar vreau să merg la, 539 00:29:05,380 --> 00:29:06,460 în esență, 456. 540 00:29:06,460 --> 00:29:09,230 >> Sau, mai degrabă, 457. 541 00:29:09,230 --> 00:29:10,590 Trebuie doar să adăugați una. 542 00:29:10,590 --> 00:29:11,790 Dar eu pot face asta, nu? 543 00:29:11,790 --> 00:29:14,680 Pentru că nu, chiar dacă am ține de desen acum ca o săgeată, e doar o 544 00:29:14,680 --> 00:29:16,570 număr, Ox456. 545 00:29:16,570 --> 00:29:21,400 Și dacă am adăuga unul la care, sau mai mult în general, dacă am adăuga eu la care pot 546 00:29:21,400 --> 00:29:24,350 de fapt, ajunge exact unde vreau. 547 00:29:24,350 --> 00:29:26,260 Deci, dacă am face de fapt acest lucru - 548 00:29:26,260 --> 00:29:28,970 și aceasta este ceea ce se numește acum aritmetică indicatorul - 549 00:29:28,970 --> 00:29:30,375 Am posibilitatea de a elimina această linie. 550 00:29:30,375 --> 00:29:33,550 Care este, sincer, cred că mai clar și un utilizator mai putin prietenos pentru a citi. 551 00:29:33,550 --> 00:29:35,970 Dar acest lucru nu este mai puțin corectă. 552 00:29:35,970 --> 00:29:38,570 >> Această linie de cod acum se utilizează indicatorul aritmetică. 553 00:29:38,570 --> 00:29:40,920 Se spune du-te la următoarea adresă - 554 00:29:40,920 --> 00:29:44,670 indiferent de început al t este, care este t plus eu, care inițial 555 00:29:44,670 --> 00:29:45,730 este 0, care este mare. 556 00:29:45,730 --> 00:29:49,280 Pentru că înseamnă începutul de t plus 1, plus 2, plus 3, și așa mai departe. 557 00:29:49,280 --> 00:29:51,030 Și la fel face cu e. 558 00:29:51,030 --> 00:29:52,750 >> Zahăr, astfel sintactic pentru aceasta. 559 00:29:52,750 --> 00:29:55,900 Dar înțelegerea a ceea ce se întâmplă cu adevărat pe sub capota, aș spune, 560 00:29:55,900 --> 00:29:57,410 este, de fapt util în sine. 561 00:29:57,410 --> 00:30:00,620 Pentru că acum înseamnă că nu este mult mai mult magie întâmplă 562 00:30:00,620 --> 00:30:01,620 sub capota. 563 00:30:01,620 --> 00:30:03,920 Nu vor fi mai multe straturi care ne putem coaja înapoi. 564 00:30:03,920 --> 00:30:04,810 Aceasta este c. 565 00:30:04,810 --> 00:30:06,410 Și acest lucru este de programare. 566 00:30:06,410 --> 00:30:08,002 Întrebare foarte bună. 567 00:30:08,002 --> 00:30:11,570 >> Bine, deci acest lucru a fost că buggy Programul m-am referit mai devreme. 568 00:30:11,570 --> 00:30:12,650 schimb a fost greșită. 569 00:30:12,650 --> 00:30:14,070 În cazul în care părea să funcționeze. 570 00:30:14,070 --> 00:30:17,390 Amintiți-vă că la fel ca cu lapte și suc de portocale - pe care am început 571 00:30:17,390 --> 00:30:18,660 băut demonstrația de azi. 572 00:30:18,660 --> 00:30:22,220 Deci, la fel ca și cu suc de portocale și lapte, am avut de a folosi un 573 00:30:22,220 --> 00:30:26,200 variabilă temporară, tmp, să dețină un temporar, astfel încât putem să 574 00:30:26,200 --> 00:30:28,820 schimba valoarea și apoi actualizați b. 575 00:30:28,820 --> 00:30:32,870 >> Dar această funcție, am spus, sau acest program în care această funcție a fost 576 00:30:32,870 --> 00:30:35,670 scris greșit și defecte, de ce? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Da? 579 00:30:39,090 --> 00:30:42,471 >> Audiența: [inaudibil]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Exact, atunci când Te sun de swap - 581 00:30:44,940 --> 00:30:47,820 sau, mai general, atunci când apela cele mai multe orice funcție - 582 00:30:47,820 --> 00:30:51,210 dacă argumentele acestei funcții sunt primitive, ca să spunem așa, int și caractere 583 00:30:51,210 --> 00:30:56,740 si la dublu și plutește, lucruri fără stele, ce se trece într-o copie de 584 00:30:56,740 --> 00:30:57,540 argumentul. 585 00:30:57,540 --> 00:31:01,580 Deci, dacă x fost de 1 și y a fost de 2, o va să fie 1 și b va fi 2. 586 00:31:01,580 --> 00:31:05,250 Dar ei vor fi diferite bucăți de biți, diferite bucăți de 587 00:31:05,250 --> 00:31:07,540 memorie care se întâmplă să fie stocarea valori identice. 588 00:31:07,540 --> 00:31:12,160 >> Deci acest cod este super perfectă la schimbarea a și b. 589 00:31:12,160 --> 00:31:13,850 Nu e bun la schimbarea - 590 00:31:13,850 --> 00:31:15,290 în exemplul de săptămâna trecută - 591 00:31:15,290 --> 00:31:16,390 x și y. 592 00:31:16,390 --> 00:31:18,780 Deoarece din nou, sunt în domeniul de aplicare greșită. 593 00:31:18,780 --> 00:31:21,310 >> Acum, cum ne-am dus de fixare asta? 594 00:31:21,310 --> 00:31:23,140 Am avut de a face funcția de uite un pic mai urât. 595 00:31:23,140 --> 00:31:25,250 Dar, din nou, ia în considerare ceea ce Acest lucru înseamnă doar. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Și, de fapt, lasă-mă, pentru consecvență, schimba un singur lucru, astfel că este identic cu 598 00:31:31,500 --> 00:31:33,200 ceea ce am făcut. 599 00:31:33,200 --> 00:31:35,690 Așa cum am menționat săptămâna trecută, ea nu contează unde se duce. 600 00:31:35,690 --> 00:31:38,120 De fapt, de obicei, v-ar pune stele, de lângă numele variabilei. 601 00:31:38,120 --> 00:31:40,750 Dar cred că ar fi un pic mai ușor să ia în considerare * de lângă 602 00:31:40,750 --> 00:31:44,910 tip de date în sensul că este un pointer este un număr întreg, în acest caz. 603 00:31:44,910 --> 00:31:46,270 >> Deci, ce fac eu aici? 604 00:31:46,270 --> 00:31:49,590 Spun că nu-mi da un int urmat de un alt int, 605 00:31:49,590 --> 00:31:50,810 numindu-le o și b. 606 00:31:50,810 --> 00:31:52,460 Dă-mi adresa de int. 607 00:31:52,460 --> 00:31:53,960 Dă-mi adresa de alt Int. 608 00:31:53,960 --> 00:31:56,330 Apela acele adrese A și B. 609 00:31:56,330 --> 00:32:00,860 >> Și apoi folosind notația * jos de mai jos, du-te la fiecare dintre aceste adrese 610 00:32:00,860 --> 00:32:05,290 după cum este necesar pentru a obține fie sau pentru a seta valoarea sa. 611 00:32:05,290 --> 00:32:07,400 Dar există o excepție aici. 612 00:32:07,400 --> 00:32:11,130 De ce nu am un * lângă tmp? 613 00:32:11,130 --> 00:32:15,070 De ce nu am face acest lucru, de exemplu? 614 00:32:15,070 --> 00:32:19,370 Se simte ca și cum ar trebui să mergem toți afară și de a corecta totul. 615 00:32:19,370 --> 00:32:19,752 Da? 616 00:32:19,752 --> 00:32:21,002 >> Audiența: [inaudibil]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: Nu am declarat tmp ca un șir. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Deci aceasta ar declara, în acest caz, un tmp să fie adresa de un int. 621 00:32:34,950 --> 00:32:37,380 Dar asta nu e chiar ceea ce vreau, pentru un cuplu de motive. 622 00:32:37,380 --> 00:32:38,616 >> Audiența: Nu vrei să le schimba. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Exact, nu vreau să schimbe nimic cu tmp. tmp este doar 624 00:32:41,800 --> 00:32:42,790 saptamana-un chestii. 625 00:32:42,790 --> 00:32:45,150 Tot ce vreau este o variabilă pentru a stoca un număr. 626 00:32:45,150 --> 00:32:47,330 Nu-mi pasă nici despre adresele în acest moment. 627 00:32:47,330 --> 00:32:50,530 >> Am nevoie de doar 32 de biți sau astfel încât pentru a stoca un int. 628 00:32:50,530 --> 00:32:56,690 Și vreau să pun în acele 32 de biți ceea ce nu este într-o, ca să spunem așa, dar 629 00:32:56,690 --> 00:33:01,260 ceea ce este la un, doar pentru a fi mai precis. 630 00:33:01,260 --> 00:33:06,420 Pentru că, dacă un este o adresă, * un mijloc du-te acolo și să obțină valoarea 1. 631 00:33:06,420 --> 00:33:10,560 De exemplu, în exemplul de săptămâna trecută sau în cazul b, a obține valoarea de 2. 632 00:33:10,560 --> 00:33:11,750 >> Deci, ce se întâmplă cu adevărat? 633 00:33:11,750 --> 00:33:15,070 Permiteți-mi trage o imagine aici, care va doar tachineze pe langa o parte din ziua de azi. 634 00:33:15,070 --> 00:33:18,580 Dar acest lucru va continua să apară de ceva timp. 635 00:33:18,580 --> 00:33:22,430 >> Acest lucru, eu susțin, este ceea ce a computerului memorie arata ca atunci când rulați un 636 00:33:22,430 --> 00:33:24,060 Programul, orice program. 637 00:33:24,060 --> 00:33:28,340 Când executați un program de la foarte de sus de RAM a computerului - deci cred că de 638 00:33:28,340 --> 00:33:33,530 acest dreptunghi, într-adevăr, așa cum dvs. RAM sau memoria computerului, toate 101 639 00:33:33,530 --> 00:33:36,920 miliard de bytes de ea, toate două miliarde de bytes, toate doi gigabytes de ea, 640 00:33:36,920 --> 00:33:39,910 indiferent de cantitatea ce trebuie este, haideți să-l ca un dreptunghi trage. 641 00:33:39,910 --> 00:33:43,260 Și eu susțin că atunci când executați un program de cum ar fi Microsoft Word sau Chrome 642 00:33:43,260 --> 00:33:49,220 sau ceva de genul asta, de biti care Microsoft sau Google, care a scris - 643 00:33:49,220 --> 00:33:50,910 în cazul acestor programe - 644 00:33:50,910 --> 00:33:54,490 sunt încărcate în memoria computerului în cazul în care acestea pot fi executate mai 645 00:33:54,490 --> 00:33:57,520 rapid și hrănite în CPU, care este creierul calculatorului. 646 00:33:57,520 --> 00:34:00,940 >> Și în TAM acestea sunt depozitate la foarte partea de sus a programului dumneavoastră, ca să spunem așa. 647 00:34:00,940 --> 00:34:03,300 Cu alte cuvinte, în cazul în care acest lucru este o bucată de memorie, atunci când faceți dublu clic pe 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, biții de vin de pe hard disk. 649 00:34:05,740 --> 00:34:06,680 Ei vor fi încărcate în memoria RAM. 650 00:34:06,680 --> 00:34:10,330 Și le vom împinge în sus la foarte de sus din acest dreptunghi conceptual. 651 00:34:10,330 --> 00:34:13,010 >> Ei bine, restul de memorie este folosit pentru lucruri diferite. 652 00:34:13,010 --> 00:34:16,460 La foarte de sus veți vedea inițializa date și să anuleze date. 653 00:34:16,460 --> 00:34:20,500 Acest lucru are de a face, în cea mai mare parte, cu constante sau variabile globale 654 00:34:20,500 --> 00:34:21,340 care au valori. 655 00:34:21,340 --> 00:34:22,980 Dar mai mult pe cei alt timp. 656 00:34:22,980 --> 00:34:25,150 >> Apoi, aveți morman, care vom reveni la. 657 00:34:25,150 --> 00:34:28,420 Dar în partea de jos este partea care este în special Germane chiar acum. 658 00:34:28,420 --> 00:34:30,210 Este așa-numitul stivă. 659 00:34:30,210 --> 00:34:33,850 Deci, la fel ca în cele mai multe orice sală D aici pe campus, aveți aceste tăvi care 660 00:34:33,850 --> 00:34:37,210 doar stivă unul peste altul pe care puteți pune mâncare și fleacuri. 661 00:34:37,210 --> 00:34:40,139 Stivă într-un sistem informatic este foarte asemănătoare. 662 00:34:40,139 --> 00:34:42,679 Cu excepția întrucât tavă, așa cum vom folosi în sala de mese, desigur, este menit 663 00:34:42,679 --> 00:34:45,710 pentru a transporta lucrurile tăvi sau cadrele - 664 00:34:45,710 --> 00:34:49,469 cum le vom numi - într-un computer memorie este folosit pentru a ține 665 00:34:49,469 --> 00:34:51,610 variabile și valori. 666 00:34:51,610 --> 00:34:53,929 >> Deci, ce se întâmplă cu adevărat sub capota? 667 00:34:53,929 --> 00:34:55,820 Ei bine, lasă-mă să flip peste la ecranul aici. 668 00:34:55,820 --> 00:34:58,370 Și haideți să se concentreze doar pe partea de jos pentru un moment. 669 00:34:58,370 --> 00:35:02,770 Dacă aceasta este partea de jos a mea memoria calculatorului se dovedește atunci când am 670 00:35:02,770 --> 00:35:05,350 apela funcția principală - care se întâmplă, sincer, 671 00:35:05,350 --> 00:35:06,950 în mod automat pentru mine - 672 00:35:06,950 --> 00:35:10,510 I a lua o bucată de memorie la partea de jos a RAM meu ca să spunem așa. 673 00:35:10,510 --> 00:35:13,390 Și acest lucru este în cazul în care este principala variabile locale merge. 674 00:35:13,390 --> 00:35:16,770 Este cazul în care argc și argv poate du-te, și orice variabile I 675 00:35:16,770 --> 00:35:18,170 declara interiorul principal. 676 00:35:18,170 --> 00:35:20,260 Ei ajung în partea de jos de RAM computerului meu. 677 00:35:20,260 --> 00:35:25,040 >> Acum, să presupunem că apelurile principale o funcție cum ar fi swap, așa cum a făcut-o săptămâna trecută? 678 00:35:25,040 --> 00:35:30,620 Ei bine, am pus în esență, un nou tavă, o Noul cadru, pe bucata mea de memorie. 679 00:35:30,620 --> 00:35:34,160 Și am de gând să descrie acest lucru ca aparținând funcția de swap. 680 00:35:34,160 --> 00:35:35,770 >> Acum, ceea ce este în interiorul de schimb? 681 00:35:35,770 --> 00:35:39,240 Ei bine, bazat pe programul de săptămâna trecută și cea pe care am văzut doar un fragment din, 682 00:35:39,240 --> 00:35:46,590 interiorul cadrului de swap lui, sau pe schimb de tavă, sunt ceea ce variabile? 683 00:35:46,590 --> 00:35:47,970 Ei bine, A și B. 684 00:35:47,970 --> 00:35:51,850 Deoarece acestea au fost argumentele sale locale, plus un al treilea, tmp. 685 00:35:51,850 --> 00:35:54,470 Deci, într-adevăr, am putea trage acest un pic mai curat. 686 00:35:54,470 --> 00:35:56,680 Lasă-mă să merg mai departe și să refacem eticheta. 687 00:35:56,680 --> 00:35:58,520 Și permiteți-mi să pretind că știi ce? 688 00:35:58,520 --> 00:36:00,560 >> o este, probabil, va ajunge aici. 689 00:36:00,560 --> 00:36:02,160 B se va termina aici. 690 00:36:02,160 --> 00:36:03,810 Și tmp se va termina aici. 691 00:36:03,810 --> 00:36:05,160 Acum, comanda ar putea fi un pic diferit. 692 00:36:05,160 --> 00:36:06,840 Dar conceptual aceasta este ideea. 693 00:36:06,840 --> 00:36:11,490 >> Și colectiv, aceasta este ceea ce vom numi cadrul swap, sau 694 00:36:11,490 --> 00:36:12,136 tavă de luat masa, hol. 695 00:36:12,136 --> 00:36:13,150 Și la fel face cu principal. 696 00:36:13,150 --> 00:36:14,040 Dar nu voi aspira asta. 697 00:36:14,040 --> 00:36:17,810 Dar asta e în cazul în care argc și argv și orice dintre variabilele sale locale ca x și y 698 00:36:17,810 --> 00:36:18,940 ar putea fi la fel de bine. 699 00:36:18,940 --> 00:36:22,170 >> Deci, acum în considerare ceea ce se întâmplă cu adevărat atunci când te sun de swap. 700 00:36:22,170 --> 00:36:26,370 Când apelați schimb, cod executarea cum ar fi acest lucru, sunteți în trecere, în 701 00:36:26,370 --> 00:36:30,670 Versiunea buggy, a și b sub formă de copii ale lui x și y. 702 00:36:30,670 --> 00:36:34,300 Deci, dacă eu atrag acum acest pe ecran - 703 00:36:34,300 --> 00:36:36,700 Trebuie să mă mai bine la asta - 704 00:36:36,700 --> 00:36:40,850 deci povestea i-am spus să mă a fost, în această versiune buggy, atunci când 705 00:36:40,850 --> 00:36:46,130 apel schimba trece în literalmente a și b ca numere întregi, ceea ce se întâmplă cu adevărat? 706 00:36:46,130 --> 00:36:48,250 >> Ei bine, ce se întâmplă cu adevărat este acest lucru. 707 00:36:48,250 --> 00:36:52,850 Lasă-mă să merg mai departe și să refacem doar pentru a clarifica unele spațiu aici. 708 00:36:52,850 --> 00:36:54,720 Deci, aceasta este memoria computerului meu. 709 00:36:54,720 --> 00:36:57,510 >> Deci, dacă am avea, de exemplu - 710 00:36:57,510 --> 00:36:58,910 lăsa să o facem în acest fel - 711 00:36:58,910 --> 00:37:02,690 dacă eu susțin că acest lucru este x, stocarea valoarea 1 la fel ca săptămâna trecută. 712 00:37:02,690 --> 00:37:05,930 Și acest lucru este y, stocarea valoarea 2 la fel ca săptămâna trecută. 713 00:37:05,930 --> 00:37:11,370 Și aceasta este principala, când am apel de swap, oferind astfel am acces la o și 714 00:37:11,370 --> 00:37:15,150 b și tmp, am de gând să pretind că aceasta este o și acest lucru este 1. 715 00:37:15,150 --> 00:37:16,080 >> Acest lucru este b. 716 00:37:16,080 --> 00:37:17,010 Aceasta este 2. 717 00:37:17,010 --> 00:37:18,370 Aceasta se numește tmp. 718 00:37:18,370 --> 00:37:23,360 >> Și inițial, acesta are o valoare de gunoi până când am stoca de fapt, într-o, 719 00:37:23,360 --> 00:37:24,450 care este 1. 720 00:37:24,450 --> 00:37:28,320 Apoi am merge mai departe și de a schimba o să fie ce? 721 00:37:28,320 --> 00:37:29,720 Valoarea B. 722 00:37:29,720 --> 00:37:31,980 >> Iar acum am doi aici. 723 00:37:31,980 --> 00:37:34,050 Și apoi am spus b. se tmp. 724 00:37:34,050 --> 00:37:37,670 Din nou, la fel ca și verifica un bun-simț, de-a treia linie de cod aici este pur și simplu acest lucru 725 00:37:37,670 --> 00:37:39,440 unul, b devine tmp. 726 00:37:39,440 --> 00:37:41,730 >> Și astfel în cele din urmă, ce să fac? 727 00:37:41,730 --> 00:37:46,800 Am merge mai departe și de a schimba b să fie orice valoarea tmp este, care este 1. 728 00:37:46,800 --> 00:37:48,390 Nu atingeți din nou tmp. 729 00:37:48,390 --> 00:37:54,100 >> Dar acum, problema este cât de curând schimb se întoarce, pentru că nu este predarea 730 00:37:54,100 --> 00:37:57,540 înapoi unele valoare, nu e nici o întoarcere afirmație în mod explicit în ea. 731 00:37:57,540 --> 00:37:59,080 Ce se intampla de fapt? 732 00:37:59,080 --> 00:38:03,480 Ei bine, în esență, toate această memorie - 733 00:38:03,480 --> 00:38:07,410 OK, se pare că radiera place doar un deget la un moment dat - 734 00:38:07,410 --> 00:38:08,180 doar dispare. 735 00:38:08,180 --> 00:38:10,070 >> Acum, în realitate, nu este merge oriunde. 736 00:38:10,070 --> 00:38:11,810 Dar vă puteți gândi la ea acum ca semne de întrebare. 737 00:38:11,810 --> 00:38:14,040 Pentru că nu mai este de fapt în uz. 738 00:38:14,040 --> 00:38:17,470 Și nu se face nimic cu aceste valori. 739 00:38:17,470 --> 00:38:21,920 >> Deci, în cazul versiunii de verde acest cod, ceea ce în schimb este în curs de 740 00:38:21,920 --> 00:38:24,640 a trecut în schimb? 741 00:38:24,640 --> 00:38:25,770 Așa se adresează. 742 00:38:25,770 --> 00:38:28,520 Deci adresa lui x și adresa de y. 743 00:38:28,520 --> 00:38:35,790 Deci, dacă am re-spunem aceasta poveste ultima timp, și am trage de fapt schimb din nou, 744 00:38:35,790 --> 00:38:44,620 dar cu indicii, aceasta fiind o, această fiind b, iar acest lucru fiind tmp, ceea ce este 745 00:38:44,620 --> 00:38:49,080 efectiv depozitată într-o în acest verde versiunea de codul meu în care am trece 746 00:38:49,080 --> 00:38:52,110 in adrese? 747 00:38:52,110 --> 00:38:53,780 >> O să fie un pointer la x. 748 00:38:53,780 --> 00:38:54,890 Deci, am putea trage o săgeată. 749 00:38:54,890 --> 00:38:57,310 Dar hai să folosim același arbitrară exemplu ca mai înainte. 750 00:38:57,310 --> 00:39:01,220 Să spunem că aceasta este ceva de genul Ox123. 751 00:39:01,220 --> 00:39:04,970 Și acest lucru se întâmplă să fie Ox127 deoarece este de patru bytes departe, pentru că este un 752 00:39:04,970 --> 00:39:07,370 Int, așa Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Și din nou, eu iau niște libertăți cu numere. 754 00:39:09,080 --> 00:39:11,430 Sunt mult mai mici decât ar fi fie de fapt și într-o ordine diferită. 755 00:39:11,430 --> 00:39:14,350 Dar asta e modul în care imaginea este acum diferit. 756 00:39:14,350 --> 00:39:19,060 >> Dar când am folosi acest cod verde și eu tmp int obține * o. 757 00:39:19,060 --> 00:39:25,010 * Un mijloc de a face următoarele, ia adresa, care este într-o și du-te la ea, 758 00:39:25,010 --> 00:39:26,190 care este 1. 759 00:39:26,190 --> 00:39:28,480 Și asta e ceea ce apoi am pus în tmp. 760 00:39:28,480 --> 00:39:32,480 Între timp, în următoarea linie de cod aici, * a se b, ce înseamnă asta? 761 00:39:32,480 --> 00:39:36,910 >> Ei bine, * un, deci du-te aici devine * b, ceea ce înseamnă du-te acolo. 762 00:39:36,910 --> 00:39:39,310 Și asta înseamnă că a pus valoarea de acolo. 763 00:39:39,310 --> 00:39:43,670 În cele din urmă, ultima linie de cod pur și simplu a declarat * B se tmp. 764 00:39:43,670 --> 00:39:48,900 >> Deci, B spune du-te acolo și suprascrie cu tmp care, în acest caz, se va 765 00:39:48,900 --> 00:39:51,520 să fie, din nou, 1. 766 00:39:51,520 --> 00:39:54,920 Și acesta este motivul pentru versiunea verde a faptele noastre de cod, în timp ce roșu 767 00:39:54,920 --> 00:39:56,010 Versiunea niciodată nu a făcut. 768 00:39:56,010 --> 00:39:59,020 Totul doar se reduce la modul în care Memoria este gestionată și care este 769 00:39:59,020 --> 00:40:02,580 pus efectiv în dvs. RAM computerului. 770 00:40:02,580 --> 00:40:07,270 Și de acum, asta e unul din lucrurile că stiva este utilizat pentru. 771 00:40:07,270 --> 00:40:09,225 >> Întrebări cu privire la aspect? 772 00:40:09,225 --> 00:40:10,380 Pe indicii? 773 00:40:10,380 --> 00:40:11,630 Sau la schimb? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> În regulă, deci malloc, rechemare, a facut ceva de genul asta. 776 00:40:17,043 --> 00:40:18,260 Acesta a fost un exemplu foarte simplu. 777 00:40:18,260 --> 00:40:20,550 Și aceasta a fost cel care Binky ne-a prezentat, deși destul de 778 00:40:20,550 --> 00:40:21,870 repede, la sfârșitul clasei. 779 00:40:21,870 --> 00:40:24,480 La naiba, nu vom merge din nou. 780 00:40:24,480 --> 00:40:28,780 >> Astfel amintesc că acesta a fost un exemplu care Binky ne-a prezentat, deși 781 00:40:28,780 --> 00:40:30,360 oarecum repede la sfârșitul clasei. 782 00:40:30,360 --> 00:40:33,640 Și aici am folosit malloc adevărat pentru a doua oară. 783 00:40:33,640 --> 00:40:37,330 Pentru că prima dată l-am folosit pentru a crea suficient RAM, aloca suficient de memorie RAM 784 00:40:37,330 --> 00:40:38,340 pentru a stoca un șir. 785 00:40:38,340 --> 00:40:40,250 >> De data aceasta Binky pastrat simplu. 786 00:40:40,250 --> 00:40:42,465 Deci, este de a stoca doar un întreg, aparent. 787 00:40:42,465 --> 00:40:43,510 Și că e în regulă. 788 00:40:43,510 --> 00:40:46,560 E un pic ciudat, sincer, să folosi malloc pentru a aloca o Int. 789 00:40:46,560 --> 00:40:50,650 Dar punctul de claymation Nick era într-adevăr spune doar povestea a ceea ce 790 00:40:50,650 --> 00:40:53,830 se întâmplă sau nu se întâmplă atunci când ai maltrata memorie. 791 00:40:53,830 --> 00:40:56,520 >> Deci, în acest caz, acest program a făcut o serie de lucruri. 792 00:40:56,520 --> 00:41:01,580 În primul caz aici, se declară un indicator numit x la un int. 793 00:41:01,580 --> 00:41:04,480 Apoi, declară un pointer numita y este un număr întreg. 794 00:41:04,480 --> 00:41:06,150 Se stochează apoi în x, ce? 795 00:41:06,150 --> 00:41:07,110 Altcineva acum. 796 00:41:07,110 --> 00:41:09,685 Ceea ce este stocat în conformitate cu x a treia linie a acestui program? 797 00:41:09,685 --> 00:41:12,380 >> Audiența: [inaudibil]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: Ei bine, nu chiar bytes, pe spun. 799 00:41:14,130 --> 00:41:16,760 Fii mai precis acum. 800 00:41:16,760 --> 00:41:18,325 Ceea ce este stocat în x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 O adresa, cred că l-am auzit. 803 00:41:22,060 --> 00:41:23,570 >> Deci, ce se întoarce malloc? 804 00:41:23,570 --> 00:41:26,030 malloc comportamental alocă o bucată de memorie. 805 00:41:26,030 --> 00:41:27,850 Dar cum se da acces la ea? 806 00:41:27,850 --> 00:41:29,460 Se întoarce ce? 807 00:41:29,460 --> 00:41:32,000 Adresa primului octet în bucată de memorie. 808 00:41:32,000 --> 00:41:33,020 >> Acum, acest lucru este foarte simplu. 809 00:41:33,020 --> 00:41:35,380 Este doar un octet, ceea ce înseamnă adresa primim înapoi este 810 00:41:35,380 --> 00:41:37,300 adresa totul. 811 00:41:37,300 --> 00:41:42,070 Astfel depozitate în x, atunci, este adresa de care bucată de memorie. 812 00:41:42,070 --> 00:41:43,400 Între timp, ceea ce se întâmplă în continuare? 813 00:41:43,400 --> 00:41:45,890 Așa că, de fapt, să mergem mai departe și trage acest rapid de reală. 814 00:41:45,890 --> 00:41:52,490 >> Deci, dacă mergem pe la ecranul de aici și vom juca asta int * x și int * y 815 00:41:52,490 --> 00:41:53,740 este de gând să facă ceea ce pentru mine? 816 00:41:53,740 --> 00:41:58,280 Eu susțin că este doar de gând să faci ceva de genul asta și îl numesc x, și 817 00:41:58,280 --> 00:42:00,010 acest lucru și-l numesc y. 818 00:42:00,010 --> 00:42:03,110 Între timp, a treia linie de cod este va aloca dimensiunea de un int, 819 00:42:03,110 --> 00:42:06,160 care se întâmplă să fie - Îmi pare rău dacă am spus o înainte de am vrut o Int - 820 00:42:06,160 --> 00:42:08,280 patru octeți de pe un calculator tipic. 821 00:42:08,280 --> 00:42:09,720 Cel puțin cu CS50 aparat. 822 00:42:09,720 --> 00:42:11,490 >> Deci, acest lucru se va aloca ea, cine știe? 823 00:42:11,490 --> 00:42:12,800 Undeva pe aici. 824 00:42:12,800 --> 00:42:15,780 Și acest lucru este stocat la unele Adresa Ox, cine știe? 825 00:42:15,780 --> 00:42:18,330 Dar ce se întâmplă să se returnate este acea adresă. 826 00:42:18,330 --> 00:42:22,270 Dar vom trage acest pictural ca doar o săgeată de genul asta. 827 00:42:22,270 --> 00:42:25,430 >> Acum, în următoarea linie * x devine 42. 828 00:42:25,430 --> 00:42:29,400 Ce * x înseamnă în termeni de nespecialist? 829 00:42:29,400 --> 00:42:30,040 Doar du-te acolo. 830 00:42:30,040 --> 00:42:30,960 Du-te la acea adresă. 831 00:42:30,960 --> 00:42:35,900 Sau cu alte cuvinte, urmați săgeată și a pus 42 acolo. 832 00:42:35,900 --> 00:42:38,140 Dar apoi sa întâmplat ceva rău la Binky, nu? 833 00:42:38,140 --> 00:42:43,950 >> Amintiti-va ca linia de cinci aici, * y devine 13, într-adevăr, un număr de ghinion, 834 00:42:43,950 --> 00:42:44,760 a făcut ceea ce pentru noi? 835 00:42:44,760 --> 00:42:47,320 Ei bine, * mijloace y du-te acolo. 836 00:42:47,320 --> 00:42:50,460 Ei bine, acest lucru nu a fost dat o valoare încă, nu? 837 00:42:50,460 --> 00:42:54,090 Codul nu are y fiind initializat cu nimic. 838 00:42:54,090 --> 00:42:56,120 Am avut x faza de inițializare la o adresă. 839 00:42:56,120 --> 00:42:57,640 Dar Y a fost declarat sus. 840 00:42:57,640 --> 00:43:00,250 Dar apoi o virgulă, nici o valoare a fost de fapt pus în ea. 841 00:43:00,250 --> 00:43:02,330 Deci, este corect să numim această o valoare gunoi. 842 00:43:02,330 --> 00:43:03,430 Cine știe ce-i acolo? 843 00:43:03,430 --> 00:43:07,160 Sunt resturi de biți care au fost folosite de o linie anterioară de cod în 844 00:43:07,160 --> 00:43:08,300 programul meu. 845 00:43:08,300 --> 00:43:13,250 >> Deci, dacă am spus acolo, acest lucru este ca, Nu am nici o idee unde acest lucru săgeata este 846 00:43:13,250 --> 00:43:14,490 va termina. 847 00:43:14,490 --> 00:43:17,720 Și asta e atunci când de obicei a obține o eroare de segmentare. 848 00:43:17,720 --> 00:43:22,430 Daca din greseala dereference, astfel încât să vorbesc, sau du-te la o adresă care nu este 849 00:43:22,430 --> 00:43:25,400 de fapt, o adresă legitim, se întâmplă lucruri rele. 850 00:43:25,400 --> 00:43:27,550 >> Și asta este exact ceea ce sa întâmplat să se gândească Binky. 851 00:43:27,550 --> 00:43:31,060 Astfel amintesc că povestea pe care Nick a fost spune aici a fost aceeași idee ca ceea ce 852 00:43:31,060 --> 00:43:34,050 Am desenat cu iluzia creta pe tablă acolo. 853 00:43:34,050 --> 00:43:35,960 X și Y sunt declarate. 854 00:43:35,960 --> 00:43:39,690 >> Apoi am alocat mărimea un int și depozitat-o ​​în x. 855 00:43:39,690 --> 00:43:42,130 Apoi următoarea linie am făcut * x. 856 00:43:42,130 --> 00:43:46,070 Aceasta a fost bagheta magică a lui Nick de dereferencing. 857 00:43:46,070 --> 00:43:49,780 Care pune 42 în memoria a subliniat de x. 858 00:43:49,780 --> 00:43:51,600 >> Dar acest lucru este în cazul în care lucrurile mers foarte prost. 859 00:43:51,600 --> 00:43:51,820 Dreapta? 860 00:43:51,820 --> 00:43:53,550 Am încercat să y dereference. 861 00:43:53,550 --> 00:43:55,620 Dar y avut o valoare fals, corect? 862 00:43:55,620 --> 00:43:57,720 >> Că săgeata în jos din partea stângă colț, nu este 863 00:43:57,720 --> 00:43:58,950 de fapt, arătând spre nimic. 864 00:43:58,950 --> 00:44:01,520 Este un fel de a face ceea ce am a făcut aici, de pe bord. 865 00:44:01,520 --> 00:44:05,900 Deci, se intampla lucruri rele, segmentarea vina, sau Binky vina, în acest caz. 866 00:44:05,900 --> 00:44:10,800 >> Dar, dacă atunci se stabilească faptul că prin a face x devine y Cum se schimbă povestea? 867 00:44:10,800 --> 00:44:15,760 Ei bine, dacă fac x devine y, care este efectiv aceeași cu a spune 868 00:44:15,760 --> 00:44:19,235 Orice ar fi, Ox-ceva va fi la fel aici, 869 00:44:19,235 --> 00:44:20,080 Ox-ceva. 870 00:44:20,080 --> 00:44:22,970 Sau pictural vom trage o săgeată. 871 00:44:22,970 --> 00:44:25,530 >> Deci, aici pe bord cu Binky, cu următoarea linie de 872 00:44:25,530 --> 00:44:28,350 cod, * y înseamnă că mergem acolo. 873 00:44:28,350 --> 00:44:29,400 Unde este acolo? 874 00:44:29,400 --> 00:44:30,820 Aceasta înseamnă peste aici. 875 00:44:30,820 --> 00:44:36,050 >> Și când am actualizare care să fie 13 aceasta implică doar merge și 876 00:44:36,050 --> 00:44:39,470 scris 13 aici acum. 877 00:44:39,470 --> 00:44:44,130 Deci, poate nu complet simplu la prima vedere. 878 00:44:44,130 --> 00:44:47,740 Dar trecerea în revistă și să utilizeze același jargon care Binky a folosit aici, așa 879 00:44:47,740 --> 00:44:50,485 primele două aloce indicii, x și y, dar nu a pointees. 880 00:44:50,485 --> 00:44:54,750 Și pointees nu face termen folosit în general. 881 00:44:54,750 --> 00:44:56,120 Dar indicatorul absolut este. 882 00:44:56,120 --> 00:44:59,200 Dar este ceea ce se a subliniat la în nomenclatura Binky. 883 00:44:59,200 --> 00:45:01,660 >> Această linie viitoare, desigur, alocă o pointee Int. 884 00:45:01,660 --> 00:45:04,840 Deci, o bucată de memorie - așa cum am atras peste pe partea dreapta acolo - și set 885 00:45:04,840 --> 00:45:06,470 x egal cu punctul de ea. 886 00:45:06,470 --> 00:45:11,350 Acest dereferences x pentru a stoca 42 în de memorie care este pointing la. 887 00:45:11,350 --> 00:45:13,380 Și apoi aceasta, desigur, a fost un lucru rău. 888 00:45:13,380 --> 00:45:15,600 Deoarece y nu a fost îndreptat la nimic încă. 889 00:45:15,600 --> 00:45:16,530 Aceasta se fixează. 890 00:45:16,530 --> 00:45:18,240 Deci, aceasta este în continuare program de buggy. 891 00:45:18,240 --> 00:45:21,580 Doar pentru că suntem suflare prin linie de cod de linie și spune, oh bine, 892 00:45:21,580 --> 00:45:22,690 lăsați-l să accident acolo. 893 00:45:22,690 --> 00:45:23,420 Asta e un lucru rău. 894 00:45:23,420 --> 00:45:26,790 Cote sunt programului doar de gând să abandona cu totul la acea linie. 895 00:45:26,790 --> 00:45:30,550 Dar dacă ar fi să scoateți prăbușit linie și să o înlocuiască cu ultimele două 896 00:45:30,550 --> 00:45:32,470 Liniile acolo atribui - 897 00:45:32,470 --> 00:45:35,310 folosind misiune pointer - y la punctul de x ca punct t. 898 00:45:35,310 --> 00:45:39,280 Și apoi dereference y într-un mod foarte sigur. 899 00:45:39,280 --> 00:45:41,520 >> Deci, unde ne duce asta? 900 00:45:41,520 --> 00:45:45,350 Ei bine, se dovedește că sub capota în CS50 biblioteca, indicii sunt 901 00:45:45,350 --> 00:45:46,320 utilizate în întreaga. 902 00:45:46,320 --> 00:45:48,910 Și vom începe efectiv de coaja înapoi ca strat înainte de lung. 903 00:45:48,910 --> 00:45:51,740 Dar se pare prea, o expresie care unii dintre voi s-ar putea să fie familiarizat cu, 904 00:45:51,740 --> 00:45:54,580 în special cele mai confortabile, este de fapt cea a unui foarte popular 905 00:45:54,580 --> 00:45:56,390 site-ul, sau Stack Overflow, în aceste zile. 906 00:45:56,390 --> 00:45:58,720 >> Dar acest fapt are foarte sensul tehnic. 907 00:45:58,720 --> 00:46:00,160 Acum știm ce o stivă este. 908 00:46:00,160 --> 00:46:02,550 E ca un teanc de tăvi în interiorul de o sală de mese. 909 00:46:02,550 --> 00:46:05,140 >> Sau în interiorul computerului Memoria sa aceste cadre 910 00:46:05,140 --> 00:46:06,900 care sunt utilizate de către funcțiile. 911 00:46:06,900 --> 00:46:10,760 Ei bine, se pare că din cauza asta implementarea foarte simplu de 912 00:46:10,760 --> 00:46:14,970 memorie și cadrele de pe așa-numitul stivă, puteți lua de fapt, controlul 913 00:46:14,970 --> 00:46:17,050 a unui sistem informatic destul de ușor. 914 00:46:17,050 --> 00:46:22,180 Puteți hack într-un sistem în cazul în care oamenii ca noi nu am scris codul nostru 915 00:46:22,180 --> 00:46:23,300 deosebit de bine. 916 00:46:23,300 --> 00:46:26,670 >> Dacă oameni ca noi folosesc bucăți de memorie sau de utilizare matrice - 917 00:46:26,670 --> 00:46:27,810 chiar mai frecvent - 918 00:46:27,810 --> 00:46:31,800 dar uneori uitați să verificați limitele gama noastră ca s-ar putea 919 00:46:31,800 --> 00:46:38,470 au tine uneori, și a reiterat mult prea departe dincolo de sfârșitul unei matrice. 920 00:46:38,470 --> 00:46:40,520 În cel mai bun caz, programul s-ar putea prăbuși doar. 921 00:46:40,520 --> 00:46:42,280 Eroare de segmentare, un fel de jenant. 922 00:46:42,280 --> 00:46:45,480 Nu este mare, dar nu este neapărat un lucru extrem de rău. 923 00:46:45,480 --> 00:46:49,480 >> Dar, în cazul în care programul este, de fapt pe reală computerele utilizatorilor, în cazul în care se execută 924 00:46:49,480 --> 00:46:53,070 pe un site web care persoane reale aleatoare pe Internet sunt lovind, permițându- 925 00:46:53,070 --> 00:46:56,690 oamenii induce lucruri rele pe care codul este în general, nu un lucru bun, deoarece 926 00:46:56,690 --> 00:46:59,930 înseamnă o oportunitate de a lua controlul calculatorului. 927 00:46:59,930 --> 00:47:01,350 Și acest lucru se întâmplă să uite un pic criptic. 928 00:47:01,350 --> 00:47:04,570 Dar am crezut că te sperii cu acest ultim exemplu aici. 929 00:47:04,570 --> 00:47:05,650 >> Iată un exemplu de cod. 930 00:47:05,650 --> 00:47:07,370 Și există o bună Wikipedia Articolul, care se plimba prin 931 00:47:07,370 --> 00:47:08,530 aceasta mai detaliat. 932 00:47:08,530 --> 00:47:13,890 Am principal la chemarea de jos foo, trecând în argv de 1. 933 00:47:13,890 --> 00:47:15,750 Și asta e doar astfel încât să puteți rula programul și să treacă 934 00:47:15,750 --> 00:47:17,080 o intrare arbitrar. 935 00:47:17,080 --> 00:47:20,180 >> Și apoi foo este declarat în sus de top ca acceptarea unui șir, sau mai mult 936 00:47:20,180 --> 00:47:21,700 precis, un char *. 937 00:47:21,700 --> 00:47:23,860 Ea declară apoi o serie de caractere. 938 00:47:23,860 --> 00:47:27,130 Numiți-un tampon, mai general, de mărimea 12. 939 00:47:27,130 --> 00:47:30,900 Deci, 12 caractere pot potrivi in ​​interiorul din care array numit C. 940 00:47:30,900 --> 00:47:33,510 >> Și apoi folosește această nouă funcție, ceea ce este nou, dar nu greu de 941 00:47:33,510 --> 00:47:34,930 înțelege, copie de memorie. 942 00:47:34,930 --> 00:47:39,290 Se copiază în memoria din bar, care a fost n trecut variabilă, indiferent 943 00:47:39,290 --> 00:47:42,080 utilizatorul tastat în argv 1 în C. 944 00:47:42,080 --> 00:47:43,090 Câți biți? 945 00:47:43,090 --> 00:47:44,260 Lungimea șir de bar. 946 00:47:44,260 --> 00:47:48,380 >> Deci, cu alte cuvinte, în cazul tipurilor de utilizare în h-e-l-l-o Introduceți, lungimea șirului 947 00:47:48,380 --> 00:47:49,260 de salut este de cinci ani. 948 00:47:49,260 --> 00:47:52,790 Deci, cinci dintre aceste bytes este mergi la a lua copiat în matrice numit C, care 949 00:47:52,790 --> 00:47:54,110 este de dimensiune 12. 950 00:47:54,110 --> 00:47:58,710 Dar tipurile de ceea ce utilizatorul într-o mult mai mult Cuvântul care este de 13 caractere sau 14 951 00:47:58,710 --> 00:48:01,250 caractere sau 100 de caractere sau mai mult? 952 00:48:01,250 --> 00:48:02,660 >> În cazul în care au de gând să meargă? 953 00:48:02,660 --> 00:48:06,090 Ei bine, acel cadru, că tava în stivă de mese sala, 954 00:48:06,090 --> 00:48:06,930 ei vor să meargă acolo. 955 00:48:06,930 --> 00:48:10,080 Și este doar de gând să înceapă suprascrierea alte lucruri pe care e deja 956 00:48:10,080 --> 00:48:12,880 pe care stiva, debordant stiva, ca să spunem așa. 957 00:48:12,880 --> 00:48:14,780 >> Deci pictural, cred că de felul acesta. 958 00:48:14,780 --> 00:48:17,970 Aceasta este doar o versiune de colorat imaginea am fost de desen. 959 00:48:17,970 --> 00:48:20,060 În partea de jos, să spunem, este principala. 960 00:48:20,060 --> 00:48:24,690 Și pe partea de sus, ceea ce vedem acum este cadru, coduri de culoare acum, pentru o 961 00:48:24,690 --> 00:48:26,090 Funcția numit foo. 962 00:48:26,090 --> 00:48:30,170 Dar ceea ce este interesant aici despre foo este că aici este cadrul său. 963 00:48:30,170 --> 00:48:32,860 Deci, este redactat la fel cum am făcut, dar în albastru deschis. 964 00:48:32,860 --> 00:48:35,220 Iar acum acest lucru este în cazul în care C suport 0 merge. 965 00:48:35,220 --> 00:48:37,410 Și acest lucru este în cazul în c suport 11 se va termina. 966 00:48:37,410 --> 00:48:39,670 >> Cu alte cuvinte, se întâmplă să fi reprezentată ca un pătrat. 967 00:48:39,670 --> 00:48:42,320 Dar dacă doar vă păstrați plopping bytes jos - sau caractere - au de gând să se încheie 968 00:48:42,320 --> 00:48:46,070 până la locația 0 tot drumul în sus la 11 deoarece este 0 indexate. 969 00:48:46,070 --> 00:48:49,170 >> Dar unde este caracterul 13 va termina? 970 00:48:49,170 --> 00:48:50,310 Unde e al 14-lea? 971 00:48:50,310 --> 00:48:52,430 Unde e caracterul 50 va termina? 972 00:48:52,430 --> 00:48:54,070 >> Se va continua merge în jos. 973 00:48:54,070 --> 00:48:57,350 Pentru că, chiar dacă ne-am desenat imagine cu stiva de creștere, 974 00:48:57,350 --> 00:48:59,920 adrese, se pare, du-te la adrese mici, mici, 975 00:48:59,920 --> 00:49:01,830 indicii, la adrese mari. 976 00:49:01,830 --> 00:49:03,540 Așa că păstrează doar merge în sus și în sus. 977 00:49:03,540 --> 00:49:05,660 >> Deci, dacă utilizatorul tastează în Bună ziua, asta e minunat. 978 00:49:05,660 --> 00:49:08,650 Nu bug-ul, nici o problemă, în condiții de siguranță toată lumea. 979 00:49:08,650 --> 00:49:11,940 Dar dacă utilizatorul tastează în ceea ce vom apel cod contradictorie, reprezentată 980 00:49:11,940 --> 00:49:16,040 generic ca un, atac, atac, atac, atac, ce se poate întâmpla? 981 00:49:16,040 --> 00:49:19,760 >> Ei bine, dacă toate de intrare care utilizatorul tastat nu este doar un amical 982 00:49:19,760 --> 00:49:21,540 sau șir de caractere ofensiv. 983 00:49:21,540 --> 00:49:24,050 Este de fapt o secvență de caractere că, dacă l-ați compilat, 984 00:49:24,050 --> 00:49:26,050 este de fapt codul. 985 00:49:26,050 --> 00:49:29,570 Poate că e cod care șterge toate fișierele de pe hard disk sau trimite spam- 986 00:49:29,570 --> 00:49:30,810 sau ceva de genul asta. 987 00:49:30,810 --> 00:49:35,110 Observați că ceea ce este esențial aici este că În cazul în care personajul negativ ajuns suficient de norocos pentru a 988 00:49:35,110 --> 00:49:37,830 suprascrie bucată roșie de memorie - 989 00:49:37,830 --> 00:49:41,080 pe care nu am trage pe poza mea, dar această imagine Wikipedia are aici - 990 00:49:41,080 --> 00:49:42,890 așa-numitul adresa retur. 991 00:49:42,890 --> 00:49:47,470 >> Când se întoarce alimentare, atunci când se întoarce de swap, cum calculatorului știu să meargă la 992 00:49:47,470 --> 00:49:49,790 aici sus în jos aici? 993 00:49:49,790 --> 00:49:52,920 Sau în segmentul tehnologie până sus, cum nu știu să meargă din swap 994 00:49:52,920 --> 00:49:54,870 cod - 0 și de 1 care compun schimb - 995 00:49:54,870 --> 00:49:56,020 Înapoi la Principal? 996 00:49:56,020 --> 00:50:00,450 Există un așa-numitul adresa expeditorului stocate în același cadru stivă, pe 997 00:50:00,450 --> 00:50:02,140 aceeași tavă cantină. 998 00:50:02,140 --> 00:50:06,080 >> Deci, dacă cel rău este destul de inteligent pentru a pune codul de atac, cod de atac, de atac 999 00:50:06,080 --> 00:50:07,960 cod, și de a lua suficient de norocos - 1000 00:50:07,960 --> 00:50:11,630 de multe ori prin încercare și eroare - a suprascrie care adresa expeditorului roșu, 1001 00:50:11,630 --> 00:50:14,360 cu adresa și anunțul foarte de sus. 1002 00:50:14,360 --> 00:50:16,830 Observați 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Este scris invers sus de top pentru Motivele vom poate revizita. 1004 00:50:20,650 --> 00:50:22,050 Acest lucru este faptul că numărul. 1005 00:50:22,050 --> 00:50:25,790 >> Deci, dacă cel rău devine suficient de norocos sau este suficient de inteligent pentru a suprascrie roșu 1006 00:50:25,790 --> 00:50:29,480 fâșie de memorie cu adresa de cod care el sau ea are într-un fel 1007 00:50:29,480 --> 00:50:34,980 injectat în computer, ghici cărui Codul va fi returnat 1008 00:50:34,980 --> 00:50:38,260 îndată ce foo se face executare? 1009 00:50:38,260 --> 00:50:39,440 >> Codul tipului cel rau. 1010 00:50:39,440 --> 00:50:43,610 Deci, acest cod de atac, AAA, din nou, s-ar putea trimite spam-ul, s-ar putea șterge toate fișierele 1011 00:50:43,610 --> 00:50:44,500 pe hard disk. 1012 00:50:44,500 --> 00:50:48,740 Dar asta este ceea ce cu adevărat un stack overflow este, sau o depășire tampon, sau un 1013 00:50:48,740 --> 00:50:51,060 buffer overflow atac. 1014 00:50:51,060 --> 00:50:54,400 >> Și e incredibil, incredibil de comune la această zi, cu programe scrise în 1015 00:50:54,400 --> 00:50:58,220 C, C + +, și chiar unele alte limbi. 1016 00:50:58,220 --> 00:51:02,275 Pe această notă infricosator, vom se încheie cu o glumă. 1017 00:51:02,275 --> 00:51:03,230 >> [Râsete] 1018 00:51:03,230 --> 00:51:04,550 >> Ne vedem miercuri. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 La următoarea CS50 - 1021 00:51:10,310 --> 00:51:15,920 Deci, eu sunt tot de lămpi disc de azi, dar așteptați, fara grasimi din lapte, jumătate din telefon 1022 00:51:15,920 --> 00:51:17,850 carte, suc de portocale că am băut azi. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Cablu USB, o cheie. 1025 00:51:22,780 --> 00:51:24,800 >> [Redarea muzicii]