1 00:00:00,000 --> 00:00:10,970 >> [Muziek] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan: Oke. 3 00:00:12,536 --> 00:00:13,392 >> [Lachen] 4 00:00:13,392 --> 00:00:14,240 >> Welkom terug. 5 00:00:14,240 --> 00:00:14,990 Dit is CS50. 6 00:00:14,990 --> 00:00:16,890 En dit het einde van de week vijf. 7 00:00:16,890 --> 00:00:20,020 En tot nu toe, we hebben vrij veel het nemen van uit dat er 8 00:00:20,020 --> 00:00:23,480 bestaat deze compiler, Clang, dat je hebt zijn beroep via deze 9 00:00:23,480 --> 00:00:27,100 andere tool genaamd Zorg dat een of andere manier magisch zet uw broncode 10 00:00:27,100 --> 00:00:31,350 in object code, de nullen en enen dat uw computers CPU, centrale 11 00:00:31,350 --> 00:00:33,410 verwerkingseenheid daadwerkelijk begrijpt. 12 00:00:33,410 --> 00:00:36,770 Maar het blijkt dat er een aantal dat is gaande onder de motorkap in 13 00:00:36,770 --> 00:00:38,690 tussen ingang en uitgang. 14 00:00:38,690 --> 00:00:41,800 >> En ik zou willen dat we vlees voorstellen dat in iets meer detail in 15 00:00:41,800 --> 00:00:45,130 deze vier stappen, hebben iets genaamd pre-processing, iets 16 00:00:45,130 --> 00:00:48,300 genaamd compileren, hetgeen wij gezien hebben, iets genaamd assembleren, en 17 00:00:48,300 --> 00:00:49,420 iets genaamd koppelen. 18 00:00:49,420 --> 00:00:53,270 Dus tot nu toe in sommige van onze programma's, we hebben gehad scherpe omvat. 19 00:00:53,270 --> 00:00:56,650 Meer recent hebben we een aantal scherpe definieert voor constanten. 20 00:00:56,650 --> 00:01:00,660 Dus het blijkt dat die dingen die worden voorafgegaan door de hekje of 21 00:01:00,660 --> 00:01:04,150 het symbool dat zijn pre-processor richtlijnen. 22 00:01:04,150 --> 00:01:07,960 Dat is gewoon een mooie manier om te zeggen dat het een regel code die eigenlijk 23 00:01:07,960 --> 00:01:12,280 omgezet in iets anders voordat de computer probeert zelfs om te zetten uw 24 00:01:12,280 --> 00:01:13,800 programma in nullen en enen. 25 00:01:13,800 --> 00:01:19,000 >> Bijvoorbeeld, scherpe bevat standaard I / O. H, vrij veel betekent gewoon gaan 26 00:01:19,000 --> 00:01:24,010 vooruit, de inhoud van de bestanden grijpen stdio.h en plak ze daar. 27 00:01:24,010 --> 00:01:25,880 Dus geen nullen en enen op nog dat punt. 28 00:01:25,880 --> 00:01:27,470 Het is eigenlijk gewoon een wissel. 29 00:01:27,470 --> 00:01:30,790 En dat is gebeurd tijdens de zogenaamde pre-processing fase, wanneer u 30 00:01:30,790 --> 00:01:34,230 eigenlijk Clang rennen of specifiek Maken in de meeste gevallen. 31 00:01:34,230 --> 00:01:36,950 Dus dit alles is gebeurd eerst automatisch tot nu toe. 32 00:01:36,950 --> 00:01:38,800 >> Dan komt de compilatie stap. 33 00:01:38,800 --> 00:01:40,920 Maar we hebben oversimplified compilatie. 34 00:01:40,920 --> 00:01:45,060 Het samenstellen van een programma werkelijk betekent om neem het van iets als C, de 35 00:01:45,060 --> 00:01:48,430 broncode hebben we schrijven, omlaag om iets te heet montage. 36 00:01:48,430 --> 00:01:52,900 Assembler is een lager niveau taal die, gelukkig, zullen wij niet 37 00:01:52,900 --> 00:01:55,480 hebben veel gelegenheid om schrijft dit semester. 38 00:01:55,480 --> 00:01:59,100 Maar het is op het laagste niveau in de zin dat je letterlijk begint te schrijven 39 00:01:59,100 --> 00:02:04,270 optellen en aftrekken en vermenigvuldigen en te laden uit het geheugen en het geheugen op te slaan, de 40 00:02:04,270 --> 00:02:08,259 zeer eenvoudige instructies die een computer, onder de motorkap, 41 00:02:08,259 --> 00:02:09,639 daadwerkelijk begrijpt. 42 00:02:09,639 --> 00:02:14,930 >> Tenslotte assembleren neemt die taal de nullen en enen die we geweest 43 00:02:14,930 --> 00:02:16,190 tot nu toe beschreven. 44 00:02:16,190 --> 00:02:19,270 En echt tot slot, is er de zogenaamde koppelen fase, die we zullen 45 00:02:19,270 --> 00:02:22,360 zien in slechts een moment, dat combineert je nullen en enen met nullen en 46 00:02:22,360 --> 00:02:24,870 die andere mensen voor u hebt gemaakt. 47 00:02:24,870 --> 00:02:26,660 >> Dus beschouw dit super eenvoudig programma. 48 00:02:26,660 --> 00:02:27,560 Het was van week 1. 49 00:02:27,560 --> 00:02:29,610 Het zei alleen, Hello World, op het scherm. 50 00:02:29,610 --> 00:02:30,920 We liepen deze via Clang. 51 00:02:30,920 --> 00:02:33,200 Of we liepen het door Make die Clang liep. 52 00:02:33,200 --> 00:02:36,170 En uitgevoerd op het moment waar aantal nullen en enen. 53 00:02:36,170 --> 00:02:38,100 Maar het blijkt dat er een tussenstap. 54 00:02:38,100 --> 00:02:40,460 Als ik ga hierheen - oeps, niet wil hem nog zien. 55 00:02:40,460 --> 00:02:44,800 Als ik ga hier naar mijn toestel en ik open hello.c, hier 56 00:02:44,800 --> 00:02:46,160 is dat hetzelfde programma. 57 00:02:46,160 --> 00:02:48,600 En wat ik ga doen in mijn terminal raam hier wordt ik ga 58 00:02:48,600 --> 00:02:51,430 run Clang plaats maken, die automatiseert alle vier van 59 00:02:51,430 --> 00:02:52,870 die stappen voor ons. 60 00:02:52,870 --> 00:02:58,620 En ik ga clang-S te doen en dan hello.c en voer. 61 00:02:58,620 --> 00:03:00,590 >> En ik krijg een knipperende prompt nogmaals, dat is goed. 62 00:03:00,590 --> 00:03:05,280 En nu in een iets groter scherm, Ik ga openstellen gedit in hier. 63 00:03:05,280 --> 00:03:09,610 En ik ga het openen van een bestand dat, blijkt, wordt hello.s dit heet 64 00:03:09,610 --> 00:03:11,870 bevat dat assembler Ik verwees naar eerder. 65 00:03:11,870 --> 00:03:15,060 En dit is wat er aan de assemblage genoemd taal, vrij laag niveau 66 00:03:15,060 --> 00:03:18,470 instructies die uw Intel-processor of wat het ook is dat er in zit 67 00:03:18,470 --> 00:03:19,350 begrijpt. 68 00:03:19,350 --> 00:03:24,480 En mov is voor de verhuizing. oproep is voor bellen, een zeer laag niveau functioneren. 69 00:03:24,480 --> 00:03:26,380 sub is voor aftrekken. 70 00:03:26,380 --> 00:03:30,370 >> Dus als je een bepaalde CPU binnen van uw computer, wat maakt het 71 00:03:30,370 --> 00:03:34,300 onderscheiden, versus andere CPU's op de markt, is die instructies het 72 00:03:34,300 --> 00:03:39,460 begrijpt en vaak hoe efficiënt het is, hoe snel het is bij het uitvoeren van een aantal 73 00:03:39,460 --> 00:03:40,380 van deze instructies. 74 00:03:40,380 --> 00:03:45,150 Nu voor meer informatie over deze, kunt u volgende Fall CS61 bij het college. 75 00:03:45,150 --> 00:03:48,170 Maar hier hebben we, bijvoorbeeld, een paar identifiers die bekend zou kunnen zien. 76 00:03:48,170 --> 00:03:50,150 hello.c is de naam van het programma. 77 00:03:50,150 --> 00:03:51,070 >> . Tekst - 78 00:03:51,070 --> 00:03:54,190 er is niet veel van belang zijn juist nu, herinneren dat de tekst 79 00:03:54,190 --> 00:03:59,190 segment vanaf maandag, is die waarbij in geheugen van uw programma daadwerkelijk eindigt. 80 00:03:59,190 --> 00:04:01,330 Dus dat is op zijn minst vaag vertrouwd zijn. 81 00:04:01,330 --> 00:04:03,730 Hier is natuurlijk een vermelding van onze functie. 82 00:04:03,730 --> 00:04:07,220 Scrollen naar beneden, deze verwijzen naar zaken zogenaamde registers, zeer kleine stukjes 83 00:04:07,220 --> 00:04:09,190 geheugen binnenkant van uw werkelijke CPU. 84 00:04:09,190 --> 00:04:12,930 En als ik naar beneden scrollen zelfs verder, zie ik een soort 85 00:04:12,930 --> 00:04:14,240 indirecte vermelding van ASCII. 86 00:04:14,240 --> 00:04:17,120 En daar, inderdaad, is die string, hello, komma, wereld. 87 00:04:17,120 --> 00:04:20,079 >> Dus lang verhaal kort, dit is gebeurt voor u, automatisch, 88 00:04:20,079 --> 00:04:22,140 onder de motorkap al die tijd. 89 00:04:22,140 --> 00:04:26,450 En wat er gebeurt is echt een keer je heb geen Clang, of door middel van 90 00:04:26,450 --> 00:04:29,150 Zorg, dat je eerst krijgt, uit de broncode, de 91 00:04:29,150 --> 00:04:30,700 zogenaamde assembler. 92 00:04:30,700 --> 00:04:35,210 Dan Clang wordt deze vergadering omzetten taal naar nullen en enen. 93 00:04:35,210 --> 00:04:38,340 En dit is de dia die we begonnen onze discussie in week 0 op - 94 00:04:38,340 --> 00:04:39,840 en dan week 1 op. 95 00:04:39,840 --> 00:04:44,030 En dan tot slot, die nullen en enen gecombineerd met nullen en enen 96 00:04:44,030 --> 00:04:47,190 van die bibliotheken hebben we zo voor lief zoals Standard I / O of de 97 00:04:47,190 --> 00:04:50,010 String Library of zelfs de CS50 bibliotheek. 98 00:04:50,010 --> 00:04:54,200 >> Dus om deze foto meer te schilderen visueel, hebben we hello.c. 99 00:04:54,200 --> 00:04:57,220 En, natuurlijk, gebruikt printf functioneren te zeggen, hallo wereld. 100 00:04:57,220 --> 00:05:01,810 De compilatie stap duurt het naar beneden om dat bestand we net zagen hello.s, zelfs 101 00:05:01,810 --> 00:05:04,290 maar dat is meestal verwijderd automatisch voor u. 102 00:05:04,290 --> 00:05:06,050 Maar dat is de assembly code in het midden stap. 103 00:05:06,050 --> 00:05:09,750 En toen we monteren de montage taal, om zo te zeggen, dat is wanneer je 104 00:05:09,750 --> 00:05:10,830 krijgen die nullen en enen. 105 00:05:10,830 --> 00:05:13,920 Dus we hebben ingezoomd effectief vandaag wat we hebben als vanzelfsprekend, 106 00:05:13,920 --> 00:05:16,430 betekent gaat broncode de objectcode. 107 00:05:16,430 --> 00:05:18,850 >> Maar ten slotte, nu dat hetzelfde beeld - laten we schuiven het over aan 108 00:05:18,850 --> 00:05:20,020 de linkerkant. 109 00:05:20,020 --> 00:05:22,880 En merken dat in de top is er Ik noemde stdio.h. 110 00:05:22,880 --> 00:05:25,030 Dat is een bestand dat we hebben opgenomen in bijna alle 111 00:05:25,030 --> 00:05:26,250 programma's die we hebben geschreven. 112 00:05:26,250 --> 00:05:28,830 En dat is het bestand waarvan de inhoud word geplakt exemplaar, 113 00:05:28,830 --> 00:05:30,350 effectief bovenop uw code. 114 00:05:30,350 --> 00:05:34,170 Maar het blijkt dat, op een computer systeem ergens, is er vermoedelijk een 115 00:05:34,170 --> 00:05:39,150 stdio.c bestand dat iemand jaren schreef geleden dat alle van de uitvoering 116 00:05:39,150 --> 00:05:41,870 functies die werden verklaard in stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Nu in werkelijkheid is het waarschijnlijk niet op je Mac of je PC of zelfs in de 118 00:05:45,465 --> 00:05:47,660 CS50 apparaat is een rauwe C-code. 119 00:05:47,660 --> 00:05:52,710 Iemand het al samengesteld en opgenomen . O-bestand voor objectcode of. Een 120 00:05:52,710 --> 00:05:56,020 bestand, dat verwijst naar een gedeelde bibliotheek dat is al vooraf geïnstalleerd en 121 00:05:56,020 --> 00:05:57,240 vooraf voor u samengesteld. 122 00:05:57,240 --> 00:06:01,950 Maar stel dat er inderdaad sprake op onze computer stdio.c parallel 123 00:06:01,950 --> 00:06:02,650 met Clang. 124 00:06:02,650 --> 00:06:04,960 Uw code is gecompileerd en gemonteerd. 125 00:06:04,960 --> 00:06:09,200 code stdio.c 's wordt samengesteld en geassembleerd, waardoor deze laatste 126 00:06:09,200 --> 00:06:13,730 stap, hier beneden, we moeten een of andere manier koppeling, om zo te zeggen, je nullen en enen 127 00:06:13,730 --> 00:06:18,430 met zijn of haar nullen en enen in een eenvoudig programma dat uiteindelijk is 128 00:06:18,430 --> 00:06:20,540 riep net Hallo. 129 00:06:20,540 --> 00:06:23,340 >> Dus dat is al de magie die is tot nu toe is gebeurd. 130 00:06:23,340 --> 00:06:26,430 En zal blijven om deze te nemen processen voor verleend, maar besef 131 00:06:26,430 --> 00:06:28,750 er is een hoop sappige details gaande eronder daar. 132 00:06:28,750 --> 00:06:31,920 En dit is wat maakt uw computer met Intel inside 133 00:06:31,920 --> 00:06:33,940 bijzonder onderscheiden. 134 00:06:33,940 --> 00:06:37,020 >> Zodat op die opmerking, als je wilt bij ons voor de lunch deze vrijdag, doen gaan 135 00:06:37,020 --> 00:06:41,570 aan de gebruikelijke plaats cs50.net/rsvp, 13:15 deze vrijdag. 136 00:06:41,570 --> 00:06:43,400 En nu een paar mededelingen. 137 00:06:43,400 --> 00:06:44,670 Dus we hebben goed nieuws. 138 00:06:44,670 --> 00:06:45,970 En we hebben slecht nieuws. 139 00:06:45,970 --> 00:06:47,260 Begin met wat goed nieuws hier. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Kreunen] 142 00:06:54,510 --> 00:06:54,710 >> Oke. 143 00:06:54,710 --> 00:06:56,670 Nou, het is technisch gezien een vakantie, dus het is niet zozeer een gift van ons. 144 00:06:56,670 --> 00:06:58,030 Maar dan het slechte nieuws natuurlijk. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Kreunen] 147 00:07:01,880 --> 00:07:03,530 >> Ik besteed veel tijd Op deze animaties. 148 00:07:03,530 --> 00:07:04,690 >> [Lachen] 149 00:07:04,690 --> 00:07:07,000 >> Er zal een evaluatie sessie deze komende maandag. 150 00:07:07,000 --> 00:07:08,340 Het zal worden op 5:30. 151 00:07:08,340 --> 00:07:11,210 Wij zullen u eraan herinneren van al deze gegevens via e-mail op de cursus 152 00:07:11,210 --> 00:07:13,470 website in slechts een paar dagen tijd. 153 00:07:13,470 --> 00:07:16,610 Het zal worden gefilmd en beschikbaar gesteld kort daarna. 154 00:07:16,610 --> 00:07:19,200 Dus als je niet kunt maken dat maandag nacht-slot, maak je geen zorgen. 155 00:07:19,200 --> 00:07:22,270 Secties deze komende week zal ook richten op review voor de quiz. 156 00:07:22,270 --> 00:07:25,670 Als uw afdeling is op maandag, dat is inderdaad universiteit vakantie, zullen we 157 00:07:25,670 --> 00:07:26,920 nog steeds voldoen in paragraaf. 158 00:07:26,920 --> 00:07:28,890 Als je gewoon niet kunt maken dat sectie want je gaat 159 00:07:28,890 --> 00:07:29,860 weg, dat is prima. 160 00:07:29,860 --> 00:07:33,710 Woon een zondag of dinsdag sectie of om tune-in paragraaf Jason's, dat is 161 00:07:33,710 --> 00:07:35,110 online beschikbaar. 162 00:07:35,110 --> 00:07:37,490 >> Dus, meer slecht nieuws. 163 00:07:37,490 --> 00:07:41,960 Dus volgens de syllabus, we hebben lezing volgende week vrijdag. 164 00:07:41,960 --> 00:07:43,690 Maar het goede nieuws - 165 00:07:43,690 --> 00:07:44,860 duidelijk, ik heb te veel tijd aan deze. 166 00:07:44,860 --> 00:07:45,280 >> [Lachen] 167 00:07:45,280 --> 00:07:47,140 >> We zullen volgende week vrijdag de colleges te annuleren. 168 00:07:47,140 --> 00:07:50,590 Dus dat zal een geschenk voor ons zijn, dus je kan echt een leuke onderbreking in 169 00:07:50,590 --> 00:07:52,990 tussen deze week en twee weken later plaatsvindt. 170 00:07:52,990 --> 00:07:57,460 Dus geen lezingen volgende week, maar een klein kleine quiz, waarvoor u moet zijn 171 00:07:57,460 --> 00:07:59,030 raken steeds meer opgewonden. 172 00:07:59,030 --> 00:08:03,870 >> Dus laten we nu onze aandacht richten op iets dat inderdaad visuele 173 00:08:03,870 --> 00:08:06,990 en nog veel meer spannende en om het podium voor wat gaat worden op de horizon 174 00:08:06,990 --> 00:08:08,420 in slechts een paar weken tijd. 175 00:08:08,420 --> 00:08:12,160 Na de eerste quiz, gaan we over de richten van ons probleem sets naar een andere 176 00:08:12,160 --> 00:08:16,710 domeinspecifieke probleem, dat van de forensics of veiligheid meer in het algemeen. 177 00:08:16,710 --> 00:08:19,550 >> In feite, de traditie met dit probleem set is voor mij een van de 178 00:08:19,550 --> 00:08:24,850 onderwijzen collega of CA's te lopen over campus nemen van enkele foto's van 179 00:08:24,850 --> 00:08:29,450 herkenbaar maar niet voor de hand liggende mensen, plaatsen of dingen, dan is ieder jaar I 180 00:08:29,450 --> 00:08:34,520 een of andere manier in slagen om per ongeluk verwijderen of corrupt de digitale mediakaart 181 00:08:34,520 --> 00:08:35,720 dat is de binnenkant van onze camera. 182 00:08:35,720 --> 00:08:36,860 Maar geen big deal. 183 00:08:36,860 --> 00:08:39,200 Ik kan gaan en stekker dat in mijn computer. 184 00:08:39,200 --> 00:08:43,010 Ik kan een forensisch afbeelding van te maken, zodat te spreken, door het kopiëren van de nullen en 185 00:08:43,010 --> 00:08:46,830 degenen off van dat de geheugenkaart, of zijn van een SD-kaart of een compact flash kaart of 186 00:08:46,830 --> 00:08:48,100 wat je bent vertrouwd met. 187 00:08:48,100 --> 00:08:49,300 En dan kunnen we de hand dat uit. 188 00:08:49,300 --> 00:08:53,190 >> En dus de komende uitdaging, onder andere dingen voor je, zal zijn om te schrijven 189 00:08:53,190 --> 00:08:58,630 C code die een hele hoop herstelt JPEG's voor mij en geopenbaard zal worden 190 00:08:58,630 --> 00:09:00,190 die mensen, plaatsen of dingen. 191 00:09:00,190 --> 00:09:03,340 En we zullen het ook hebben, in dit probleem ingesteld en in de dagen te komen, over 192 00:09:03,340 --> 00:09:04,440 graphics meer in het algemeen. 193 00:09:04,440 --> 00:09:06,140 We hebben ze gebruikt, een cursus, voor uitbreken. 194 00:09:06,140 --> 00:09:09,080 Maar je hebt soort van vanzelfsprekendheid bestaat deze begrippen hoog niveau 195 00:09:09,080 --> 00:09:10,680 rechthoeken en ovalen. 196 00:09:10,680 --> 00:09:12,450 Maar onder de motorkap Er zijn pixels. 197 00:09:12,450 --> 00:09:14,370 En je hebt gehad om te beginnen denken over die. 198 00:09:14,370 --> 00:09:18,800 Of je zal voor p-set 4 moeten nadenken over de spleet tussen de stenen, hoe 199 00:09:18,800 --> 00:09:21,990 snel je bal beweegt over het scherm voor het uitbreken. 200 00:09:21,990 --> 00:09:24,830 Dus er is dit begrip van de puntjes op het scherm dat is 201 00:09:24,830 --> 00:09:26,290 komen in het spel reeds. 202 00:09:26,290 --> 00:09:29,430 >> Nu wat je ziet, is echter wat krijg je op een computerscherm. 203 00:09:29,430 --> 00:09:33,680 Als je ooit hebt gekeken wat goed of slechte TV, kansen zijn ze vrij veel 204 00:09:33,680 --> 00:09:36,280 trakteren het publiek als technofoben die niet echt 205 00:09:36,280 --> 00:09:37,630 weet veel over computers. 206 00:09:37,630 --> 00:09:40,840 En dus is het zeer gemakkelijk voor de politie detective te zeggen, kunt u 207 00:09:40,840 --> 00:09:41,710 schoon dat voor mij? 208 00:09:41,710 --> 00:09:42,710 Of verbeteren, toch? 209 00:09:42,710 --> 00:09:45,550 Verbeteren is als de buzz woord in vrijwel elke misdaad gerelateerde tonen. 210 00:09:45,550 --> 00:09:49,240 En de realiteit is als je een heel nemen onscherpe foto van een verdachte te doen 211 00:09:49,240 --> 00:09:51,620 iets slecht, je kan niet gewoon verbeter het. 212 00:09:51,620 --> 00:09:53,080 U kunt niet inzoomen oneindig. 213 00:09:53,080 --> 00:09:56,350 Je kunt niet zien in de glinstering van iemands oog die dat gepleegd 214 00:09:56,350 --> 00:09:59,860 bijzonder misdaad, ondanks de prevalentie van deze op tv. 215 00:09:59,860 --> 00:10:04,110 >> En dus met dat laten we motiveren dat aankomende probleem set met een blik op 216 00:10:04,110 --> 00:10:05,765 sommige shows waarmee je misschien wel bekend voor. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEO AFSPELEN] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Nu, laten we een goede blik op jou. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Wacht. 222 00:10:17,766 --> 00:10:18,658 Lopen die terug. 223 00:10:18,658 --> 00:10:19,550 >> -Wacht even. 224 00:10:19,550 --> 00:10:21,580 Ga naar rechts. 225 00:10:21,580 --> 00:10:21,800 >> -Er. 226 00:10:21,800 --> 00:10:22,690 Bevriezen dat. 227 00:10:22,690 --> 00:10:23,692 >> -Full screen. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Bevriezen dat. 230 00:10:24,154 --> 00:10:25,140 >> -Draai op dat, zal ya? 231 00:10:25,140 --> 00:10:27,090 >> -Vector in op die vent door het achterwiel. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom in hier op deze plek. 233 00:10:29,730 --> 00:10:33,700 >> -Met de juiste apparatuur, de afgebeelde kan worden vergroot en verscherpt. 234 00:10:33,700 --> 00:10:34,490 >> -Wat is dat? 235 00:10:34,490 --> 00:10:35,870 >> -Het is een verhoging programma. 236 00:10:35,870 --> 00:10:36,793 >> -Kun je duidelijk dat je geen? 237 00:10:36,793 --> 00:10:38,560 >> -Ik weet het niet. 238 00:10:38,560 --> 00:10:39,090 Laten we verbeteren het. 239 00:10:39,090 --> 00:10:41,690 >> -Verbeter sectie A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Ik verbeterde de detail-en - 241 00:10:43,510 --> 00:10:44,456 >> -Ik denk dat er genoeg te verbeteren. 242 00:10:44,456 --> 00:10:45,402 Laat het aan mijn scherm. 243 00:10:45,402 --> 00:10:47,300 >> -Verbeteren van de bezinning in haar ogen. 244 00:10:47,300 --> 00:10:49,330 >> -Laten we lopen deze door video enhancement. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, kunt u dit verbeteren? 246 00:10:50,340 --> 00:10:52,320 >> -Hang on. 247 00:10:52,320 --> 00:10:54,290 >> -Ik heb gewerkt aan dit reflectie. 248 00:10:54,290 --> 00:10:55,560 >> -Iemand reflectie's. 249 00:10:55,560 --> 00:10:56,440 >> -Reflectie. 250 00:10:56,440 --> 00:10:57,940 >> -Er is een reflectie van de man's gezicht. 251 00:10:57,940 --> 00:10:58,860 >> -De reflectie. 252 00:10:58,860 --> 00:10:59,710 >> -Er is een reflectie. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom in op de spiegel. 254 00:11:00,900 --> 00:11:03,500 >> -U kunt een reflectie zien. 255 00:11:03,500 --> 00:11:04,700 >> -Kun je de afbeelding verbeteren van hier? 256 00:11:04,700 --> 00:11:05,700 >> -Kun je hem verbeteren hier? 257 00:11:05,700 --> 00:11:06,500 >> -Kun je het te verbeteren? 258 00:11:06,500 --> 00:11:07,380 >> -Kun je het te verbeteren? 259 00:11:07,380 --> 00:11:08,190 >> -Kunnen we dit verbeteren? 260 00:11:08,190 --> 00:11:08,940 >> -Kun je het te verbeteren? 261 00:11:08,940 --> 00:11:10,280 >> -Wacht even, ik zal verbeteren. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom in op de deur. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Lachen] 266 00:11:13,197 --> 00:11:14,360 >> -Beweeg inch 267 00:11:14,360 --> 00:11:15,100 >> -Wacht, stop. 268 00:11:15,100 --> 00:11:15,740 >> -Stoppen. 269 00:11:15,740 --> 00:11:16,290 >> -Pauzeer het. 270 00:11:16,290 --> 00:11:19,390 >> -Draai een 75 graden rond de verticale alstublieft. 271 00:11:19,390 --> 00:11:19,886 >> [Lachen] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, en terug naar het gedeelte over de deur weer. 273 00:11:24,350 --> 00:11:26,330 >> -Kreeg een afbeelding enhancer dat kan bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Misschien kunnen we gebruik maken van de Pradeep Sen methode om te zien in de ramen. 275 00:11:28,990 --> 00:11:30,680 >> -Deze software is state of the art. 276 00:11:30,680 --> 00:11:31,676 >> -Het pictogram waarde is uitgeschakeld. 277 00:11:31,676 --> 00:11:34,166 >> -Met de juiste combinatie van algoritmen. 278 00:11:34,166 --> 00:11:38,399 >> -Hij heeft algoritmen verlichting genomen om het volgende niveau en ik kan ze gebruiken om 279 00:11:38,399 --> 00:11:38,648 versterken deze foto. 280 00:11:38,648 --> 00:11:42,050 >> Lock-on en vergroten de z-as. 281 00:11:42,050 --> 00:11:42,760 >> -Verbeteren. 282 00:11:42,760 --> 00:11:43,060 >> -Verbeteren. 283 00:11:43,060 --> 00:11:43,760 >> -Verbeteren. 284 00:11:43,760 --> 00:11:45,010 >> -Freeze en verbeteren. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END VIDEO AFSPELEN] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: So Probleemverzameling 5 is wat ons te wachten daar. 288 00:11:51,470 --> 00:11:55,260 Dus zullen we binnenkort krijgen een beter inzicht van wanneer en waarom je 289 00:11:55,260 --> 00:11:57,300 en ons niet kunnen verbeteren op die manier. 290 00:11:57,300 --> 00:12:00,090 Maar laten we eerst terugkeren onze aandacht om een ​​deel van de bouwstenen zullen we 291 00:12:00,090 --> 00:12:02,250 moeten in staat zijn om dat verhaal te vertellen. 292 00:12:02,250 --> 00:12:05,580 >> Zodat herinneren dat we trok dit beeld op Maandag en een beetje van vorige week. 293 00:12:05,580 --> 00:12:09,970 En dit beschrijft de lay-out van de dingen in het geheugen van uw computer wanneer 294 00:12:09,970 --> 00:12:11,000 draaien van een programma. 295 00:12:11,000 --> 00:12:14,310 De tech segment tot boven, recall, verwijst de werkelijke nullen en enen 296 00:12:14,310 --> 00:12:16,000 dat uw programma samenstellen. 297 00:12:16,000 --> 00:12:19,340 Er is, onder dat, sommige geïnitialiseerd of geïnitialiseerde data, die typisch 298 00:12:19,340 --> 00:12:22,910 verwijst naar zaken als constanten of strings of globale variabelen die moeten 299 00:12:22,910 --> 00:12:24,200 vooraf werd aangegeven. 300 00:12:24,200 --> 00:12:26,500 Er is de hoop, maar we komen terug naar dat in een beetje. 301 00:12:26,500 --> 00:12:27,410 >> En dan is er de stack. 302 00:12:27,410 --> 00:12:30,660 Net als een stapel trays in de cafetaria, dit is waar het geheugen wordt 303 00:12:30,660 --> 00:12:33,610 gelaagd en gelaagd wanneer je doet wat in een programma? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Wat is de stack gebruikt voor? 306 00:12:37,730 --> 00:12:39,320 >> Yeah? 307 00:12:39,320 --> 00:12:40,000 >> Noemen van de functie. 308 00:12:40,000 --> 00:12:42,890 Elke keer dat je een functie noemt, het is gegeven lont geheugen voor de 309 00:12:42,890 --> 00:12:45,020 lokale variabelen en de parameters. 310 00:12:45,020 --> 00:12:48,810 En picturaal, zien we dat met elkaar opeenvolgende functie aangeroepen wanneer A 311 00:12:48,810 --> 00:12:52,520 oproepen B oproepen C oproepen D, zij krijgen gelaagd op de stapel. 312 00:12:52,520 --> 00:12:55,630 En binnen elk van deze plakjes geheugen is in wezen een uniek scope 313 00:12:55,630 --> 00:12:58,590 voor die functie, die, uiteraard, is problematisch als je wilt bij de hand 314 00:12:58,590 --> 00:13:01,850 van de ene functie naar de andere Een stuk van de gegevens die u wilt 315 00:13:01,850 --> 00:13:03,500 te muteren of te wijzigen. 316 00:13:03,500 --> 00:13:08,060 >> Dus wat was onze oplossing voor zodat Een functie vertegenwoordigd door een stapel 317 00:13:08,060 --> 00:13:11,390 omlijsten het geheugen binnen te veranderen van een andere stackframe? 318 00:13:11,390 --> 00:13:14,590 Hoe werken die twee met elkaar kunnen? 319 00:13:14,590 --> 00:13:18,510 Dus door middel van pointers of adressen, die, nogmaals, net beschrijven in 320 00:13:18,510 --> 00:13:22,280 geheugen, via een specifieke beet nummer, de specifieke 321 00:13:22,280 --> 00:13:23,830 waarde kan worden gevonden. 322 00:13:23,830 --> 00:13:26,860 Dus roepen laatste tijd ook bleven we het verhaal en keek naar een 323 00:13:26,860 --> 00:13:28,280 vrij buggy programma. 324 00:13:28,280 --> 00:13:32,900 En dit programma is buggy voor een paar redenen, maar de meest zorgwekkende is 325 00:13:32,900 --> 00:13:34,620 omdat het niet te controleren wat? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ja, zij niet aan de ingang controleren. 328 00:13:40,450 --> 00:13:41,870 Sorry? 329 00:13:41,870 --> 00:13:43,880 >> Als het meer dan 12 tekens. 330 00:13:43,880 --> 00:13:47,260 Dus heel slim, bij het bellen memcopy, die, zoals de naam al doet vermoeden, net 331 00:13:47,260 --> 00:13:50,630 kopieën geheugen van zijn tweede argument in zijn eerste argument. 332 00:13:50,630 --> 00:13:54,730 Het derde argument, heel slim, is gecontroleerd om ervoor te zorgen dat u niet 333 00:13:54,730 --> 00:13:59,400 Kopieer dan, in dit geval de lengte van de bar, aantal tekens, 334 00:13:59,400 --> 00:14:03,810 in de bestemming, dat is dit matrix C. Maar het probleem is dat wat 335 00:14:03,810 --> 00:14:07,230 Als C zelf is niet groot genoeg te hanteren dat? 336 00:14:07,230 --> 00:14:09,900 Je gaat naar het aantal te kopiëren bytes die je hebt gekregen. 337 00:14:09,900 --> 00:14:13,040 Maar wat doe je eigenlijk meer hebt bytes dan heb je ruimte voor? 338 00:14:13,040 --> 00:14:16,770 >> Nou, dit programma erg dom gewoon blindelings opbrengst te nemen wat het is 339 00:14:16,770 --> 00:14:20,650 gegeven, hello backslash 0 is geweldig als tekenreeks is kort 340 00:14:20,650 --> 00:14:22,040 genoeg, net als vijf tekens. 341 00:14:22,040 --> 00:14:26,470 Maar als het is eigenlijk 12 tekens of 1.200 tekens, vorige keer zagen we 342 00:14:26,470 --> 00:14:29,380 dat je gewoon gaat volledig overschrijven geheugen dat 343 00:14:29,380 --> 00:14:30,470 hoort niet bij jou. 344 00:14:30,470 --> 00:14:34,390 En het ergste geval, als u overschrijven dat rode gedeelte daar dat we wel de 345 00:14:34,390 --> 00:14:35,380 het terug - 346 00:14:35,380 --> 00:14:38,370 Dit is precies waar de computer automatisch, voor u, achter de 347 00:14:38,370 --> 00:14:43,130 scènes, plooien weg een 32-bits waarde die herinnert het aan welk adres het moet 348 00:14:43,130 --> 00:14:47,080 terugkeren wanneer foo, deze andere functie, gebeurt uitvoeren. 349 00:14:47,080 --> 00:14:49,320 Het is een broodkruimel van soorten waarbij het terugkeert. 350 00:14:49,320 --> 00:14:52,490 Als u overschrijven dat, potentieel, als je de bad guy, kan kon 351 00:14:52,490 --> 00:14:54,750 potentieel over te nemen iemands computer. 352 00:14:54,750 --> 00:14:58,020 En je zult zeker crashen in de meeste gevallen. 353 00:14:58,020 --> 00:15:01,690 >> Nu dit probleem is alleen verergerd als we begonnen te praten over het geheugen 354 00:15:01,690 --> 00:15:03,010 beheer meer in het algemeen. 355 00:15:03,010 --> 00:15:07,150 En malloc, voor het toewijzen van geheugen, is een functie die we kunnen gebruiken om te wijzen 356 00:15:07,150 --> 00:15:11,260 geheugen als we niet van tevoren weten dat we nodig zou kunnen hebben een aantal. 357 00:15:11,260 --> 00:15:13,960 Dus, bijvoorbeeld, als ik terug het apparaat hier. 358 00:15:13,960 --> 00:15:21,010 En ik openstellen van de vorige keer hello2.c, herinneren hier dit programma, dat zag er 359 00:15:21,010 --> 00:15:23,500 een beetje zoiets als dit, slechts drie lijnen - 360 00:15:23,500 --> 00:15:27,940 vermelding van uw naam, dan naam touwtje, aan de linkerkant, is gelijk aan getString. 361 00:15:27,940 --> 00:15:29,690 En vervolgens uit te printen we het uit, naam van de gebruiker. 362 00:15:29,690 --> 00:15:31,170 >> Dus dit was een super eenvoudig programma. 363 00:15:31,170 --> 00:15:34,870 Om duidelijk te zijn, laat me ga je gang en maak hello-2. 364 00:15:34,870 --> 00:15:36,680 Ik ga doen dot slash hello-2. 365 00:15:36,680 --> 00:15:37,750 Vermeld uw naam - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Hallo David. 369 00:15:39,540 --> 00:15:41,060 Het lijkt te werken op OK. 370 00:15:41,060 --> 00:15:43,140 Maar wat er werkelijk aan de hand eronder hood hier? 371 00:15:43,140 --> 00:15:44,670 Laten we het eerst pellen sommige lagen. 372 00:15:44,670 --> 00:15:48,380 String is gewoon een synoniem we hebben gerealiseerd voor wat? 373 00:15:48,380 --> 00:15:49,110 Char ster. 374 00:15:49,110 --> 00:15:52,740 Dus laten we het een beetje meer geheimzinnige maar meer technisch juist dat deze 375 00:15:52,740 --> 00:15:55,570 is een char ster, waardoor naam, ja, is een variabele. 376 00:15:55,570 --> 00:15:59,920 Maar welke naam winkels is het adres van de een char, dat voelt een beetje vreemd 377 00:15:59,920 --> 00:16:01,050 want ik krijg weer een string. 378 00:16:01,050 --> 00:16:03,580 Ik krijg weer meerdere chars niet een char. 379 00:16:03,580 --> 00:16:07,400 >> Maar natuurlijk, u alleen de eerste nodig adres char's te herinneren waar de 380 00:16:07,400 --> 00:16:08,870 hele reeks is want waarom? 381 00:16:08,870 --> 00:16:12,700 Hoe kom je erachter waar het einde van de string is te weten het begin? 382 00:16:12,700 --> 00:16:13,630 De backslash nul. 383 00:16:13,630 --> 00:16:17,260 Dus met die twee aanwijzingen je uitzoeken vóór het begin en het einde van 384 00:16:17,260 --> 00:16:20,280 elke string zijn, zolang ze goed gevormd met dat null 385 00:16:20,280 --> 00:16:22,110 terminator, dat backslash nul. 386 00:16:22,110 --> 00:16:24,520 >> Maar dit roept getString. 387 00:16:24,520 --> 00:16:28,020 En het blijkt dat getString al die tijd is zo vriendelijk geweest van 388 00:16:28,020 --> 00:16:28,820 vreemdgaan voor ons. 389 00:16:28,820 --> 00:16:32,460 Het is gedaan deze arbeid, om zeker te zijn, om een ​​string van de gebruiker. 390 00:16:32,460 --> 00:16:34,580 Maar waar is dat het geheugen komen al uit? 391 00:16:34,580 --> 00:16:38,440 Als we terug gaan naar de foto en toepassing van de definitie van slechts een 392 00:16:38,440 --> 00:16:42,610 daarnet, dat de stapel is waar geheugen gaat wanneer functies worden genoemd, 393 00:16:42,610 --> 00:16:45,370 door die logica, wanneer je getString noemen, en typ ik in 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Voer, waar is D-A-V-I-D backslash nul opgeslagen, in de 395 00:16:50,900 --> 00:16:53,480 verhaal dat we ons ver verteld? 396 00:16:53,480 --> 00:16:55,190 >> Het lijkt in de stack, toch? 397 00:16:55,190 --> 00:16:58,120 Als u belt krijgt touwtje krijg je een klein stukje van het geheugen op de stack. 398 00:16:58,120 --> 00:17:01,630 Dus het spreekt vanzelf dat D-A-V-I-D backslash nul wordt opgeslagen 399 00:17:01,630 --> 00:17:02,770 er in de stapel. 400 00:17:02,770 --> 00:17:07,680 Maar wacht eens even, getString rendement dat koord, om zo te zeggen, waardoor 401 00:17:07,680 --> 00:17:11,700 het is lade uit de kantine wordt genomen uit de stapel. 402 00:17:11,700 --> 00:17:14,560 En we vorige keer zei dat zodra een functie terugkeert, en je neemt dat 403 00:17:14,560 --> 00:17:20,109 lade, om zo te zeggen, uit de stapel, wat kunt u ervan uitgaan over de restanten van 404 00:17:20,109 --> 00:17:21,819 dat het geheugen? 405 00:17:21,819 --> 00:17:25,160 Ik soort van belangrijke vormgever hen als vraagtekens omdat ze effectief worden 406 00:17:25,160 --> 00:17:26,250 onbekende waarden. 407 00:17:26,250 --> 00:17:29,500 Ze kunnen worden hergebruikt bij sommige volgende functie wordt aangeroepen. 408 00:17:29,500 --> 00:17:31,870 >> Met andere woorden, als we toevallig te slaan - 409 00:17:31,870 --> 00:17:34,350 Ik zal snel een foto te trekken hier van de stapel. 410 00:17:34,350 --> 00:17:38,690 Als we toevallig te trekken van de bodem van mijn geheugen segment, en we zullen zeggen 411 00:17:38,690 --> 00:17:42,230 dat dit de plek van het geheugen bezet door de belangrijkste en misschien arg c en 412 00:17:42,230 --> 00:17:46,790 arg v en iets anders in het programma, wanneer getString wordt genoemd, 413 00:17:46,790 --> 00:17:51,120 vermoedelijk getString krijgt een stuk van het geheugen hier. 414 00:17:51,120 --> 00:17:53,940 En vervolgens D-A-V-I-D ergens komt in deze functie. 415 00:17:53,940 --> 00:17:55,320 En ik ga te eenvoudig. 416 00:17:55,320 --> 00:18:00,050 Maar laten we aannemen dat de D-A-V-I-D backslash nul. 417 00:18:00,050 --> 00:18:03,500 Dus zoveel bytes worden gebruikt het frame voor getString. 418 00:18:03,500 --> 00:18:08,270 >> Maar zodra getString terugkeert, we zei vorige keer dat dit geheugen op 419 00:18:08,270 --> 00:18:11,340 hier allemaal wordt - woops! - 420 00:18:11,340 --> 00:18:14,270 alle daadwerkelijk wordt gewist. 421 00:18:14,270 --> 00:18:17,220 En we kunnen nu denken dat dit als vraag merken want wie weet 422 00:18:17,220 --> 00:18:18,720 wat er gaat worden van dat geheugen. 423 00:18:18,720 --> 00:18:22,130 Sterker nog, ik roep heel vaak functies dan getString. 424 00:18:22,130 --> 00:18:24,750 En zodra ik noem een ​​aantal andere functie dan getString, misschien niet in 425 00:18:24,750 --> 00:18:28,860 dit specifieke programma we gewoon gekeken op maar een aantal andere, zeker een aantal andere 426 00:18:28,860 --> 00:18:34,180 functie zou kunnen eindigen wordt gegeven deze volgende plek in de stapel. 427 00:18:34,180 --> 00:18:39,410 >> Dus het kan niet zo zijn dat getString winkels D-A-V-I-D op de stapel, want ik zou 428 00:18:39,410 --> 00:18:41,040 direct toegang tot het te verliezen. 429 00:18:41,040 --> 00:18:43,720 Maar we weten dat ze getString alleen wat terug? 430 00:18:43,720 --> 00:18:47,220 Het is niet terug te keren naar me zes tekens. 431 00:18:47,220 --> 00:18:51,090 Wat is het echt terug had concluderen we vorige keer? 432 00:18:51,090 --> 00:18:52,480 Het adres van de eerste. 433 00:18:52,480 --> 00:18:56,650 Dus een of andere manier, als je getString genoemd, het is de toewijzing van een stuk van het geheugen voor 434 00:18:56,650 --> 00:18:59,620 de tekenreeks die het type gebruikers en vervolgens terugkerende adres ervan. 435 00:18:59,620 --> 00:19:02,930 En het blijkt dat wanneer je wilt functie om geheugen in deze toewijzen 436 00:19:02,930 --> 00:19:08,390 manier en terug te keren naar de persoon die heeft gebeld die functie, het adres van de 437 00:19:08,390 --> 00:19:11,870 dat stuk van het geheugen, je absoluut kan het niet in de stapel bij de 438 00:19:11,870 --> 00:19:14,750 bodem, want functioneel is het gewoon ga niet heel de jouwe 439 00:19:14,750 --> 00:19:17,800 snel, dus je kunt waarschijnlijk wel raden waar we waarschijnlijk gaan om het te gooien 440 00:19:17,800 --> 00:19:20,130 in plaats daarvan, de zogenaamde heap. 441 00:19:20,130 --> 00:19:25,290 >> Dus tussen de onderkant van je geheugen lay-out en de bovenkant van uw geheugen 442 00:19:25,290 --> 00:19:26,820 lay-out zijn een heleboel segmenten. 443 00:19:26,820 --> 00:19:29,270 Een is de stack en rechts boven de heap. 444 00:19:29,270 --> 00:19:33,680 En hoop is gewoon een ander stuk van geheugen dat niet wordt gebruikt voor functies 445 00:19:33,680 --> 00:19:34,770 wanneer ze worden opgeroepen. 446 00:19:34,770 --> 00:19:38,100 Het wordt gebruikt voor de langere termijn geheugen, wanneer U wilt een functie om wat te pakken 447 00:19:38,100 --> 00:19:42,700 geheugen en in staat zijn om op te hangen aan het zonder verlies van controle over. 448 00:19:42,700 --> 00:19:45,550 >> Nu heb je misschien meteen zou kunnen zien dat dit niet 449 00:19:45,550 --> 00:19:48,060 noodzakelijk een perfect design. 450 00:19:48,060 --> 00:19:51,350 Als uw programma toegewezen geheugen op de stapel, of als u belt meer en 451 00:19:51,350 --> 00:19:55,540 meer functies, of als u toe te wijzen geheugen op de heap met malloc af als 452 00:19:55,540 --> 00:20:00,690 getString doet, wat duidelijk lijkt onvermijdelijk probleem? 453 00:20:00,690 --> 00:20:00,860 >> Rechts. 454 00:20:00,860 --> 00:20:03,150 Zoals het feit dat deze pijlen wijzen naar elkaar 455 00:20:03,150 --> 00:20:04,380 voorspelt niet veel goeds. 456 00:20:04,380 --> 00:20:08,630 En inderdaad, konden we heel snel crashen een programma op een aantal manieren. 457 00:20:08,630 --> 00:20:12,050 Sterker nog, ik denk dat we kunnen hebben dit per ongeluk een keer gedaan. 458 00:20:12,050 --> 00:20:14,020 Of indien niet, laten we het doen doelbewust nu. 459 00:20:14,020 --> 00:20:21,330 Laat me ga je gang en schrijf super snel een programma genaamd dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 En nu zal ik hier binnen te gaan en geen scherpe omvatten stdio.h. 461 00:20:26,730 --> 00:20:32,620 Laten we verklaren functie foo neemt geen argumenten, dat is 462 00:20:32,620 --> 00:20:34,040 aangeduid alsook door leegte. 463 00:20:34,040 --> 00:20:37,830 >> En het enige wat foo gaat doen is oproep foo, dat is waarschijnlijk niet de 464 00:20:37,830 --> 00:20:39,100 slimste idee, maar het zij zo. 465 00:20:39,100 --> 00:20:40,490 Ent belangrijkste leegte. 466 00:20:40,490 --> 00:20:45,270 Nu is het enige belangrijkste gaat te doen is bellen foo ook. 467 00:20:45,270 --> 00:20:51,050 En gewoon voor de kick, ik ga om te gaan vooruit hier en zeggen: printf "Hello from 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Dus als ik geen fouten maakte, Maak dontdothis dot slash. 471 00:21:00,160 --> 00:21:01,960 En laten we het doen in een groter venster - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Kom op. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Blijkbaar, kunt u dit doen. 478 00:21:13,100 --> 00:21:15,190 Verdomme. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Wachten. 481 00:21:16,580 --> 00:21:17,370 Stand-by. 482 00:21:17,370 --> 00:21:18,270 Deden we - 483 00:21:18,270 --> 00:21:20,110 We hebben gebruik het met Zorg. 484 00:21:20,110 --> 00:21:22,050 >> [SIGHS] 485 00:21:22,050 --> 00:21:25,110 >> Ik weet het, maar ik denk dat we gewoon verwijderd dat. 486 00:21:25,110 --> 00:21:28,410 Uh, ja. 487 00:21:28,410 --> 00:21:30,660 Verdomme. 488 00:21:30,660 --> 00:21:32,640 Los deze Rob. 489 00:21:32,640 --> 00:21:34,678 Wat? 490 00:21:34,678 --> 00:21:35,928 Het is heel simpel. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ja, we draaide optimalisatie uitgeschakeld. 493 00:21:47,360 --> 00:21:48,970 OK, stand bye. 494 00:21:48,970 --> 00:21:49,950 Nu voel ik me beter. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Oke. 497 00:21:51,780 --> 00:21:53,430 >> Dus laten we opnieuw compileren deze - 498 00:21:53,430 --> 00:21:55,880 Maak je dontdothis. 499 00:21:55,880 --> 00:22:00,090 Je zou kunnen hebben om deze te hernoemen naar dothis.c in slechts een moment. 500 00:22:00,090 --> 00:22:00,710 Daar gaan we. 501 00:22:00,710 --> 00:22:01,240 Dank u. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Dus het feit dat ik werd afgedrukt iets uit was eigenlijk gewoon 504 00:22:05,480 --> 00:22:08,150 het vertragen van het proces waarbij we zou dat punt hebben bereikt. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Phew! 507 00:22:08,870 --> 00:22:11,180 >> Dus wat er eigenlijk aan de hand? 508 00:22:11,180 --> 00:22:14,440 De reden dat er, net als een terzijde, is iets te doen in termen van input en 509 00:22:14,440 --> 00:22:17,270 uitgang heeft de neiging langzamer te zijn, omdat je moeten de tekens schrijven 510 00:22:17,270 --> 00:22:18,600 scherm, Het heeft te scrollen. 511 00:22:18,600 --> 00:22:21,720 Dus lang verhaal kort, had ik eigenlijk gebeurde zo ongeduldig, zouden we 512 00:22:21,720 --> 00:22:23,260 gezien dit eindresultaat ook. 513 00:22:23,260 --> 00:22:26,220 Nu ik kreeg rit van de afdruk-ups, zien we het meteen. 514 00:22:26,220 --> 00:22:28,410 Waarom is dit zo gebeurt. 515 00:22:28,410 --> 00:22:31,300 Nou, de eenvoudige verklaring, natuurlijk, is dat foo waarschijnlijk niet te 516 00:22:31,300 --> 00:22:32,500 worden die zichzelf. 517 00:22:32,500 --> 00:22:34,470 >> Nu in algemene termen, Dit is recursie. 518 00:22:34,470 --> 00:22:36,970 En we dachten dat een paar weken geleden recursieve is goed. 519 00:22:36,970 --> 00:22:40,330 Recursie is deze magische manier van jezelf uitdrukken super kort en bondig. 520 00:22:40,330 --> 00:22:41,400 En het werkt gewoon. 521 00:22:41,400 --> 00:22:45,060 Maar er is een belangrijk kenmerk van alle de recursieve programma's die we hebben gesproken 522 00:22:45,060 --> 00:22:48,260 over en keek tot nu toe, die was dat ze wat? 523 00:22:48,260 --> 00:22:52,610 Een referentiemodel, dat was wat hard coded geval dat genoemde in sommige situaties 524 00:22:52,610 --> 00:22:56,210 denk foo, die duidelijk niet bellen hier niet het geval. 525 00:22:56,210 --> 00:22:58,920 >> Dus wat er werkelijk gebeurt in termen van deze foto? 526 00:22:58,920 --> 00:23:01,790 Nou, als belangrijkste noemt foo, het krijgt een stukje van het geheugen. 527 00:23:01,790 --> 00:23:04,150 Wanneer foo noemt foo, het wordt een stukje van het geheugen. 528 00:23:04,150 --> 00:23:06,430 Wanneer foo noemt foo, krijgt het een slice. 529 00:23:06,430 --> 00:23:07,080 Het krijgt een stukje. 530 00:23:07,080 --> 00:23:08,120 Het krijgt een stukje. 531 00:23:08,120 --> 00:23:09,460 Omdat foo is nooit terug te keren. 532 00:23:09,460 --> 00:23:12,160 We zijn nooit wist een van die kaders van de stapel. 533 00:23:12,160 --> 00:23:15,930 Dus we waait door de heap, niet te vermelden wie weet wat nog meer, en 534 00:23:15,930 --> 00:23:19,600 we overschrijden de grenzen van onze zogenaamde segment van het geheugen. 535 00:23:19,600 --> 00:23:21,790 Fout gaan segmentatie vals. 536 00:23:21,790 --> 00:23:24,110 >> Dus de oplossing is duidelijk doen dit niet. 537 00:23:24,110 --> 00:23:28,830 Maar de grotere implicatie is dat, ja, Er is absoluut een bepaalde grens, 538 00:23:28,830 --> 00:23:32,470 zelfs als het niet goed gedefinieerd, hoe vele functies u kunt bellen in een 539 00:23:32,470 --> 00:23:34,970 programma, hoe vaak een functie kan zelf bellen. 540 00:23:34,970 --> 00:23:38,430 Dus hoewel we prediken recursie als deze potentieel magische ding een 541 00:23:38,430 --> 00:23:41,870 paar weken geleden voor de sigma functie, en wanneer krijgen we de data 542 00:23:41,870 --> 00:23:45,270 structuren en CS50, zult u meer zien toepassingen voor het, het is niet 543 00:23:45,270 --> 00:23:46,500 noodzakelijkerwijs het beste ding. 544 00:23:46,500 --> 00:23:50,070 Want als een functie noemt zichzelf, noemt zichzelf, zelfs als er een basis 545 00:23:50,070 --> 00:23:54,860 geval, als je niet raken dat base case voor 1.000 oproepen of 10.000 oproepen, door 546 00:23:54,860 --> 00:23:58,800 die keer dat je van de kamer zou zijn leeg op je zogenaamde stack en hit 547 00:23:58,800 --> 00:24:00,400 andere segmenten van het geheugen. 548 00:24:00,400 --> 00:24:03,950 Dus het is ook een ontwerp trade-off tussen elegantie en tussen 549 00:24:03,950 --> 00:24:06,920 robuustheid van uw specifieke implementatie. 550 00:24:06,920 --> 00:24:10,780 >> Dus er is nog een nadeel of andere gotcha aan wat we hebben 551 00:24:10,780 --> 00:24:11,720 tot nu toe gedaan. 552 00:24:11,720 --> 00:24:12,980 Toen ik belde getString - 553 00:24:12,980 --> 00:24:15,120 Laat me teruggaan naar hello-2. 554 00:24:15,120 --> 00:24:18,170 Merk op dat ik bel getString, die is terug een adres. 555 00:24:18,170 --> 00:24:20,730 En we vandaag beweren dat adres is van de hoop. 556 00:24:20,730 --> 00:24:24,480 En nu ben ik het afdrukken van de snaar op dat adres. 557 00:24:24,480 --> 00:24:27,000 Maar we hebben nooit opgeroepen de tegenovergestelde van getString. 558 00:24:27,000 --> 00:24:30,850 We zijn nooit naar een functie als calll ungetstring, waar je hand heen 559 00:24:30,850 --> 00:24:31,610 dat geheugen. 560 00:24:31,610 --> 00:24:33,250 Maar eerlijk gezegd we waarschijnlijk had moeten zijn. 561 00:24:33,250 --> 00:24:37,390 Want als we blijven vragen de computer voor het geheugen, bij wijze van iemand als 562 00:24:37,390 --> 00:24:40,830 getString maar geef het nooit meer terug, zeker ook dat is gebonden leiden tot 563 00:24:40,830 --> 00:24:42,970 problemen waarbij we opraken van het geheugen. 564 00:24:42,970 --> 00:24:46,140 >> En in feite, kunnen we kijken naar deze problemen met de nieuwe tool waarvan gebruik 565 00:24:46,140 --> 00:24:47,640 is een beetje cryptisch te typen. 566 00:24:47,640 --> 00:24:50,960 Maar laat me gaan en spatten omhoog op het scherm in slechts een moment. 567 00:24:50,960 --> 00:24:56,940 Ik ga om te gaan en uit te voeren Valgrind met parameter wiens eerste commando 568 00:24:56,940 --> 00:25:00,260 line argument is de naam van dat programma hello-2. 569 00:25:00,260 --> 00:25:02,650 En helaas is het uitgang is gruwelijk 570 00:25:02,650 --> 00:25:04,290 complex voor geen goede reden. 571 00:25:04,290 --> 00:25:06,280 Zo zien we al die rotzooi. 572 00:25:06,280 --> 00:25:07,530 David is vermeld mijn naam. 573 00:25:07,530 --> 00:25:09,760 Dus dat is het programma werkelijk aan het draaien. 574 00:25:09,760 --> 00:25:11,180 En nu krijgen we deze uitgang. 575 00:25:11,180 --> 00:25:13,400 >> Dus Valgrind vergelijkbaar in de geest naar GDB. 576 00:25:13,400 --> 00:25:14,950 Het is niet een debugger per se. 577 00:25:14,950 --> 00:25:16,270 Maar het is een herinnering checker. 578 00:25:16,270 --> 00:25:20,140 Het is een programma dat je zal lopen programmeren en u vertellen of u gevraagd een 579 00:25:20,140 --> 00:25:23,860 computer voor het geheugen en nooit gaf het terug, waardoor betekent dat je hebt 580 00:25:23,860 --> 00:25:24,570 een geheugenlek. 581 00:25:24,570 --> 00:25:26,240 En geheugen lekken neiging om slecht te zijn. 582 00:25:26,240 --> 00:25:29,120 En u is gebruikers van de computers Waarschijnlijk voelde dit, of je hebt een 583 00:25:29,120 --> 00:25:30,300 Mac of een PC. 584 00:25:30,300 --> 00:25:33,730 Heb je ooit gebruikt uw computer voor terwijl en niet opnieuw opgestart in verschillende 585 00:25:33,730 --> 00:25:36,820 dagen, of je hebt net een stuk van programma's draaien, en het verdomde ding 586 00:25:36,820 --> 00:25:42,360 vertraagt ​​tot stilstand, althans het super vervelend te gebruiken, omdat 587 00:25:42,360 --> 00:25:44,350 alles net super traag. 588 00:25:44,350 --> 00:25:46,260 >> Nu dat kan een aantal redenen te zijn. 589 00:25:46,260 --> 00:25:49,600 Het kan een oneindige lus, een bug in zijn iemands code, of, eenvoudiger, het 590 00:25:49,600 --> 00:25:53,250 zou kunnen betekenen dat u gebruikt meer geheugen, of proberen om, dan je 591 00:25:53,250 --> 00:25:54,920 computer heeft eigenlijk. 592 00:25:54,920 --> 00:25:57,770 En misschien is er een bug in een programma die blijven vragen voor het geheugen. 593 00:25:57,770 --> 00:26:02,480 Browsers voor jaren waren berucht voor dit, vragen om meer en meer geheugen 594 00:26:02,480 --> 00:26:03,870 maar nooit overhandigen het terug. 595 00:26:03,870 --> 00:26:07,220 Zeker, als je alleen maar een eindige hoeveelheid geheugen, kan je niet vragen 596 00:26:07,220 --> 00:26:09,990 oneindig vaak voor sommige van dat geheugen. 597 00:26:09,990 --> 00:26:13,070 >> En dus wat je hier ziet, ook al opnieuw uitgang Valgrind's is 598 00:26:13,070 --> 00:26:17,490 onnodig ingewikkelde blik op eerste, dit is het interessante deel. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 in gebruik bij afslag. 601 00:26:20,060 --> 00:26:22,810 Dus hier is hoeveel geheugen was gebruikt in de heap de 602 00:26:22,810 --> 00:26:24,300 tijd mijn programma verlaten - 603 00:26:24,300 --> 00:26:27,280 blijkbaar zes bytes in een blok. 604 00:26:27,280 --> 00:26:28,710 Dus ik ga mijn handen zwaaien naar wat een blok is. 605 00:26:28,710 --> 00:26:31,270 Denken van het is gewoon een brok, een meer technische woord voor chunk. 606 00:26:31,270 --> 00:26:33,140 Maar zes bytes - 607 00:26:33,140 --> 00:26:36,870 wat zijn de zes bytes die waren nog in gebruik? 608 00:26:36,870 --> 00:26:37,390 >> Precies. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D backslash nul, vijf letters naam plus de null-terminator. 610 00:26:41,520 --> 00:26:46,350 Dus dit programma Valgrind gemerkt dat ik vroeg om zes bytes, blijkbaar, door 611 00:26:46,350 --> 00:26:48,950 manier getString, maar nooit gaf ze terug. 612 00:26:48,950 --> 00:26:52,030 En in feite, kan dit niet worden duidelijk als mijn programma is niet drie 613 00:26:52,030 --> 00:26:53,590 lijnen, maar het is 300 lijnen. 614 00:26:53,590 --> 00:26:56,920 Dus we kunnen eigenlijk geven een andere opdracht lijn argument Valgrind aan 615 00:26:56,920 --> 00:26:58,290 maken het meer breedsprakig. 616 00:26:58,290 --> 00:26:59,760 Het is een beetje vervelend om te onthouden. 617 00:26:59,760 --> 00:27:01,580 Maar als ik dat doe - 618 00:27:01,580 --> 00:27:01,930 laten we eens kijken. 619 00:27:01,930 --> 00:27:03,540 Lek - 620 00:27:03,540 --> 00:27:05,030 Werd het lek - 621 00:27:05,030 --> 00:27:07,580 zelfs ik weet het niet meer wat het is uit de hand. 622 00:27:07,580 --> 00:27:08,550 >> - Lek-check gelijk vol. 623 00:27:08,550 --> 00:27:10,180 Yep, dank je. 624 00:27:10,180 --> 00:27:12,520 - Lek-check gelijk vol. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Hetzelfde programma wordt uitgevoerd. 627 00:27:14,940 --> 00:27:16,180 Typ in David weer. 628 00:27:16,180 --> 00:27:17,660 Nu zie ik wat meer detail. 629 00:27:17,660 --> 00:27:20,890 Maar minder dan de heap samenvatting, die is gelijk aan vier - ah, 630 00:27:20,890 --> 00:27:22,120 dit is wel leuk. 631 00:27:22,120 --> 00:27:25,460 Nu Valgrind is eigenlijk op zoek een beetje harder in mijn code. 632 00:27:25,460 --> 00:27:29,580 En het is te zeggen dat, blijkbaar, malloc op lijn - 633 00:27:29,580 --> 00:27:30,580 we uitzoomen. 634 00:27:30,580 --> 00:27:31,980 Op lijn - 635 00:27:31,980 --> 00:27:32,930 we niet zien welke lijn het is. 636 00:27:32,930 --> 00:27:35,110 Maar malloc is de eerste boosdoener. 637 00:27:35,110 --> 00:27:38,630 Er is een blog in malloc. 638 00:27:38,630 --> 00:27:39,810 >> Oke? 639 00:27:39,810 --> 00:27:40,450 OK, nee. 640 00:27:40,450 --> 00:27:40,940 Rechts? 641 00:27:40,940 --> 00:27:42,520 Ik belde getString. 642 00:27:42,520 --> 00:27:44,460 getString roept blijkbaar malloc. 643 00:27:44,460 --> 00:27:47,800 Dus wat regel code is blijkbaar schuld voor het feit dat 644 00:27:47,800 --> 00:27:49,050 toegewezen dit geheugen? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Laten we aannemen dat wie malloc schreef heeft al lang genoeg dat het 647 00:27:55,540 --> 00:27:56,390 niet hun schuld. 648 00:27:56,390 --> 00:27:57,520 Dus het is waarschijnlijk de mijne. 649 00:27:57,520 --> 00:28:02,000 getString in cs50.c - dus dat is een bestand ergens op de computer - 650 00:28:02,000 --> 00:28:05,210 in lijn 286 lijkt de boosdoener zijn. 651 00:28:05,210 --> 00:28:08,140 Laten we nu eens aannemen dat CS50 is geweest rond voor behoorlijke hoeveelheid tijd, dus 652 00:28:08,140 --> 00:28:09,720 ook wij zijn onfeilbaar. 653 00:28:09,720 --> 00:28:14,080 En dus het is waarschijnlijk niet in getString dat de bug ligt, maar in 654 00:28:14,080 --> 00:28:17,810 hello-2.c lijn 18. 655 00:28:17,810 --> 00:28:20,670 >> Dus laten we eens een kijkje nemen op wat dat lijn 18 was. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Een of andere manier deze lijn is niet noodzakelijk buggy, per se, maar het is de reden 658 00:28:27,130 --> 00:28:28,630 achter dat geheugenlek. 659 00:28:28,630 --> 00:28:32,140 Zo super gewoon, wat zou intuïtief zijn hier de oplossing? 660 00:28:32,140 --> 00:28:34,710 Als we vragen voor het geheugen, waren nooit waardoor het terug, en dat lijkt te zijn van een 661 00:28:34,710 --> 00:28:37,940 probleem, want na verloop van tijd mijn computer zou opraken van het geheugen, kunnen vertragen 662 00:28:37,940 --> 00:28:42,110 neer, misschien slechte dingen gebeuren, nou ja, wat is de eenvoudige en intuïtieve oplossing? 663 00:28:42,110 --> 00:28:43,140 Geef het gewoon terug. 664 00:28:43,140 --> 00:28:44,770 >> Hoe doe je vrij dat het geheugen? 665 00:28:44,770 --> 00:28:49,970 Nou ja, gelukkig is het heel simpel om gewoon te zeggen vrij naam. 666 00:28:49,970 --> 00:28:51,260 En we hebben dit nog nooit gedaan. 667 00:28:51,260 --> 00:28:55,890 Maar je kunt wezen bedenken vrij als het tegenovergestelde van malloc. 668 00:28:55,890 --> 00:28:58,030 gratis is het tegenovergestelde van toewijzen van geheugen. 669 00:28:58,030 --> 00:28:59,540 Dus nu laat ik deze opnieuw compileren. 670 00:28:59,540 --> 00:29:02,050 Maak hello-2. 671 00:29:02,050 --> 00:29:04,620 Laat ik het nogmaals uit te voeren. hello-2 David. 672 00:29:04,620 --> 00:29:07,290 Dus het lijkt te werken in dezelfde manier. 673 00:29:07,290 --> 00:29:11,180 Maar als ik terug naar Valgrind en re-run dat hetzelfde commando op mijn nieuw 674 00:29:11,180 --> 00:29:14,720 gecompileerde programma, het typen in mijn naam als voorheen - 675 00:29:14,720 --> 00:29:15,370 nice. 676 00:29:15,370 --> 00:29:16,760 Heap samenvatting - 677 00:29:16,760 --> 00:29:17,740 in gebruik bij afslag - 678 00:29:17,740 --> 00:29:19,370 nul bytes in nul blokken. 679 00:29:19,370 --> 00:29:21,840 En dit is super leuk, allemaal heap blokken werden bevrijd. 680 00:29:21,840 --> 00:29:23,480 Geen lekken zijn mogelijk. 681 00:29:23,480 --> 00:29:27,200 >> Dus komen, niet met Probleemverzameling 4, maar met Probleemverzameling 5, de forensische 682 00:29:27,200 --> 00:29:30,740 en verder, ook dit zal een maat voor de juistheid van uw 683 00:29:30,740 --> 00:29:33,630 programma, of u hebt of hebben geen geheugen lekken. 684 00:29:33,630 --> 00:29:36,900 Maar gelukkig, niet alleen kan je redeneren door hen intuïtief dat 685 00:29:36,900 --> 00:29:40,430 is, misschien wel, makkelijk voor kleine programma's maar moeilijker voor grotere programma's, 686 00:29:40,430 --> 00:29:43,860 Valgrind, voor die grotere programma's, herkent u 687 00:29:43,860 --> 00:29:45,360 het specifieke probleem. 688 00:29:45,360 --> 00:29:47,500 >> Maar er is een ander probleem die zich kunnen voordoen. 689 00:29:47,500 --> 00:29:51,245 Laat ik hier open dit bestand, dat is, weer een enigszins eenvoudig voorbeeld. 690 00:29:51,245 --> 00:29:53,760 Maar laten we focussen op wat Dit programma doet. 691 00:29:53,760 --> 00:29:55,190 Dit memory.c genoemd. 692 00:29:55,190 --> 00:29:58,380 We zullen post dit later vandaag in de zip van de huidige broncode. 693 00:29:58,380 --> 00:30:01,610 En merken dat ik een functie genaamd f dat er geen argumenten en neemt 694 00:30:01,610 --> 00:30:02,800 keert niets. 695 00:30:02,800 --> 00:30:07,240 In lijn 20, ben ik blijkbaar waarbij een pointer naar een int en noemde het x. 696 00:30:07,240 --> 00:30:09,570 Ik ben het toewijzen is de terugkeer waarde van malloc. 697 00:30:09,570 --> 00:30:14,590 En alleen maar om duidelijk, hoeveel bytes am Ik waarschijnlijk krijgen terug van malloc 698 00:30:14,590 --> 00:30:17,080 in deze situatie? 699 00:30:17,080 --> 00:30:18,040 >> Waarschijnlijk 40. 700 00:30:18,040 --> 00:30:18,840 Waar haal je dat vandaan? 701 00:30:18,840 --> 00:30:22,410 Nou, als je eraan herinneren dat een int is vaak 4 bytes, het is tenminste in de 702 00:30:22,410 --> 00:30:25,110 apparaat 10 keer 4 is duidelijk 40. 703 00:30:25,110 --> 00:30:28,920 Dus malloc is terug te keren van een adres van een stuk van het geheugen en het opslaan van die 704 00:30:28,920 --> 00:30:30,800 pakken uiteindelijk in x. 705 00:30:30,800 --> 00:30:32,570 Dus om duidelijk te zijn, wat dan gebeurt? 706 00:30:32,570 --> 00:30:34,990 Nou, laat me terug te schakelen om onze foto hier. 707 00:30:34,990 --> 00:30:38,150 Laat me niet alleen trekken de bodem van mijn geheugen van de computer, laat mij ga je gang en 708 00:30:38,150 --> 00:30:42,990 trek de hele rechthoek die vertegenwoordigt al mijn RAM. 709 00:30:42,990 --> 00:30:44,790 >> We zeggen dat de stapel op de bodem. 710 00:30:44,790 --> 00:30:47,010 En er is een tekst-segment in de geïnitialiseerde data. 711 00:30:47,010 --> 00:30:49,880 Maar ik ga gewoon abstracte die andere dingen weg als dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Ik ga gewoon om te verwijzen naar dit de heap bovenaan. 713 00:30:53,470 --> 00:30:57,070 En dan aan de onderkant van deze foto, tot belangrijkste vertegenwoordigen, ik ga 714 00:30:57,070 --> 00:30:59,880 om het een plakjes geheugen geven op de stack. 715 00:30:59,880 --> 00:31:03,150 Voor f, ga ik het een stukje geven van het geheugen op de stack. 716 00:31:03,150 --> 00:31:05,140 Nu, ik moet mijn raadplegen broncode opnieuw. 717 00:31:05,140 --> 00:31:07,170 Wat zijn de lokale variabelen voor de belangrijkste? 718 00:31:07,170 --> 00:31:10,710 Blijkbaar niets, zodat slice is effectief leeg of zelfs niet zo groot 719 00:31:10,710 --> 00:31:11,600 zoals ik getekend heb het. 720 00:31:11,600 --> 00:31:15,730 Maar in f, ik heb een lokale variabele, waarin x is genoemd. 721 00:31:15,730 --> 00:31:20,410 Dus ik ga om verder te gaan en geef f een stuk van het geheugen, noemde het x. 722 00:31:20,410 --> 00:31:24,680 >> En nu malloc van 10 maal 4, Dus malloc 40, waar is dat 723 00:31:24,680 --> 00:31:25,430 geheugen vandaan? 724 00:31:25,430 --> 00:31:27,530 We hebben een foto niet getekend als dit al eerder. 725 00:31:27,530 --> 00:31:31,140 Maar laten we veronderstellen dat het effectief vanuit hier, dus een, 726 00:31:31,140 --> 00:31:33,170 twee, drie, vier, vijf. 727 00:31:33,170 --> 00:31:34,680 En nu heb ik 40 van deze. 728 00:31:34,680 --> 00:31:37,540 Dus ik zal gewoon doen puntje, puntje, puntje te suggereren dat er nog meer geheugen 729 00:31:37,540 --> 00:31:39,350 komt terug van de hoop. 730 00:31:39,350 --> 00:31:40,710 Nu, wat is het adres? 731 00:31:40,710 --> 00:31:42,620 Laten we kiezen voor onze willekeurige aanpakken zoals altijd - 732 00:31:42,620 --> 00:31:46,310 Ox123, ook al is het waarschijnlijk gaat iets heel anders te zijn. 733 00:31:46,310 --> 00:31:50,420 Dat is het adres van de eerste byte in geheugen dat ik vraag malloc voor. 734 00:31:50,420 --> 00:31:53,630 >> Dus in het kort, een keer lijn 20 uitvoert, wat is letterlijk 735 00:31:53,630 --> 00:31:57,170 opgeslagen binnenkant van x hier? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 En de Os is oninteressant. 739 00:32:01,550 --> 00:32:03,200 Het betekent alleen hier is een hexadecimaal getal. 740 00:32:03,200 --> 00:32:06,490 Maar wat is belangrijk is dat wat ik heb winkel in x, die een lokale variabele. 741 00:32:06,490 --> 00:32:10,260 Maar het data type, nogmaals, is een adres van een int. 742 00:32:10,260 --> 00:32:12,710 Nou, ik ga slaan Ox123. 743 00:32:12,710 --> 00:32:16,610 Maar nogmaals, als dat een beetje te onnodig ingewikkeld, als ik het scrollen 744 00:32:16,610 --> 00:32:21,490 terug, kunnen we abstracte deze weg vrij redelijk en gewoon zeggen dat x een 745 00:32:21,490 --> 00:32:23,910 pointer naar dat stuk van het geheugen. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Nu is de vraag bij de hand is de volgende - 748 00:32:26,230 --> 00:32:29,910 lijn 21, zo blijkt, is buggy. 749 00:32:29,910 --> 00:32:31,160 Waarom? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Sorry? 752 00:32:36,930 --> 00:32:38,640 Het hoeft niet - 753 00:32:38,640 --> 00:32:40,390 Zeg dat nog eens. 754 00:32:40,390 --> 00:32:41,240 Nou, het doet niet gratis. 755 00:32:41,240 --> 00:32:42,350 Dus dat is de tweede maar. 756 00:32:42,350 --> 00:32:45,000 Dus er is een andere, maar specifiek op lijn 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Precies. 759 00:32:50,040 --> 00:32:54,980 Deze eenvoudige regel code is slechts een buffer overflow, een bufferoverloop. 760 00:32:54,980 --> 00:32:57,050 Een buffer betekent gewoon een stuk van het geheugen. 761 00:32:57,050 --> 00:33:01,520 Maar dat stuk van het geheugen is van omvang 10, 10 gehele getallen, wat betekent dat als we 762 00:33:01,520 --> 00:33:05,350 index in het gebruik van de syntactische suiker van de array notatie, het plein 763 00:33:05,350 --> 00:33:09,220 haakjes, heb je toegang tot hebt x beugel 0 x beugel 1 x, 764 00:33:09,220 --> 00:33:10,390 beugel puntje, puntje, puntje. 765 00:33:10,390 --> 00:33:13,270 x beugel 9 is de grootste. 766 00:33:13,270 --> 00:33:17,680 Dus als ik doe x beugel 10, waar Ik ben eigenlijk aan de hand in het geheugen? 767 00:33:17,680 --> 00:33:19,120 >> Nou, als ik 10 int - 768 00:33:19,120 --> 00:33:21,070 laten we eigenlijk trekken alle van deze hier. 769 00:33:21,070 --> 00:33:22,700 Dus dat was de eerste vijf. 770 00:33:22,700 --> 00:33:24,660 Hier is de andere vijf ints. 771 00:33:24,660 --> 00:33:29,580 Dus x beugel 0 is hier. x beugel 1 is hier. x beugel 9 is hier. x beugel 772 00:33:29,580 --> 00:33:37,960 10 is hier, wat betekent dat ik zeg, in lijn 21, de computer aan het zetten 773 00:33:37,960 --> 00:33:39,400 nummer waar? 774 00:33:39,400 --> 00:33:42,010 Het getal 0, waar? 775 00:33:42,010 --> 00:33:43,380 Nou, het is 0, ja. 776 00:33:43,380 --> 00:33:45,460 Maar het feit dat de 0 is een soort van toeval. 777 00:33:45,460 --> 00:33:47,140 Het zou de nummer 50, voor zover we schelen. 778 00:33:47,140 --> 00:33:50,480 Maar we proberen om het te zetten op x beugel 10, waar de 779 00:33:50,480 --> 00:33:53,700 vraagteken wordt getrokken, die is geen goede zaak. 780 00:33:53,700 --> 00:33:57,070 Dit programma zou heel goed crash als gevolg. 781 00:33:57,070 --> 00:33:59,400 >> Laten we nu verder gaan en zien of dit is inderdaad wat er gebeurt. 782 00:33:59,400 --> 00:34:02,600 Voeg geheugen, omdat het bestand memory.c wordt genoemd. 783 00:34:02,600 --> 00:34:05,950 Laten we verder gaan en uitvoeren het programma geheugen. 784 00:34:05,950 --> 00:34:08,239 Dus we hebben geluk, eigenlijk, het lijkt. 785 00:34:08,239 --> 00:34:09,340 We hebben geluk gehad. 786 00:34:09,340 --> 00:34:11,060 Maar laten we eens kijken of we lopen nu Valgrind. 787 00:34:11,060 --> 00:34:14,170 Op het eerste gezicht, mijn programma zou lijken te zijn volkomen juist. 788 00:34:14,170 --> 00:34:18,010 Maar laat me lopen Valgrind met de - Lek-check gelijk vol op het geheugen. 789 00:34:18,010 --> 00:34:20,110 >> En nu wanneer ik dit - 790 00:34:20,110 --> 00:34:21,030 interessant. 791 00:34:21,030 --> 00:34:26,800 Ongeldige schrijven van grootte 4 bij lijn 21 van memory.c. 792 00:34:26,800 --> 00:34:29,284 Lijn 21 van memory.c is welke? 793 00:34:29,284 --> 00:34:30,340 Oh, interessant. 794 00:34:30,340 --> 00:34:31,080 Maar wacht. 795 00:34:31,080 --> 00:34:32,389 Maat 4, wat is dat verwijst naar? 796 00:34:32,389 --> 00:34:34,969 Ik alleen heb een schrijven, maar het is van grootte 4. 797 00:34:34,969 --> 00:34:36,889 Waarom is het 4? 798 00:34:36,889 --> 00:34:39,280 Het is omdat het is een int, die is wederom vier bytes. 799 00:34:39,280 --> 00:34:42,510 Dus Valgrind vond een bug die ik, blik op mijn code, niet. 800 00:34:42,510 --> 00:34:45,040 En misschien je TF wel of niet zou. 801 00:34:45,040 --> 00:34:48,469 Wat Maar Valgrind zeker gevonden dat we hebben een fout gemaakt daar, zelfs 802 00:34:48,469 --> 00:34:52,719 hoewel we geluk, en de computer besloten, eh, ik ga niet crashen 803 00:34:52,719 --> 00:34:57,470 alleen maar omdat je een byte, een aangeraakt int de moeite waard van het geheugen dat je dat niet deed 804 00:34:57,470 --> 00:34:58,550 eigenlijk zelf. 805 00:34:58,550 --> 00:35:00,380 >> Nou, wat anders buggy is hier. 806 00:35:00,380 --> 00:35:01,180 Adres - 807 00:35:01,180 --> 00:35:03,190 dit is een gek op zoek adres hexadecimaal. 808 00:35:03,190 --> 00:35:06,890 Dat betekent gewoon ergens in de heap is nul bytes na een blok van maat 40 809 00:35:06,890 --> 00:35:07,620 wordt toegewezen. 810 00:35:07,620 --> 00:35:10,610 Laat me hier uit te zoomen en te kijken of Dit is een beetje meer behulpzaam. 811 00:35:10,610 --> 00:35:11,410 Interessant. 812 00:35:11,410 --> 00:35:15,600 40 bytes zijn zeker verloren in verliesverslag 1 van 1. 813 00:35:15,600 --> 00:35:17,840 Ook meer woorden dan hier bruikbaar. 814 00:35:17,840 --> 00:35:21,350 Maar gebaseerd op de gemarkeerde lijnen, waar moet ik waarschijnlijk richten mijn 815 00:35:21,350 --> 00:35:24,070 aandacht voor een andere bug? 816 00:35:24,070 --> 00:35:26,570 Ziet eruit als een lijn 20 van memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Dus als we terug gaan naar lijn 20, dat is de een die je eerder geïdentificeerd. 818 00:35:30,990 --> 00:35:33,030 En het is niet per se buggy. 819 00:35:33,030 --> 00:35:35,160 Maar we hebben dit omgekeerd zijn gevolgen. 820 00:35:35,160 --> 00:35:38,790 Dus hoe kan ik corrigeren tenminste een van die fouten? 821 00:35:38,790 --> 00:35:42,240 Wat kan ik doen na lijn 21? 822 00:35:42,240 --> 00:35:47,110 Ik kon vrij van x doen, dus wordt terug te geven die het geheugen. 823 00:35:47,110 --> 00:35:49,230 En hoe kan ik deze bug oplossen? 824 00:35:49,230 --> 00:35:52,120 Ik moet zeker gaan niet verder dan 0. 825 00:35:52,120 --> 00:35:53,670 Dus laat me proberen en re-run deze. 826 00:35:53,670 --> 00:35:56,080 Sorry, zeker gaan niet verder dan 9. 827 00:35:56,080 --> 00:35:57,510 Maak geheugen. 828 00:35:57,510 --> 00:36:00,650 Laat me nog even Valgrind in een groter venster. 829 00:36:00,650 --> 00:36:01,580 En kijk nu. 830 00:36:01,580 --> 00:36:02,250 Leuk. 831 00:36:02,250 --> 00:36:03,270 Alle hoop blokken werden bevrijd. 832 00:36:03,270 --> 00:36:04,270 Geen lekken zijn mogelijk. 833 00:36:04,270 --> 00:36:07,520 En boven hier, er is geen melding nog meer van de ongeldige recht. 834 00:36:07,520 --> 00:36:09,820 >> Gewoon om hebzuchtig te krijgen, en laten we zien of een andere demonstratie 835 00:36:09,820 --> 00:36:11,050 gaat niet zo bedoeld - 836 00:36:11,050 --> 00:36:12,560 Ik heb geluk een moment geleden. 837 00:36:12,560 --> 00:36:15,530 En het feit dat dit is wellicht 0 onnodig misleidend. 838 00:36:15,530 --> 00:36:20,650 Laten we het gewoon doen 50, een enigszins arbitrair nummer, maak geheugen dot slash geheugen - 839 00:36:20,650 --> 00:36:21,410 nog geluk. 840 00:36:21,410 --> 00:36:22,510 Niets crashen. 841 00:36:22,510 --> 00:36:26,150 Stel dat ik gewoon iets echt dwaas, en ik doe 100. 842 00:36:26,150 --> 00:36:30,360 Laat me geheugen remake, dot slash geheugen - 843 00:36:30,360 --> 00:36:31,075 heb weer geluk. 844 00:36:31,075 --> 00:36:32,800 Hoe zit het met 1000? 845 00:36:32,800 --> 00:36:35,370 ints voorbij, ruwweg, waar ik zou moeten zijn? 846 00:36:35,370 --> 00:36:37,410 Maak geheugen - 847 00:36:37,410 --> 00:36:38,570 damn it. 848 00:36:38,570 --> 00:36:39,920 >> [Lachen] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Laten we niet meer prutsen. 851 00:36:43,920 --> 00:36:45,120 Rerun geheugen. 852 00:36:45,120 --> 00:36:45,840 Daar gaan we. 853 00:36:45,840 --> 00:36:46,410 Oke. 854 00:36:46,410 --> 00:36:52,500 Dus blijkbaar je index 100.000 ints dan waar je in had moeten zijn 855 00:36:52,500 --> 00:36:54,410 geheugen, slechte dingen gebeuren. 856 00:36:54,410 --> 00:36:56,430 Dus dit is natuurlijk niet een harde, snelle regel. 857 00:36:56,430 --> 00:36:58,190 Ik was een soort van het gebruik van proef en error om er te komen. 858 00:36:58,190 --> 00:37:02,230 Maar dit is omdat, lang verhaal kort, geheugen van uw computer wordt ook verdeeld 859 00:37:02,230 --> 00:37:03,580 in deze dingen genoemd segmenten. 860 00:37:03,580 --> 00:37:07,260 En soms de computer daadwerkelijk je een beetje meer geheugen heeft gegeven 861 00:37:07,260 --> 00:37:08,400 dan je vraagt. 862 00:37:08,400 --> 00:37:12,170 Maar voor efficiency, het is gewoon makkelijker om krijgen meer geheugen, maar alleen vertellen 863 00:37:12,170 --> 00:37:13,780 dat je krijgt van een deel ervan. 864 00:37:13,780 --> 00:37:16,370 >> En als je geluk soms, dus, zou je in staat zijn om aan te raken 865 00:37:16,370 --> 00:37:17,795 geheugen dat niet van jou is. 866 00:37:17,795 --> 00:37:21,860 Heb je geen garantie dat wat waarde je zet er zal daar blijven, omdat 867 00:37:21,860 --> 00:37:25,080 de computer denkt nog steeds dat het niet jou, maar het is niet per se te gaan 868 00:37:25,080 --> 00:37:29,910 naar een ander segment van het geheugen hit in de computer en het induceren van een dergelijke fout 869 00:37:29,910 --> 00:37:31,710 deze hier. 870 00:37:31,710 --> 00:37:32,060 Oke. 871 00:37:32,060 --> 00:37:37,240 Heeft u vragen dan op het geheugen? 872 00:37:37,240 --> 00:37:37,590 >> Oke. 873 00:37:37,590 --> 00:37:40,610 Laten we eens een kijkje hier, vervolgens, bij iets wat we al nemen voor 874 00:37:40,610 --> 00:37:48,361 verleend voor geruime tijd, die is in dit dossier genoemd cs50.h. 875 00:37:48,361 --> 00:37:49,420 Dus dit is een bestand. 876 00:37:49,420 --> 00:37:51,130 Dit zijn slechts een hele hoop van reacties up top. 877 00:37:51,130 --> 00:37:53,900 En je zou hebben gekeken naar deze indien je prikte rond op het toestel. 878 00:37:53,900 --> 00:37:57,000 Maar het blijkt dat de hele tijd, toen we naar een string te gebruiken als een 879 00:37:57,000 --> 00:38:01,130 synoniem, het middel waardoor wij verklaard dat synoniem is met dit 880 00:38:01,130 --> 00:38:03,990 trefwoord typedef, voor type-definitie. 881 00:38:03,990 --> 00:38:07,500 En we zijn in wezen zeggen, maken rijgen een synoniem voor char ster. 882 00:38:07,500 --> 00:38:11,190 Dat de wijze waarop de stapel gemaakt van deze zijwieltjes bekend als 883 00:38:11,190 --> 00:38:12,040 de string. 884 00:38:12,040 --> 00:38:14,830 >> Nu hier is slechts een prototype voor getchar. 885 00:38:14,830 --> 00:38:17,350 We zouden hebben het al eerder gezien, maar dat is inderdaad wat het doet. getchar 886 00:38:17,350 --> 00:38:19,070 neemt geen argumenten, retourneert een char. 887 00:38:19,070 --> 00:38:21,340 getdouble neemt geen argumenten, retourneert een dubbele. 888 00:38:21,340 --> 00:38:24,440 getfloat neemt geen argumenten, rendement a float, enzovoort. 889 00:38:24,440 --> 00:38:27,270 getint is in hier. getlonglong is in hier. 890 00:38:27,270 --> 00:38:28,820 En getString is in hier. 891 00:38:28,820 --> 00:38:29,420 En dat is het. 892 00:38:29,420 --> 00:38:33,080 Deze paarse lijn is een andere preprocessor richtlijn vanwege de 893 00:38:33,080 --> 00:38:35,550 hashtag aan het begin ervan. 894 00:38:35,550 --> 00:38:35,870 >> Oke. 895 00:38:35,870 --> 00:38:38,380 Dus nu laat me gaan in cs50.c. 896 00:38:38,380 --> 00:38:40,400 En we zullen niet te lang praten over dit. 897 00:38:40,400 --> 00:38:43,280 Maar om u een glimp van wat er te geven er aan de hand dit alles 898 00:38:43,280 --> 00:38:46,434 tijd, laat me gaan naar - 899 00:38:46,434 --> 00:38:48,250 laten we het doen getchar. 900 00:38:48,250 --> 00:38:51,050 Dus getchar is vooral opmerkingen. 901 00:38:51,050 --> 00:38:52,060 Maar het lijkt erop dat dit. 902 00:38:52,060 --> 00:38:54,800 Dus dit is de eigenlijke functie getchar dat we geweest zijn 903 00:38:54,800 --> 00:38:56,055 nemen als vanzelfsprekend aanwezig. 904 00:38:56,055 --> 00:38:59,370 En ook al hebben we geen gebruik van deze ene dat vaak, of nooit, het is in ieder geval 905 00:38:59,370 --> 00:39:00,470 relatief eenvoudig. 906 00:39:00,470 --> 00:39:02,580 Dus het is de moeite waard een snelle blik op hier. 907 00:39:02,580 --> 00:39:06,540 >> Dus getchar heeft een oneindige lus, opzettelijk zo blijkbaar. 908 00:39:06,540 --> 00:39:10,050 Het roept dan - en dit is een soort van een nice hergebruik van code die we onszelf schreven. 909 00:39:10,050 --> 00:39:11,220 Het roept getString. 910 00:39:11,220 --> 00:39:12,460 Want wat doet het betekenen voor een char te krijgen? 911 00:39:12,460 --> 00:39:14,730 Nou, kan je net zo goed proberen om een ​​te krijgen hele lijn van de tekst van de gebruiker en 912 00:39:14,730 --> 00:39:16,940 dan kijk maar naar een van deze tekens. 913 00:39:16,940 --> 00:39:19,170 In lijn 60, hier is een kleine beetje een sanity check. 914 00:39:19,170 --> 00:39:21,610 Als getString terug null, laten we niet gaan. 915 00:39:21,610 --> 00:39:22,820 Er is iets misgegaan. 916 00:39:22,820 --> 00:39:28,120 >> Nu is dit een beetje vervelend, maar conventioneel C. char max waarschijnlijk 917 00:39:28,120 --> 00:39:29,960 staat voor wat net op basis van zijn naam? 918 00:39:29,960 --> 00:39:31,670 Het is een constante. 919 00:39:31,670 --> 00:39:36,040 Het is net als de numerieke waarde van de grootste char u kan vertegenwoordigen met 920 00:39:36,040 --> 00:39:40,370 een hap, wat waarschijnlijk het aantal 255, dat is de grootste nummer dat u 921 00:39:40,370 --> 00:39:42,720 vertegenwoordigen acht bits, vanaf nul. 922 00:39:42,720 --> 00:39:47,460 Zo heb ik gebruik deze, in deze functie, wanneer het schrijven van deze code, alleen omdat 923 00:39:47,460 --> 00:39:51,753 als er iets mis gaat in getchar maar haar doel in het leven is om een ​​terugkeer 924 00:39:51,753 --> 00:39:54,830 char, moet je een of andere manier te kunnen kunnen waarschuwen de gebruiker dat 925 00:39:54,830 --> 00:39:55,840 ging er iets mis. 926 00:39:55,840 --> 00:39:56,970 We kunnen niet terugkeren null. 927 00:39:56,970 --> 00:39:58,480 Het blijkt dat null is een pointer. 928 00:39:58,480 --> 00:40:01,030 En nogmaals, getchar heeft een char terug. 929 00:40:01,030 --> 00:40:04,760 >> Dus de conventie, als er iets gaat verkeerde, is u, de programmeur, of in 930 00:40:04,760 --> 00:40:08,160 dit geval, mij met de bibliotheek, had ik een gewoon beslissen willekeurig, indien 931 00:40:08,160 --> 00:40:12,230 er iets fout gaat, ga ik keren het getal 255, dat is echt 932 00:40:12,230 --> 00:40:17,240 betekent dat we kunnen niet, de gebruiker kan niet typen het teken weergegeven door de 933 00:40:17,240 --> 00:40:21,410 nummer 255, want we hadden een stelen als zogenaamde sentinel waarde 934 00:40:21,410 --> 00:40:23,410 een probleem vormen. 935 00:40:23,410 --> 00:40:27,010 Nu blijkt dat het karakter 255 is niet iets wat je kunt typen op 936 00:40:27,010 --> 00:40:28,380 uw toetsenbord, dus het is geen big deal. 937 00:40:28,380 --> 00:40:30,910 De gebruiker merkt niet dat Ik heb dit karakter gestolen. 938 00:40:30,910 --> 00:40:34,620 Maar als je ooit in de man-pagina's op een computersysteem een ​​verwijzing naar een 939 00:40:34,620 --> 00:40:38,560 alle doppen constant als deze die zegt, in geval van een fout deze constante kracht 940 00:40:38,560 --> 00:40:42,720 worden teruggegeven, dat is alles wat de mens gedaan jaar geleden werd willekeurig beslist om 941 00:40:42,720 --> 00:40:45,680 terug deze bijzondere waarde en noem het een constante in het geval 942 00:40:45,680 --> 00:40:46,840 er iets fout gaat. 943 00:40:46,840 --> 00:40:48,580 >> Nu de magie gebeurt hier beneden. 944 00:40:48,580 --> 00:40:52,600 Ten eerste, ik ben te verklaren in de lijn 67 twee personages, C1 en C2. 945 00:40:52,600 --> 00:40:57,080 En vervolgens in lijn 68, is er eigenlijk een regel code die doet denken aan 946 00:40:57,080 --> 00:41:01,140 onze vriend printf, gezien het feit dat het heeft wel procent Cs tussen aanhalingstekens. 947 00:41:01,140 --> 00:41:06,490 Maar let op wat er hier gebeurt. sscanf betekent touwtje scan - 948 00:41:06,490 --> 00:41:11,690 betekent scannen een geformatteerde koord, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Wat betekent dat? 950 00:41:12,590 --> 00:41:16,310 Het betekent dat u doorgeeft aan een string sscanf. 951 00:41:16,310 --> 00:41:18,420 En lijn is wat de gebruiker typt inch 952 00:41:18,420 --> 00:41:23,520 U passeert een format string als sscanf dit dat scanf vertelt wat zijn 953 00:41:23,520 --> 00:41:25,870 hoop je de gebruiker heeft getypt inch 954 00:41:25,870 --> 00:41:29,730 Je vervolgens doorgeven in de adressen van twee delen van het geheugen, in casu 955 00:41:29,730 --> 00:41:31,150 want ik heb twee tijdelijke aanduidingen. 956 00:41:31,150 --> 00:41:34,610 Dus ik ga het het adres geven van C1 en het adres van de C2. 957 00:41:34,610 --> 00:41:37,700 >> En herinneren dat u een functie te geven de adres van enkele variabele, wat is 958 00:41:37,700 --> 00:41:38,950 de implicatie? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Wat kan die functie doen als gevolg het te geven het adres van een 961 00:41:45,050 --> 00:41:48,170 variabele tegenover de variabele zelf? 962 00:41:48,170 --> 00:41:49,450 Het kan veranderen, toch? 963 00:41:49,450 --> 00:41:53,250 Als je iemand een kaart aan een fysieke gehad adres, kunnen ze daar heen te gaan en te doen 964 00:41:53,250 --> 00:41:54,750 wat ze willen op dat adres. 965 00:41:54,750 --> 00:41:55,800 Hetzelfde idee hier. 966 00:41:55,800 --> 00:41:59,950 Als we doorgeven aan sscanf, het adres van de twee delen van het geheugen, zelfs deze kleine 967 00:41:59,950 --> 00:42:03,585 kleine delen van het geheugen, C1 en C2, maar We vertellen het adres van hen, 968 00:42:03,585 --> 00:42:05,170 sscanf kan veranderen. 969 00:42:05,170 --> 00:42:08,530 >> Dus sscanf's doel in het leven, als we lezen de man pagina, is te lezen wat de 970 00:42:08,530 --> 00:42:13,420 gebruiker ingetypt, hoop voor de gebruiker met getypt in een personage en misschien 971 00:42:13,420 --> 00:42:16,470 een ander karakter, en wat de gebruiker getypt, het eerste teken gaat 972 00:42:16,470 --> 00:42:19,310 hier, het tweede karakter gaat hier. 973 00:42:19,310 --> 00:42:22,470 Nu, als een terzijde, dit, en je zou Alleen weten dit uit de documentatie, 974 00:42:22,470 --> 00:42:25,570 het feit dat ik er een lege ruimte betekent gewoon dat ik niet schelen als 975 00:42:25,570 --> 00:42:28,440 de gebruiker de spatiebalk raakt een paar keer voordat hij of zij neemt een 976 00:42:28,440 --> 00:42:30,400 karakter, ik ga negeren geen witte ruimte. 977 00:42:30,400 --> 00:42:32,510 Zodat, ik weet uit de documentatie. 978 00:42:32,510 --> 00:42:36,570 >> Het feit dat er een tweede% c gevolgd door een spatie is eigenlijk 979 00:42:36,570 --> 00:42:37,410 weloverwogen. 980 00:42:37,410 --> 00:42:41,190 Ik wil in staat zijn om te detecteren of de gebruiker screwed up of geen medewerking verleenden. 981 00:42:41,190 --> 00:42:45,630 Dus ik hoop dat de gebruiker alleen getypt in een personage, dus ik hoop 982 00:42:45,630 --> 00:42:50,640 dat sscanf alleen gaat om het terug te keren waarde 1 omdat, nogmaals, als ik lees 983 00:42:50,640 --> 00:42:55,400 de documentatie, sscanf's doel in het leven te keren naar het aantal 984 00:42:55,400 --> 00:42:59,170 variabelen die werden gevuld met gebruikersinvoer. 985 00:42:59,170 --> 00:43:02,270 >> Ik passeerde in twee variabelen adressen, C1 en C2. 986 00:43:02,270 --> 00:43:06,420 Ik hoop echter dat slechts een van ze wordt vermoord omdat als sscanf 987 00:43:06,420 --> 00:43:11,130 rendement 2, wat is vermoedelijk de implicatie logisch? 988 00:43:11,130 --> 00:43:14,600 Dat de gebruiker niet geef me een karakter zoals ik vertelde hem of haar. 989 00:43:14,600 --> 00:43:17,860 Ze waarschijnlijk getypt op tenminste twee tekens. 990 00:43:17,860 --> 00:43:22,430 Dus als ik in plaats daarvan niet de tweede hebben % C, ik had net een, die 991 00:43:22,430 --> 00:43:25,370 eerlijk gezegd zou meer intuïtief aanpak, ik denk dat een eerste blik, 992 00:43:25,370 --> 00:43:30,220 je bent niet van plan om te kunnen detecteren Als de gebruiker is waardoor u meer 993 00:43:30,220 --> 00:43:31,780 ingang dan je eigenlijk wilde. 994 00:43:31,780 --> 00:43:34,100 Dus dit is een impliciete vorm van foutcontrole. 995 00:43:34,100 --> 00:43:35,640 >> Maar let op wat ik hier doe. 996 00:43:35,640 --> 00:43:39,970 Zodra ik ben er zeker van dat de gebruiker gaf me een karakter, Ik bevrijd de lijn, doet 997 00:43:39,970 --> 00:43:44,450 het tegenovergestelde van getString, waardoor maakt gebruik van malloc, en toen ik terug 998 00:43:44,450 --> 00:43:51,030 C1, het personage dat ik hoopte dat de gebruiker verstrekt en slechts verstrekt. 999 00:43:51,030 --> 00:43:54,680 Dus een snelle glimp alleen, maar Voor vragen over getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 We komen terug naar een aantal van de anderen. 1002 00:43:59,590 --> 00:44:03,770 >> Nou, laat me ga je gang en doe dit - veronderstel nu, gewoon om te motiveren ons 1003 00:44:03,770 --> 00:44:08,910 discussie in een week plus tijd, dit is een bestand met de naam structs.h. 1004 00:44:08,910 --> 00:44:11,440 En nogmaals, dit is slechts een voorproefje van iets dat voor ons ligt. 1005 00:44:11,440 --> 00:44:13,090 Maar merken dat veel Dit heeft opmerkingen. 1006 00:44:13,090 --> 00:44:17,440 Dus laat me benadrukken alleen de interessante deel voor nu. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 er is dat hetzelfde zoekwoord weer. 1009 00:44:19,700 --> 00:44:23,100 typedef we gebruiken om touwtje te verklaren als een speciaal datatype. 1010 00:44:23,100 --> 00:44:27,490 U kunt typedef gebruiken om nieuwe te creëren soorten gegevens die niet bestonden toen 1011 00:44:27,490 --> 00:44:28,570 C werd uitgevonden. 1012 00:44:28,570 --> 00:44:32,520 Bijvoorbeeld, int geleverd met C. char wordt geleverd met C. dubbel geleverd met C. Maar 1013 00:44:32,520 --> 00:44:34,000 is er geen notie van een student. 1014 00:44:34,000 --> 00:44:37,230 En toch is het vrij nuttig te zijn zou zijn in staat om een ​​programma dat opslaat schrijven 1015 00:44:37,230 --> 00:44:40,440 in een variabele, het ID-nummer van een student, hun naam en hun huis. 1016 00:44:40,440 --> 00:44:42,890 Met andere woorden, drie stukken van data, zoals een int en een 1017 00:44:42,890 --> 00:44:44,420 string en andere string. 1018 00:44:44,420 --> 00:44:48,220 >> Met typedef, wat is vrij krachtig over dit en het zoekwoord sturct voor 1019 00:44:48,220 --> 00:44:53,660 structuur, u, de programmeur in 2013, kan eigenlijk definieer uw eigen de 1020 00:44:53,660 --> 00:44:57,530 soorten gegevens die niet bestonden jaar geleden, maar dat past bij uw doeleinden. 1021 00:44:57,530 --> 00:45:01,910 En dus hier, in lijnen 13 tot 19, we zijn waarbij een nieuw type gegevens, zoals 1022 00:45:01,910 --> 00:45:04,320 een int, maar noemde het student. 1023 00:45:04,320 --> 00:45:09,310 En de binnenkant van deze variabele gaat zijn drie dingen - een int, een string, 1024 00:45:09,310 --> 00:45:09,930 en een string. 1025 00:45:09,930 --> 00:45:13,040 Dus je kunt bedenken wat echt hier gebeurd is, ook al is dit een 1026 00:45:13,040 --> 00:45:17,160 beetje een vereenvoudiging voor vandaag, een student is in wezen gaat 1027 00:45:17,160 --> 00:45:19,450 om te kijken als deze. 1028 00:45:19,450 --> 00:45:22,580 Het gaat om een ​​stuk van zijn geheugen met een ID, een naam 1029 00:45:22,580 --> 00:45:25,580 veld, en een huis veld. 1030 00:45:25,580 --> 00:45:30,670 En we zullen in staat zijn om die stukjes te gebruiken geheugen en toegang tot hen als volgt. 1031 00:45:30,670 --> 00:45:38,870 >> Als ik in struct0.c, hier is een relatief lang, maar na een 1032 00:45:38,870 --> 00:45:42,630 patroon, van de code die gebruikt deze nieuwe truc. 1033 00:45:42,630 --> 00:45:45,790 Dus laat me eerst uw aandacht om de interessante delen boven. 1034 00:45:45,790 --> 00:45:49,670 Scherpe definieert studenten 3, verklaart een constante riep studenten en rechtverkrijgenden 1035 00:45:49,670 --> 00:45:53,450 het willekeurig het getal 3, maar dus ik heb drie studenten met behulp van 1036 00:45:53,450 --> 00:45:54,830 dit programma voor nu. 1037 00:45:54,830 --> 00:45:55,960 Hier komt Main. 1038 00:45:55,960 --> 00:45:58,860 En let, hoe kan ik verklaar een array van studenten? 1039 00:45:58,860 --> 00:46:00,480 Nou, ik gebruik gewoon dezelfde syntaxis. 1040 00:46:00,480 --> 00:46:02,110 Het woord student is natuurlijk nieuw. 1041 00:46:02,110 --> 00:46:04,790 Maar student, klasse, beugel studenten. 1042 00:46:04,790 --> 00:46:06,720 >> Dus helaas er is een hoop van hergebruik van termen hier. 1043 00:46:06,720 --> 00:46:07,660 Dit is maar een getal. 1044 00:46:07,660 --> 00:46:09,040 Dus dit is hetzelfde als zeggen drie. 1045 00:46:09,040 --> 00:46:11,430 Klasse is precies wat ik wil om de variabele te bellen. 1046 00:46:11,430 --> 00:46:12,840 Ik kon noemen studenten. 1047 00:46:12,840 --> 00:46:15,880 Maar class, dit is geen klasse een object georiënteerde Java soort manier. 1048 00:46:15,880 --> 00:46:17,220 Het is gewoon een klasse van studenten. 1049 00:46:17,220 --> 00:46:20,590 En het gegevenstype van elk element in die matrix is ​​student. 1050 00:46:20,590 --> 00:46:23,040 Dit is een beetje anders dus en naar iets te zeggen 1051 00:46:23,040 --> 00:46:25,250 als dit, het is gewoon - 1052 00:46:25,250 --> 00:46:29,500 Ik zeg geef me drie studenten en bel die array klasse. 1053 00:46:29,500 --> 00:46:29,800 >> Oke. 1054 00:46:29,800 --> 00:46:30,680 Nu hier is een vier lus. 1055 00:46:30,680 --> 00:46:33,480 Deze vent is bekend - iterate van nul tot drie. 1056 00:46:33,480 --> 00:46:35,160 En hier is het nieuwe stuk van de syntax. 1057 00:46:35,160 --> 00:46:37,710 Het programma gaat me prompt, de mens, om het een student geven 1058 00:46:37,710 --> 00:46:39,200 ID, die een int. 1059 00:46:39,200 --> 00:46:44,650 En hier is de syntax waarmee u kunt iets opslaan in het ID veld 1060 00:46:44,650 --> 00:46:48,630 locatie klasse beugel I. So Deze syntax is niet nieuw. 1061 00:46:48,630 --> 00:46:51,450 Dit betekent geef me de achtste leerling in de klas. 1062 00:46:51,450 --> 00:46:52,940 Maar dit symbool is nieuw. 1063 00:46:52,940 --> 00:46:56,320 Tot nu toe hebben we niet kunnen gebruiken dot, althans in code als volgt. 1064 00:46:56,320 --> 00:47:01,490 Dit betekent naar de structuur bekend als een student en zet daar iets. 1065 00:47:01,490 --> 00:47:05,670 Ook in deze volgende regel, 31, gaat vooruit en zetten wat soorten van de gebruiker 1066 00:47:05,670 --> 00:47:10,530 voor een naam hier en wat ze doen voor een huis, het zelfde ding, ga je gang en 1067 00:47:10,530 --> 00:47:13,230 zet het in. house. 1068 00:47:13,230 --> 00:47:15,955 >> Dus wat heeft dit programma uiteindelijk doen? 1069 00:47:15,955 --> 00:47:17,220 U kunt een kleine teaser daar te zien. 1070 00:47:17,220 --> 00:47:24,780 Laat me ga je gang en doen maken structs 0 dot slash struct 0, student ID 1, 1071 00:47:24,780 --> 00:47:28,250 zegt David Mather, student ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 en het enige wat dit programma deed, dat is gewoon volkomen willekeurig, wordt 1075 00:47:38,380 --> 00:47:40,980 Ik wilde iets doen met deze gegevens, nu dat ik ons ​​heb geleerd hoe 1076 00:47:40,980 --> 00:47:43,450 Gebruik structs, is dat ik had net deze extra lus hier. 1077 00:47:43,450 --> 00:47:45,260 Ik itereren over de vele studenten. 1078 00:47:45,260 --> 00:47:49,170 Ik gebruikte onze, misschien nu vertrouwd vriend, string vergelijker, stircomp te 1079 00:47:49,170 --> 00:47:53,780 check is huis 8 student gelijk Mather? 1080 00:47:53,780 --> 00:47:56,760 En zo ja, gewoon iets af te drukken willekeurig als, ja, het is. 1081 00:47:56,760 --> 00:47:59,430 Maar nogmaals, alleen het geven van me kansen te gebruiken en hergebruiken en 1082 00:47:59,430 --> 00:48:02,270 hergebruiken deze nieuwe puntnotatie. 1083 00:48:02,270 --> 00:48:03,250 >> Dus who cares, toch? 1084 00:48:03,250 --> 00:48:06,270 Coming up met een student programma is enigszins arbitrair, maar het blijkt 1085 00:48:06,270 --> 00:48:09,800 dat we nuttige dingen kunnen doen met dit bijvoorbeeld als volgt. 1086 00:48:09,800 --> 00:48:14,600 Dit is een veel ingewikkelder struct in C. Het heeft een dozijn of meer velden, 1087 00:48:14,600 --> 00:48:15,880 enigszins cryptisch vernoemd. 1088 00:48:15,880 --> 00:48:20,110 Maar als je ooit hebt gehoord van een grafische bestandsformaat genaamd bitmap, BMP, het 1089 00:48:20,110 --> 00:48:22,830 blijkt dat de bitmap bestandsformaat vrij veel lijkt op dat dit. 1090 00:48:22,830 --> 00:48:24,200 Het is een beetje dom gezicht Smiley. 1091 00:48:24,200 --> 00:48:27,840 Het is een kleine afbeelding die ik heb ingezoomd op vrij groot, zodat ik kon elke zien 1092 00:48:27,840 --> 00:48:30,410 van de individuele puntjes of pixels. 1093 00:48:30,410 --> 00:48:33,800 Nu, het blijkt dat we kunnen vertegenwoordigen een zwarte stip met bijvoorbeeld het getal 0. 1094 00:48:33,800 --> 00:48:35,520 En een witte stip met het nummer 1. 1095 00:48:35,520 --> 00:48:39,140 >> Dus met andere woorden, als je wilt een te tekenen Smiley gezicht en slaan die op in een 1096 00:48:39,140 --> 00:48:42,680 computer volstaat de nullen slaan en degenen die er uitzien als deze, waar, 1097 00:48:42,680 --> 00:48:45,250 nogmaals, degenen zijn wit en nullen zijn zwart. 1098 00:48:45,250 --> 00:48:48,290 En samen, als je effectief hebt een omgorden van enen en nullen, je hebt een 1099 00:48:48,290 --> 00:48:51,030 raster van pixels, en als je lay ze uit, je hebt een leuke 1100 00:48:51,030 --> 00:48:52,560 weinig Smiley gezicht. 1101 00:48:52,560 --> 00:48:58,150 Nu, bitmap, BMP, is effectief dat onder de motorkap, 1102 00:48:58,150 --> 00:49:00,970 maar met meer pixels sot dat u kan eigenlijk kleuren vertegenwoordigen. 1103 00:49:00,970 --> 00:49:05,170 >> Maar als je meer geavanceerde bestandsformaten zoals BMP en JPEG en GIF 1104 00:49:05,170 --> 00:49:09,360 waarmee je misschien wel bekend, die bestanden op een schijf typisch niet alleen 1105 00:49:09,360 --> 00:49:13,760 hebben nullen en enen van de pixels, maar ze hebben een aantal metadata alsook - 1106 00:49:13,760 --> 00:49:16,960 meta in die zin dat niet echt gegevens, maar het is handig om te hebben. 1107 00:49:16,960 --> 00:49:21,370 Dus deze velden hier zijn impliceren, en we zullen dit in meer detail in P-set 1108 00:49:21,370 --> 00:49:25,810 5, dat voor de nullen en enen dat vertegenwoordigen de pixels in een beeld, 1109 00:49:25,810 --> 00:49:29,110 Er is een bos van metadata zoals de grootte van de afbeelding en de 1110 00:49:29,110 --> 00:49:30,250 breedte van het beeld. 1111 00:49:30,250 --> 00:49:32,910 En let ik plukken uit een aantal willekeurige dingen hier - 1112 00:49:32,910 --> 00:49:34,260 breedte en hoogte. 1113 00:49:34,260 --> 00:49:36,160 Aantal bits en een aantal andere dingen. 1114 00:49:36,160 --> 00:49:37,840 Dus er is een aantal metagegevens in een bestand. 1115 00:49:37,840 --> 00:49:41,470 >> Maar door te begrijpen hoe de bestanden worden gelegd op deze manier, kun je eigenlijk 1116 00:49:41,470 --> 00:49:45,890 dan beelden te manipuleren, het herstellen van afbeeldingen van schijf, resize images. 1117 00:49:45,890 --> 00:49:47,560 Maar je kunt niet per se verbeter ze. 1118 00:49:47,560 --> 00:49:48,480 Ik had een foto. 1119 00:49:48,480 --> 00:49:52,840 Dus ging ik terug naar RJ hier, die je zag op het scherm al geruime tijd geleden. 1120 00:49:52,840 --> 00:49:57,160 En als ik open Keynote hier, dit is wat gebeurt er als je probeert in te zoomen en 1121 00:49:57,160 --> 00:49:59,380 verbeteren RJ. 1122 00:49:59,380 --> 00:50:01,480 Hij is niet beter krijgen echt. 1123 00:50:01,480 --> 00:50:06,240 Nu Keynote is een soort van vervaging het een klein beetje, gewoon om te verdoezelen de 1124 00:50:06,240 --> 00:50:11,040 feit dat RJ niet bijzonder krijgt versterkt wanneer u vergroten 1125 00:50:11,040 --> 00:50:13,310 En als het op deze manier, Zie de pleinen? 1126 00:50:13,310 --> 00:50:15,490 Ja, je kunt zeker zien de vierkanten op een projector. 1127 00:50:15,490 --> 00:50:17,690 >> Dat is wat je krijgt als je te verbeteren. 1128 00:50:17,690 --> 00:50:22,570 Maar om te begrijpen hoe onze RJ of de Smiley gezicht is geïmplementeerd zal ons laten 1129 00:50:22,570 --> 00:50:24,950 eigenlijk code die manipuleert schrijven deze dingen. 1130 00:50:24,950 --> 00:50:29,970 En ik dacht dat ik zou eindigen op deze nota, met 55 seconden een verbetering die, 1131 00:50:29,970 --> 00:50:31,230 Ik durf zeggen nogal misleidend. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEO AFSPELEN] 1133 00:50:32,990 --> 00:50:34,790 >> -Hij liegt. 1134 00:50:34,790 --> 00:50:38,310 Over wat, weet ik niet. 1135 00:50:38,310 --> 00:50:41,200 >> -Dus wat weten we? 1136 00:50:41,200 --> 00:50:45,280 >> -Dat op 9:15 Ray Santoya was de ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Dus de vraag is wat deed hij op 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Opnamen van de negen millimeter op iets. 1139 00:50:50,750 --> 00:50:52,615 Misschien zag hij de sluipschutter. 1140 00:50:52,615 --> 00:50:54,760 >> -Of werkte met hem. 1141 00:50:54,760 --> 00:50:56,120 >> -Wacht. 1142 00:50:56,120 --> 00:50:57,450 Ga terug een. 1143 00:50:57,450 --> 00:50:58,700 >> -Wat zie je? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Breng zijn gezicht, volledig scherm. 1146 00:51:09,490 --> 00:51:09,790 >> -Zijn bril. 1147 00:51:09,790 --> 00:51:11,040 >> -Er is een reflectie. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Dat is het Neuvitas honkbalteam. 1150 00:51:23,520 --> 00:51:24,530 Dat is hun logo. 1151 00:51:24,530 --> 00:51:27,040 >> -En hij praat aan wie is het dragen van die jas. 1152 00:51:27,040 --> 00:51:27,530 >> [END VIDEO AFSPELEN] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: Dit zal zijn Probleemverzameling 5. 1154 00:51:29,180 --> 00:51:30,720 We zullen je volgende week. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: Bij de volgende CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Getjilp van krekels] 1157 00:51:39,240 --> 00:51:41,270 >> [Muziek]