1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MUSIC JOC] 3 00:00:11,261 --> 00:00:12,640 >> David J. MALAN: Bine. 4 00:00:12,640 --> 00:00:14,525 Acest lucru este CS50. 5 00:00:14,525 --> 00:00:16,009 Și acesta este începutul de săptămână 5. 6 00:00:16,009 --> 00:00:18,050 Și, după cum poate ați observat, o parte din materialul 7 00:00:18,050 --> 00:00:21,050 devine un pic mai mult complex, puțin densă. 8 00:00:21,050 --> 00:00:24,560 >> Și este foarte ușor, mai ales dacă ai fost în obiceiul de ceva timp, 9 00:00:24,560 --> 00:00:28,600 să încerce să mâzgălească jos cele mai orice am face, ne spune în clasă. 10 00:00:28,600 --> 00:00:31,626 Dar dau seama, că nu este, probabil, abordarea ideală pedagogic 11 00:00:31,626 --> 00:00:34,250 pentru a învăța acest tip de material, și mai mult material, în general. 12 00:00:34,250 --> 00:00:37,250 Și așa suntem încântați să anunta propria Gheng că CS50 lui 13 00:00:37,250 --> 00:00:39,780 Gong a început să se pregătească un set canonic de note 14 00:00:39,780 --> 00:00:42,100 pentru curs, speranța de și anume că, unul, acestea 15 00:00:42,100 --> 00:00:44,030 servi nu numai ca un referință și o resursă 16 00:00:44,030 --> 00:00:47,410 pentru revizuirea materialelor și merge înapoi prin materiale care ar putea avea 17 00:00:47,410 --> 00:00:51,230 ai scăpat prima dată în jurul, dar De asemenea, astfel încât capetele pot fi mai 18 00:00:51,230 --> 00:00:53,740 în sus decât în ​​jos, atunci când vine vorba de timp pentru a preda, 19 00:00:53,740 --> 00:00:56,960 astfel încât s-ar putea angaja mai gânditor, ca 20 00:00:56,960 --> 00:00:59,170 Spre deosebire de mai scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Cu care a spus, ceea ce veți găsi pe site-ul este de documente, cum ar fi acest lucru. 22 00:01:02,510 --> 00:01:04,660 Și preaviz, la stânga sus, nu e nu doar un cuprins, 23 00:01:04,660 --> 00:01:06,920 dar, de asemenea, codurile de timp care vă va sari imediat 24 00:01:06,920 --> 00:01:09,077 la partea corespunzătoare în video online. 25 00:01:09,077 --> 00:01:11,410 Și ce Chang aici a făcut este, în esență, documentate 26 00:01:11,410 --> 00:01:13,340 ceea ce sa întâmplat în acest special prelegere. 27 00:01:13,340 --> 00:01:16,370 Și mulți dintre cursurile sunt deja on-line acum cu acest URL. 28 00:01:16,370 --> 00:01:20,110 Și vom continua să posta restul a celor de la sfârșitul acestei săptămâni, 29 00:01:20,110 --> 00:01:22,380 asa ca profita de această resursă. 30 00:01:22,380 --> 00:01:25,740 >> Deci, fără alte formalități, am început să coaja înapoi 31 00:01:25,740 --> 00:01:28,180 stratul care a fost șir de ceva timp. 32 00:01:28,180 --> 00:01:30,670 Și ceea ce am spus un șir este de fapt săptămâna trecută? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Stele Deci, char. 35 00:01:32,900 --> 00:01:34,900 Și stea char, bine, ce am de fapt acest lucru? 36 00:01:34,900 --> 00:01:37,150 Ei bine, în tot acest timp, în cazul în care ne-am sunat o funcție, 37 00:01:37,150 --> 00:01:40,450 ca getString, și depozitare așa-numitul revenirea 38 00:01:40,450 --> 00:01:42,910 Valoarea de getString într-o variable-- se numește 39 00:01:42,910 --> 00:01:47,721 s tip string-- am scris linie de cod acolo sus. 40 00:01:47,721 --> 00:01:49,970 Și e doar atunci când văd meu scris de mână amplificat aici 41 00:01:49,970 --> 00:01:51,930 îmi dau seama cât de atroce este. 42 00:01:51,930 --> 00:01:54,180 >> Cu toate acestea, să presupunem că, pe partea dreaptă 43 00:01:54,180 --> 00:01:57,070 este, totuși, un rezonabil descriere a ceea ce este 44 00:01:57,070 --> 00:01:58,880 se intampla toate astea timp cu getString. 45 00:01:58,880 --> 00:02:00,380 getString, desigur, devine un șir. 46 00:02:00,380 --> 00:02:01,691 Dar ce înseamnă de fapt acest lucru? 47 00:02:01,691 --> 00:02:04,190 Aceasta înseamnă că devine o bucată de memorie din sistemul de operare 48 00:02:04,190 --> 00:02:06,040 prin apelarea unei funcții, numită malloc. 49 00:02:06,040 --> 00:02:07,390 Dar mai multe despre asta mai târziu. 50 00:02:07,390 --> 00:02:09,139 Și apoi populează că bucata de memorie 51 00:02:09,139 --> 00:02:11,764 cu literele utilizatorul are introduce, urmată de, desigur, 52 00:02:11,764 --> 00:02:14,800 un caracter nul, sau backslash zero la sfârșit. 53 00:02:14,800 --> 00:02:18,280 >> Între timp, pe partea stângă din această poveste, în tot acest timp, 54 00:02:18,280 --> 00:02:20,850 am fost declararea unei variabile, cum ar fi s. 55 00:02:20,850 --> 00:02:24,770 Și că variabila este ceea ce acum va începe de asteptare un pointer. 56 00:02:24,770 --> 00:02:29,190 Nu este o cutie interior de care am pus șir, Daven, în sine, 57 00:02:29,190 --> 00:02:32,550 ci mai degrabă ne-am pus în pătrat caseta din stânga a ce anume? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Da? 60 00:02:35,390 --> 00:02:37,118 >> Audiența: Adresa de în cazul în care se află în memorie. 61 00:02:37,118 --> 00:02:38,118 >> David J. MALAN: Exact. 62 00:02:38,118 --> 00:02:40,690 Adresa de unde Daven este localizat în memorie. 63 00:02:40,690 --> 00:02:44,650 Și nu în cazul în care toate de Daven se află, în sine, dar în mod special adresa 64 00:02:44,650 --> 00:02:45,150 de ce? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Da? 67 00:02:46,810 --> 00:02:47,460 >> Audiența: Primul caracter. 68 00:02:47,460 --> 00:02:50,209 >> David J. MALAN: Primul caracter în Daven, care, în acest caz, 69 00:02:50,209 --> 00:02:53,820 Am propus a fost arbitrar și nerealist 1, OX1, 70 00:02:53,820 --> 00:02:55,910 care înseamnă doar număr hexazecimal de 1. 71 00:02:55,910 --> 00:02:57,993 Dar este, probabil, va să fie un număr mult mai mare 72 00:02:57,993 --> 00:03:01,260 pe care le-ar putea atrage cu un 0x ca prefix, 73 00:03:01,260 --> 00:03:02,806 reprezentând un caracter hexazecimal. 74 00:03:02,806 --> 00:03:05,930 Și pentru că nu avem nevoie să știm unde restul personajelor de Daven 75 00:03:05,930 --> 00:03:09,860 sunt, pentru că de ce design simplu decizie care a fost făcut în urmă cu mai mulți ani? 76 00:03:09,860 --> 00:03:10,548 Da? 77 00:03:10,548 --> 00:03:11,651 >> Audiența: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 David J. MALAN: Da, exact. 79 00:03:12,900 --> 00:03:18,100 Backslash 0 va permite, chiar dacă în timp liniar, pentru a traversa șir, 80 00:03:18,100 --> 00:03:20,400 de mers pe jos de la stânga la dreapta, cu o buclă de, sau un timp 81 00:03:20,400 --> 00:03:22,608 buclă, sau ceva de genul că, și de a determina, oh, aici 82 00:03:22,608 --> 00:03:24,751 este sfârșitul acestui șir particular. 83 00:03:24,751 --> 00:03:27,000 Deci, cu doar adresa la începutul unui șir, 84 00:03:27,000 --> 00:03:30,290 putem accesa totalitatea ea, pentru că în tot acest timp, 85 00:03:30,290 --> 00:03:32,030 un șir a fost doar o stea char. 86 00:03:32,030 --> 00:03:36,370 >> Deci, este cu siguranță bine pentru a continua utilizarea biblioteca CS50 și această abstracție, 87 00:03:36,370 --> 00:03:38,440 ca să spunem așa, dar vom începem să vedem exact 88 00:03:38,440 --> 00:03:41,230 ceea ce se întâmplă sub tot acest timp. 89 00:03:41,230 --> 00:03:45,260 Deci, s-ar putea aminti acest exemplu, de asemenea, de la ultima dată, compara 0, 90 00:03:45,260 --> 00:03:47,300 care nu au efectiv compara. 91 00:03:47,300 --> 00:03:49,070 Dar am început să rezolve acest lucru. 92 00:03:49,070 --> 00:03:52,020 >> Dar, așa cum, probabil, o perfecționare, s-ar putea să intereseze pe cineva 93 00:03:52,020 --> 00:03:54,261 într-un elefant roz de astăzi, de asemenea, făcută de Chang? 94 00:03:54,261 --> 00:03:55,760 Cum despre tine in fata? [Neauzit]. 95 00:03:55,760 --> 00:03:56,660 Hai sus. 96 00:03:56,660 --> 00:03:58,740 >> Și între timp, cum ți-a venit, să 97 00:03:58,740 --> 00:04:01,670 ia în considerare pentru o clipă ce acest cod a fost de fapt fac. 98 00:04:01,670 --> 00:04:04,917 Este declararea de două variabile în sus top, s și t, și de asteptare getString. 99 00:04:04,917 --> 00:04:08,250 Acesta nu este un program foarte user-friendly, pentru că nu-ți spun ce să facă. 100 00:04:08,250 --> 00:04:10,541 Dar să presupunem că suntem concentrându-se pe de o parte suculent. 101 00:04:10,541 --> 00:04:14,470 Și atunci ce facem, în cazul în care s este egal cu este egal cu t, ar trebui să spunem printf, 102 00:04:14,470 --> 00:04:16,170 ați tastat același lucru. 103 00:04:16,170 --> 00:04:16,670 Buna ziua. 104 00:04:16,670 --> 00:04:17,050 Care e numele tău? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. MALAN: Janelle, bucur să te cunosc. 107 00:04:19,529 --> 00:04:21,800 Deci, provocarea la mână pentru acest elefant 108 00:04:21,800 --> 00:04:25,230 este de a atrage noi mai întâi o imagine a ceea ce este fiind reprezentată în cele două întâi 109 00:04:25,230 --> 00:04:25,970 linii. 110 00:04:25,970 --> 00:04:28,139 Deci s și t poate fi a reprezentat modul de pe ecran? 111 00:04:28,139 --> 00:04:30,680 Și tu poți să-l trage cu degetul pe acest ecran mare. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Deci, există două jumătăți de fiecare parte a acestei ecuații. 114 00:04:34,510 --> 00:04:37,760 Deci, există e pe stânga, și apoi getString pe dreapta. 115 00:04:37,760 --> 00:04:40,540 Și apoi există t pe partea stângă, și apoi getString pe dreapta. 116 00:04:40,540 --> 00:04:42,630 Deci, cum s-ar putea să începem desen o imagine care 117 00:04:42,630 --> 00:04:46,340 reprezintă ceea ce se întâmplă aici în memorie, ai spune? 118 00:04:46,340 --> 00:04:49,150 Și lasă-mă să vă explic ce faci ca te duci. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Ei bine, în primul rând, s-ar fi cerut tine pentru a obține șirul de intrare. 121 00:04:58,890 --> 00:05:00,439 Și s-ar store-- oh, îmi pare rău. 122 00:05:00,439 --> 00:05:01,230 David J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Bun. 124 00:05:01,730 --> 00:05:03,330 Și aceasta se numește ce? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Continuă. 127 00:05:04,450 --> 00:05:05,575 N-am vrut să vă întrerup. 128 00:05:05,575 --> 00:05:07,060 Janelle: Îmi pare rău. 129 00:05:07,060 --> 00:05:14,237 Deci, ar fi de intrare in adresa nu de-- sigur. 130 00:05:14,237 --> 00:05:17,320 Nu-mi amintesc exact numărul, dar eu cred că a fost, începând cu 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. MALAN: Nu-i nimic, pentru că am făcut numerele sus, 132 00:05:18,420 --> 00:05:19,650 astfel încât nu există nici un răspuns corect. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Începând cu 0 arcul. 134 00:05:22,105 --> 00:05:24,000 >> David J. MALAN: OK, deci element de 0. 135 00:05:24,000 --> 00:05:24,765 Sigur. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: Și apoi, dacă a fost ca doar un doi-cu scrisoarea 137 00:05:28,295 --> 00:05:30,496 >> David J. MALAN: OK, înapoi la tine. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Deci element de 0, și apoi elementul 1 sau element de 2. 139 00:05:33,629 --> 00:05:36,670 David J. MALAN: Si care bucată de imaginea desenezi chiar acum? 140 00:05:36,670 --> 00:05:37,690 Apelul la getString? 141 00:05:37,690 --> 00:05:38,830 Sau declarația de s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Declarația de s, cred. 143 00:05:42,890 --> 00:05:45,980 Oh, getString, deoarece aceasta ar să fie introduse în fiecare [? domeniu. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. MALAN: Bine. 145 00:05:46,510 --> 00:05:47,051 Exact. 146 00:05:47,051 --> 00:05:49,300 Chiar dacă acest lucru în mod eficient returnează o matrice, rechemare, 147 00:05:49,300 --> 00:05:53,300 când ne întoarcem un șir, putem index în care string, folosind 01 și 2. 148 00:05:53,300 --> 00:05:56,180 Punct de vedere tehnic, acestea sunt, probabil, reprezentată de adrese individuale, 149 00:05:56,180 --> 00:05:57,100 dar asta e bine. 150 00:05:57,100 --> 00:06:00,170 >> Deci, să presupunem că, dacă pot doar rapid transmite de unde am ramas 151 00:06:00,170 --> 00:06:04,320 ultima dată, în cazul în care unul dintre siruri de caractere a fost g o b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, reprezentând astfel lui Gabe de intrare, cum s-ar putea să ne reprezentăm e acum? 153 00:06:10,337 --> 00:06:12,670 Dacă aceasta este memoria care este fost returnate de către getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Ar fi reprezentat de un arc? 156 00:06:17,610 --> 00:06:18,750 >> David J. MALAN: Printr-un arc? 157 00:06:18,750 --> 00:06:19,130 Ei bine, nu. 158 00:06:19,130 --> 00:06:21,171 Să spunem doar că, pictural, lasă-mă să merg mai departe 159 00:06:21,171 --> 00:06:25,710 și propune ca, în cazul în care acest lucru este s, această este valoarea de returnare a getString. 160 00:06:25,710 --> 00:06:29,482 Și ai tras aceasta ca 0, 1, 2, care este perfect rezonabil, pentru că ne-am 161 00:06:29,482 --> 00:06:30,940 poate indexa în șir, ca atare. 162 00:06:30,940 --> 00:06:33,340 Dar, doar pentru a fi în concordanță cu Ultima dată, lasă-mă să merg mai departe 163 00:06:33,340 --> 00:06:37,310 și propune în mod arbitrar că această este adresa 1, aceasta este adresa 2, 164 00:06:37,310 --> 00:06:39,597 aceasta este adresa 3, și așa mai departe. 165 00:06:39,597 --> 00:06:41,430 Și așa, doar pentru a fi super clar, ce se întâmplă 166 00:06:41,430 --> 00:06:44,580 pentru a merge într-s ca un rezultat de care prima linie de cod, ai spune? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adresa 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. MALAN: Exact. 169 00:06:46,420 --> 00:06:47,190 Deci, adresa 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Și între timp, lasă-mă să mergeți mai departe și duplicat de mult de ceea ce ai făcut 172 00:06:51,230 --> 00:06:52,740 și adăugați propria mea t aici. 173 00:06:52,740 --> 00:06:56,340 Dacă ar fi să tastați în Gabe din nou, a doua oară, 174 00:06:56,340 --> 00:07:01,530 când vi se solicită cu getString, în cazul în care, desigur, este Gabe va merge? 175 00:07:01,530 --> 00:07:02,280 Ei bine, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Ca pe aici? 178 00:07:05,975 --> 00:07:06,850 David J. MALAN: Da. 179 00:07:06,850 --> 00:07:08,516 Janelle: Sau este, de asemenea, în aceleași cutii? 180 00:07:08,516 --> 00:07:11,940 David J. MALAN: Lasă-mă să propună, da, exact, deci în aceste cutii suplimentare. 181 00:07:11,940 --> 00:07:15,230 Dar ceea ce este esențial acum este că, chiar deși am atras acestea destul de aproape 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, această este 0x2-- în realitate, 183 00:07:18,650 --> 00:07:25,750 acest lucru acum ar putea fi adresa 0x10, de exemplu, si 0x11, 0x12 și, 184 00:07:25,750 --> 00:07:26,870 și așa mai departe. 185 00:07:26,870 --> 00:07:29,955 Și astfel, în cazul în care este cazul, ce se va ajunge aici în t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. MALAN: Exact. 188 00:07:31,830 --> 00:07:33,180 Deci, 0x10. 189 00:07:33,180 --> 00:07:34,570 Iar acum, întrebarea finală. 190 00:07:34,570 --> 00:07:37,510 Ai, de departe, a trebuit să lucreze cel mai greu pentru un elefant până acum. 191 00:07:37,510 --> 00:07:42,650 Până acum, dacă am trage în sus codul de din nou, atunci când o fac, în linie de trei, 192 00:07:42,650 --> 00:07:47,630 dacă s egal este egal cu t, ceea ce sunt eu de fapt compararea pe care le-am atras aici? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Cele două adrese? 194 00:07:49,271 --> 00:07:50,270 David J. MALAN: Exact. 195 00:07:50,270 --> 00:07:53,350 Deci, vreau să spun este e egal egal cu t? 196 00:07:53,350 --> 00:07:56,210 Cu alte cuvinte, este de 1 egal egal cu 10? 197 00:07:56,210 --> 00:07:59,710 Și, desigur, Răspunsul evident este acum, nu. 198 00:07:59,710 --> 00:08:02,920 Și astfel acest program este în cele din urmă va imprima ceea ce, i-ai spune? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Ar fi, ați tastat același lucru? 201 00:08:08,405 --> 00:08:11,446 >> David J. MALAN: Deci, dacă s este 1 și t este de 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Ai tastat lucruri diferite. 203 00:08:13,320 --> 00:08:13,570 >> David J. MALAN: Exact. 204 00:08:13,570 --> 00:08:14,480 Ai scris lucruri diferite. 205 00:08:14,480 --> 00:08:14,850 În regulă. 206 00:08:14,850 --> 00:08:16,714 Deci, o rundă de aplauze, dacă am putea, aici. 207 00:08:16,714 --> 00:08:17,214 [Aplauze] 208 00:08:17,214 --> 00:08:17,708 A fost dureros. 209 00:08:17,708 --> 00:08:18,208 Știu. 210 00:08:18,208 --> 00:08:19,684 Bine lucrat. 211 00:08:19,684 --> 00:08:24,690 Deci, acum să vedem dacă nu putem tachineze pe langa ceea ce a fost fix. 212 00:08:24,690 --> 00:08:28,040 Și, desigur, atunci când ne-am fixat asta-- pe care voi reprezenta acum în green-- 213 00:08:28,040 --> 00:08:29,690 am făcut o pereche de îmbunătățiri aici. 214 00:08:29,690 --> 00:08:32,409 În primul rând, la fel cum un bun-simț verifica, eu sunt primul verificare 215 00:08:32,409 --> 00:08:35,110 dacă e egal cu zero și t este egal cu zero. 216 00:08:35,110 --> 00:08:39,440 Și ca să fie clar, când s-ar putea s sau t fi nul în cod ca asta? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Când s-ar putea s sau t fi nul. 219 00:08:44,490 --> 00:08:44,990 Da? 220 00:08:44,990 --> 00:08:45,990 >> Audiența: [inaudibil]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. MALAN: Exact. 223 00:08:50,510 --> 00:08:52,840 În cazul în care șirul pe care utilizatorul tastat în este mult prea lung 224 00:08:52,840 --> 00:08:56,140 pentru a se potrivi în memorie, sau unele caz colț ciudat de genul asta, 225 00:08:56,140 --> 00:08:59,010 getString, așa cum vom vedea, la propriu astăzi, în documentația sa, 226 00:08:59,010 --> 00:09:02,330 spune că va reveni nul ca o valoare deosebită santinelă, 227 00:09:02,330 --> 00:09:05,417 sau doar un fel de simbol special înseamnă că ceva nu a mers bine. 228 00:09:05,417 --> 00:09:07,500 Așa că vrem să verificați pentru că, pentru că se pare că 229 00:09:07,500 --> 00:09:09,720 care nul este o valoare foarte periculos. 230 00:09:09,720 --> 00:09:14,250 >> De multe ori, daca incerci sa faci ceva cu null implică o function-- trecerea 231 00:09:14,250 --> 00:09:17,470 ca intrare, pentru instance-- că funcția s-ar putea foarte va prăbuși și, cu ea, 232 00:09:17,470 --> 00:09:19,090 să ia în jos tot programul. 233 00:09:19,090 --> 00:09:22,570 Deci, această a treia linie acum este doar un bun-simț verifica, verificarea erorilor, dacă vreți. 234 00:09:22,570 --> 00:09:25,450 Asta e un obicei bun acum pentru ne pentru a obține în orice moment noi 235 00:09:25,450 --> 00:09:28,050 încercați să utilizați o valoare care ar putea, eventual, să fie nul. 236 00:09:28,050 --> 00:09:32,000 >> Acum, în al patrulea rând aici, "În cazul în care strcmp (s, t)," bine, 237 00:09:32,000 --> 00:09:33,180 ce-i asta referindu-se la? 238 00:09:33,180 --> 00:09:36,750 Ei bine, am spus acest lucru a fost un foarte succint numit funcție de comparație șir. 239 00:09:36,750 --> 00:09:40,370 Și scopul său în viață este de a compara primul argument împotriva ei de-al doilea, 240 00:09:40,370 --> 00:09:44,640 dar nu în ceea ce privește adresele lor, așa cum am făcut-o în mod neintenționat un moment 241 00:09:44,640 --> 00:09:48,270 în urmă cu codul roșu, dar mai degrabă pentru a compara cele două 242 00:09:48,270 --> 00:09:53,210 siruri de caractere din punct de vedere uman intuitiv mod prin compararea acest, împotriva acestei, 243 00:09:53,210 --> 00:09:56,690 împotriva acestei, împotriva acestei, și apoi oprire în cazul în care și atunci când unul 244 00:09:56,690 --> 00:09:59,590 sau ambele degete lovește un backslash 0. 245 00:09:59,590 --> 00:10:04,530 Strcmp Deci, de ani în urmă cineva a implementat să pună în aplicare pentru noi funcționalitatea 246 00:10:04,530 --> 00:10:08,890 pe care am sperat ne-ar fi ajuns de doar compararea a două valori simple. 247 00:10:08,890 --> 00:10:14,929 >> Acum sincer, eu ține desen toate aceste numere diferite. 248 00:10:14,929 --> 00:10:17,470 Dar realitatea este, am fost face astea tot timpul. 249 00:10:17,470 --> 00:10:19,580 Și așa lasă-mă să merg mai departe și scrijelesc pe acestea 250 00:10:19,580 --> 00:10:23,100 pentru a face un punct care, la sfârșitul de zi și merge mai departe, 251 00:10:23,100 --> 00:10:30,160 Nu suntem de gând să-i pese ce abordează lucrurile sunt de fapt 252 00:10:30,160 --> 00:10:30,790 în memorie. 253 00:10:30,790 --> 00:10:34,320 Deci, eu nu am de gând să atragă aceste tipuri de numere prea mult acum, 254 00:10:34,320 --> 00:10:38,970 Sunt doar un rezumat această distanță o ceva mai prietenos cu doar săgeți. 255 00:10:38,970 --> 00:10:42,060 >> Cu alte cuvinte, în cazul în care s este un pointer, bine, hai să-l trage, literalmente, 256 00:10:42,060 --> 00:10:45,430 ca un pointer, o săgeată orientată de la sine la altceva, 257 00:10:45,430 --> 00:10:48,280 și nu vă faceți griji prea mult despre punctelor caracteristice acestor adrese 258 00:10:48,280 --> 00:10:49,910 care, din nou, am făcut oricum. 259 00:10:49,910 --> 00:10:52,680 Dar vom vedea acele adrese, uneori, atunci când depanare cod. 260 00:10:52,680 --> 00:10:56,450 >> Acum între timp, acest program aici remedieri, desigur, 261 00:10:56,450 --> 00:10:58,720 că problema prin compararea cele două șiruri. 262 00:10:58,720 --> 00:11:00,260 Dar am dat peste o altă problemă. 263 00:11:00,260 --> 00:11:03,180 Acest lucru a fost din copia programa ultimul timp, 264 00:11:03,180 --> 00:11:06,880 prin care, am fost încercarea de a capitaliza doar primul caracter dintr-un șir. 265 00:11:06,880 --> 00:11:09,620 Dar ceea ce a fost simptomul am văzut ultima dată când 266 00:11:09,620 --> 00:11:14,150 un utilizator introduce o valoare, cum ar fi Gabe cu litere mici, pentru s, 267 00:11:14,150 --> 00:11:19,310 apoi ne-am atribuit lui în t, ca și în al treilea rând acolo, 268 00:11:19,310 --> 00:11:22,900 și apoi am încercat să valorifica t suport 0? 269 00:11:22,900 --> 00:11:25,950 Care a fost efectul schimbarea t suport 0 aici? 270 00:11:25,950 --> 00:11:27,150 >> Audiența: A schimbat uri. 271 00:11:27,150 --> 00:11:29,360 >> David J. MALAN: Da, Am schimbat s, de asemenea. 272 00:11:29,360 --> 00:11:31,050 Pentru că ceea ce se intampla de fapt? 273 00:11:31,050 --> 00:11:34,130 Ei bine, lasă-mă să văd dacă pot curăța această imagine, după cum urmează. 274 00:11:34,130 --> 00:11:41,390 >> În cazul în care s este, din nou, cuvântul g, a, b, e, backslash, 0, și s 275 00:11:41,390 --> 00:11:44,084 vom continua desen ca o cutie aici, dar nu mai multe adrese. 276 00:11:44,084 --> 00:11:45,250 Să nu mai face lucrurile. 277 00:11:45,250 --> 00:11:47,510 Să desena o imagine pentru a simplifica lumea. 278 00:11:47,510 --> 00:11:52,640 >> Când m-am t declara cu șir t, care creează că bucata de memorie. 279 00:11:52,640 --> 00:11:55,850 Piața se întâmplă să fie 32 biți în cele mai multe calculatoare. 280 00:11:55,850 --> 00:11:59,530 De fapt, dacă ați auzit vreodată de o calculator având o arhitectură pe 32 de biți, 281 00:11:59,530 --> 00:12:03,000 într-adevăr fantezie-vorbesc, că doar înseamnă că folosește adrese de 32 de biți. 282 00:12:03,000 --> 00:12:05,370 Și, ca o tehnică deoparte, dacă v-ați întrebat vreodată 283 00:12:05,370 --> 00:12:09,630 de ce computere mai vechi, dacă tu de fapt a încercat să-i supa cu o mulțime de RAM, 284 00:12:09,630 --> 00:12:12,360 ar putea avea doar un maxim de patru gigabytes de memorie RAM, 285 00:12:12,360 --> 00:12:14,860 bine asta pentru ca, literalmente, computerul vechi ar putea doar 286 00:12:14,860 --> 00:12:17,250 conta la fel de mare ca 4 miliarde, 4 miliarde de bytes, 287 00:12:17,250 --> 00:12:20,590 pentru că a fost folosind 32 de biți Numerele de adrese. 288 00:12:20,590 --> 00:12:23,260 >> Dar, în orice caz, în această exemplu, povestea e mult mai simplu. 289 00:12:23,260 --> 00:12:27,250 t este doar un alt indicator, sau într-adevăr o stea char, aka șir. 290 00:12:27,250 --> 00:12:30,860 Și cum nu vreau să actualizeze această imagine acum cu faptul că a doua linie de cod, 291 00:12:30,860 --> 00:12:31,950 după punct, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Când m-am face string t este egal s punct și virgulă, cum se schimbă această imagine? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Da? 295 00:12:38,000 --> 00:12:38,916 >> Audiența: [inaudibil]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. MALAN: Da. 298 00:12:42,020 --> 00:12:42,600 Exact. 299 00:12:42,600 --> 00:12:45,620 Tocmai am pus o săgeată din t box la aceeași adresă, 300 00:12:45,620 --> 00:12:47,570 În același prima literă a adus. 301 00:12:47,570 --> 00:12:50,850 Sau punct de vedere tehnic, în cazul în care acest lucru tip au fost încă de la 0x1, 302 00:12:50,850 --> 00:12:53,052 E ca și cum am avut 0x1 aici și 0x1 aici. 303 00:12:53,052 --> 00:12:54,760 Dar, din nou, cui îi pasă despre adresele? 304 00:12:54,760 --> 00:12:56,345 E doar ideea care conteaza acum. 305 00:12:56,345 --> 00:12:57,720 Deci, asta este ceea ce se întâmplă aici. 306 00:12:57,720 --> 00:13:02,690 Deci, desigur, dacă faci t suport 0, care este notația matrice, 307 00:13:02,690 --> 00:13:05,650 bineinteles-- și sincer, se pare ca exista o serie de peste aici, 308 00:13:05,650 --> 00:13:07,340 dar acum există acest lucru ciudat. 309 00:13:07,340 --> 00:13:11,160 Să știți că limbajul de programare, C, vă oferă această caracteristică, 310 00:13:11,160 --> 00:13:14,650 prin care, chiar dacă t este un pointer, sau s este un pointer, 311 00:13:14,650 --> 00:13:18,050 puteți utiliza în continuare că familiar, suport confortabil pătrat 312 00:13:18,050 --> 00:13:22,520 notație pentru a merge la primul element, sau al doilea element, sau orice element 313 00:13:22,520 --> 00:13:26,130 că indicatorul este îndreptat pentru că, probabil, ea 314 00:13:26,130 --> 00:13:29,410 este, ca și în acest caz, arătând spre o anumită matrice. 315 00:13:29,410 --> 00:13:30,340 >> Deci, cum putem rezolva această problemă? 316 00:13:30,340 --> 00:13:33,660 Sincer, acest lucru este în cazul în care aceasta are o puțin copleșitor la prima vedere. 317 00:13:33,660 --> 00:13:35,340 Dar aici este o versiune nouă și îmbunătățită. 318 00:13:35,340 --> 00:13:37,460 >> Deci, prima, Primesc scăpa de bibliotecă CS50, 319 00:13:37,460 --> 00:13:41,170 doar pentru a expune că S este într-adevăr o stea char, doar un sinonim. 320 00:13:41,170 --> 00:13:43,540 Și T este, de asemenea, o stea char. 321 00:13:43,540 --> 00:13:48,290 Dar ce se întâmplă cu privire la partea dreaptă a liniei 322 00:13:48,290 --> 00:13:49,970 unde t este alocată o valoare? 323 00:13:49,970 --> 00:13:50,790 >> Ce este malloc? 324 00:13:50,790 --> 00:13:51,630 Ce este strlen? 325 00:13:51,630 --> 00:13:52,547 Ce este sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 De ce naiba face acest lucru linie privire atât de complex? 327 00:13:54,380 --> 00:13:55,713 Ce o face la un nivel înalt? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Ce se depozita în t? 330 00:13:57,440 --> 00:13:58,646 Da? 331 00:13:58,646 --> 00:14:01,104 Audiența: E alocarea unui anumită cantitate de spațiu de memorie. 332 00:14:01,104 --> 00:14:03,032 Este pentru a stoca, cred, scrisori [neauzit]. 333 00:14:03,032 --> 00:14:04,032 >> David J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfect. 335 00:14:04,540 --> 00:14:06,650 Este alocarea unui anumit cantitatea de spațiu de memorie 336 00:14:06,650 --> 00:14:08,940 pentru a stoca, probabil, scrisori viitoare. 337 00:14:08,940 --> 00:14:11,310 Și, în special, malloc Prin urmare, se întoarce ce? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Audiența: Returnarea [neauzit]? 340 00:14:14,851 --> 00:14:15,850 David J. MALAN: Exact. 341 00:14:15,850 --> 00:14:18,850 Revenind adresa de memorie care, care este un mod fantezist de a spune, 342 00:14:18,850 --> 00:14:21,640 returneaza adresa primul octet din memoria. 343 00:14:21,640 --> 00:14:25,460 Este sarcina pe mine să-mi amintesc câtă memorie am de fapt 344 00:14:25,460 --> 00:14:27,140 alocate sau a cerut malloc pentru. 345 00:14:27,140 --> 00:14:28,384 >> Acum, cât de mult este asta? 346 00:14:28,384 --> 00:14:30,550 Ei bine, chiar dacă nu există o mulțime de paranteze aici, 347 00:14:30,550 --> 00:14:32,970 malloc are doar un singur argument. 348 00:14:32,970 --> 00:14:37,250 Și eu precizând strlen de s, asa ca acorda mine, ca de multe bytes cum există în s, 349 00:14:37,250 --> 00:14:37,800 dar să adăugați unul. 350 00:14:37,800 --> 00:14:38,300 De ce? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Da? 353 00:14:39,530 --> 00:14:40,840 >> Audiența: backslash 0. 354 00:14:40,840 --> 00:14:41,840 David J. MALAN: Exact. 355 00:14:41,840 --> 00:14:43,423 Avem de a face un pic de menaj. 356 00:14:43,423 --> 00:14:45,970 Deci, pentru că există o bară oblică inversă 0, ne-ar aminti mai bine. 357 00:14:45,970 --> 00:14:47,310 În caz contrar, ne vom pentru a crea un șir de caractere care 358 00:14:47,310 --> 00:14:49,170 nu are ca terminator special. 359 00:14:49,170 --> 00:14:52,640 >> Între timp, doar pentru a fi super- anal, am sizeof (char) au, 360 00:14:52,640 --> 00:14:55,730 doar în cazul în care cineva se execută meu Codul nu pe aparatul CS50, 361 00:14:55,730 --> 00:14:58,220 dar poate un alt computer în total în cazul în care caractere 362 00:14:58,220 --> 00:15:01,470 sunt un octet, prin convenție, dar două bytes, sau ceva mai mult decât atât. 363 00:15:01,470 --> 00:15:04,490 Este doar pentru a fi super, super-potrivnic la erori. 364 00:15:04,490 --> 00:15:06,940 Chiar dacă, în realitate, este cel mai probabil, va fi un 1. 365 00:15:06,940 --> 00:15:11,490 >> Acum, între timp, am merge mai departe și copia șir, t suport i este egal cu t suport uri. 366 00:15:11,490 --> 00:15:14,962 Și voi amâna pentru săptămâna trecută codul sursă pentru a vedea ce se întâmplă. 367 00:15:14,962 --> 00:15:17,670 Dar Takeaway cheie, și motiv pentru care am pus codul de acum în verde, 368 00:15:17,670 --> 00:15:22,520 este pentru că ultima linie, t suport 0 este egal cu toupper, 369 00:15:22,520 --> 00:15:25,230 are ca efect valorificare care șir? 370 00:15:25,230 --> 00:15:26,960 t și / sau s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Aceasta ultima linie de cod. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Doar t, pentru că ceea ce-i sa întâmplat de data aceasta, 375 00:15:35,560 --> 00:15:41,500 dacă am anula ușor că ultimul pas, ceea ce sa întâmplat este, când eu numesc malloc, 376 00:15:41,500 --> 00:15:45,380 Am obține, în esență, o bucată de memorie care este de aceeași mărime ca și originalul, 377 00:15:45,380 --> 00:15:47,020 pentru că aritmetica am făcut-o. 378 00:15:47,020 --> 00:15:50,920 Am stocarea în t adresa de care bucată de memorie. 379 00:15:50,920 --> 00:15:53,370 Chiar dacă acest lucru pare frumos și destul de, frumos și gol, 380 00:15:53,370 --> 00:15:56,882 realitatea este acolo, ceea ce vom ține de asteptare, valorile de gunoi aici. 381 00:15:56,882 --> 00:15:59,340 Asta bucată de memorie s-ar putea foarte bine au fost folosite înainte, 382 00:15:59,340 --> 00:16:00,940 câteva secunde, în urmă cu câteva minute. 383 00:16:00,940 --> 00:16:04,410 Deci, ar putea exista absolut numere sau scrisori de acolo, doar prin accident. 384 00:16:04,410 --> 00:16:08,580 Dar nu sunt valabile, până când am eu popula această bucată de memorie 385 00:16:08,580 --> 00:16:12,510 cu caractere reale, așa cum am face în această buclă de acolo. 386 00:16:12,510 --> 00:16:13,180 În regulă? 387 00:16:13,180 --> 00:16:16,180 >> Deci, acum, punctul culminant al aceste trei exemple 388 00:16:16,180 --> 00:16:20,730 care au fost aparent rupt ultima dată, acest exemplu Swap, această funcție 389 00:16:20,730 --> 00:16:23,670 a lucrat în sensul că el a schimbat un și b. 390 00:16:23,670 --> 00:16:25,620 Dar nu a mers în ce alt sens? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Da? 393 00:16:28,614 --> 00:16:29,612 >> Audiența: [inaudibil]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. MALAN: Exact. 396 00:16:36,700 --> 00:16:39,530 Dacă ar fi să numesc această funcție de la another-- de exemplu, 397 00:16:39,530 --> 00:16:42,870 dintr-o asemenea funcție principală, unde Am o variabilă, x și y, așa cum am 398 00:16:42,870 --> 00:16:46,160 a făcut săptămâna trecută, același cod, și trec în x și y 399 00:16:46,160 --> 00:16:49,860 Pentru a schimba, și apoi apel Swap-- aceasta, desigur, este versiunea corectă 400 00:16:49,860 --> 00:16:52,220 este ceea ce suntem pe cale să see-- nu a mers. 401 00:16:52,220 --> 00:16:53,770 Deci, ce este fix? 402 00:16:53,770 --> 00:16:56,850 >> Ei bine, astfel încât să fie clar, lasă-mă să merg mai departe 403 00:16:56,850 --> 00:17:05,450 si-- dă-mi o secundă aici, și vezi dacă pot să-ți arăt ultima, care 404 00:17:05,450 --> 00:17:12,464 va fi in-- să vedem dacă pot găsi acest adevărat OK fast--, [neauzit]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, asta este. 407 00:17:19,240 --> 00:17:21,000 Deci, ignora comenzile Eu doar dactilografiere. 408 00:17:21,000 --> 00:17:23,780 Vreau sa-l pentru a prelua de la în ultimul moment, de exemplu, 409 00:17:23,780 --> 00:17:27,960 din ultimul timp, care este numit acum nu Swap. 410 00:17:27,960 --> 00:17:30,200 >> Deci, nu Swap este în cazul în care ne-am oprit ultima dată, 411 00:17:30,200 --> 00:17:32,930 prin care, am initializat x și y la 1 la 2. 412 00:17:32,930 --> 00:17:35,840 Atunci eu numesc Swap, care trece în 1 și 2. 413 00:17:35,840 --> 00:17:37,930 Și apoi această funcție a lucrat într-un fel, 414 00:17:37,930 --> 00:17:40,750 dar ea nu a avut nici permanent efect de x și y. 415 00:17:40,750 --> 00:17:45,430 Deci, intrebarea la îndemână este, cum acum Nu ne-am rezolva de fapt problema? 416 00:17:45,430 --> 00:17:47,820 Care este soluția la îndemână? 417 00:17:47,820 --> 00:17:53,150 >> Ei bine, în swap.c, care este nou astăzi, observa o pereche de diferențe. 418 00:17:53,150 --> 00:17:54,700 x și y sunt aceleași. 419 00:17:54,700 --> 00:17:57,250 Dar ceea ce este în mod clar diferit de linia 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Ce este nou acolo, dacă vă aduceți aminte cum arata acum un al doilea? 422 00:18:01,715 --> 00:18:02,565 >> Audiența: [inaudibil]. 423 00:18:02,565 --> 00:18:03,440 >> David J. MALAN: Da. 424 00:18:03,440 --> 00:18:06,680 Deci ampersand sunt o nouă piesă de sintaxă nu numai în acest program, 425 00:18:06,680 --> 00:18:08,560 dar, de asemenea, în general, în CS50. 426 00:18:08,560 --> 00:18:10,680 Până în prezent, nu cred că am vazut exemple 427 00:18:10,680 --> 00:18:14,070 sau într-adevăr a vorbit despre ele în orice detaliu, altele decât, poate, preventiv 428 00:18:14,070 --> 00:18:16,467 în secțiune, un ampersand ca asta. 429 00:18:16,467 --> 00:18:19,300 Ei bine, se pare că ampersand este una din ultimele piese ale noului sintaxă 430 00:18:19,300 --> 00:18:20,174 vom afla. 431 00:18:20,174 --> 00:18:23,500 Tot ceea ce înseamnă adresa unor variabile. 432 00:18:23,500 --> 00:18:25,070 La ce adresă are x trăi? 433 00:18:25,070 --> 00:18:26,510 Dar ce adresă are y trăi? 434 00:18:26,510 --> 00:18:28,700 Pentru că, dacă problemă fundamentală înainte 435 00:18:28,700 --> 00:18:32,970 a fost că x și y au fost trecute ca de exemplare, ceea ce vrem cu adevărat să facem 436 00:18:32,970 --> 00:18:38,780 se asigura Swap cu ca o comoară harta care duce la unde x și y de fapt 437 00:18:38,780 --> 00:18:41,910 sunt în RAM, astfel încât Swap pot urmări că harta 438 00:18:41,910 --> 00:18:47,760 și du-te la oriunde x sau y marchează locul și de a schimba valorile reale 1 și 2 439 00:18:47,760 --> 00:18:48,270 acolo. 440 00:18:48,270 --> 00:18:50,710 >> Deci Swap trebuie să se schimbe ușor prea. 441 00:18:50,710 --> 00:18:53,760 Și la prima vedere, aceasta ar putea se pare un pic similar cu stele char. 442 00:18:53,760 --> 00:18:54,850 Și într-adevăr este. 443 00:18:54,850 --> 00:18:59,635 Deci, o este un pointer la ce tip de date, bazat pe această porțiune evidențiat? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Deci, este un întreg. 446 00:19:01,620 --> 00:19:04,880 >> Deci, un nu mai este o int, este adresa de int. 447 00:19:04,880 --> 00:19:07,910 Și în mod similar, b este acum de gând să fie adresa de int. 448 00:19:07,910 --> 00:19:12,470 Așa că atunci când eu numesc acum Swap de la Main, Eu nu am de gând să dea Swap 1 și 2. 449 00:19:12,470 --> 00:19:15,540 Am de gând să-l dea ca Ox-ceva și Ox-ceva, 450 00:19:15,540 --> 00:19:19,820 două adrese care vor conduce Swap de locuri reale 451 00:19:19,820 --> 00:19:21,310 în memoria calculatorului meu. 452 00:19:21,310 --> 00:19:25,580 >> Deci, acum, punerea în aplicare a mea rămas trebuie să se schimbe un pic. 453 00:19:25,580 --> 00:19:28,650 Ce este, evident, diferit acum în aceste trei linii de cod? 454 00:19:28,650 --> 00:19:31,350 Exista aceste blestemate stele toate peste tot, bine? 455 00:19:31,350 --> 00:19:33,014 Deci, ce se întâmplă aici? 456 00:19:33,014 --> 00:19:33,514 Da? 457 00:19:33,514 --> 00:19:35,055 >> Audiența: Este evident [neauzit]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. MALAN: Exact. 460 00:19:37,990 --> 00:19:41,560 Deci, în acest context-- și acest lucru nu a fost cea mai bună decizie de design, desigur, 461 00:19:41,560 --> 00:19:42,530 ani în urmă. 462 00:19:42,530 --> 00:19:45,110 In acest context, în cazul în care trebuie doar o stea, 463 00:19:45,110 --> 00:19:48,240 și nu aveți un tip de date, cum ar fi int, imediat la stânga, 464 00:19:48,240 --> 00:19:53,146 în schimb va avea un semn de egalitate, în mod clar, în acest context, atunci când spui stea o, 465 00:19:53,146 --> 00:19:56,980 înseamnă că merge la Adresa de e într-o. 466 00:19:56,980 --> 00:19:58,870 Urmați harta comorii, ca să spunem așa. 467 00:19:58,870 --> 00:20:01,720 >> Și între timp, în linia 37, aceasta înseamnă același lucru. 468 00:20:01,720 --> 00:20:05,460 Du-te la adresa A, și a pus acolo ce? 469 00:20:05,460 --> 00:20:09,520 Oricare ar fi la localizare care b specifică. 470 00:20:09,520 --> 00:20:10,980 Cu alte cuvinte, du-te la b. 471 00:20:10,980 --> 00:20:12,130 Ia valoare. 472 00:20:12,130 --> 00:20:15,620 Du-te la o și, pe egalul semna, operatorul de atribuire, 473 00:20:15,620 --> 00:20:17,010 pune că valoare acolo. 474 00:20:17,010 --> 00:20:19,272 >> În mod similar, int temp este doar un int. 475 00:20:19,272 --> 00:20:20,730 Nimic nu trebuie să se schimbe cu privire la temp. 476 00:20:20,730 --> 00:20:24,810 E doar un pahar de rezervă de la Annenberg pentru lapte sau suc de portocale. 477 00:20:24,810 --> 00:20:27,630 Dar trebuie să spun, du-te la b. 478 00:20:27,630 --> 00:20:31,449 Du-te la asta destinație și pune în valoare temp acolo. 479 00:20:31,449 --> 00:20:32,490 Deci, ce se întâmplă atunci? 480 00:20:32,490 --> 00:20:36,540 Când de fapt, eu numesc Swap acest moment, în cazul în care acest prim tavă reprezintă aici Main, 481 00:20:36,540 --> 00:20:42,270 acest al doilea tavă reprezintă Swap, atunci când Trec ampersand x și y ampersand 482 00:20:42,270 --> 00:20:47,150 de la Main pentru a schimba, doar pentru a fi clar, ceea ce este această stivă cadru de recepție? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Da? 485 00:20:49,200 --> 00:20:50,180 >> Audiența: [inaudibil]. 486 00:20:50,180 --> 00:20:51,180 David J. MALAN: Exact. 487 00:20:51,180 --> 00:20:53,129 Adresa de x și y adresa. 488 00:20:53,129 --> 00:20:55,170 Și vă puteți gândi la aceste cum ar fi adresele poștale. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street și 35 Oxford Street, și tu 490 00:20:58,772 --> 00:21:01,230 doriți să mutați cele două clădiri care sunt în acele zone. 491 00:21:01,230 --> 00:21:04,680 >> Este un fel de idee ridicolă, dar asta e tot ce vrem să spunem prin adresa. 492 00:21:04,680 --> 00:21:07,000 În cazul în care în lume se poate veți găsi aceste două int? 493 00:21:07,000 --> 00:21:09,470 În cazul în care în lume nu poate tine găsi aceste două clădiri? 494 00:21:09,470 --> 00:21:15,170 Deci, dacă în cele din urmă, după tot acest timp am du-te în codul sursă de astăzi și compila 495 00:21:15,170 --> 00:21:22,110 Swap și a alerga ./swap, în cele din urmă, pentru Prima dată nu am vedea de fapt că 496 00:21:22,110 --> 00:21:25,330 valorile mele au într-adevăr fost schimbate cu succes. 497 00:21:25,330 --> 00:21:30,860 Și acum, putem lua chiar notă de acest lucru în, să zicem, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Așa că lasă-mă să merg în același fișier. 499 00:21:32,740 --> 00:21:35,010 Lasă-mă să mergeți mai departe și a alerga gdb de ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Și acum, în Swap, am de gând să merg înainte și a stabilit un punct de pauză în Main. 502 00:21:40,547 --> 00:21:42,630 Și acum am de gând să merg înainte și rulați programul. 503 00:21:42,630 --> 00:21:45,810 Și acum vom vedea codul meu se opri la acea linie. 504 00:21:45,810 --> 00:21:48,330 >> Dacă aș merge mai departe și de imprimare x, ceea ce ar trebui să văd aici? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Este o întrebare. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Spune din nou? 509 00:21:51,530 --> 00:21:52,295 >> Audiența: [inaudibil]. 510 00:21:52,295 --> 00:21:53,910 >> David J. MALAN: Deci, numere aleatoare, poate. 511 00:21:53,910 --> 00:21:56,010 Poate am noroc, și este frumos și simplu, cum ar fi 0. 512 00:21:56,010 --> 00:21:57,230 Dar poate că e un număr aleator. 513 00:21:57,230 --> 00:21:58,090 În acest caz, am avut noroc. 514 00:21:58,090 --> 00:21:59,030 Se întâmplă să fie 0. 515 00:21:59,030 --> 00:22:00,780 Dar este într-adevăr noroc, pentru că nu până când am 516 00:22:00,780 --> 00:22:06,280 tipul următor și apoi de imprimare x are ca linie de cod, linia 19, a fost executat. 517 00:22:06,280 --> 00:22:10,942 >> Între timp, dacă am introduce următorul nou, și acum imprima y, am de gând să văd 2. 518 00:22:10,942 --> 00:22:13,900 Acum, dacă am introduce următorul, se va a obține un pic confuz, pentru că acum, 519 00:22:13,900 --> 00:22:17,250 printf este de gând să apară pe pe ecran, așa cum a făcut-o. x este 1. 520 00:22:17,250 --> 00:22:18,606 >> Să facem acest lucru din nou. 521 00:22:18,606 --> 00:22:20,480 Și acum, iată unde lucrurile devin interesante. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Înainte de a apela Swap sau chiar pas în ea, să ia un pic cu ochiul. 524 00:22:26,580 --> 00:22:28,980 x este, din nou, 1. 525 00:22:28,980 --> 00:22:33,240 Y este, desigur, sanatatea rapidă verifica, 2, deci nu e greu acolo. 526 00:22:33,240 --> 00:22:35,740 Dar ceea ce este ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Răspuns, e un fel de funky caută. 529 00:22:39,350 --> 00:22:43,500 Dar steaua int în paranteze este doar PIB-ul este un fel de a spune acest lucru este o adresă. 530 00:22:43,500 --> 00:22:48,290 Nu e un int, este un pointer la un Int, sau altfel cunoscut ca o adresă. 531 00:22:48,290 --> 00:22:49,742 >> Ce este acest lucru nebun? 532 00:22:49,742 --> 00:22:51,825 Nu am mai văzut ceva chiar așa înainte. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Deci, aceasta este adresa la computerul meu memorie de unde x se întâmplă să trăiască. 535 00:22:58,120 --> 00:22:59,040 Este Ox-ceva. 536 00:22:59,040 --> 00:23:01,290 Și aceasta este, sincer, de ce Am inceput sa desenez săgeți, 537 00:23:01,290 --> 00:23:03,340 în loc de numere, pentru că cine îi pasă cu adevărat 538 00:23:03,340 --> 00:23:06,890 care int-ul este la un anumit Adresa de e atât de mare. 539 00:23:06,890 --> 00:23:12,160 Dar bffff0c4, toate acestea sunt într-adevăr cifre hexazecimale, 540 00:23:12,160 --> 00:23:13,720 care sunt de la 0 la f. 541 00:23:13,720 --> 00:23:16,590 >> Deci, noi nu vom insista prea lung pe care aceste lucruri sunt. 542 00:23:16,590 --> 00:23:19,400 Dar dacă imprima y, desigur, eu văd 2. 543 00:23:19,400 --> 00:23:22,440 Dar ampersand y, eu văd această adresă. 544 00:23:22,440 --> 00:23:26,527 Și preaviz, pentru curioși, cat de departe sunt x și y? 545 00:23:26,527 --> 00:23:27,985 Puteți ignora cea mai mare parte a adresei. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Patru bytes. 548 00:23:29,920 --> 00:23:33,510 Și asta e în concordanță cu nostru mai devreme susțin că cât de mare este un int? 549 00:23:33,510 --> 00:23:34,130 Patru bytes. 550 00:23:34,130 --> 00:23:37,420 Deci, se pare ca garnitură totul e în sus frumos, cum s-ar putea spera, în memorie. 551 00:23:37,420 --> 00:23:40,010 >> Deci, acum, hai să fast forward la sfârșitul acestui poveste. 552 00:23:40,010 --> 00:23:43,290 Să mergem mai departe și de tip pas, pentru a se arunca cu capul în funcția de Swap. 553 00:23:43,290 --> 00:23:46,880 Acum observați, în cazul în care introduc o, e identic cu adresa de x. 554 00:23:46,880 --> 00:23:52,130 Dacă aș tip b, e identic la adresa de y. 555 00:23:52,130 --> 00:23:57,020 Deci, ce ar trebui să văd dacă am spun, du-te la adresa unui? 556 00:23:57,020 --> 00:23:58,120 Deci, imprima stea o. 557 00:23:58,120 --> 00:24:00,130 Deci stea înseamnă du-te acolo, în acest context. 558 00:24:00,130 --> 00:24:02,730 Ampersand înseamnă ceea ce este adresa de. 559 00:24:02,730 --> 00:24:05,000 Deci stea un mijloc 1. 560 00:24:05,000 --> 00:24:09,590 Și stea imprimare b mi-a dat 2. 561 00:24:09,590 --> 00:24:15,750 >> Și lasă-mă să-și asume, pentru moment, că cel puțin codul care 562 00:24:15,750 --> 00:24:18,950 continuă să execute acum poate fi motivată prin faptul că în mod. 563 00:24:18,950 --> 00:24:21,150 Dar ne vom revedea această idee înainte de mult timp. 564 00:24:21,150 --> 00:24:23,850 Deci, această versiune a Swap este acum corect și permite 565 00:24:23,850 --> 00:24:26,650 ne pentru a schimba acest tip de date special. 566 00:24:26,650 --> 00:24:29,120 >> Deci orice întrebări atunci pe Swap? 567 00:24:29,120 --> 00:24:29,890 Pe stele? 568 00:24:29,890 --> 00:24:30,690 Pe adresa de? 569 00:24:30,690 --> 00:24:33,270 Și veți vedea, cu problemă set 4, un fel de, 570 00:24:33,270 --> 00:24:37,310 dar problema stabilit 5, cu siguranta, modul în care acestea lucrurile sunt utile și de a lua mult mai mult 571 00:24:37,310 --> 00:24:39,584 confortabil cu ei, ca rezultat. 572 00:24:39,584 --> 00:24:40,430 Orice? 573 00:24:40,430 --> 00:24:40,930 În regulă. 574 00:24:40,930 --> 00:24:44,350 Deci malloc este, din nou, această funcție care alocă doar memorie, memoria 575 00:24:44,350 --> 00:24:45,330 alocare. 576 00:24:45,330 --> 00:24:47,024 Și de ce este aceasta utilă? 577 00:24:47,024 --> 00:24:48,940 Ei bine, în tot acest timp, ați fost utilizați malloc. 578 00:24:48,940 --> 00:24:52,230 Dacă considerați că acum cum lucrări getString, probabil, e 579 00:24:52,230 --> 00:24:56,140 a întrebat cineva pentru o bucată de memorie, oricând utilizatorul tastează un șir 580 00:24:56,140 --> 00:24:59,040 în, pentru că noi cu siguranță nu stiu, ca personal CS50, 581 00:24:59,040 --> 00:25:02,710 cât de mare aceste siruri de caractere pe care oamenii sunt de gând să tastați ar putea fi. 582 00:25:02,710 --> 00:25:07,910 >> Deci, haideți să, pentru prima dată, începe să Desprindeți modul în care funcționează biblioteca CS50, 583 00:25:07,910 --> 00:25:10,990 printr-o serie de exemple care ne va duce acolo. 584 00:25:10,990 --> 00:25:15,300 Deci, dacă am deschide gedit și deschide scanf 0, 585 00:25:15,300 --> 00:25:17,055 vom vedea codul de mai jos. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, disponibile pe site-ul de astăzi, are relativ puține linii de cod 588 00:25:23,530 --> 00:25:25,351 aici, prin 14 20. 589 00:25:25,351 --> 00:25:26,600 Și să vedem ce face. 590 00:25:26,600 --> 00:25:28,920 Se declară un int, numit x. 591 00:25:28,920 --> 00:25:30,850 Se spune ceva de genul, număr vă rog. 592 00:25:30,850 --> 00:25:33,940 Și acum se spune, scanf% i, & x. 593 00:25:33,940 --> 00:25:35,620 Deci, există o grămadă de lucruri noi acolo. 594 00:25:35,620 --> 00:25:38,420 >> Dar scanf, vă puteți gândi un fel de a ca opusul printf. 595 00:25:38,420 --> 00:25:40,090 printf, desigur, printuri pe ecran. 596 00:25:40,090 --> 00:25:44,410 fel scanf de scanări de utilizator tastatură ceva el sau ea a scris. 597 00:25:44,410 --> 00:25:46,550 >> % I este la fel ca printf. 598 00:25:46,550 --> 00:25:49,410 Acest lucru înseamnă aștepta utilizator de tip int. 599 00:25:49,410 --> 00:25:52,820 Și acum, de ce crezi că am s-ar putea trece scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 În cazul în care scopul în viață de scanf este de a obtine ceva de la utilizator, 602 00:25:57,770 --> 00:26:02,480 ceea ce este sensul de trecându-l, și x, acum? 603 00:26:02,480 --> 00:26:02,980 Da? 604 00:26:02,980 --> 00:26:03,896 >> Audiența: [inaudibil]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. MALAN: Exact. 607 00:26:06,540 --> 00:26:12,900 Oricare ar fi eu, omul, tastați, intrare meu va fi salvat în acea locație. 608 00:26:12,900 --> 00:26:17,660 Nu este suficient, amintesc, la doar trece în x, pentru că am văzut deja, 609 00:26:17,660 --> 00:26:21,630 de fiecare dată când trece doar o variabilă crud, ca un întreg, pentru o altă funcție, 610 00:26:21,630 --> 00:26:25,640 sigur, se poate schimba asta variabilă, dar nu permanent. 611 00:26:25,640 --> 00:26:27,360 Ea nu poate avea un efect asupra Main. 612 00:26:27,360 --> 00:26:29,420 Se poate schimba doar propria copie locală. 613 00:26:29,420 --> 00:26:32,560 Dar dacă, în schimb, tu nu faci da-mi int real, 614 00:26:32,560 --> 00:26:36,640 dar mi-ai da indicatii care int, eu acum, fiind scanf, 615 00:26:36,640 --> 00:26:41,050 sigur, eu pot urmări că aborda și a pus un număr de acolo 616 00:26:41,050 --> 00:26:43,280 astfel încât să aibă acces la ea, de asemenea. 617 00:26:43,280 --> 00:26:45,120 >> Așa că atunci când am rulat acest program, să vedem. 618 00:26:45,120 --> 00:26:49,660 Asigurați-scanf 0 puncte slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Și dacă eu scriu acum un număr cum ar fi 50, multumesc pentru 50. 620 00:26:54,030 --> 00:26:58,150 Dacă am introduce acum un număr ca negativ 1, pentru negativ 1. 621 00:26:58,150 --> 00:27:04,200 Tastez acum un număr ca 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 De ce mi-a ignorat programul meu? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Ei bine, pentru că pur și simplu, i-am spus aceasta să se aștepte doar un int. 625 00:27:09,880 --> 00:27:10,380 În regulă. 626 00:27:10,380 --> 00:27:11,630 Deci asta este o versiune a acestui. 627 00:27:11,630 --> 00:27:16,600 Să luăm lucrurile la un alt nivel și propune ca acest lucru nu este bun. 628 00:27:16,600 --> 00:27:20,530 Și aici se află un exemplu foarte simplu de modul în care putem începe scrierea de cod 629 00:27:20,530 --> 00:27:24,450 că alte persoane pot exploata sau compromite prin a face lucruri rele. 630 00:27:24,450 --> 00:27:28,336 Deci linia 16, atât de asemănătoare în spirit de înainte, 631 00:27:28,336 --> 00:27:29,960 dar eu nu sunt declarând că aceasta int acest moment. 632 00:27:29,960 --> 00:27:32,970 Declar o stea char, aka șir. 633 00:27:32,970 --> 00:27:35,190 >> Dar ce înseamnă de fapt acest lucru? 634 00:27:35,190 --> 00:27:38,790 Deci, dacă eu nu specifica un address-- și Ii voi spune în mod arbitrar, tampon, 635 00:27:38,790 --> 00:27:43,370 dar am putea numi aceasta e, de a fi simple-- și apoi să fac acest lucru, să-mi explice, 636 00:27:43,370 --> 00:27:48,630 dacă ai putea, pe baza precedent logică, ceea ce este scanf face în linia 18, 637 00:27:48,630 --> 00:27:55,000 dacă treci% s și tampon, care este o adresă? 638 00:27:55,000 --> 00:27:58,210 Ce este scanf, dacă se aplică aceeași logică exact ca versiunea 0, 639 00:27:58,210 --> 00:28:00,640 O să încercăm să facem aici, atunci când ceva tipuri de utilizatori în? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Da? 642 00:28:03,409 --> 00:28:04,407 >> Audiența: [inaudibil]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. MALAN: Exact. 645 00:28:08,890 --> 00:28:11,577 Scanf, de logica mai devreme, este de gând să ia șirul 646 00:28:11,577 --> 00:28:13,410 că tastat uman in-- este acum un șir de caractere, 647 00:28:13,410 --> 00:28:15,790 nu este un număr, probabil, în cazul în care el sau ea cooperates-- 648 00:28:15,790 --> 00:28:19,310 și că va încerca să pună că șir în memorie la orice adresă 649 00:28:19,310 --> 00:28:20,340 tampon specifică. 650 00:28:20,340 --> 00:28:23,870 Și acest lucru este mare, deoarece tampon este într-adevăr menit să fie o adresă. 651 00:28:23,870 --> 00:28:30,470 >> Dar eu susțin acest program este buggy într-un mod foarte serios, pentru că ceea ce este de valoare 652 00:28:30,470 --> 00:28:31,330 tampon în mod implicit? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Ce am inițializat în? 655 00:28:34,790 --> 00:28:35,770 Ce bucată de memorie? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Eu nu am, nu? 658 00:28:38,620 --> 00:28:42,265 >> Deci, chiar dacă am alocat o stele char că nu se mai numeste s, 659 00:28:42,265 --> 00:28:48,030 se în schimb numit, buffer-- așa hai trage numele variabilei 660 00:28:48,030 --> 00:28:53,380 acum ca buffer-- dacă nu am numit getString sau malloc aici, 661 00:28:53,380 --> 00:28:56,030 ceea ce înseamnă că în mod eficient tampon este doar o valoare gunoi. 662 00:28:56,030 --> 00:28:57,030 >> Acum, ce înseamnă asta? 663 00:28:57,030 --> 00:29:00,220 Aceasta înseamnă că le-am spus scanf să se aștepte un șir de utilizator. 664 00:29:00,220 --> 00:29:01,300 Și știi ce? 665 00:29:01,300 --> 00:29:03,883 Indiferent de acest lucru se indică sa-- și trag semn de întrebare, 666 00:29:03,883 --> 00:29:07,060 dar în realitate, ea va fi ca OX1, 2, 3, ceva corect? 667 00:29:07,060 --> 00:29:10,730 Este o valoare fals că doar se întâmplă să fie acolo de la înainte. 668 00:29:10,730 --> 00:29:13,440 Deci, cu alte cuvinte, este ca și cum tampon este doar 669 00:29:13,440 --> 00:29:16,180 arătând spre ceva în memorie. 670 00:29:16,180 --> 00:29:17,610 Nu am nici o idee ce. 671 00:29:17,610 --> 00:29:24,130 >> Deci, dacă am introduce în Gabe acum, va pentru a încerca să pună g-a-b-e / 0 acolo. 672 00:29:24,130 --> 00:29:25,530 Dar cine știe ce e asta? 673 00:29:25,530 --> 00:29:27,480 Și în trecut, orice timp am încercat să atingă 674 00:29:27,480 --> 00:29:29,770 memorie care nu face parte pentru noi, ceea ce sa întâmplat? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Sau aproape de fiecare dată. 677 00:29:32,870 --> 00:29:34,310 Eroare de segmentare, nu? 678 00:29:34,310 --> 00:29:37,829 >> Această săgeată, nu am nici o idee unde este indicare. e doar o valoare aleatorie. 679 00:29:37,829 --> 00:29:40,370 Și, desigur, dacă ai interpreta o valoare aleatoare ca o adresă, 680 00:29:40,370 --> 00:29:42,610 ai de gând să meargă la unele destinație aleator. 681 00:29:42,610 --> 00:29:46,810 Deci, Gabe ar putea într-adevăr accident Programul meu în acest caz aici. 682 00:29:46,810 --> 00:29:50,600 >> Deci, ce putem face e aproape la fel de rău? 683 00:29:50,600 --> 00:29:52,660 Luați în considerare acest al treilea și exemplu finală de scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Această versiune este mai bine în ce sens? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Dacă sunteți confortabil cu problema precedentă, acest lucru este mai bine. 688 00:30:01,400 --> 00:30:02,250 De ce? 689 00:30:02,250 --> 00:30:03,250 >> Audiența: [inaudibil]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. MALAN: Bine. 692 00:30:07,110 --> 00:30:09,970 Deci, acest caz de linia 16 este mai bine, în sensul 693 00:30:09,970 --> 00:30:12,030 că suntem în mod explicit alocarea unele memorie. 694 00:30:12,030 --> 00:30:14,190 Noi nu utilizați malloc, suntem folosind săptămâna 2 695 00:30:14,190 --> 00:30:16,060 Abordarea de doar declararea unei matrice. 696 00:30:16,060 --> 00:30:18,130 Și am spus înainte că un șir este doar o serie de caractere, 697 00:30:18,130 --> 00:30:19,690 deci acest lucru este total legitim. 698 00:30:19,690 --> 00:30:22,910 Dar este, desigur, ca voi nota, dimensiune fixă, 16. 699 00:30:22,910 --> 00:30:25,440 >> Deci, acest program este complet în condiții de siguranță, în cazul în care am de tip 700 00:30:25,440 --> 00:30:29,760 în șiruri de câte un caracter, două caractere siruri de caractere, 15 de șiruri de caractere. 701 00:30:29,760 --> 00:30:34,970 Dar, de îndată ce încep să tastați 16, 17, 18, 1000 șiruri de caractere, 702 00:30:34,970 --> 00:30:37,390 unde se că șir va ajunge? 703 00:30:37,390 --> 00:30:39,570 O să ajung în parte aici. 704 00:30:39,570 --> 00:30:42,820 Dar cine știe ce altceva este dincolo de limitele 705 00:30:42,820 --> 00:30:44,270 din acest tablou special? 706 00:30:44,270 --> 00:30:48,015 >> Este ca și cum am a declarat 16 cutii de aici. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Deci, mai degrabă decât scoate tot de 16, vom ne prefacem că am atras 16. 709 00:30:52,690 --> 00:30:56,540 Dar dacă apoi încearcă să citească un șir asta e mult mai mult, cum ar fi 50 de caractere, 710 00:30:56,540 --> 00:31:01,270 Am de gând să înceapă punerea a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Și acest lucru este, probabil, alt segment de memorie 712 00:31:04,916 --> 00:31:06,790 că, din nou, s-ar putea provoca programul meu sa se prabuseasca, 713 00:31:06,790 --> 00:31:10,600 pentru că eu nu am cerut pentru nimic mai mult decât de 16 bytes. 714 00:31:10,600 --> 00:31:12,260 >> Deci, cui îi pasă? 715 00:31:12,260 --> 00:31:13,880 Ei bine, aici e biblioteca CS50. 716 00:31:13,880 --> 00:31:17,220 Și de cele mai multe acest lucru este doar cum ar fi instrucțiuni sus. 717 00:31:17,220 --> 00:31:21,670 Biblioteca CS50, în tot acest timp, a avut această linie în linie 52. 718 00:31:21,670 --> 00:31:23,680 Am văzut typedef, sau veți vedea typedef 719 00:31:23,680 --> 00:31:27,930 în PSET 4, care creează doar o sinonim prin stele char poate fi mai 720 00:31:27,930 --> 00:31:29,290 pur și simplu menționate ca șir. 721 00:31:29,290 --> 00:31:31,540 Deci, aceasta este una dintre câteva roți de formare 722 00:31:31,540 --> 00:31:34,120 am folosit secret sub capota. 723 00:31:34,120 --> 00:31:36,490 >> Între timp, aici e funcția, getchar. 724 00:31:36,490 --> 00:31:38,190 Acum se pare, nu e nici un corp să-l. 725 00:31:38,190 --> 00:31:40,273 Și de fapt, dacă am ține defilare, eu nu fac de fapt 726 00:31:40,273 --> 00:31:42,080 vezi orice punere în aplicare acestor funcții. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Ca un control bun-simț, de ce este asta? 729 00:31:45,516 --> 00:31:46,795 >> Audiența: [inaudibil]. 730 00:31:46,795 --> 00:31:47,670 David J. MALAN: Da. 731 00:31:47,670 --> 00:31:48,950 Deci, aceasta este fișierul antet. 732 00:31:48,950 --> 00:31:52,520 Și fișiere antet conține prototipuri, plus alte lucruri, se pare, 733 00:31:52,520 --> 00:31:53,780 ca typedefs. 734 00:31:53,780 --> 00:31:56,910 Dar, în CS50.c, care ne-am nu ți-a dat pur și simplu, 735 00:31:56,910 --> 00:32:02,100 dar a fost în aparat CS50 toate de această dată, adânc în interiorul de dosare sale, 736 00:32:02,100 --> 00:32:04,990 observă că există un întreg grămadă de funcții de aici. 737 00:32:04,990 --> 00:32:06,720 >> De fapt, hai să derulați în jos. 738 00:32:06,720 --> 00:32:08,810 Să ignore cele mai multe dintre ele, pentru acum. 739 00:32:08,810 --> 00:32:12,670 Dar, defilați în jos pentru a getint și a vedea cum funcționează getint. 740 00:32:12,670 --> 00:32:13,890 Deci, aici este getint. 741 00:32:13,890 --> 00:32:17,727 Și dacă vreodată te interesează cu adevărat cum te Int funcționează, aici este documentația acestuia. 742 00:32:17,727 --> 00:32:19,560 Și printre lucrurile se spune este ce spune 743 00:32:19,560 --> 00:32:21,340 ce gama de valori se poate returna. 744 00:32:21,340 --> 00:32:24,400 Este, în esență negativ de 2 miliarde la pozitiv 2 miliarde, da sau de a lua. 745 00:32:24,400 --> 00:32:26,420 >> Și se pare că, tot acest timp, chiar dacă nu ne-am 746 00:32:26,420 --> 00:32:28,570 te-a verifica pentru el, în cazul în care ceva nu merge bine, 747 00:32:28,570 --> 00:32:30,680 se pare că toate acest timp, are getint 748 00:32:30,680 --> 00:32:33,600 a fost întoarcerea un special constant, nu null, 749 00:32:33,600 --> 00:32:36,760 ci int_max, care este convenție doar un programator. 750 00:32:36,760 --> 00:32:38,846 Aceasta înseamnă aici este o valoare deosebită. 751 00:32:38,846 --> 00:32:41,470 Asigurați-vă că pentru a verifica acest lucru, doar în cazul în care ceva nu merge bine. 752 00:32:41,470 --> 00:32:43,261 Dar noi n-am deranjat cu care până în prezent, 753 00:32:43,261 --> 00:32:45,200 deoarece din nou, acest lucru trebui să fie benefic. 754 00:32:45,200 --> 00:32:46,950 >> Dar cum getint fi puse în aplicare? 755 00:32:46,950 --> 00:32:48,450 Ei bine, unul, este nevoie de nici un argument. 756 00:32:48,450 --> 00:32:49,390 Știm că. 757 00:32:49,390 --> 00:32:50,820 Aceasta returneaza un int. 758 00:32:50,820 --> 00:32:51,950 Știm că. 759 00:32:51,950 --> 00:32:54,460 Deci, cum functioneaza sub capota? 760 00:32:54,460 --> 00:32:58,290 >> Deci, există aparent un infinit buclă, cel puțin aparența de unul. 761 00:32:58,290 --> 00:33:00,290 Observați că suntem folosind getString. 762 00:33:00,290 --> 00:33:04,000 Deci, asta e interesant. getint invită propria noastră funcție, getString. 763 00:33:04,000 --> 00:33:05,645 Și acum, ce ar putea fi acest caz? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 De ce am fi defensiv aici, în linie 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Ce-ar putea întâmpla în linie 164, doar pentru a fi clar? 768 00:33:15,639 --> 00:33:16,930 Este același răspuns ca și înainte. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 S-ar putea să fie doar din memorie. 771 00:33:20,089 --> 00:33:23,130 Ceva nu merge bine cu getString, Trebuie să fie în măsură să se ocupe de asta. 772 00:33:23,130 --> 00:33:27,070 Și motivul pentru care nu se mai întorc nul este că, tehnic, null este un pointer. 773 00:33:27,070 --> 00:33:29,120 getint trebuie să se întoarcă un int. 774 00:33:29,120 --> 00:33:31,060 Așa că am arbitrar a decis, în esență, 775 00:33:31,060 --> 00:33:34,600 că 2 miliarde, da sau de a lua, se va să fie o valoare deosebită pe care n-am putea 776 00:33:34,600 --> 00:33:35,970 obține de fapt, de la utilizator. 777 00:33:35,970 --> 00:33:39,930 E doar valoarea o am de gând a deșeurilor pentru a reprezenta un cod de eroare. 778 00:33:39,930 --> 00:33:41,540 >> Deci, acum, lucrurile devin un pic de fantezie. 779 00:33:41,540 --> 00:33:44,670 Și nu e chiar aceeași funcție ca și mai înainte, dar este foarte asemănător. 780 00:33:44,670 --> 00:33:50,120 Deci observa, declar aici, în linie 172, atât o int n și un char c. 781 00:33:50,120 --> 00:33:53,600 Și apoi am folosi această linie de funky, sscanf, care se dovedește 782 00:33:53,600 --> 00:33:55,990 nu scanează un șir de la tastatură. 783 00:33:55,990 --> 00:33:59,226 Se ridică un șir existent care utilizatorul a tastat deja în. 784 00:33:59,226 --> 00:34:02,100 Așa că am sunat deja getString, care înseamnă că am un șir în memorie. 785 00:34:02,100 --> 00:34:05,020 sscanf este ceea ce ai apela o funcție de parsare. 786 00:34:05,020 --> 00:34:07,760 Se uită la șirul am tastat în, caracter cu caracter, 787 00:34:07,760 --> 00:34:09,250 și face ceva util. 788 00:34:09,250 --> 00:34:10,969 Asta șir este stocat în linie. 789 00:34:10,969 --> 00:34:13,560 Și știu că doar prin a merge copii de siguranță aici și spune, oh, bine, 790 00:34:13,560 --> 00:34:15,143 L-am sunat, nu e de data asta, dar linie. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Iar acum acest lucru este un pic diferit. 793 00:34:18,080 --> 00:34:22,480 Dar aceasta înseamnă în mod eficient, din motive vom val oarecum mâinile noastre la ziua de azi, 794 00:34:22,480 --> 00:34:26,070 că suntem de verificare a vedea dacă utilizatorul tastat în 795 00:34:26,070 --> 00:34:29,909 și int și, poate, un alt personaj. 796 00:34:29,909 --> 00:34:33,610 În cazul în care utilizatorul a introdus într-un int, e O să fie stocate în n, pentru că eu sunt 797 00:34:33,610 --> 00:34:36,739 trece acest lucru prin adresa, nou truc care le-am văzut azi. 798 00:34:36,739 --> 00:34:41,570 În cazul în care utilizatorul, de asemenea, tastat în așa 123x, că x 799 00:34:41,570 --> 00:34:45,060 se va ajunge o scrisoare în caracter c. 800 00:34:45,060 --> 00:34:48,739 >> Acum, se pare că sscanf mi se va spune, inteligent, 801 00:34:48,739 --> 00:34:54,750 cât de multe variabile fost sscanf posibilitatea de succes pentru a umple. 802 00:34:54,750 --> 00:34:58,770 Deci, prin această logică, în cazul în care funcția de Sunt de punere în aplicare este getint, 803 00:34:58,770 --> 00:35:00,900 dar eu sunt de verificare, potențial, pentru utilizator 804 00:35:00,900 --> 00:35:04,190 pentru a fi introdus într-un int urmată de altceva, 805 00:35:04,190 --> 00:35:08,580 ce vreau de sscanf valoare reveni cu adevărat să fie? 806 00:35:08,580 --> 00:35:10,950 În cazul în care scopul este de a obtine doar un int de utilizator? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Deci, dacă sscanf se întoarce 2, ce înseamnă asta? 809 00:35:19,300 --> 00:35:21,660 Utilizatorul tastat ceva de genul, pur și simplu, 810 00:35:21,660 --> 00:35:24,770 123x, care este doar un nonsens. 811 00:35:24,770 --> 00:35:27,490 Este o stare de eroare, și Vreau să verific pentru că. 812 00:35:27,490 --> 00:35:32,960 >> Deci, dacă tipurile de utilizatori în acest, prin această logică, ceea ce face sscanf reveni, 813 00:35:32,960 --> 00:35:33,740 ai spune? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Deci, o să se întoarcă 2, pentru că 123 este de gând să meargă în aici, 816 00:35:39,130 --> 00:35:41,580 și x se va ajunge aici. 817 00:35:41,580 --> 00:35:43,970 Dar eu nu vreau x sa se umple. 818 00:35:43,970 --> 00:35:48,580 Vreau să sscanf pentru a reuși numai în completarea prima de variabilele sale. 819 00:35:48,580 --> 00:35:52,490 Și de aceea am doresc sscanf să se întoarcă 1. 820 00:35:52,490 --> 00:35:55,750 >> Și dacă acest lucru este un pic peste cap pentru moment, asta e cu totul bine. 821 00:35:55,750 --> 00:36:00,030 Realizati deși, că unul dintre Valorile de getint și getString 822 00:36:00,030 --> 00:36:03,630 este că vom face un heck de o mulțime de eroare de verificare de genul asta așa 823 00:36:03,630 --> 00:36:07,130 că, până în prezent, puteți destul de mult tastați nimic la tastatură, 824 00:36:07,130 --> 00:36:08,490 Si noi vom prinde. 825 00:36:08,490 --> 00:36:10,592 Și cu siguranță, personal, nu va fi cu siguranta 826 00:36:10,592 --> 00:36:13,300 fi sursa de o eroare în ta Programul, pentru că suntem în defensivă 827 00:36:13,300 --> 00:36:16,270 verificarea pentru toate prost lucruri pe care un utilizator ar putea face, 828 00:36:16,270 --> 00:36:18,900 cum ar fi tastarea un șir de caractere, atunci când ai vrut int. 829 00:36:18,900 --> 00:36:21,350 Deci, pentru acum-- vom veni înapoi la acest lucru înainte de long-- 830 00:36:21,350 --> 00:36:23,710 dar în tot acest timp, getString și getint au 831 00:36:23,710 --> 00:36:29,950 fost sub capota folosind această Ideea de bază a adreselor de memorie. 832 00:36:29,950 --> 00:36:32,580 >> Deci, acum, hai să facem lucrurile o ceva mai user-friendly. 833 00:36:32,580 --> 00:36:38,740 După cum vă amintiți, la ultima Binky timp-- dacă mouse-ul meu va cooperate-- astfel 834 00:36:38,740 --> 00:36:42,560 am avut acest cod, care sincer, este destul de lipsit de sens. 835 00:36:42,560 --> 00:36:45,330 Acest cod atinge nimic utilă, dar a fost un exemplu 836 00:36:45,330 --> 00:36:48,330 că profesorul Parlante utilizat pentru a reprezenta 837 00:36:48,330 --> 00:36:51,840 ceea ce se întâmplă într-o program care implică memorie. 838 00:36:51,840 --> 00:36:54,850 >> Așa că haideți să povestesc această poveste foarte scurt. 839 00:36:54,850 --> 00:36:58,720 Aceste prime două linii, în Engleză, nu ceea ce, i-ai spune? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Doar în mod rezonabil uman, dar ușor punct de vedere tehnic, să ia o lovitură de cuțit. 842 00:37:05,430 --> 00:37:06,346 Audiența: [inaudibil]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. MALAN: OK, te stabilirea adrese pentru x și y variabile. 845 00:37:11,080 --> 00:37:15,520 Nu chiar, pentru că x și y nu sunt variabile în sensul tradițional. 846 00:37:15,520 --> 00:37:18,054 x și y sunt adrese sau va stoca adresa. 847 00:37:18,054 --> 00:37:19,220 Așa că haideți să încercăm încă o dată. 848 00:37:19,220 --> 00:37:21,010 Nu este un început rău, totuși. 849 00:37:21,010 --> 00:37:21,510 Da? 850 00:37:21,510 --> 00:37:22,426 >> Audiența: [inaudibil]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. MALAN: Bine. 853 00:37:24,840 --> 00:37:26,173 Cred că e un pic mai curat. 854 00:37:26,173 --> 00:37:28,630 Declararea doi indicatori, două numere întregi. 855 00:37:28,630 --> 00:37:30,150 Și noi îi cheamă x și y. 856 00:37:30,150 --> 00:37:32,790 Sau, dacă ar fi să atragă aceasta ca o imagine, din nou, 857 00:37:32,790 --> 00:37:36,410 amintesc pur și simplu că toate facem cu prima linie 858 00:37:36,410 --> 00:37:39,690 este de a atrage o cutie ca aceasta, cu o anumită valoare gunoi în ea, 859 00:37:39,690 --> 00:37:41,920 și ea apel x, și apoi altă cutie ca aceasta, 860 00:37:41,920 --> 00:37:43,880 cu o valoare gunoi în ea, sun y. 861 00:37:43,880 --> 00:37:45,810 Ne-am declarat două indicii că în cele din urmă 862 00:37:45,810 --> 00:37:47,860 va stoca adresa de int. 863 00:37:47,860 --> 00:37:49,170 Deci, asta e tot acolo. 864 00:37:49,170 --> 00:37:53,290 >> Deci, atunci când Binky a făcut acest lucru, lut am uitat ca aceasta. 865 00:37:53,290 --> 00:37:55,350 Și Nick doar un fel de înfășurat săgețile, 866 00:37:55,350 --> 00:37:57,590 ca și cum ei nu sunt nicăieri îndreptat în special, pentru că sunt doar 867 00:37:57,590 --> 00:37:58,250 Valorile de gunoi. 868 00:37:58,250 --> 00:38:01,670 Ei nu sunt inițializate explicit oriunde în particular. 869 00:38:01,670 --> 00:38:03,980 >> Acum, următoarea linie de cod, amintesc, a fost aceasta. 870 00:38:03,980 --> 00:38:07,510 Deci, în mod rezonabil, user-friendly, dar English oarecum tehnic, 871 00:38:07,510 --> 00:38:09,790 ceea ce este această linie de cod faci? 872 00:38:09,790 --> 00:38:10,391 Da? 873 00:38:10,391 --> 00:38:11,333 >> Audiența: [inaudibil]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> David J. MALAN: Perfect. 876 00:38:13,950 --> 00:38:17,016 Este alocarea bucată de de memorie care este de dimensiunea unui int. 877 00:38:17,016 --> 00:38:18,140 Și asta e pe jumătate răspunsul. 878 00:38:18,140 --> 00:38:20,056 Ați răspuns dreapta jumătate a expresiei. 879 00:38:20,056 --> 00:38:22,473 Ce se întâmplă pe din partea stanga a semnului egal? 880 00:38:22,473 --> 00:38:22,972 Da? 881 00:38:22,972 --> 00:38:24,814 Audiența: și atribuie l la variabila x? 882 00:38:24,814 --> 00:38:27,690 >> David J. MALAN: și agenții acesta a variabilei x. 883 00:38:27,690 --> 00:38:31,650 Deci, pentru a recapitulare, alocă din partea dreaptă suficientă memorie pentru a stoca un int. 884 00:38:31,650 --> 00:38:34,150 Dar malloc special returneaza adresa 885 00:38:34,150 --> 00:38:37,270 de care bucată de memorie, pe care le-ați doar propus este stocat în x. 886 00:38:37,270 --> 00:38:42,560 >> Deci, ce Nick a făcut ultima dată cu Binky este el a târât că pointer afară, lutul, 887 00:38:42,560 --> 00:38:46,820 pentru a indica acum la o bucată albă de memorie care este egală cu dimensiunea de un int. 888 00:38:46,820 --> 00:38:49,360 Și într-adevăr, că este menit pentru a reprezenta patru octeți. 889 00:38:49,360 --> 00:38:55,310 >> Acum, următoarea linie de cod a făcut acest lucru, stea x devine 42. 890 00:38:55,310 --> 00:38:58,530 Deci 42 este simplă, pe de partea dreaptă, sensul vieții. 891 00:38:58,530 --> 00:39:00,500 Partea stângă, stele x înseamnă ce? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Că prea s-ar putea avea gone-- este OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> Audiența: Practic, du-te la [neauzit] 896 00:39:06,875 --> 00:39:07,750 David J. MALAN: Bine. 897 00:39:07,750 --> 00:39:08,760 Audiența: [inaudibil]. 898 00:39:08,760 --> 00:39:09,760 David J. MALAN: Exact. 899 00:39:09,760 --> 00:39:11,979 Din partea stanga, înseamnă a merge la x. 900 00:39:11,979 --> 00:39:12,520 x este adresa. 901 00:39:12,520 --> 00:39:15,520 E ca și cum 33 Oxford Street, sau OX1. 902 00:39:15,520 --> 00:39:18,690 Și stea x înseamnă du-te la asta aborda și a pus acolo ce? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Deci, într-adevăr, asta este exact ceea ce a făcut Nick. 905 00:39:21,290 --> 00:39:23,740 A început cu de, în esență, mental 906 00:39:23,740 --> 00:39:26,270 arătând cu degetul x, urmând săgeata 907 00:39:26,270 --> 00:39:30,670 la caseta de alb pe-dreapta lateral, și punerea numărul 42 acolo. 908 00:39:30,670 --> 00:39:34,120 Dar apoi lucrurile s-au puțin periculos, nu? 909 00:39:34,120 --> 00:39:35,860 Lui Binky pe cale să piardă capul. 910 00:39:35,860 --> 00:39:39,465 >> Steaua y este egal cu 13, ghinion, ce înseamnă? 911 00:39:39,465 --> 00:39:43,620 Deci, mijloace y stele du-te la adresa din y. 912 00:39:43,620 --> 00:39:45,630 Dar ceea ce este adresa la y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Bine, e valoare gunoi, nu? 915 00:39:49,440 --> 00:39:50,800 Am desenat ca un semn de întrebare. 916 00:39:50,800 --> 00:39:54,850 Nick este atras ca o săgeată curbată în sus. 917 00:39:54,850 --> 00:39:59,600 Și, de îndată ce va încerca să face y stele, spunând: du-te acolo, 918 00:39:59,600 --> 00:40:03,872 dar nu există un legitim adresa, e un fals localizare, 919 00:40:03,872 --> 00:40:05,080 Programul se va prăbuși. 920 00:40:05,080 --> 00:40:08,580 Și capul Binky se întâmplă pentru a zbura de pe aici, așa cum a făcut-o. 921 00:40:08,580 --> 00:40:12,130 >> Deci, în cele din urmă, acest program a fost doar defect din apartament. 922 00:40:12,130 --> 00:40:13,540 A fost un program de buggy. 923 00:40:13,540 --> 00:40:14,760 Și trebuie să fie stabilită. 924 00:40:14,760 --> 00:40:18,260 Și singura cale, într-adevăr, să-l repari ar fi, de exemplu, această linie, 925 00:40:18,260 --> 00:40:21,010 care nici macar nu ajunge la, deoarece Programul sa prăbușit prea repede. 926 00:40:21,010 --> 00:40:26,170 Dar dacă ar fi să se stabilească acest lucru, ceea ce efect nu face y x egale avea? 927 00:40:26,170 --> 00:40:30,010 Ei bine, se arată, în esență, y la indiferent de valoarea x este îndreptat la. 928 00:40:30,010 --> 00:40:32,430 >> Deci, în povestea lui Nick, sau povestea Binky lui, atât 929 00:40:32,430 --> 00:40:34,640 x și y au fost îndreptat la bucată albă de memorie, 930 00:40:34,640 --> 00:40:38,300 astfel încât, în cele din urmă, atunci când Nu star Y este egal cu 13 din nou, 931 00:40:38,300 --> 00:40:43,080 ajungi pune 13 în locul potrivit. 932 00:40:43,080 --> 00:40:47,640 Deci, toate aceste linii sunt perfect legitim, cu excepția pentru aceasta, 933 00:40:47,640 --> 00:40:51,730 când sa întâmplat înainte de a de fapt atribuit y o anumită valoare. 934 00:40:51,730 --> 00:40:54,290 >> Acum, din fericire, tu nu faci Trebuie să raționeze prin toate 935 00:40:54,290 --> 00:40:56,560 de aceste tipuri de probleme pe cont propriu. 936 00:40:56,560 --> 00:40:59,310 Lasă-mă să mergeți mai departe și deschide o fereastră terminal aici 937 00:40:59,310 --> 00:41:03,050 și deschide, pentru o clipă, un program de super-scurt, care 938 00:41:03,050 --> 00:41:04,360 De asemenea, este un fel de lipsit de sens. 939 00:41:04,360 --> 00:41:05,152 E urât. 940 00:41:05,152 --> 00:41:06,610 Ea nu atinge nimic folositor. 941 00:41:06,610 --> 00:41:10,180 Dar ea nu demonstrează probleme de memorie, așa că haideți să aruncăm o privire. 942 00:41:10,180 --> 00:41:11,830 >> Principal, super-simplu. 943 00:41:11,830 --> 00:41:14,830 Se pare că solicită o funcție, f, iar apoi revine la 0. 944 00:41:14,830 --> 00:41:16,310 E cam greu să te pui asta. 945 00:41:16,310 --> 00:41:18,540 Deci, principala este destul de bun, așa de departe. 946 00:41:18,540 --> 00:41:20,100 >> Deci f este problematic. 947 00:41:20,100 --> 00:41:22,120 Și nu a pus mult efort în numind-o 948 00:41:22,120 --> 00:41:23,990 aici, pentru a menține accentul pe codul. 949 00:41:23,990 --> 00:41:25,740 f are două linii. 950 00:41:25,740 --> 00:41:27,610 Și să vedem ce se întâmplă acum pe. 951 00:41:27,610 --> 00:41:29,840 Deci, pe de o parte, aici-- și lasă-mă să fac 952 00:41:29,840 --> 00:41:32,680 această concordanță cu cel anterior exemplu-- pe de o parte, 953 00:41:32,680 --> 00:41:35,830 partea stângă este a face ceea ce, în limba engleză? 954 00:41:35,830 --> 00:41:36,493 Acesta e-- 955 00:41:36,493 --> 00:41:37,701 Audiența: Crearea unui pointer. 956 00:41:37,701 --> 00:41:40,830 David J. MALAN: Crearea unui pointer la un int și numindu-l x. 957 00:41:40,830 --> 00:41:43,789 Deci, se creează una din acele cutii Tot bazându-se pe ecranul tactil. 958 00:41:43,789 --> 00:41:45,913 Și acum, pe-dreapta lateral, malloc, desigur, 959 00:41:45,913 --> 00:41:47,420 este alocarea unui segment de memorie. 960 00:41:47,420 --> 00:41:49,989 Și ca să fie clar, cum mult de memorie este aparent 961 00:41:49,989 --> 00:41:52,030 alocarea, dacă doar un fel de a face matematica aici? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Deci, este de 40 bytes. 964 00:41:54,040 --> 00:41:57,400 Și știu că doar pentru că știu că o Int, pe aparatul CS50, cel puțin, 965 00:41:57,400 --> 00:41:58,060 este de patru bytes. 966 00:41:58,060 --> 00:41:59,610 Deci, de 10 ori 4 este de 40. 967 00:41:59,610 --> 00:42:04,924 Deci, aceasta este stocarea unui x, adresa din prima out de 40 de int care 968 00:42:04,924 --> 00:42:07,340 s-au alocat spațiu înapoi, în spate, în spate, în spate. 969 00:42:07,340 --> 00:42:08,470 >> Și asta e cheia despre malloc. 970 00:42:08,470 --> 00:42:11,261 Nu e nevoie de un pic de memorie aici, un pic de aici, un pic de aici. 971 00:42:11,261 --> 00:42:14,220 Acesta vă oferă o bucată de memorie, contiguu, din activități de exploatare 972 00:42:14,220 --> 00:42:15,240 sistem. 973 00:42:15,240 --> 00:42:18,500 >> Acum, ce zici de asta, x suport 10 este egal cu 0? 974 00:42:18,500 --> 00:42:19,470 Linie arbitrar de cod. 975 00:42:19,470 --> 00:42:21,100 Ea nu atinge nimic folositor. 976 00:42:21,100 --> 00:42:26,128 Dar este interesant, deoarece x suport 10--? 977 00:42:26,128 --> 00:42:26,628 Da? 978 00:42:26,628 --> 00:42:27,912 >> Audiența: [inaudibil]? 979 00:42:27,912 --> 00:42:30,500 >> David J. MALAN: x Suport 10 nu trebuie să fie nul. 980 00:42:30,500 --> 00:42:35,070 Detaliul nul vine numai în joc cu siruri de caractere, la sfârșitul unui șir. 981 00:42:35,070 --> 00:42:36,700 Dar un gand bun. 982 00:42:36,700 --> 00:42:39,615 >> Cât de mare este această matrice, chiar deși am alocat 40 de bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Este de la 0 la nouă, nu? 985 00:42:43,690 --> 00:42:45,120 E 10 int, totală. 986 00:42:45,120 --> 00:42:48,790 40 de bytes, dar 10 int, indexate de la 0 la 0. 987 00:42:48,790 --> 00:42:50,930 >> Deci, ce este că x suport 10? 988 00:42:50,930 --> 00:42:53,090 Este de fapt ceva Valoarea gunoi necunoscut. 989 00:42:53,090 --> 00:42:54,780 Este de memorie care nu-mi aparține. 990 00:42:54,780 --> 00:42:59,650 N-ar trebui atinge că byte număr 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Mă duc puțin prea departe. 992 00:43:01,420 --> 00:43:04,490 >> Și, într-adevăr, dacă am alerga aceasta program, acesta s-ar putea foarte bine accident. 993 00:43:04,490 --> 00:43:05,790 Dar, uneori, vom avea noroc. 994 00:43:05,790 --> 00:43:07,706 Și astfel doar pentru a demonstra asta-- și sincer, 995 00:43:07,706 --> 00:43:11,000 nu știi niciodată înainte de a Nu it-- să ruleze acest lucru. 996 00:43:11,000 --> 00:43:12,480 Nu a de fapt accident. 997 00:43:12,480 --> 00:43:15,032 >> Dar dacă am schimba acest lucru, pentru exemplu, să fie ca 1000, 998 00:43:15,032 --> 00:43:16,740 pentru a face acest lucru într-adevăr deliberat, să vedem 999 00:43:16,740 --> 00:43:18,710 dacă putem să-l sa se prabuseasca de data asta. 1000 00:43:18,710 --> 00:43:20,070 OK, nu a accident. 1001 00:43:20,070 --> 00:43:22,600 Ce zici de 100.000? 1002 00:43:22,600 --> 00:43:25,000 Să-l refacă, iar acum se reface. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Pfiu. 1005 00:43:25,960 --> 00:43:26,460 În regulă. 1006 00:43:26,460 --> 00:43:29,090 Deci, se pare, din nou, acestea segmente de memorie, ca să spunem așa, 1007 00:43:29,090 --> 00:43:32,660 sunt destul de mari, astfel încât să putem ajunge din nou și din nou noroc. 1008 00:43:32,660 --> 00:43:36,510 Dar, în cele din urmă, odată ce te ridicol și într-adevăr merge departe pe ecran, 1009 00:43:36,510 --> 00:43:39,120 atingeți de memorie care într-adevăr, într-adevăr nu-ți aparține. 1010 00:43:39,120 --> 00:43:40,870 >> Dar sincer, acestea tipuri de bug-uri vor 1011 00:43:40,870 --> 00:43:43,020 pentru a fi mai greu și mai greu să dau seama pe cont propriu. 1012 00:43:43,020 --> 00:43:47,880 Dar, din fericire, ca programatori, ne-am instrumente care ne permit să facem acest lucru pentru noi. 1013 00:43:47,880 --> 00:43:50,140 Deci, aceasta este, probabil, unul de cele mai urate programelor, 1014 00:43:50,140 --> 00:43:52,060 chiar mai urât decât producția gdb lui. 1015 00:43:52,060 --> 00:43:55,670 Dar ea are întotdeauna o linie sau doi, care sunt foarte utile. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind este un program care ajută tu nu debug un program, în sine, 1017 00:44:00,310 --> 00:44:03,500 dar găsi legate de memorie probleme, în mod specific. 1018 00:44:03,500 --> 00:44:07,590 Aceasta se va desfășura în mod automat codul de te si uita-te pentru cel puțin două lucruri. 1019 00:44:07,590 --> 00:44:10,680 Unul, ai făcut ceva accidental ca memorie tactil 1020 00:44:10,680 --> 00:44:11,980 care nu vă aparține? 1021 00:44:11,980 --> 00:44:13,590 Acesta vă va ajuta să găsiți aceste cazuri. 1022 00:44:13,590 --> 00:44:15,710 >> Și doi, aceasta va ajuta veți găsi ceva numit 1023 00:44:15,710 --> 00:44:19,270 pierderi de memorie, pe care le avem complet ignorat, în mod naiv, 1024 00:44:19,270 --> 00:44:21,380 de ceva timp și fericire. 1025 00:44:21,380 --> 00:44:23,140 Dar se pare că, tot acest timp, ori de câte ori 1026 00:44:23,140 --> 00:44:26,620 te-am sunat getString în atât de multe dintre programele noastre, 1027 00:44:26,620 --> 00:44:28,930 ceri de operare sistem de memorie, 1028 00:44:28,930 --> 00:44:32,070 dar aveți orice amintire de tot ea da 1029 00:44:32,070 --> 00:44:36,169 înapoi, face NEALOCATE, sau liber, așa cum se numește. 1030 00:44:36,169 --> 00:44:37,960 Nu, pentru că nu ne-am ți-a cerut să facă acest lucru. 1031 00:44:37,960 --> 00:44:41,250 >> Dar în tot acest timp, programele de care le-ați scris în C 1032 00:44:41,250 --> 00:44:43,800 Au fost scurgeri de memorie, cere de operare 1033 00:44:43,800 --> 00:44:46,190 Sistem pentru tot mai mulți memorie pentru siruri de caractere și de fleacuri, 1034 00:44:46,190 --> 00:44:47,870 dar nu se preda înapoi. 1035 00:44:47,870 --> 00:44:50,080 Iar acum acest lucru este un pic de o simplificare excesivă, 1036 00:44:50,080 --> 00:44:53,550 dar dacă ai vreodată rula Mac-ul sau PC-ul de ceva timp, de deschidere 1037 00:44:53,550 --> 00:44:55,790 o mulțime de programe, programe poate de închidere, 1038 00:44:55,790 --> 00:44:57,795 și chiar dacă dumneavoastră calculator nu sa prăbușit, 1039 00:44:57,795 --> 00:45:01,690 se face atât de mult mai lent, ca și cum este într-adevăr 1040 00:45:01,690 --> 00:45:04,290 folosind o mulțime de memorie sau resurse, chiar dacă, 1041 00:45:04,290 --> 00:45:06,070 dacă tu nu ești nici măcar atingeți tastatura, 1042 00:45:06,070 --> 00:45:10,430 care ar putea fi--, dar nu a putut intotdeauna-- fie că programele pe care le rulați 1043 00:45:10,430 --> 00:45:11,920 au ele însele pierderi de memorie. 1044 00:45:11,920 --> 00:45:15,645 Și ei tot întreb sistemul de operare pentru mai mult și mai multă memorie, dar uitând de el, 1045 00:45:15,645 --> 00:45:18,470 de fapt, nu folosind-o, dar având, prin urmare, memorie departe 1046 00:45:18,470 --> 00:45:20,500 de la alte programe care s-ar putea dori. 1047 00:45:20,500 --> 00:45:23,940 Deci, asta este o explicație comună. 1048 00:45:23,940 --> 00:45:25,940 Acum, aici e unde e Valgrind ieșire este complet 1049 00:45:25,940 --> 00:45:29,290 atroce a celor mai puțin și mai confortabil la fel. 1050 00:45:29,290 --> 00:45:32,690 Dar interesant Chestia asta e chiar aici. 1051 00:45:32,690 --> 00:45:37,060 Ea îmi spune o scriere invalid de Dimensiunea patru se întâmplă în acest program, 1052 00:45:37,060 --> 00:45:40,640 în special, la linia 21 din memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Dacă mă duc la linia 21, hm, nu într-adevăr este o scriere invalid de dimensiune patru. 1054 00:45:45,450 --> 00:45:46,250 De ce dimensiune patru? 1055 00:45:46,250 --> 00:45:49,500 Ei bine, acest number-- și ea ar putea fi orice-- este un int. 1056 00:45:49,500 --> 00:45:50,450 Deci, este de patru octeți. 1057 00:45:50,450 --> 00:45:52,550 Asa ca imi pun patru bytes în cazul în care acestea nu fac parte. 1058 00:45:52,550 --> 00:45:55,080 Asta e ceea ce Valgrind este, de fapt mi-a spus. 1059 00:45:55,080 --> 00:45:57,600 Mai mult decât atât, el va, de asemenea, Spune-mi, cum vom vedea, 1060 00:45:57,600 --> 00:46:01,490 ca tu a alerga aceasta într-un viitor PSET, în cazul în care și când ai scurgeri de memorie, care într-adevăr 1061 00:46:01,490 --> 00:46:05,300 Eu am, pentru că am sunat malloc, dar eu nu am de fapt 1062 00:46:05,300 --> 00:46:08,010 numit, în acest caz, gratuit, care vom vedea în cele din urmă 1063 00:46:08,010 --> 00:46:09,830 este opusul malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Așa că acum, cred, un ultim exemplu. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Deci, acesta este un pic mai mult arcane, dar este, probabil, 1068 00:46:16,690 --> 00:46:19,180 cel mai mare motiv de fi atent cu memorie, 1069 00:46:19,180 --> 00:46:24,490 și motivul pentru care multe programe și / sau servere de web, chiar la această zi, 1070 00:46:24,490 --> 00:46:28,200 sunt preluate de către baietii rai undeva pe internet, care sunt într-un fel 1071 00:46:28,200 --> 00:46:33,390 trimiterea de pachete false la server-ul dvs. încearcă să facă un compromis conturile tale, 1072 00:46:33,390 --> 00:46:36,420 sau de a lua datele, sau doar în general, preia o mașină. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, ca Numele sugerează, mijloace 1074 00:46:38,910 --> 00:46:40,740 debordant nu o int, dar un tampon. 1075 00:46:40,740 --> 00:46:43,490 Și un tampon este doar un mod fantezist de a spune că este o grămadă de memorie. 1076 00:46:43,490 --> 00:46:46,710 >> Și într-adevăr, am sunat un șir înainte tampon, în loc de s. 1077 00:46:46,710 --> 00:46:49,234 Pentru că, dacă e un tampon, ca, în sensul YouTube, 1078 00:46:49,234 --> 00:46:52,400 sau de fiecare dată când te uiți la un film, este posibil să fi văzut tamponarea cuvânt, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 Este incredibil de enervant. 1081 00:46:54,240 --> 00:46:55,990 Și asta înseamnă doar că player-ul video 1082 00:46:55,990 --> 00:46:58,710 este încercarea de a descărca o mulțime de bytes, o mulțime de bytes 1083 00:46:58,710 --> 00:47:00,170 de la un video de pe internet. 1084 00:47:00,170 --> 00:47:02,920 Dar e lent, așa că încearcă pentru a descărca o grămadă de ele 1085 00:47:02,920 --> 00:47:06,430 pentru a umple un tampon, un container, astfel încât aveți suficient de bytes care se poate apoi 1086 00:47:06,430 --> 00:47:09,174 vă arată video, fără a întrerupe în mod constant. 1087 00:47:09,174 --> 00:47:11,340 Dar se pare că, puteți au un tampon pentru atât de mare. 1088 00:47:11,340 --> 00:47:15,710 Dar încercați să puneți atât de mult de date în ea, și foarte lucruri rele se pot întâmpla. 1089 00:47:15,710 --> 00:47:22,780 Deci, de exemplu, să ne uităm la acest teaser finală de exemplu. 1090 00:47:22,780 --> 00:47:24,720 Acesta este un alt program că, la prima vedere, 1091 00:47:24,720 --> 00:47:26,540 nu face nimic foarte util. 1092 00:47:26,540 --> 00:47:29,590 Are o funcție principală care apelează această funcție, f. 1093 00:47:29,590 --> 00:47:36,640 Și această funcție, f, aici, are o matrice char, numit C, de dimensiune 12. 1094 00:47:36,640 --> 00:47:39,340 Și atunci se folosește acest Noua funcție numită strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Se pare că, cu acest simplu, simplu linie de cod, la doar două linii, 1097 00:47:45,190 --> 00:47:49,130 ne-am făcut întreg programul meu, și, prin urmare, întreaga mea calculator, 1098 00:47:49,130 --> 00:47:54,000 și contul meu de utilizator, și greu meu conduce potențial vulnerabile la nimeni 1099 00:47:54,000 --> 00:47:58,170 care știe și este destul de bun pentru a rula acest program cu o anumită linie de comandă 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Cu alte cuvinte, în cazul în care acest tip de rău pune în interiorul argvargv [1] prin tastarea 1102 00:48:03,400 --> 00:48:08,750 la tastatura un foarte special pregatit șir, nu abc, 123, dar, în esență, 1103 00:48:08,750 --> 00:48:15,180 simboluri binare care reprezintă executabil cod, un program care el sau ea a scris, 1104 00:48:15,180 --> 00:48:19,190 cu acest program simplu, care este reprezentant de mii de programe 1105 00:48:19,190 --> 00:48:23,610 care sunt la fel de vulnerabile, îndrăznesc să spun, el sau ea poate șterge în cele din urmă toate 1106 00:48:23,610 --> 00:48:26,680 fișierele de pe hard-disk, pentru a primi un clipește rapid, astfel încât el sau ea poate 1107 00:48:26,680 --> 00:48:30,170 Tip comenzi pe cont propriu, e-mail toate fișierele de mine. 1108 00:48:30,170 --> 00:48:34,660 Ceva ce pot face, el sau ea poate face cu acest cod. 1109 00:48:34,660 --> 00:48:36,575 >> Noi nu prea va rezolva acest lucru încă. 1110 00:48:36,575 --> 00:48:38,700 Și, de fapt, se va implica o imagine puțin 1111 00:48:38,700 --> 00:48:41,470 ca aceasta, pe care vom veni în curând pentru a înțelege tot mai bine. 1112 00:48:41,470 --> 00:48:44,480 Dar pentru ziua de azi, să se încheie pe ceea ce este, sperăm, un pic mai 1113 00:48:44,480 --> 00:48:48,360 de înțeles gluma XKCD, până când vom relua data viitoare. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 În regulă. 1116 00:48:51,600 --> 00:48:53,446 Ne vedem miercuri. 1117 00:48:53,446 --> 00:48:54,754 >> [MUSIC JOC] 1118 00:48:54,754 --> 00:48:57,790 >> Vorbitor: Și acum, adânc gânduri, de Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Memoria este ca sari într-o grămadă de frunze de aur pe o duminica dupa-amiaza. 1121 00:49:04,770 --> 00:49:09,000 Vântul, se clatina ta hair-- oh, mi-e dor de zilele when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Râsete] 1124 00:49:12,650 --> 00:49:13,750