1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MUZIKO Ludante] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. Malan: Bone. 4 00:00:12,640 --> 00:00:14,525 Jen CS50. 5 00:00:14,525 --> 00:00:16,009 Kaj tio estas la komenco de la semajno 5. 6 00:00:16,009 --> 00:00:18,050 Kaj kiel vi eble rimarkis, kelkaj el la materialo 7 00:00:18,050 --> 00:00:21,050 fariĝas iom pli kompleksa, la iom pli densa. 8 00:00:21,050 --> 00:00:24,560 >> Kaj ĝi estas tre facila, precipe se vi estis la kutimo por iu tempo, 9 00:00:24,560 --> 00:00:28,600 esti provante scribble malsupren plej ion ni faras, ni diras en klaso. 10 00:00:28,600 --> 00:00:31,626 Sed rimarki, ke ne estas eble la idealo pedagogia alproksimiĝo 11 00:00:31,626 --> 00:00:34,250 por lerni ĉi tiu tipo de materialo, kaj materialoj pli ĝenerale. 12 00:00:34,250 --> 00:00:37,250 Kaj tial ni ĝojas anonci ke CS50 propra Gheng 13 00:00:37,250 --> 00:00:39,780 Gong komencis prepari kanona aro de notoj 14 00:00:39,780 --> 00:00:42,100 por la kurso, esperante kio estas ke, oni, tiuj 15 00:00:42,100 --> 00:00:44,030 ne nur servas kiel referenco kaj rimedo 16 00:00:44,030 --> 00:00:47,410 por revizii materialo kaj tuj reen tra materialo kiu povus havi 17 00:00:47,410 --> 00:00:51,230 eskapis vi la unuan fojon ĉirkaŭe, sed ankaŭ tiel, ke viaj kapoj povas esti pli 18 00:00:51,230 --> 00:00:53,740 supren ol malsupren, kiam venas la tempo por prelegi, 19 00:00:53,740 --> 00:00:56,960 por ke vi povu partopreni pli penseme, kiel 20 00:00:56,960 --> 00:00:59,170 kontraste al pli scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Kun kiu diris, kion vi trovos en La retejo estas tiaj dokumentoj kiel ĉi. 22 00:01:02,510 --> 00:01:04,660 Kaj rimarki, ĉe maldekstra supera, estas Ne nur enhavtabelon, 23 00:01:04,660 --> 00:01:06,920 sed ankaux tempon kodoj kiuj Mi tuj salti vin 24 00:01:06,920 --> 00:01:09,077 al la konvena parto en la video online. 25 00:01:09,077 --> 00:01:11,410 Kaj kio Chang tie faris estas, esence, dokumentita 26 00:01:11,410 --> 00:01:13,340 kio okazis en tiu aparta prelego. 27 00:01:13,340 --> 00:01:16,370 Kaj multaj el la prelegoj estas Jam enreta nun kun ĉi retadreso. 28 00:01:16,370 --> 00:01:20,110 Kaj ni daŭrigos sendi la reston de tiuj por finoj de ĉi tiu semajno, 29 00:01:20,110 --> 00:01:22,380 do utiligi tiun rimedon. 30 00:01:22,380 --> 00:01:25,740 >> Do sen pli, ni komencis senŝeligi reen 31 00:01:25,740 --> 00:01:28,180 la mantelon kiu estis kordo por iu tempo. 32 00:01:28,180 --> 00:01:30,670 Kaj kion ni diru ŝnuro efektive estas pasintsemajne? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Do char stelo. 35 00:01:32,900 --> 00:01:34,900 Kaj char stelo, nu, kio cxu tio vere signifas? 36 00:01:34,900 --> 00:01:37,150 Nu, ĉiuj ĉi tempo, se ni estis nomante funkcio, 37 00:01:37,150 --> 00:01:40,450 kiel getString kaj provizon la tn reveno 38 00:01:40,450 --> 00:01:42,910 valoro de getString en variable-- ĝi nomiĝas 39 00:01:42,910 --> 00:01:47,721 s tipo string-- ni estis skribante la linio de kodo tie supre. 40 00:01:47,721 --> 00:01:49,970 Kaj ĝi estas nur kiam mi vidas mia manskribo Pligrandigita tie 41 00:01:49,970 --> 00:01:51,930 mi rimarkas kiom atroz tio. 42 00:01:51,930 --> 00:01:54,180 >> Tamen, ni supozu ke, sur la dekstra flanko 43 00:01:54,180 --> 00:01:57,070 Estas, tamen, akceptebla priskribo de kio estas 44 00:01:57,070 --> 00:01:58,880 iris sur ĉiuj ĉi tempo kun getString. 45 00:01:58,880 --> 00:02:00,380 getString kompreneble ricevas kordo. 46 00:02:00,380 --> 00:02:01,691 Sed kion signifas tiu vere signifas? 47 00:02:01,691 --> 00:02:04,190 Ĝi signifas metas eron de memoro de la mastruma sistemo 48 00:02:04,190 --> 00:02:06,040 nomante funkcio, nomis malloc. 49 00:02:06,040 --> 00:02:07,390 Sed pli sur tiu poste. 50 00:02:07,390 --> 00:02:09,139 Kaj tiam popolas ke eron de memoro 51 00:02:09,139 --> 00:02:11,764 kun la literoj de la uzanto havas tajpita en, sekvita, kompreneble, 52 00:02:11,764 --> 00:02:14,800 nula karaktero, aŭ backslash nulo je la fino. 53 00:02:14,800 --> 00:02:18,280 >> Dume, sur la maldekstra flanko de tiu rakonto, ĉiu ĉi tiu tempo, 54 00:02:18,280 --> 00:02:20,850 ni estis deklari variablon, kiel s. 55 00:02:20,850 --> 00:02:24,770 Kaj tiu variablo estas kio nun komencos nomi puntero. 56 00:02:24,770 --> 00:02:29,190 Ne skatolo ene de kiu Ni metis la ŝnuron, Daven, per, 57 00:02:29,190 --> 00:02:32,550 sed prefere ni metas en tiu kvadrato boksi maldekstre kion ekzakte? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Yeah? 60 00:02:35,390 --> 00:02:37,118 >> Aŭdienco: La adreso de kie ĝi estas lokita en la memoro. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. Malan: Ĝuste. 62 00:02:38,118 --> 00:02:40,690 La adreso de kie Daven situas en memoro. 63 00:02:40,690 --> 00:02:44,650 Kaj ne kie ĉiuj Daven situas, per, sed specife la adreso 64 00:02:44,650 --> 00:02:45,150 de kio? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Yeah? 67 00:02:46,810 --> 00:02:47,460 >> Publiko: Unua karaktero. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. Malan: La unua karaktero en Daven, kiuj, en tiu kazo, 69 00:02:50,209 --> 00:02:53,820 Mi proponis estis arbitre kaj unrealistically 1an Ox1, 70 00:02:53,820 --> 00:02:55,910 kiu signifas nur la deksesuma nombro de 1. 71 00:02:55,910 --> 00:02:57,993 Sed ĝi estas probable tuj esti multe pli granda nombro 72 00:02:57,993 --> 00:03:01,260 ke ni povu ĉerpi per 0x kiel prefikso, 73 00:03:01,260 --> 00:03:02,806 reprezentante deksesuma karaktero. 74 00:03:02,806 --> 00:03:05,930 Kaj ĉar ni ne bezonas scii kie la resto de la karakteroj de Daven 75 00:03:05,930 --> 00:03:09,860 estas, pro kio simpla dezajno decido kiu estis farita antaŭ multaj jaroj? 76 00:03:09,860 --> 00:03:10,548 Yeah? 77 00:03:10,548 --> 00:03:11,651 >> Publiko: Deklivo 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. Malan: Jes, ĝuste. 79 00:03:12,900 --> 00:03:18,100 La backslash 0 permesas, kvankam en lineara tempo, tra la ŝnuroj, 80 00:03:18,100 --> 00:03:20,400 marŝi de maldekstre al dekstre, kun por ciklo, aŭ dum 81 00:03:20,400 --> 00:03:22,608 buklo, aŭ io simila kiu, kaj determini, ho, tie 82 00:03:22,608 --> 00:03:24,751 Estas la fino de ĉi tiu aparta kordo. 83 00:03:24,751 --> 00:03:27,000 Do, kun nur la adreson la komenco de kordo, 84 00:03:27,000 --> 00:03:30,290 ni povas aliri la totalo de ĝin, ĉar ĉiuj ĉi tempo, 85 00:03:30,290 --> 00:03:32,030 ŝnuro ĵus estis char stelo. 86 00:03:32,030 --> 00:03:36,370 >> Do estas certe fajna daŭrigi uzante la CS50 biblioteko kaj tiu abstraktaĵo 87 00:03:36,370 --> 00:03:38,440 tiel diri, sed ni komencos vidi ĝuste 88 00:03:38,440 --> 00:03:41,230 kio daŭras sub ĉi tiu tuta tempo. 89 00:03:41,230 --> 00:03:45,260 Do vi eble memoras tiun ekzemplon, tro, de lasta fojo, kompari 0, 90 00:03:45,260 --> 00:03:47,300 kiu fakte ne komparas. 91 00:03:47,300 --> 00:03:49,070 Sed ni komencis solvi ĉi. 92 00:03:49,070 --> 00:03:52,020 >> Sed kiel eble refresher, eble mi interesos iun 93 00:03:52,020 --> 00:03:54,261 en rozkoloran elefanton hodiaŭ, ankaŭ farita de Chang? 94 00:03:54,261 --> 00:03:55,760 Kion pri vi antaux? [Inaudible]. 95 00:03:55,760 --> 00:03:56,660 Venu supren. 96 00:03:56,660 --> 00:03:58,740 >> Kaj dume, kiel vi venis, ni 97 00:03:58,740 --> 00:04:01,670 konsideri por ĝuste momento kion tiu kodo estis reale faras. 98 00:04:01,670 --> 00:04:04,917 Ĝi deklaras du variabloj supren supro, s kaj t kaj vokas getString. 99 00:04:04,917 --> 00:04:08,250 Tiu ne estas tre uzantamika programo, ĉar ne diros al vi kion fari. 100 00:04:08,250 --> 00:04:10,541 Sed ni nur supozi ni centrante en la suka parto. 101 00:04:10,541 --> 00:04:14,470 Kaj tiam ni faros, se s egalas egalas t, ĝi devus diri printf, 102 00:04:14,470 --> 00:04:16,170 vi tajpis la samon. 103 00:04:16,170 --> 00:04:16,670 Saluton. 104 00:04:16,670 --> 00:04:17,050 Kio estas via nomo? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. Malan: Janelle, agrable renkonti vin. 107 00:04:19,529 --> 00:04:21,800 Do via defio je manon por tiu elefanto 108 00:04:21,800 --> 00:04:25,230 estas unue cxerpi ni bildon de kio estas estante reprezentita en tiuj unuaj du 109 00:04:25,230 --> 00:04:25,970 linioj. 110 00:04:25,970 --> 00:04:28,139 Do s kaj t eblus reprezentitaj kiel sur la ekrano? 111 00:04:28,139 --> 00:04:30,680 Kaj vi povas simple desegni ĝin per vian fingron sur tiu granda ekrano. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Do ekzistas du duonoj por ĉiu flanko de tiu ekvacio. 114 00:04:34,510 --> 00:04:37,760 Do tie estas s sur la maldekstra, kaj tiam getString dekstre. 115 00:04:37,760 --> 00:04:40,540 Kaj tiam ekzistas t maldekstre kaj tiam getString dekstre. 116 00:04:40,540 --> 00:04:42,630 Do kiom eble ni komencu desegni bildon ke 117 00:04:42,630 --> 00:04:46,340 reprezentas kio okazas tie en la memoro, vi dirus? 118 00:04:46,340 --> 00:04:49,150 Kaj lasu min lasu vin klarigi kion vi faras dum vi iros. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Nu, unue, ĝi estus demandi vin akiri la enigo kordoj. 121 00:04:58,890 --> 00:05:00,439 Kaj ĝi store-- ho bedaŭras. 122 00:05:00,439 --> 00:05:01,230 DAVID J. Malan: Bone. 123 00:05:01,230 --> 00:05:01,730 Bonan. 124 00:05:01,730 --> 00:05:03,330 Kaj tio nomiĝas kio? 125 00:05:03,330 --> 00:05:03,950 Ho, OK. 126 00:05:03,950 --> 00:05:04,450 Konservu iras. 127 00:05:04,450 --> 00:05:05,575 Mi ne intencis interrompi. 128 00:05:05,575 --> 00:05:07,060 Janelle: Pardonu. 129 00:05:07,060 --> 00:05:14,237 Do ĝi farus input ĝin la adreso of-- ne certas. 130 00:05:14,237 --> 00:05:17,320 Mi ne povas ekzakte memori la numeron, sed mi kredas, ĝi ekde 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. Malan: Tute bone, ĉar mi faris la nombroj ĝis, 132 00:05:18,420 --> 00:05:19,650 tial ne estas ĝusta respondo. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Komencante kun la 0 arko. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. Malan: Bone, do ero 0. 135 00:05:24,000 --> 00:05:24,765 Certe. 136 00:05:24,765 --> 00:05:28,295 >> Janelle Kaj tiam se estis kiel nur du-letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. Malan: Bone, reen al vi. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Do ero 0, kaj tiam elemento 1 aŭ elementon 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. Malan: Kaj kia peco de la bildo vi desegni nun? 140 00:05:36,670 --> 00:05:37,690 La alvoko al getString? 141 00:05:37,690 --> 00:05:38,830 Aŭ la deklaro de s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: La deklaro de s, mi kredas. 143 00:05:42,890 --> 00:05:45,980 Ho, la getString, ĉar ĝi havus esti inputted en ĉiu [? areo. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. Malan: Bone. 145 00:05:46,510 --> 00:05:47,051 Ĝuste. 146 00:05:47,051 --> 00:05:49,300 Eĉ kvankam ĉi efike Revenas tabelo, revokon, 147 00:05:49,300 --> 00:05:53,300 kiam ni reiros cxeno, ni povas indekson en tiu ŝnuro uzante 01 kaj 2. 148 00:05:53,300 --> 00:05:56,180 Teknike, tiuj estas verŝajne reprezentita de individuaj adresoj, 149 00:05:56,180 --> 00:05:57,100 sed tio estas bone. 150 00:05:57,100 --> 00:06:00,170 >> Do supozu, se mi povas nur rapide plusendu al kie ni cxesis 151 00:06:00,170 --> 00:06:04,320 lasta fojo, se unu el la kordoj estis g b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, tio reprezentas Gabe La enigo, kiom eble ni reprezentas s nun? 153 00:06:10,337 --> 00:06:12,670 Se ĉi tiu estas la memoro tio estis redonita de getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Ĉu estus reprezentita de arko? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. Malan: Per arko? 157 00:06:18,750 --> 00:06:19,130 Nu, ne. 158 00:06:19,130 --> 00:06:21,171 Ni nur diras, pictóricamente, lasu min nur antaŭeniri 159 00:06:21,171 --> 00:06:25,710 kaj proponi ke, se tiu estas s, ĉi estas la reveno valoro de getString. 160 00:06:25,710 --> 00:06:29,482 Kaj vi nomis tion kiel 0, 1, 2, kiu estas perfekte racia, ĉar ni 161 00:06:29,482 --> 00:06:30,940 povas indekson en la kordo, kiel tia. 162 00:06:30,940 --> 00:06:33,340 Sed nur por esti konsekvenca kun lasta momento, lasu min iri antaŭen 163 00:06:33,340 --> 00:06:37,310 kaj arbitre proponas ke tiu estas adreso 1, ĉi tiu estas adreso 2 164 00:06:37,310 --> 00:06:39,597 tiu estas adreso 3, kaj tiel plu. 165 00:06:39,597 --> 00:06:41,430 Kaj tiel, nur por esti súper klara, kio okazas 166 00:06:41,430 --> 00:06:44,580 iri s kiel rezulto de tiu unua linio de kodo, vi dirus? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adreso 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. Malan: Ĝuste. 169 00:06:46,420 --> 00:06:47,190 Do trakti 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Kaj dume, lasu min antaŭeniri kaj duobligi tre de kion vi faris 172 00:06:51,230 --> 00:06:52,740 kaj aldoni mian propran t tie. 173 00:06:52,740 --> 00:06:56,340 Se mi tajpas Gabe denove, duan fojon, 174 00:06:56,340 --> 00:07:01,530 kiam invitite getString, kie, kompreneble, estas Gabe tuj iros? 175 00:07:01,530 --> 00:07:02,280 Nu, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Kiel ĉi tie? 178 00:07:05,975 --> 00:07:06,850 DAVID J. Malan: Jes. 179 00:07:06,850 --> 00:07:08,516 Janelle: Aŭ ĝi estas ankaŭ en la sama skatolojn? 180 00:07:08,516 --> 00:07:11,940 DAVID J. Malan: Lasu min proponi, yeah, akurate, tiel en tiuj pliaj skatoloj. 181 00:07:11,940 --> 00:07:15,230 Sed kio estas klavo nun estas, ke eĉ kvankam mi eltiris tiujn belajn proksime 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, tiu Estas 0x2-- reale, 183 00:07:18,650 --> 00:07:25,750 ĉi nun eble adreso 0x10, Ekzemple, kaj 0x11 kaj 0x12, 184 00:07:25,750 --> 00:07:26,870 ks. 185 00:07:26,870 --> 00:07:29,955 Kaj tiel, se tio estas la kazo, kio tuj finos tie en t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. Malan: Ĝuste. 188 00:07:31,830 --> 00:07:33,180 Do 0x10. 189 00:07:33,180 --> 00:07:34,570 Kaj nun, lasta demando. 190 00:07:34,570 --> 00:07:37,510 Vi, por for, devis prilabori la plej malfacila por elefanto tiom. 191 00:07:37,510 --> 00:07:42,650 Per nun, se mi elsxiros kodo denove, kiam mi faras, en linio tri, 192 00:07:42,650 --> 00:07:47,630 se s egalas egalas t, kion mi reale Komparante ke ni eltiris ĉi tie? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: La du adresojn? 194 00:07:49,271 --> 00:07:50,270 DAVID J. Malan: Ĝuste. 195 00:07:50,270 --> 00:07:53,350 Do mi diris s egala egala al t? 196 00:07:53,350 --> 00:07:56,210 En aliaj vortoj, estas 1 egala egala al 10? 197 00:07:56,210 --> 00:07:59,710 Kaj kompreneble, la evidenta respondo nun estas, neniu. 198 00:07:59,710 --> 00:08:02,920 Kaj tiu programo estas finfine tuj presi kio, ĉu vi diras? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Ĉu estus, vi tajpis la saman aferon? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. Malan: Do se s 1 kaj t estas 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Vi tajpis malsamaj aĵoj. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. Malan: Ĝuste. 204 00:08:13,570 --> 00:08:14,480 Vi tajpis malsamaj aĵoj. 205 00:08:14,480 --> 00:08:14,850 Bone. 206 00:08:14,850 --> 00:08:16,714 Do ĉirkaŭvojon de aplaŭdoj, se ni povus, tie. 207 00:08:16,714 --> 00:08:17,214 [Aplaŭdo] 208 00:08:17,214 --> 00:08:17,708 Tio estis dolora. 209 00:08:17,708 --> 00:08:18,208 Mi scias. 210 00:08:18,208 --> 00:08:19,684 Nicely farita. 211 00:08:19,684 --> 00:08:24,690 Do nun ni vidu, se ni ne povas turmentus aparte kio la embaraso estis. 212 00:08:24,690 --> 00:08:28,040 Kaj kompreneble, kiam ni fiksis this-- kiun mi nun reprezentas en green-- 213 00:08:28,040 --> 00:08:29,690 ni faris paron de plibonigoj tie. 214 00:08:29,690 --> 00:08:32,409 Unue, ĝuste kiel prudento kontrolu, mi unue kontrolas 215 00:08:32,409 --> 00:08:35,110 se s egalas nula kaj t egalas nula. 216 00:08:35,110 --> 00:08:39,440 Kaj ĝuste por esti klara, kiam potenco s aŭ t nula en kodo kiel ĉi tiu? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Kiam eble s aŭ t esti nula. 219 00:08:44,490 --> 00:08:44,990 Yeah? 220 00:08:44,990 --> 00:08:45,990 >> Publiko: [inaudible]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. Malan: Ĝuste. 223 00:08:50,510 --> 00:08:52,840 Se la ŝnuro kiun la uzanto tajpita en estas tro longa 224 00:08:52,840 --> 00:08:56,140 por persvadi en memoro, aŭ iu weird angulo kazo kiel tiu, 225 00:08:56,140 --> 00:08:59,010 getString, kiel ni vidos, laŭvorte hodiaŭ, en lia dokumentado, 226 00:08:59,010 --> 00:09:02,330 diras revenos rifuzis speciala gardostaranto valoro, 227 00:09:02,330 --> 00:09:05,417 aŭ simple speco de speciala simbolo kiuj signifas iun iris malbone. 228 00:09:05,417 --> 00:09:07,500 Do ni volas kontroli ke, ĉar ĝi rezultas 229 00:09:07,500 --> 00:09:09,720 ke nula estas tre danĝera valoro. 230 00:09:09,720 --> 00:09:14,250 >> Ofte, se vi provos fari iun kun null engaĝante function-- preter 231 00:09:14,250 --> 00:09:17,470 kiel enigo por instance-- domadministranto povus tre devos frakasi kaj, kun ĝi, 232 00:09:17,470 --> 00:09:19,090 deprenu viajn tuta programo. 233 00:09:19,090 --> 00:09:22,570 Do tiu tria linio nun estas nur la prudento kontrolu, eraro kontrolanta, se vi volas. 234 00:09:22,570 --> 00:09:25,450 Tio estas bona kutimo nun por nin al eniri ajnan tempon ni 235 00:09:25,450 --> 00:09:28,050 provu uzi valoro kiu povus, potenciale, nula. 236 00:09:28,050 --> 00:09:32,000 >> Nun, en la kvara linio tie, "Se strcmp (s, t)," bone, 237 00:09:32,000 --> 00:09:33,180 kio estas ke raportante al? 238 00:09:33,180 --> 00:09:36,750 Nu, ni diris ĉi estis tre koncize nomita funkcio por arĉinstrumenta komparo. 239 00:09:36,750 --> 00:09:40,370 Kaj lia celo en la vivo estas kompari lia unua argumento kontraux gxi dua, 240 00:09:40,370 --> 00:09:44,640 sed ne en terminoj de iliaj adresoj, kiel ni faris senintence momenton 241 00:09:44,640 --> 00:09:48,270 monato kun la ruĝa kodo, sed prefere kompari tiujn du 242 00:09:48,270 --> 00:09:53,210 kordoj en la home intuicia vojo komparante ĉi, kontraŭ tio, 243 00:09:53,210 --> 00:09:56,690 kontraŭ ĉi, kontraŭ tio, kaj tiam halti se kaj kiam oni 244 00:09:56,690 --> 00:09:59,590 aŭ ambaŭ de miaj fingroj kolizias kun backslash 0. 245 00:09:59,590 --> 00:10:04,530 Do iu jarojn implementado strcmp implementar por ni la funcionalidad 246 00:10:04,530 --> 00:10:08,890 ke ni esperis, ni estus alvenintaj per simple komparante du simplajn valorojn. 247 00:10:08,890 --> 00:10:14,929 >> Nun sincere, mi gardas desegno ĉiuj tiuj diversaj nombroj. 248 00:10:14,929 --> 00:10:17,470 Sed la realo estas, mi estis farante tiujn la tutan tempon. 249 00:10:17,470 --> 00:10:19,580 Kaj lasu min nur antaŭeniri kaj scribble tiuj el 250 00:10:19,580 --> 00:10:23,100 fari punkto kiu, fine de la tago kaj movanta antaŭen, 251 00:10:23,100 --> 00:10:30,160 ni ne vere tuj zorgas pri kio turnas aferoj estas reale 252 00:10:30,160 --> 00:10:30,790 en memoro. 253 00:10:30,790 --> 00:10:34,320 Do mi ne tuj eltiros tiuj specojn de nombroj tiel plu, 254 00:10:34,320 --> 00:10:38,970 Mi estas nur abstrakta ĉi foririnte iom pli amika kun nur sagojn. 255 00:10:38,970 --> 00:10:42,060 >> En aliaj vortoj, se s estas puntero, Nu, ni nur desegni ĝin, laŭvorte, 256 00:10:42,060 --> 00:10:45,430 kiel puntero, sago montras el al io alia, 257 00:10:45,430 --> 00:10:48,280 kaj ne tro maltrankviliĝu pli pri la minutia el tiuj adresoj 258 00:10:48,280 --> 00:10:49,910 kiuj, denove, mi formitaj ĉiuokaze. 259 00:10:49,910 --> 00:10:52,680 Sed ni vidos tiujn adresojn, foje, kiam elpurigi kodon. 260 00:10:52,680 --> 00:10:56,450 >> Nun dume, ĉi programo tien fiksa, kompreneble, 261 00:10:56,450 --> 00:10:58,720 ke problemo komparante tiuj du ŝnuroj. 262 00:10:58,720 --> 00:11:00,260 Sed ni kuris al alia problemo. 263 00:11:00,260 --> 00:11:03,180 Tio estis el la kopio plani lasta fojo, 264 00:11:03,180 --> 00:11:06,880 per Mi provis kapitaligi nur la unua gravulo en ĉeno. 265 00:11:06,880 --> 00:11:09,620 Sed kio estis la simptomo ni vidis lastan fojon kiam 266 00:11:09,620 --> 00:11:14,150 uzanto tajpas en valoro, kiel Gabe en minuskla, por s, 267 00:11:14,150 --> 00:11:19,310 tiam ni atribuis s en t, kiel en la tria linio tie, 268 00:11:19,310 --> 00:11:22,900 kaj tiam mi provis capitalizar t krampo 0? 269 00:11:22,900 --> 00:11:25,950 Kio estis la efiko de ŝanĝi t krampo 0 tien? 270 00:11:25,950 --> 00:11:27,150 >> Publikon: ĝi ŝanĝis s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. Malan: Jes, Mi ŝanĝis s, tiel. 272 00:11:29,360 --> 00:11:31,050 Pro kio vere okazas? 273 00:11:31,050 --> 00:11:34,130 Nu, mi volas vidi se mi povas purigi tiun bildon, kiel sekvas. 274 00:11:34,130 --> 00:11:41,390 >> Se s estas, denove, la vorto g, a, b, e, backslash, 0, kaj s 275 00:11:41,390 --> 00:11:44,084 ni devos daŭrigi desegno kiel skatolo ĉi tie, sed ne pli adresoj. 276 00:11:44,084 --> 00:11:45,250 Ni haltas farante aĵojn. 277 00:11:45,250 --> 00:11:47,510 Ni simple desegni bildon simpligi la mondo. 278 00:11:47,510 --> 00:11:52,640 >> Kiam mi rakontos t kun kordo t, kiu kreas ke eron de memoro. 279 00:11:52,640 --> 00:11:55,850 Kvadrata okazas al esti 32 bitojn en plej komputiloj. 280 00:11:55,850 --> 00:11:59,530 Fakte, se vi iam aŭdis pri komputilo havante 32-bita arkitekturo, 281 00:11:59,530 --> 00:12:03,000 vere fancy-paroli, ke nur signifas uzas 32-bita adresoj. 282 00:12:03,000 --> 00:12:05,370 Kaj kiel teknika flanko, Se vi iam scivolis 283 00:12:05,370 --> 00:12:09,630 kial pli malnovaj komputiloj, se vi reale provis supon ilin kun multaj RAM, 284 00:12:09,630 --> 00:12:12,360 povis nur havi maksimuman de kvar gigabajtoj de RAM, 285 00:12:12,360 --> 00:12:14,860 nu tio estas ĉar, laŭvorte, via malnova komputilo povis nur 286 00:12:14,860 --> 00:12:17,250 rakonti kiel altan kiel 4 miliardo, 4 miliardoj bajtoj, 287 00:12:17,250 --> 00:12:20,590 ĉar ĝi uzas 32-bita nombroj por adresoj. 288 00:12:20,590 --> 00:12:23,260 >> Sed ĉiuokaze, en tiu Ekzemple, rakonto de multe pli simpla. 289 00:12:23,260 --> 00:12:27,250 t estas nur alia puntero, aŭ vere char stelo, alias kordo. 290 00:12:27,250 --> 00:12:30,860 Kaj kiel mi volas ĝisdatigi ĉi bildo nun kun tiu dua linio de kodo, 291 00:12:30,860 --> 00:12:31,950 post la punkto, ĝi pentras, ĝi pentras? 292 00:12:31,950 --> 00:12:35,845 Kiam mi faras ĉenon t egalas s punktokomo, kiel tiu ĉi bildo ŝanĝi? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Yeah? 295 00:12:38,000 --> 00:12:38,916 >> Publiko: [inaudible]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. Malan: Jes. 298 00:12:42,020 --> 00:12:42,600 Ĝuste. 299 00:12:42,600 --> 00:12:45,620 Mi ĵus metis la sagon el la t skatolon al la sama adreso, 300 00:12:45,620 --> 00:12:47,570 la sama unua letero en donis. 301 00:12:47,570 --> 00:12:50,850 Aŭ teknike, se tiu ulo estis ankoraŭ ĉe 0x1, 302 00:12:50,850 --> 00:12:53,052 estas kvazaŭ mi havis 0x1 tie kaj 0x1 tie. 303 00:12:53,052 --> 00:12:54,760 Sed denove, kiu zorgas pri la adresojn? 304 00:12:54,760 --> 00:12:56,345 Estas nur la ideo, ke nun importas. 305 00:12:56,345 --> 00:12:57,720 Do tio estas kio okazas tie. 306 00:12:57,720 --> 00:13:02,690 Do kompreneble, se vi faras t krampo 0, kio estas tabelo skribmaniero, 307 00:13:02,690 --> 00:13:05,650 de course-- kaj sincere, ĝi aspektas kiel ekzistas tabelo tien, 308 00:13:05,650 --> 00:13:07,340 sed nun ekzistas tiu stranga afero. 309 00:13:07,340 --> 00:13:11,160 Sciu, ke la lingvo de programado, C, proponas al vi tiun karakterizaĵon, 310 00:13:11,160 --> 00:13:14,650 per, eĉ se t estas pointer, aŭ s estas puntero, 311 00:13:14,650 --> 00:13:18,050 vi povas ankoraŭ uzi tiun familiara, komforta kvadrata krampo 312 00:13:18,050 --> 00:13:22,520 skribmaniero por iri al la unua elemento, aŭ la dua elemento, aŭ ajna elemento 313 00:13:22,520 --> 00:13:26,130 ke tio montrilo notas por ke, supozeble, ĝi 314 00:13:26,130 --> 00:13:29,410 Estas, kiel en ĉi tiu kazo, indikante en iu tabelo. 315 00:13:29,410 --> 00:13:30,340 >> Do kiel ni riparos tion? 316 00:13:30,340 --> 00:13:33,660 Sincere, ĉi tiu estas kie akiris iom blindiga unuavide. 317 00:13:33,660 --> 00:13:35,340 Sed ĉi tie estas nova kaj plibonigita versio. 318 00:13:35,340 --> 00:13:37,460 >> Do unue mi ricevas senigi de la CS50 biblioteko, 319 00:13:37,460 --> 00:13:41,170 nur elmontri ke s estas ja oni char stelo, simple sinonimon. 320 00:13:41,170 --> 00:13:43,540 Kaj t estas ankaŭ char stelo. 321 00:13:43,540 --> 00:13:48,290 Sed kio okazas en la dekstra flanko de tiu linio 322 00:13:48,290 --> 00:13:49,970 kie t estas asignita valoro? 323 00:13:49,970 --> 00:13:50,790 >> Kio estas malloc? 324 00:13:50,790 --> 00:13:51,630 Kio ĝi estas strlen? 325 00:13:51,630 --> 00:13:52,547 Kio estas sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Kial la heck faras ĉi linio rigardon tiel kompleksa? 327 00:13:54,380 --> 00:13:55,713 Kio ĝi faras al alta nivelo? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Kio ĝi stokante en t? 330 00:13:57,440 --> 00:13:58,646 Yeah? 331 00:13:58,646 --> 00:14:01,104 Publiko: Ĝi estas atribuo de certa kvanto de memora spaco. 332 00:14:01,104 --> 00:14:03,032 Estas stoki, mi supozas, literojn [inaudible]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. Malan: Perfekta. 334 00:14:04,032 --> 00:14:04,540 Perfekta. 335 00:14:04,540 --> 00:14:06,650 Ĝi atribuo certa kvanto de memora spaco 336 00:14:06,650 --> 00:14:08,940 stoki, supozeble, futura literoj. 337 00:14:08,940 --> 00:14:11,310 Kaj precipe, malloc Estas do reveni kio? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Publiko: Revenante la [inaudible]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. Malan: Ĝuste. 341 00:14:15,850 --> 00:14:18,850 Revenante al la adreso de tiu memoro, kio estas fantazio maniero diri, 342 00:14:18,850 --> 00:14:21,640 redonas la adreson de la unua bitoko de tiu memoro. 343 00:14:21,640 --> 00:14:25,460 La onus estas ĉe mi rememori kiom memoro mi reale 344 00:14:25,460 --> 00:14:27,140 asignitaj aŭ demandis malloc por. 345 00:14:27,140 --> 00:14:28,384 >> Nun kiom estas tio? 346 00:14:28,384 --> 00:14:30,550 Nu, eĉ se ekzistas multan krampoj tie, 347 00:14:30,550 --> 00:14:32,970 malloc prenas nur unu argumenton. 348 00:14:32,970 --> 00:14:37,250 Kaj mi preciziganta strlen de s, tial donu mi kiel multaj bajtoj kiel estas en s, 349 00:14:37,250 --> 00:14:37,800 sed aldoni unu. 350 00:14:37,800 --> 00:14:38,300 Kial? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Yeah? 353 00:14:39,530 --> 00:14:40,840 >> Aŭdienco: La backslash 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. Malan: Ĝuste. 355 00:14:41,840 --> 00:14:43,423 Ni devas fari iom apartan domon. 356 00:14:43,423 --> 00:14:45,970 Do ĉar tie estas backslash 0, prefere ni memoros tion. 357 00:14:45,970 --> 00:14:47,310 Alie, ni iras krei ĉenon ke 358 00:14:47,310 --> 00:14:49,170 ne havas tiun specialan finilo. 359 00:14:49,170 --> 00:14:52,640 >> Dume, nur por esti súper anal, mi havas sizeof (char) 360 00:14:52,640 --> 00:14:55,730 ĉiaokaze iu kuras mia kodo ne sur la CS50 aparaton, 361 00:14:55,730 --> 00:14:58,220 sed eble malsama komputilo tute kie signoj 362 00:14:58,220 --> 00:15:01,470 Estas unu bajto, per konvencio, sed du bajtoj, aŭ iu pli granda ol tio. 363 00:15:01,470 --> 00:15:04,490 Estas nur por esti súper, súper adversa al eraroj. 364 00:15:04,490 --> 00:15:06,940 Kvankam, fakte, estas probable tuj estos 1. 365 00:15:06,940 --> 00:15:11,490 >> Nun, dume, mi iras antaŭen kaj kopii la kordo, t krampo i egalas t krampo s. 366 00:15:11,490 --> 00:15:14,962 Kaj mi cedu al lasta semajno fontkodon por vidi kio okazas. 367 00:15:14,962 --> 00:15:17,670 Sed la ŝlosilo takeaway kaj la Tial mi metas la kodo nun en verdo, 368 00:15:17,670 --> 00:15:22,520 Estas pro tiu lasta linio, t krampo 0 egalas toupper, 369 00:15:22,520 --> 00:15:25,230 havas la efekton de kapitaligi kiu kordo? 370 00:15:25,230 --> 00:15:26,960 t kaj / aŭ s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Tiu lasta linio de kodo. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Nur t, ĉar kio estas okazis tiu fojo, 375 00:15:35,560 --> 00:15:41,500 se mi iomete malfari tiun lastan paŝon, kio okazis estas, kiam mi vokas malloc, 376 00:15:41,500 --> 00:15:45,380 Mi esence akiras eron de memoro kiu estas la sama grandeco kiel la originala, 377 00:15:45,380 --> 00:15:47,020 ĉar tio estas la aritmetika mi faris. 378 00:15:47,020 --> 00:15:50,920 Mi stokante en t la adreso de tiu bloko de memoro. 379 00:15:50,920 --> 00:15:53,370 Eĉ kvankam tio aspektas bela kaj bela, bela kaj blanka, 380 00:15:53,370 --> 00:15:56,882 la realo ekzistas, kion ni subteni nomante, rubo valoroj en ĉi tie. 381 00:15:56,882 --> 00:15:59,340 Tio eron de memoro multobligita tre bone estis uzita antaŭe, 382 00:15:59,340 --> 00:16:00,940 kelkaj sekundoj, antaŭ kelkaj minutoj. 383 00:16:00,940 --> 00:16:04,410 Do povus absolute esti nombroj aŭ literojn tie, nur hazarde. 384 00:16:04,410 --> 00:16:08,580 Sed ili ne estas validaj, ĝis mi mi popolas ĉi eron de memoro 385 00:16:08,580 --> 00:16:12,510 kun realaj signoj, kiel mi fari en tiu por buklo tie. 386 00:16:12,510 --> 00:16:13,180 Ĉiuj rajtas? 387 00:16:13,180 --> 00:16:16,180 >> Do nun, la kulmino de tiuj tri ekzemploj 388 00:16:16,180 --> 00:16:20,730 kiuj ŝajne rompita lasta fojo, ĉi Swap ekzemplo, ĉi tiu funkcio 389 00:16:20,730 --> 00:16:23,670 laboris en la senco ke interŝanĝis kaj b. 390 00:16:23,670 --> 00:16:25,620 Sed ĝi ne funkcias en kio alia senco? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Yeah? 393 00:16:28,614 --> 00:16:29,612 >> Publiko: [inaudible]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. Malan: Ĝuste. 396 00:16:36,700 --> 00:16:39,530 Se mi nomas tiun funkcion el another-- ekzemple, 397 00:16:39,530 --> 00:16:42,870 de funkcio kiel ĉefa, kie Mi havas variablo x kaj y, kiel mi 398 00:16:42,870 --> 00:16:46,160 faris pasintsemajne, sama kodo, kaj mi pasas en x kaj y 399 00:16:46,160 --> 00:16:49,860 al Permuta kaj tiam nomita Swap-- ĉi, kompreneble, estas la korekta versio 400 00:16:49,860 --> 00:16:52,220 Estas kion ni volis see-- tio ne funkciis. 401 00:16:52,220 --> 00:16:53,770 Do kio estas la embaraso? 402 00:16:53,770 --> 00:16:56,850 >> Nu, do nur esti klara, lasu min iri antaŭen 403 00:16:56,850 --> 00:17:05,450 kaj- donu al mi duan tien kaj vidu se mi povas montri al vi la lasta, kiu 404 00:17:05,450 --> 00:17:12,464 Estos in-- ni vidu se mi povas trovi tiu reala fast-- OK, [inaudible]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, tie ĝi estas. 407 00:17:19,240 --> 00:17:21,000 Do ignoras la ordonojn mi simple tajpante. 408 00:17:21,000 --> 00:17:23,780 Mi volas ĝin retrovi ĉe la lasta minuto ekzemplo 409 00:17:23,780 --> 00:17:27,960 de lasta momento, kiun nun estas nomita neniu Swap. 410 00:17:27,960 --> 00:17:30,200 >> Do neniu Swap estas kie ni cxesis lasta fojo, 411 00:17:30,200 --> 00:17:32,930 per Mi inicializado x al 1 kaj y 2. 412 00:17:32,930 --> 00:17:35,840 Mi tiam nomita Swap, pasante en 1 kaj 2. 413 00:17:35,840 --> 00:17:37,930 Kaj tiam tiu funkcio laboris en iu senso, 414 00:17:37,930 --> 00:17:40,750 sed havis neniun permanentan efektiviĝo de x kaj y. 415 00:17:40,750 --> 00:17:45,430 Do la demando en mano estas, kiel nun ĉu ni efektive ripari tiun problemon? 416 00:17:45,430 --> 00:17:47,820 Kio estas la solvo en la mano? 417 00:17:47,820 --> 00:17:53,150 >> Nu, en swap.c, kiuj estas novaj hodiaŭ, rimarki kelkaj diferencoj. 418 00:17:53,150 --> 00:17:54,700 x kaj y estas la sama. 419 00:17:54,700 --> 00:17:57,250 Sed kio estas klare malsamaj pri linio 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Kio novas tie, se vi memoras kio aspektis kiel dua monato? 422 00:18:01,715 --> 00:18:02,565 >> Publiko: [inaudible]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. Malan: Jes. 424 00:18:03,440 --> 00:18:06,680 Do la ampersands estas nova peco de sintakso ne nur en tiu programo, 425 00:18:06,680 --> 00:18:08,560 sed ankaŭ pli ĝenerale en CS50. 426 00:18:08,560 --> 00:18:10,680 Ĝis nun, mi ne kredas Ni vidis neniun ekzemploj 427 00:18:10,680 --> 00:18:14,070 aŭ vere parolis pri ili en ajna detalo, krom, eble, preventa 428 00:18:14,070 --> 00:18:16,467 en tiu sekcio, kaj-simbolo ŝatas ĉi. 429 00:18:16,467 --> 00:18:19,300 Nu, tio rezultas-simbolo estas el la lastaj pecoj de nova sintakso 430 00:18:19,300 --> 00:18:20,174 Ni iras al lerni. 431 00:18:20,174 --> 00:18:23,500 Ĉio tio signifas estas la adreso de iu variablo. 432 00:18:23,500 --> 00:18:25,070 Je kio adreso ne x vivas? 433 00:18:25,070 --> 00:18:26,510 Sed kion adreso ne y vivi? 434 00:18:26,510 --> 00:18:28,700 Ĉar se la fundamentan problemon antaŭe 435 00:18:28,700 --> 00:18:32,970 Estis ke x kaj y oni aprobotaj kiel kopioj, kion ni vere volas fari 436 00:18:32,970 --> 00:18:38,780 estas provizi Swap kun kiel trezoron mapo kiu kondukas al kie x kaj y reale 437 00:18:38,780 --> 00:18:41,910 Estas en RAM, tiel ke Swap povas sekvi tiun mapon 438 00:18:41,910 --> 00:18:47,760 kaj iru, kien x aŭ y markas la lokon kaj ŝanĝi la efektivaj valoroj 1 kaj 2 439 00:18:47,760 --> 00:18:48,270 tie. 440 00:18:48,270 --> 00:18:50,710 >> Do Swap bezonas ŝanĝi iomete tro. 441 00:18:50,710 --> 00:18:53,760 Kaj unuavide, tiu potenco simili iom simila al char stelo. 442 00:18:53,760 --> 00:18:54,850 Kaj ja estas. 443 00:18:54,850 --> 00:18:59,635 Do estas puntero al kio tipo de datumoj, bazita sur ĉi reliefigis parto? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Do ĝi estas int. 446 00:19:01,620 --> 00:19:04,880 >> Do ne plu estas int, ĝi estas la adreso de int. 447 00:19:04,880 --> 00:19:07,910 Kaj simile, b estas ankoraux esti la adreso de int. 448 00:19:07,910 --> 00:19:12,470 Do kiam mi nun nomos Swap de Main, Mi ne donos al Swap 1 kaj 2. 449 00:19:12,470 --> 00:19:15,540 Mi tuj donos ĝin kiel Bovo-io kaj Ox-io, 450 00:19:15,540 --> 00:19:19,820 du adresoj kiuj kondukos Swap iliaj realaj lokoj 451 00:19:19,820 --> 00:19:21,310 en mia komputilo la memoro. 452 00:19:21,310 --> 00:19:25,580 >> Do nun, miaj ceteraj efektivigo bezonas ŝanĝi tad. 453 00:19:25,580 --> 00:19:28,650 Kio estas evidente malsama nun en tiuj tri linioj de kodo? 454 00:19:28,650 --> 00:19:31,350 Ekzistas tiuj malbenita steloj ĉiuj super la loko, ĉiuj rajtas? 455 00:19:31,350 --> 00:19:33,014 Do kio okazas ĉi tie? 456 00:19:33,014 --> 00:19:33,514 Yeah? 457 00:19:33,514 --> 00:19:35,055 >> Publiko: Estas evidente [inaudible]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. Malan: Ĝuste. 460 00:19:37,990 --> 00:19:41,560 Do en ĉi context-- kaj tio ne estis la bona dezajno decido, rekoni, 461 00:19:41,560 --> 00:19:42,530 jarojn. 462 00:19:42,530 --> 00:19:45,110 En tiu kunteksto, kie Vi nur devas stelo, 463 00:19:45,110 --> 00:19:48,240 kaj vi ne havos datumtipo, kiel int, tuj al la maldekstra, 464 00:19:48,240 --> 00:19:53,146 anstataŭ vi havas egalan signon, klare, en tiu kunteksto, kiam vi diras star a, 465 00:19:53,146 --> 00:19:56,980 tio signifas iri al la adreso tio en. 466 00:19:56,980 --> 00:19:58,870 Sekvu la trezoro mapo, por tiel diri. 467 00:19:58,870 --> 00:20:01,720 >> Kaj dume, en linio 37, signifas la samon. 468 00:20:01,720 --> 00:20:05,460 Iru al la adreso al, kaj metis kio? 469 00:20:05,460 --> 00:20:09,520 Kio ajn estas la situo ke b specifas. 470 00:20:09,520 --> 00:20:10,980 En aliaj vortoj, iru al b. 471 00:20:10,980 --> 00:20:12,130 Akiri tiun valoron. 472 00:20:12,130 --> 00:20:15,620 Iru al kaj, por la egaleco subskribi, la asigno operatoro, 473 00:20:15,620 --> 00:20:17,010 enkalkulu valoron tie. 474 00:20:17,010 --> 00:20:19,272 >> Simile, int temp estas nur int. 475 00:20:19,272 --> 00:20:20,730 Nenio bezonas ŝanĝi pri temp. 476 00:20:20,730 --> 00:20:24,810 Estas nur anstataŭigoj vitro el Annenberg por iu lakto aŭ oranĝa suko. 477 00:20:24,810 --> 00:20:27,630 Sed mi bezonas diri, iru al b. 478 00:20:27,630 --> 00:20:31,449 Iru al tiu destino kaj meti la valoron en temp tie. 479 00:20:31,449 --> 00:20:32,490 Do kio okazas tiam? 480 00:20:32,490 --> 00:20:36,540 Kiam mi vere nomas Permuta tiu tempo, se tiu unua pleto tie reprezentas Main, 481 00:20:36,540 --> 00:20:42,270 tiu dua pleto reprezentas Swap, kiam Mi pasos-simbolo x kaj-signo y 482 00:20:42,270 --> 00:20:47,150 el Ĉefa al Permuta, nur por esti klara, kio estas tiu stako kadro akcepto? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Yeah? 485 00:20:49,200 --> 00:20:50,180 >> Publiko: [inaudible]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. Malan: Ĝuste. 487 00:20:51,180 --> 00:20:53,129 La adreso de x kaj la adreso de y. 488 00:20:53,129 --> 00:20:55,170 Kaj vi povas pensi pri tiuj kiel poŝta adresoj. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street kaj 35 Oxford Street, kaj vi 490 00:20:58,772 --> 00:21:01,230 volas movi la du konstruaĵoj ke estas ĉe tiuj lokoj. 491 00:21:01,230 --> 00:21:04,680 >> Ĝi estas speco de ridinda ideo, sed tio kion ni celas diri per adreso. 492 00:21:04,680 --> 00:21:07,000 Kie en la mondo povas Vi trovos tiujn du ints? 493 00:21:07,000 --> 00:21:09,470 Kie en la mondo vi povas trovi tiuj du konstruaĵoj? 494 00:21:09,470 --> 00:21:15,170 Do se fine, post cxio cxi tio mi iru en la hodiaŭa fontkodo kaj kompili 495 00:21:15,170 --> 00:21:22,110 Swap kaj kuritaj ./swap, fine, por la unuafoje ni vere vidos ke 496 00:21:22,110 --> 00:21:25,330 miaj valoroj havas ja estis interŝanĝitaj sukcese. 497 00:21:25,330 --> 00:21:30,860 Kaj nun ni povas eĉ preni rimarkigi ĉi en, ekzemple, GDB. 498 00:21:30,860 --> 00:21:32,740 >> Do lasu min iri en la sama dosiero. 499 00:21:32,740 --> 00:21:35,010 Lasu min kaj kuras GDB de ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Kaj nun, en Swap, mi tuj iros antaŭeniris kaj metis ripozon punkto Ĉefa. 502 00:21:40,547 --> 00:21:42,630 Kaj nun mi estas ironta antaŭen kaj kuri la programon. 503 00:21:42,630 --> 00:21:45,810 Kaj nun ni vidu mian kodo paŭzis ĉe tiu linio. 504 00:21:45,810 --> 00:21:48,330 >> Se mi iras antaŭen kaj presita x, kion mi devus vidi ĉi tie? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Estas demando. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Diru denove? 509 00:21:51,530 --> 00:21:52,295 >> Publiko: [inaudible]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. Malan: Do hazardaj nombroj, eble. 511 00:21:53,910 --> 00:21:56,010 Eble mi akiri bonŝanca, kaj estas bela kaj simpla, kiel 0. 512 00:21:56,010 --> 00:21:57,230 Sed eble estas iuj hazardaj nombraj. 513 00:21:57,230 --> 00:21:58,090 En ĉi tiu kazo, mi havas sorton. 514 00:21:58,090 --> 00:21:59,030 Tio simple okazas al esti 0. 515 00:21:59,030 --> 00:22:00,780 Sed estas ja sorton, ĉar ne ĝis mi 516 00:22:00,780 --> 00:22:06,280 tajpi proksima kaj tiam presi x havas tiun linio de kodo, linio 19, estis ekzekutitaj. 517 00:22:06,280 --> 00:22:10,942 >> Dume, se mi tajpas apud denove, kaj nun presi y, Mi iras vidi 2. 518 00:22:10,942 --> 00:22:13,900 Nun, se mi tajpas proksima, ĝi tuj preni iom konfuza, ĉar nun, 519 00:22:13,900 --> 00:22:17,250 la printf tuj aperas sur la ekrano, kiel faris. x estas 1. 520 00:22:17,250 --> 00:22:18,606 >> Ni faru tion denove. 521 00:22:18,606 --> 00:22:20,480 Kaj nun, jen kie aĵoj interesa. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Antaŭ mi nomas Swap aŭ eĉ ŝtupo en ĝin, ni prenu iom peek. 524 00:22:26,580 --> 00:22:28,980 x estas, denove, 1. 525 00:22:28,980 --> 00:22:33,240 Y estas kompreneble rapida prudento kontrolu, 2, do ne peza tie. 526 00:22:33,240 --> 00:22:35,740 Sed kio estas signo x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Respondo: Estas speco de funky rigardis. 529 00:22:39,350 --> 00:22:43,500 Sed la int stelo en krampoj estas nur GDP la maniero diri ĉi estas adreso. 530 00:22:43,500 --> 00:22:48,290 Ĝi ne estas int, estas puntero al int, aŭ alie sciata kiel adreso. 531 00:22:48,290 --> 00:22:49,742 >> Kio estas ĉi tiu freneza afero? 532 00:22:49,742 --> 00:22:51,825 Ni neniam vidis ion tute same kiel tio antaŭe. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Do tiu estas la adreso en mia komputilo memoro de kie x okazas vivi. 535 00:22:58,120 --> 00:22:59,040 Estas Ox-io. 536 00:22:59,040 --> 00:23:01,290 Kaj tio estas, sincere, kial Mi komencis desegni sagoj, 537 00:23:01,290 --> 00:23:03,340 anstataŭ numeroj ĉar kiu vere zorgas 538 00:23:03,340 --> 00:23:06,890 ke via int estas aparta adreso tio ke granda. 539 00:23:06,890 --> 00:23:12,160 Sed bffff0c4, tiuj estas ĉiuj ja deksesumaj ciferoj, 540 00:23:12,160 --> 00:23:13,720 kio estas 0 tra f. 541 00:23:13,720 --> 00:23:16,590 >> Do ni ne tuj logxas tro longa sur kio tiuj aferoj. 542 00:23:16,590 --> 00:23:19,400 Sed se mi presi y, kompreneble, mi vidas 2. 543 00:23:19,400 --> 00:23:22,440 Sed signo y, mi vidas ĉi adreso. 544 00:23:22,440 --> 00:23:26,527 Kaj avizo, la kurioza, kiom aparte estas x kaj y? 545 00:23:26,527 --> 00:23:27,985 Vi povas ignori la plejparto de la adreso. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Kvar bajtoj. 548 00:23:29,920 --> 00:23:33,510 Kaj tio estas konsekvenca kun niaj fruaj asertas ke kiom granda estas int? 549 00:23:33,510 --> 00:23:34,130 Kvar bajtoj. 550 00:23:34,130 --> 00:23:37,420 Tiel ĝi aspektas kiel ĉio tegaĵo supren bele, kiel vi povus atendi, en memoro. 551 00:23:37,420 --> 00:23:40,010 >> Do nun, ni simple rapida antaŭen al la fino de ĉi tiu rakonto. 552 00:23:40,010 --> 00:23:43,290 Ni iru antaŭen kaj tajpu paŝo, plonĝi en la Swap funkcio. 553 00:23:43,290 --> 00:23:46,880 Nun rimarki, se mi tajpi, estas identa al la adreso de x. 554 00:23:46,880 --> 00:23:52,130 Se mi tajpas b, estas identa al la adreso de y. 555 00:23:52,130 --> 00:23:57,020 Do kion devus mi vidas se mi diri, iru al la adreso de? 556 00:23:57,020 --> 00:23:58,120 Do presi star a. 557 00:23:58,120 --> 00:24:00,130 Do stelo signifas iri tie, en tiu kunteksto. 558 00:24:00,130 --> 00:24:02,730 Kaj-signo signifas kio estas la adreso de. 559 00:24:02,730 --> 00:24:05,000 Do star rimedo 1. 560 00:24:05,000 --> 00:24:09,590 Kaj print stelo b donas al mi 2. 561 00:24:09,590 --> 00:24:15,750 >> Kaj mi supozas, por la momento, ke almenaŭ la kodo kiu 562 00:24:15,750 --> 00:24:18,950 procedas ekzekuti nun povas esti rezonis per en tiu vojo. 563 00:24:18,950 --> 00:24:21,150 Sed ni reviziti tiun ideon antaŭ longe. 564 00:24:21,150 --> 00:24:23,850 Do tiu versio de Swap nun estas korekta kaj permesas 565 00:24:23,850 --> 00:24:26,650 ni interŝanĝu tiun apartan datumtipo. 566 00:24:26,650 --> 00:24:29,120 >> Do demandojn tiam Swap? 567 00:24:29,120 --> 00:24:29,890 Sur stelo? 568 00:24:29,890 --> 00:24:30,690 Sur adreso de? 569 00:24:30,690 --> 00:24:33,270 Kaj vi vidos, kun problemo starigis 4, ia, 570 00:24:33,270 --> 00:24:37,310 sed problemo starigis 5, definitive, kiel tiuj aferoj estas utilaj kaj akiri multe pli 571 00:24:37,310 --> 00:24:39,584 komforta kun ili, kiel rezulto. 572 00:24:39,584 --> 00:24:40,430 Io ajn? 573 00:24:40,430 --> 00:24:40,930 Bone. 574 00:24:40,930 --> 00:24:44,350 Do malloc estas, denove, ĉi tiu funkcio ke ĝuste atribuas memoro, memoro 575 00:24:44,350 --> 00:24:45,330 atribuo. 576 00:24:45,330 --> 00:24:47,024 Kaj kial tio estas utila? 577 00:24:47,024 --> 00:24:48,940 Nu, ĉio ĉi momento, vi estis uzante malloc. 578 00:24:48,940 --> 00:24:52,230 Se vi konsideras nun kiel getString verkoj, supozeble, estas 579 00:24:52,230 --> 00:24:56,140 estis demandante iun por peco de memoro, ĉiutempe la uzanto tipoj ŝnuro 580 00:24:56,140 --> 00:24:59,040 en, ĉar ni certe ne sciis, kiel CS50 bastonon 581 00:24:59,040 --> 00:25:02,710 kiom granda tiujn ĉenojn kiuj homoj tuj tajpi povus esti. 582 00:25:02,710 --> 00:25:07,910 >> Do ni, por la unua fojo, komenci hollejo reen kiel la CS50 biblioteko verkoj 583 00:25:07,910 --> 00:25:10,990 per vojo de paro de ekzemploj ke kondukos nin tie. 584 00:25:10,990 --> 00:25:15,300 Do se mi malfermas gedit kaj malfermu scanf 0, 585 00:25:15,300 --> 00:25:17,055 Ni tuj vidos la sekvan kodon. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, havebla sur la retejo por hodiaŭ, ĝi havas relative malmultajn liniojn de kodo 588 00:25:23,530 --> 00:25:25,351 tie, 14 tra 20. 589 00:25:25,351 --> 00:25:26,600 Kaj ni vidos kion faras. 590 00:25:26,600 --> 00:25:28,920 Ĝi deklaras int, nomata x. 591 00:25:28,920 --> 00:25:30,850 Ĝi diras ion kiel, numeron bonvolu. 592 00:25:30,850 --> 00:25:33,940 Kaj nun diras, scanf% i, e x. 593 00:25:33,940 --> 00:25:35,620 Do ekzistas aro da novaj aĵoj tie. 594 00:25:35,620 --> 00:25:38,420 >> Sed scanf, vi povas ia opinias de kiel la malo de printf. 595 00:25:38,420 --> 00:25:40,090 printf kompreneble impresoj al la ekrano. 596 00:25:40,090 --> 00:25:44,410 scanf ia skanadoj de la uzanto klavaro io aŭ ŝi tajpita. 597 00:25:44,410 --> 00:25:46,550 >> % I estas simple kiel printf. 598 00:25:46,550 --> 00:25:49,410 Tio signifas atendi la uzanto entajpi int. 599 00:25:49,410 --> 00:25:52,820 Kaj nun kial vi pensas ke mi povus esti pasante scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Se la celo en la vivo de scanf estas akiri ion de la uzanto, 602 00:25:57,770 --> 00:26:02,480 kio estas la signifo de pasante ĝin, & x, nun? 603 00:26:02,480 --> 00:26:02,980 Yeah? 604 00:26:02,980 --> 00:26:03,896 >> Publiko: [inaudible]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. Malan: Ĝuste. 607 00:26:06,540 --> 00:26:12,900 Kion ajn mi, la homa, entajpu, mia eniro tuj estos savitaj en tiu loko. 608 00:26:12,900 --> 00:26:17,660 Ĝi estas ne sufiĉa, memoru, ke nur pasas en x, ĉar ni vidis jam, 609 00:26:17,660 --> 00:26:21,630 ajna tempo pasas nur krudan variablo, kiel int, al iu alia funkcio, 610 00:26:21,630 --> 00:26:25,640 Kompreneble, tio povas ŝanĝi tion variablo, sed ne ĉiam. 611 00:26:25,640 --> 00:26:27,360 Ĝi ne povas havi efikon sur Main. 612 00:26:27,360 --> 00:26:29,420 Ĝi povas nur ŝanĝi sian propran lokan kopion. 613 00:26:29,420 --> 00:26:32,560 Sed se, kontraŭe, vi ne donu al mi la reala int, 614 00:26:32,560 --> 00:26:36,640 sed vi donas al mi direktoj ke int, mi nun, estante scanf, 615 00:26:36,640 --> 00:26:41,050 certe mi povas sekvi ke alparoli kaj metis numeron tie 616 00:26:41,050 --> 00:26:43,280 tial vi havas aliron al ĝi tiel. 617 00:26:43,280 --> 00:26:45,120 >> Do kiam mi kuros ĉi programo, vidu. 618 00:26:45,120 --> 00:26:49,660 Faru scanf 0 dot oblikvo, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Kaj se mi nun tajpas nombro kiel 50, dankon por la 50. 620 00:26:54,030 --> 00:26:58,150 Se mi nun tajpas nombro ŝatas negativa 1, cxar la negativa 1. 621 00:26:58,150 --> 00:27:04,200 Mi nun tajpas nombro kiel 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Kial mia programo ignori min? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Nu, ĉar simple mi rakontis ĝin atendi int nur. 625 00:27:09,880 --> 00:27:10,380 Bone. 626 00:27:10,380 --> 00:27:11,630 Do jen unu version de tiu. 627 00:27:11,630 --> 00:27:16,600 Ni prenu tion supren muesca kaj proponas ke tiu ne estas bona. 628 00:27:16,600 --> 00:27:20,530 Kaj en tio kuŝas tre simpla ekzemplo de kiel ni povas komenci skribi kodo 629 00:27:20,530 --> 00:27:24,450 ke aliaj homoj eblas ekspluati aŭ kompromisi farante malbonaj aĵoj. 630 00:27:24,450 --> 00:27:28,336 Do linio 16, tiel similaj spirite al antaŭ, 631 00:27:28,336 --> 00:27:29,960 sed mi ne deklarante ĝin int tiu tempo. 632 00:27:29,960 --> 00:27:32,970 Mi deklarante ĝin char stelo, alias kordo. 633 00:27:32,970 --> 00:27:35,190 >> Sed kion signifas tiu vere signifas? 634 00:27:35,190 --> 00:27:38,790 Do, se mi ne specifi address-- kaj Mi nomas ĝin arbitre, bufro, 635 00:27:38,790 --> 00:27:43,370 sed mi povis nomi lin s, esti simple-- kaj tiam mi faras tion, klarigi al mi, 636 00:27:43,370 --> 00:27:48,630 se vi povis, bazita sur la antaŭa logiko, kio scanf faras en linio 18, 637 00:27:48,630 --> 00:27:55,000 se pass% s kaj bufro, kio estas adreso? 638 00:27:55,000 --> 00:27:58,210 Kio estas scanf, se vi apliki la ĝusta sama logiko kiel versio 0, 639 00:27:58,210 --> 00:28:00,640 tuj provos fari ĉi tien, kiam la uzanto tajpas ion en? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Yeah? 642 00:28:03,409 --> 00:28:04,407 >> Publiko: [inaudible]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. Malan: Ĝuste. 645 00:28:08,890 --> 00:28:11,577 Scanf per la logiko antaŭe, tuj prenos la kordo 646 00:28:11,577 --> 00:28:13,410 ke la homa tajpita in-- estas nun cxeno, 647 00:28:13,410 --> 00:28:15,790 ĝi ne estas nombro, supozeble, se li aŭ ŝi cooperates-- 648 00:28:15,790 --> 00:28:19,310 kaj tuj provas meti tiun kordo memore je ajn adreso 649 00:28:19,310 --> 00:28:20,340 buffer specifas. 650 00:28:20,340 --> 00:28:23,870 Kaj tiu estas granda, ĉar la buffer Estas ja signifis esti adreson. 651 00:28:23,870 --> 00:28:30,470 >> Sed mi asertas ĉi programo estas kalesxon en tre serioza maniero, ĉar kio valoro estas 652 00:28:30,470 --> 00:28:31,330 buffer defaŭlte? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Kion mi inicializado en? 655 00:28:34,790 --> 00:28:35,770 Kio eron de memoro? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Mi ne havas, ĉu ne? 658 00:28:38,620 --> 00:28:42,265 >> Do kvankam mi asignitaj al char stelo kiu ne plu nomis s, 659 00:28:42,265 --> 00:28:48,030 ĝi estas anstataŭe nomita, buffer-- tiel ni desegni la variablo nomo 660 00:28:48,030 --> 00:28:53,380 nun kiel buffer-- se mi ne nomata getString aŭ malloc tie, 661 00:28:53,380 --> 00:28:56,030 ke efektive signifas ke buffer estas nur iuj rubo valoro. 662 00:28:56,030 --> 00:28:57,030 >> Nun kion tio signifas? 663 00:28:57,030 --> 00:29:00,220 Ĝi signifas ke mi rakontis scanf atendi ĉenon de la uzanto. 664 00:29:00,220 --> 00:29:01,300 Kaj vi scias kion? 665 00:29:01,300 --> 00:29:03,883 Kion ajn tion notas to-- kaj mi tiros demandosigno, 666 00:29:03,883 --> 00:29:07,060 sed fakte, ĝi tuj estos iu kiel Ox1, 2, 3, dekstra? 667 00:29:07,060 --> 00:29:10,730 Estas iuj blufa valoro kiu ĵus sekvinbero al esti tie antaŭe. 668 00:29:10,730 --> 00:29:13,440 Do metu alia maniero, estas kvazaŭ skusorbilo estas nur 669 00:29:13,440 --> 00:29:16,180 montras ion en la memoro. 670 00:29:16,180 --> 00:29:17,610 Mi havas neniun ideon kion. 671 00:29:17,610 --> 00:29:24,130 >> Do se mi tajpas en Gabe nun, ĝi okazas provi meti g-a-b-e / 0 tie. 672 00:29:24,130 --> 00:29:25,530 Sed kiu scias, kio tio estas? 673 00:29:25,530 --> 00:29:27,480 Kaj en la pasinteco, ajna tempo ni provis tuŝi 674 00:29:27,480 --> 00:29:29,770 memoro kiu ne apartenas al ni, kio okazis? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Aŭ preskaŭ ĉiufoje. 677 00:29:32,870 --> 00:29:34,310 Segmentación kulpo, dekstra? 678 00:29:34,310 --> 00:29:37,829 >> Ĉi sagon, mi ne havas ideon kie ĝi estas notante. estas nur iuj hazardaj valoro. 679 00:29:37,829 --> 00:29:40,370 Kaj kompreneble, se vi interpretas hazarda valoro kiel adreso, 680 00:29:40,370 --> 00:29:42,610 vi tuj iru al iuj hazardaj celloko. 681 00:29:42,610 --> 00:29:46,810 Do Gabe eble ja kraŝo mia programo en tiu kazo tie. 682 00:29:46,810 --> 00:29:50,600 >> Do kion ni povas fari, ke estas preskaŭ tiel malbona? 683 00:29:50,600 --> 00:29:52,660 Konsideri ĉi tria kaj lasta ekzemplo de scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Tiu versio estas pli bona en kiu senco? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Se vi estas komforta kun la antaŭa problemo, tiu estas bona. 688 00:30:01,400 --> 00:30:02,250 Kial? 689 00:30:02,250 --> 00:30:03,250 >> Publiko: [inaudible]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. Malan: Bone. 692 00:30:07,110 --> 00:30:09,970 Do tiu kazo de linio 16 estas bona, en la senco 693 00:30:09,970 --> 00:30:12,030 ke ni estas eksplicite atribuo iu memoro. 694 00:30:12,030 --> 00:30:14,190 Ni ne uzante malloc, ni uzas la semajno 2 695 00:30:14,190 --> 00:30:16,060 alproksimiĝo de nur deklarante tabelo. 696 00:30:16,060 --> 00:30:18,130 Kaj ni diris antaŭ tiu ŝnureto estas nur tabelo de signoj, 697 00:30:18,130 --> 00:30:19,690 tial tiu estas totalmente leĝa. 698 00:30:19,690 --> 00:30:22,910 Sed estas, kompreneble, kiel Vi rimarku, fiksa grandeco 16. 699 00:30:22,910 --> 00:30:25,440 >> Do tiu programo estas plene sekura, se mi tajpas 700 00:30:25,440 --> 00:30:29,760 en unu karaktero ŝnuroj, du karaktero kordoj, 15 karaktero ŝnuroj. 701 00:30:29,760 --> 00:30:34,970 Sed kiam mi ektajpu 16 17, 18, 1000 karaktero ŝnuroj, 702 00:30:34,970 --> 00:30:37,390 kie estas tiu kordo tuj finos? 703 00:30:37,390 --> 00:30:39,570 Ĝi tuj finos parte tie. 704 00:30:39,570 --> 00:30:42,820 Sed tiam, kiu scias kion alian estas preter la limoj 705 00:30:42,820 --> 00:30:44,270 de tiu aparta tabelo? 706 00:30:44,270 --> 00:30:48,015 >> Estas kvazaŭ mi havas deklaris 16 skatoloj tie. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Do anstataŭ elingigos ĉiuj 16an ni ĝuste ŝajnigi, ke mi desegnis 16. 709 00:30:52,690 --> 00:30:56,540 Sed se mi tiam provos legi kordo ke estas multe pli longa, kiel 50 karakteroj, 710 00:30:56,540 --> 00:31:01,270 Mi tuj komenci metante a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Kaj tio estas supozeble iu alia memoro segmento 712 00:31:04,916 --> 00:31:06,790 ke, denove, igu mia programo kolapsas, 713 00:31:06,790 --> 00:31:10,600 ĉar mi ne petis io pli ol nur 16 bajtoj. 714 00:31:10,600 --> 00:31:12,260 >> Do kiu zorgas? 715 00:31:12,260 --> 00:31:13,880 Nu, jen la CS50 biblioteko. 716 00:31:13,880 --> 00:31:17,220 Kaj plejparto de tio estas nur kiel instrukcioj ĝis supro. 717 00:31:17,220 --> 00:31:21,670 La CS50 biblioteko, ĉiu ĉi tiu tempo, havis tiun linion en linio 52. 718 00:31:21,670 --> 00:31:23,680 Ni vidis typedef aux vi vidos typedef 719 00:31:23,680 --> 00:31:27,930 en pset 4, kiu ĵus kreas sinonimo per char stelo povas esti pli 720 00:31:27,930 --> 00:31:29,290 simple referita al kiel kordo. 721 00:31:29,290 --> 00:31:31,540 Do ĉi tiu estas unu el la malmultaj trejnado radoj 722 00:31:31,540 --> 00:31:34,120 ni uzis sekrete sub la kapuĉo. 723 00:31:34,120 --> 00:31:36,490 >> Dume, jen la funkcio, getchar. 724 00:31:36,490 --> 00:31:38,190 Nun ŝajne, ne estas korpo al ĝi. 725 00:31:38,190 --> 00:31:40,273 Kaj fakte, se mi konservos movo, mi ne vere 726 00:31:40,273 --> 00:31:42,080 vidi ajnan implementaciones de tiuj funkcioj. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Kiel prudento ĉeko, kial do? 729 00:31:45,516 --> 00:31:46,795 >> Publiko: [inaudible]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. Malan: Jes. 731 00:31:47,670 --> 00:31:48,950 Do tio estas la kaplinion dosiero. 732 00:31:48,950 --> 00:31:52,520 Kaj kaplinion dosieroj enhavas prototipoj, pli iuj aliaj aĵoj, ĝi ŝajnas, 733 00:31:52,520 --> 00:31:53,780 kiel typedefs. 734 00:31:53,780 --> 00:31:56,910 Sed en CS50.c, kiun ni neniam donis al vi sincere, 735 00:31:56,910 --> 00:32:02,100 sed estis en la CS50 aparaton ĉiuj tiu tempo, profunde ene de lia dosierujoj, 736 00:32:02,100 --> 00:32:04,990 rimarki ke ekzistas tuta faskon da funkcioj en ĉi tie. 737 00:32:04,990 --> 00:32:06,720 >> Fakte, ni rulumu malsupren. 738 00:32:06,720 --> 00:32:08,810 Ni ignoru la plimulto de ili, por nun. 739 00:32:08,810 --> 00:32:12,670 Sed rulumu malsupren getInt kaj vidi kiel getInt funkcias. 740 00:32:12,670 --> 00:32:13,890 Do jen getInt. 741 00:32:13,890 --> 00:32:17,727 Kaj se vi iam vere zorgis kiel akiri int funkcias, tie estas ĝia dokumentado. 742 00:32:17,727 --> 00:32:19,560 Kaj inter la aferoj ĝi diras estas tio informas vin 743 00:32:19,560 --> 00:32:21,340 kion la rangoj de valoroj povas reveni. 744 00:32:21,340 --> 00:32:24,400 Ĝi estas esence negativa 2 miliardoj pozitivajn 2 miliardoj, donu aŭ preni. 745 00:32:24,400 --> 00:32:26,420 >> Kaj ĝi rezultas, ĉiuj ĉi tempo, kvankam ni neniam 746 00:32:26,420 --> 00:32:28,570 estis vi kontrolu ŝin, se iu eliras malbone, 747 00:32:28,570 --> 00:32:30,680 Ĝi rezultas ke ĉiuj tiu tempo, getInt havas 748 00:32:30,680 --> 00:32:33,600 estis reveni speciala konstanta, ne nula, 749 00:32:33,600 --> 00:32:36,760 sed prefere int_max, kio estas nur programisto an konvencion. 750 00:32:36,760 --> 00:32:38,846 Ĝi signifas tie estas speciala valoro. 751 00:32:38,846 --> 00:32:41,470 Fari certe kontroli tion, nur en kazo iu eliras malbone. 752 00:32:41,470 --> 00:32:43,261 Sed ni neniam tedis kun kiu al dato, 753 00:32:43,261 --> 00:32:45,200 ĉar denove, tiu celas simpligi. 754 00:32:45,200 --> 00:32:46,950 >> Sed kiel getInt get implementado? 755 00:32:46,950 --> 00:32:48,450 Nu, oni, ĝi prenas neniun argumenton. 756 00:32:48,450 --> 00:32:49,390 Ni scias tion. 757 00:32:49,390 --> 00:32:50,820 Ĝi redonas int. 758 00:32:50,820 --> 00:32:51,950 Ni scias tion. 759 00:32:51,950 --> 00:32:54,460 Do kiel funkcias sub la kapuĉo? 760 00:32:54,460 --> 00:32:58,290 >> Do ekzistas ŝajne senfinan buklo, almenaŭ la ŝajnon de unu. 761 00:32:58,290 --> 00:33:00,290 Rimarku ke ni uzas getString. 762 00:33:00,290 --> 00:33:04,000 Do tio estas interesa. getInt nomas nian propran funkcion, getString. 763 00:33:04,000 --> 00:33:05,645 Kaj nun kial povus ĉi estus la kazo? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Kial mi esti defenda tie en linio 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Kio povus okazi en linio 164, nur por esti klara? 768 00:33:15,639 --> 00:33:16,930 Ĝi estas la sama respondo kiel antaŭe. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Povus esti simple el memoro. 771 00:33:20,089 --> 00:33:23,130 Iu iras malbone kun getString, ni devas povi trakti tion. 772 00:33:23,130 --> 00:33:27,070 Kaj la kialo mi ne revenos nula estas ke teknike, nula estas montrilo. 773 00:33:27,070 --> 00:33:29,120 getInt devas reveni al int. 774 00:33:29,120 --> 00:33:31,060 Do mi arbitre decidis, esence, 775 00:33:31,060 --> 00:33:34,600 ke 2 bilionoj, donu aŭ preni, tuj esti speciala valoro kiun mi neniam povas 776 00:33:34,600 --> 00:33:35,970 reale preni de la uzanto. 777 00:33:35,970 --> 00:33:39,930 Estas nur unu valoro Mi iras malŝpari reprezenti eraro kodo. 778 00:33:39,930 --> 00:33:41,540 >> Do nun, la aĵoj iom kaprico. 779 00:33:41,540 --> 00:33:44,670 Kaj ĝi ne estas tute la sama funkcio kiel antaŭe, sed estas tre simila. 780 00:33:44,670 --> 00:33:50,120 Do rimarki, mi deklaras tie ĉi, en linio 172, ambaŭ estas int n kaj char c. 781 00:33:50,120 --> 00:33:53,600 Kaj tiam mi uzas ĉi funky linio, sscanf, kiu rezultu 782 00:33:53,600 --> 00:33:55,990 ne skani ĉenon de la klavaro. 783 00:33:55,990 --> 00:33:59,226 Ĝi staras ekzistantan ĉeno kiu la uzanto jam tajpis en. 784 00:33:59,226 --> 00:34:02,100 Do mi jam nomis getString, kiu signifas Mi havas ĉenon en memoro. 785 00:34:02,100 --> 00:34:05,020 sscanf estas kion vi volas voki analiza funkcio. 786 00:34:05,020 --> 00:34:07,760 Ĝi rigardas la kordo Mi havas tajpita en, karaktero de karaktero, 787 00:34:07,760 --> 00:34:09,250 kaj faras ion utilan. 788 00:34:09,250 --> 00:34:10,969 Ke kordoj estas stokita en linio. 789 00:34:10,969 --> 00:34:13,560 Kaj mi scias, ke nur irante asist tie kaj jene: Ho, bone, 790 00:34:13,560 --> 00:34:15,143 Mi nomis ĝin ne tio tempo, sed lineo. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Kaj nun jen estas iom malsama. 793 00:34:18,080 --> 00:34:22,480 Sed tio efektive signifas, por kialoj ni iomete skuu niajn manojn hodiaŭ, 794 00:34:22,480 --> 00:34:26,070 ke ni kontrolanta por vidi se la uzanto tajpas en 795 00:34:26,070 --> 00:34:29,909 kaj int kaj eble alian karakteron. 796 00:34:29,909 --> 00:34:33,610 Se la uzanto tajpas en int, estas tuj estos stokitaj en n, ĉar mi 797 00:34:33,610 --> 00:34:36,739 pasante ĉi per adreso, la nova lertaĵo ni vidis hodiaŭ. 798 00:34:36,739 --> 00:34:41,570 Se la uzanto ankaŭ tajpitaj same 123x, ke x 799 00:34:41,570 --> 00:34:45,060 tuj finos supren letero en karaktero c. 800 00:34:45,060 --> 00:34:48,739 >> Nun ĝi rezultas ke sscanf rakontos al mi, inteligente, 801 00:34:48,739 --> 00:34:54,750 kiom variabloj estis sscanf sukcese povis plenigi. 802 00:34:54,750 --> 00:34:58,770 Do per tiu logiko, se la funkcio Mi efektivigo estas getInt, 803 00:34:58,770 --> 00:35:00,900 sed mi kontrolanta, potenciale, por la uzanto 804 00:35:00,900 --> 00:35:04,190 esti tajpita en int sekvita de iu alia, 805 00:35:04,190 --> 00:35:08,580 Kion mi volas sscanf La reveno valoro vere esti? 806 00:35:08,580 --> 00:35:10,950 Se la celo estas akiri nur int de la uzanto? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Do se sscanf revenoj 2, kion tio signifas? 809 00:35:19,300 --> 00:35:21,660 La uzanto tajpas en ion kiel, laŭvorte, 810 00:35:21,660 --> 00:35:24,770 123x, kiu estas nur sensencaĵo. 811 00:35:24,770 --> 00:35:27,490 Estas eraro kondiĉo, kaj Mi volas kontroli tion. 812 00:35:27,490 --> 00:35:32,960 >> Do se la uzanto tajpas ĉi en, per tiu logiko, kion faras sscanf reveni, 813 00:35:32,960 --> 00:35:33,740 vi dirus? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Do tuj revenos 2, ĉar la 123 tuj iros tien, 816 00:35:39,130 --> 00:35:41,580 kaj la x tuj finos en ĉi tie. 817 00:35:41,580 --> 00:35:43,970 Sed mi ne volas, ke la x al get plenigis. 818 00:35:43,970 --> 00:35:48,580 Mi volas sscanf nur sukcesos plenigante la unua el ĝiaj variabloj. 819 00:35:48,580 --> 00:35:52,490 Kaj tial mi volas sscanf reveni 1. 820 00:35:52,490 --> 00:35:55,750 >> Kaj se tio estas iom super la kapo por la momento, estas tute bone. 821 00:35:55,750 --> 00:36:00,030 Rimarkas tamen, ke unu el la valoroj de getInt kaj getString 822 00:36:00,030 --> 00:36:03,630 estas ke ni faras heck de multan eraro kontrolanta kiel ĉi tio 823 00:36:03,630 --> 00:36:07,130 ke, ĝis nun, vi povas sufiĉe tre tajpi ion en via klavaro, 824 00:36:07,130 --> 00:36:08,490 kaj ni kaptos ŝin. 825 00:36:08,490 --> 00:36:10,592 Kaj certe ni, La bastono, definitive ne 826 00:36:10,592 --> 00:36:13,300 esti la fonto de cimo en via programo, ĉar ni defende 827 00:36:13,300 --> 00:36:16,270 kontrolanta por ĉiuj stultaj aferojn kiujn uzanto povus fari, 828 00:36:16,270 --> 00:36:18,900 kiel tajpado cxeno, kiam vi vere volis int. 829 00:36:18,900 --> 00:36:21,350 Do por now-- ni venos reen al tiu antaŭ long-- 830 00:36:21,350 --> 00:36:23,710 sed ĉiu ĉi tiu tempo, getString kaj getInt havas 831 00:36:23,710 --> 00:36:29,950 estis sub la kapuĉo uzanta ĉi baza ideo de adresoj de memoro. 832 00:36:29,950 --> 00:36:32,580 >> Do nun, ni faru tion oni iom pli uzantamika. 833 00:36:32,580 --> 00:36:38,740 Kiel vi eble memoras, de Binky lasta time-- se mia muso cooperate-- tiel 834 00:36:38,740 --> 00:36:42,560 ni havis ĉi tiun kodon, kiu sincere, estas sufiĉe sensenca. 835 00:36:42,560 --> 00:36:45,330 Tiu kodo nenion atingas utila, sed ĝi estis la ekzemplo 836 00:36:45,330 --> 00:36:48,330 ke instruisto Parlante uzata por reprezenti 837 00:36:48,330 --> 00:36:51,840 kio okazas en programo engaĝante memoro. 838 00:36:51,840 --> 00:36:54,850 >> Do ni retell ĉi rakonto súper mallonge. 839 00:36:54,850 --> 00:36:58,720 Tiuj unuaj du linioj, en Angla, do kion, vi dirus? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Nur en laŭkaŭze homa, sed iomete teknika terminoj, preni ponardopiko. 842 00:37:05,430 --> 00:37:06,346 Publiko: [inaudible]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. Malan: Bone, vi establante adresoj por via x kaj y variabloj. 845 00:37:11,080 --> 00:37:15,520 Ne tute, ĉar x kaj y estas ne variabloj en la tradicia senco. 846 00:37:15,520 --> 00:37:18,054 x kaj y estas adresoj aŭ stokos adreso. 847 00:37:18,054 --> 00:37:19,220 Do ni provu ĉi ankoraŭfoje. 848 00:37:19,220 --> 00:37:21,010 Ne malbona komenco, kvankam. 849 00:37:21,010 --> 00:37:21,510 Yeah? 850 00:37:21,510 --> 00:37:22,426 >> Publiko: [inaudible]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. Malan: Bone. 853 00:37:24,840 --> 00:37:26,173 Mi kredas ke estas iom pli pura. 854 00:37:26,173 --> 00:37:28,630 Deklarante du punteros, du entjeroj. 855 00:37:28,630 --> 00:37:30,150 Kaj ni vokas ilin x kaj y. 856 00:37:30,150 --> 00:37:32,790 Aŭ se oni devis desegni tion kiel bildo, denove, 857 00:37:32,790 --> 00:37:36,410 memoras tute simple ke ĉiuj ni faras kun tiu unua linio 858 00:37:36,410 --> 00:37:39,690 skizas skatolo ŝatas ĉi, kun iuj rubo valoron en ĝi, 859 00:37:39,690 --> 00:37:41,920 kaj nomante ĝin X, kaj tiam alian skatolon kiel tiu, 860 00:37:41,920 --> 00:37:43,880 kun iuj rubo valoro en ĝi, nomante ĝin y. 861 00:37:43,880 --> 00:37:45,810 Ni deklaras du punteros kiu finfine 862 00:37:45,810 --> 00:37:47,860 konservos la adreso de int. 863 00:37:47,860 --> 00:37:49,170 Do jen ĉio tie. 864 00:37:49,170 --> 00:37:53,290 >> Do kiam Binky faris tion, la argilo simple rigardis kiel tiu. 865 00:37:53,290 --> 00:37:55,350 Kaj Nick ĝuste speco de envolvis la sagojn 866 00:37:55,350 --> 00:37:57,590 kvazaŭ ili ne montras ie precipe, ĉar ili estas nur 867 00:37:57,590 --> 00:37:58,250 rubo valoroj. 868 00:37:58,250 --> 00:38:01,670 Ili ne eksplicite inicializado ie en aparta. 869 00:38:01,670 --> 00:38:03,980 >> Nun la sekva linio kodo, revokon, estis jena. 870 00:38:03,980 --> 00:38:07,510 Do en laŭkaŭze uzantamika, sed iu teknika angla, 871 00:38:07,510 --> 00:38:09,790 kio estas tiu linio de kodo faras? 872 00:38:09,790 --> 00:38:10,391 Yeah? 873 00:38:10,391 --> 00:38:11,333 >> Publiko: [inaudible]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. Malan: Perfekta. 876 00:38:13,950 --> 00:38:17,016 Ĝi atribuante la eron de la memoro kiu estas la grandeco de int. 877 00:38:17,016 --> 00:38:18,140 Kaj tio estas la duono de la respondo. 878 00:38:18,140 --> 00:38:20,056 Vi respondis dekstre duono de la esprimo. 879 00:38:20,056 --> 00:38:22,473 Kio okazas en la maldekstra flanko de la egala signo? 880 00:38:22,473 --> 00:38:22,972 Yeah? 881 00:38:22,972 --> 00:38:24,814 Publiko: Kaj atribuas al la variablo x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. Malan: Kaj atribuas al la variablo x. 883 00:38:27,690 --> 00:38:31,650 Do por recap, dekstra flanko atribuas sufiĉa memoro por stoki int. 884 00:38:31,650 --> 00:38:34,150 Sed malloc specife Revenas la adreso 885 00:38:34,150 --> 00:38:37,270 de tiu bloko de memoro, kiun vi havas nur proponis prenas stokitaj en x. 886 00:38:37,270 --> 00:38:42,560 >> Do kio Nick faris lastan fojon kun Binky estas Li trenis ke puntero ekstere, argilon, 887 00:38:42,560 --> 00:38:46,820 atentigi nun blankan eron de memoro kiu estas egala al la grandeco de int. 888 00:38:46,820 --> 00:38:49,360 Kaj efektive, tio signifis reprezenti kvar bajtoj. 889 00:38:49,360 --> 00:38:55,310 >> Nun, la sekvanta linio de kodo faris tion, stelo x prenas 42. 890 00:38:55,310 --> 00:38:58,530 Do 42 estas simpla en la dekstra flanko, signifo de la vivo. 891 00:38:58,530 --> 00:39:00,500 Maldekstra flanko, stelo x signifas kion? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Tio tro havu gone-- tio OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> Publiko: Esence, iru al la [inaudible] 896 00:39:06,875 --> 00:39:07,750 DAVID J. Malan: Bone. 897 00:39:07,750 --> 00:39:08,760 Publiko: [inaudible]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. Malan: Ĝuste. 899 00:39:09,760 --> 00:39:11,979 Maldekstra flanko signifas iri al x. 900 00:39:11,979 --> 00:39:12,520 x estas adreso. 901 00:39:12,520 --> 00:39:15,520 Estas kiel 33 Oxford Street, aŭ Ox1. 902 00:39:15,520 --> 00:39:18,690 Kaj stelo x signifas iri al tiu alparoli kaj metis kio? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Do ja, tio estas ĝuste kion Nick faris. 905 00:39:21,290 --> 00:39:23,740 Li komencis kun pretere, esence, mense 906 00:39:23,740 --> 00:39:26,270 indikante fingro x, sekvante la sagon 907 00:39:26,270 --> 00:39:30,670 la blanka skatolo sur la dekstra mano flanko, kaj metante la numero 42 tie. 908 00:39:30,670 --> 00:39:34,120 Sed tiam tio akiris iom danĝera, ĉu ne? 909 00:39:34,120 --> 00:39:35,860 Binky la perdonta sian kapon. 910 00:39:35,860 --> 00:39:39,465 >> Stelo y egalas 13, malbona sorto, ĝi signifas kion? 911 00:39:39,465 --> 00:39:43,620 Do stelo y signifas iri al la adreso en y. 912 00:39:43,620 --> 00:39:45,630 Sed kio estas la adreso en y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Bone, ĝi estas rubo valoro, ĉu ne? 915 00:39:49,440 --> 00:39:50,800 Mi tiris ŝin kiel demandosigno. 916 00:39:50,800 --> 00:39:54,850 Noĉjo tiris ĝin kiel kurbigitaj sago. 917 00:39:54,850 --> 00:39:59,600 Kaj kiam vi provas fari stelo y, dirante iri tien, 918 00:39:59,600 --> 00:40:03,872 sed ne ekzistas leĝa adreso, estas iuj blufa situo, 919 00:40:03,872 --> 00:40:05,080 la programo tuj frakasi. 920 00:40:05,080 --> 00:40:08,580 Kaj Binky kapo tuj flugi for tie, kiel ĝi faris. 921 00:40:08,580 --> 00:40:12,130 >> Do, en la fino, tiu programo Estis nur plata el difekto. 922 00:40:12,130 --> 00:40:13,540 Estis kalesxo programo. 923 00:40:13,540 --> 00:40:14,760 Kaj ĝi devis esti riparita. 924 00:40:14,760 --> 00:40:18,260 Kaj la sola maniero, vere, ripari ĝin estus, ekzemple, tiu linio, 925 00:40:18,260 --> 00:40:21,010 kiun ni eĉ ne atingas, ĉar la programo frakasis tro frue. 926 00:40:21,010 --> 00:40:26,170 Sed se ni devis ripari tion, kio efekto faras fari y egala x havas? 927 00:40:26,170 --> 00:40:30,010 Nu, tio esence antaŭ y je ajn valoro x fingromontrante. 928 00:40:30,010 --> 00:40:32,430 >> Do Noĉjo historio, aŭ Binky historio, ambaŭ 929 00:40:32,430 --> 00:40:34,640 x kaj y oni fingromontrante la blanka chunk de memoro, 930 00:40:34,640 --> 00:40:38,300 tiel ke, fine, kiam vi ĉu star y egalas 13 denove, 931 00:40:38,300 --> 00:40:43,080 vi finas metante 13 la taŭga loko. 932 00:40:43,080 --> 00:40:47,640 Do ĉiuj ĉi tiuj linioj estas perfekte legitima, krom ĉi tiu, 933 00:40:47,640 --> 00:40:51,730 kiam okazis antaŭ vi fakte atribuis y iu valoro. 934 00:40:51,730 --> 00:40:54,290 >> Nun dankeme, vi ne devas rezoni per ĉiuj 935 00:40:54,290 --> 00:40:56,560 de tiuj specoj de aferoj en via propra. 936 00:40:56,560 --> 00:40:59,310 Lasu min kaj malfermu supren terminalfenestro tie 937 00:40:59,310 --> 00:41:03,050 kaj malfermu, por momento, super mallonga programo kiu 938 00:41:03,050 --> 00:41:04,360 ankaŭ estas speco de sencela. 939 00:41:04,360 --> 00:41:05,152 Ĝi estas malbela. 940 00:41:05,152 --> 00:41:06,610 Ne atingi ion utilan. 941 00:41:06,610 --> 00:41:10,180 Sed tio pruvas temoj de memoro, do ni rigardu. 942 00:41:10,180 --> 00:41:11,830 >> Artikolo, súper simpla. 943 00:41:11,830 --> 00:41:14,830 Ĝi ŝajne nomas funkcio, f, kaj tiam revenas 0. 944 00:41:14,830 --> 00:41:16,310 Estas speco de malfacile salato ĉi supre. 945 00:41:16,310 --> 00:41:18,540 Do Ĉefa estas sufiĉe bona, tiel for. 946 00:41:18,540 --> 00:41:20,100 >> Do f estas problema. 947 00:41:20,100 --> 00:41:22,120 Kaj simple ne metis multan penado en enoficigi ĝin 948 00:41:22,120 --> 00:41:23,990 tie, teni la fokuson sur la kodon. 949 00:41:23,990 --> 00:41:25,740 f havas du liniojn. 950 00:41:25,740 --> 00:41:27,610 Kaj ni vidos kio nun okazas. 951 00:41:27,610 --> 00:41:29,840 Tiel unuflanke here-- kaj lasu min fari 952 00:41:29,840 --> 00:41:32,680 tio kongruas kun la antaŭa example-- unuflanke, 953 00:41:32,680 --> 00:41:35,830 la maldekstra flanko estas faras kion, en la angla? 954 00:41:35,830 --> 00:41:36,493 Ĝi is-- 955 00:41:36,493 --> 00:41:37,701 Publiko: Kreante montrilo. 956 00:41:37,701 --> 00:41:40,830 DAVID J. Malan: Kreante montrilo al int kaj nomante lin x. 957 00:41:40,830 --> 00:41:43,789 Do ĝi estas kreante unu el tiuj skatoloj Mi dauxre utiligante la ekrano táctil. 958 00:41:43,789 --> 00:41:45,913 Kaj nun, je la dekstra mano flanko, malloc, kompreneble, 959 00:41:45,913 --> 00:41:47,420 estas atribuo eron de memoro. 960 00:41:47,420 --> 00:41:49,989 Kaj ĝuste por esti klara, kiom multan memoron estas ŝajne 961 00:41:49,989 --> 00:41:52,030 atribuo, se vi nur speco de fari la math tie? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Do estas 40 bajtoj. 964 00:41:54,040 --> 00:41:57,400 Kaj mi scias, ke nur ĉar mi konas int, la CS50 aparaton, almenaŭ, 965 00:41:57,400 --> 00:41:58,060 Estas kvar bajtoj. 966 00:41:58,060 --> 00:41:59,610 Do 10 fojojn 4 estas 40. 967 00:41:59,610 --> 00:42:04,924 Do tiu estas stokante x, la adreso de la unua el 40 ints ke 968 00:42:04,924 --> 00:42:07,340 estis asignitaj spaco dorso, apogi, apogi, por dorso. 969 00:42:07,340 --> 00:42:08,470 >> Kaj tio estas kio estas ŝlosila pri malloc. 970 00:42:08,470 --> 00:42:11,261 Ĝi ne portas iom memoro tie, iom tie, iom cxi tie. 971 00:42:11,261 --> 00:42:14,220 Ĝi donas al vi unu pecon da memoro, contiguously, de la mastruma 972 00:42:14,220 --> 00:42:15,240 sistemon. 973 00:42:15,240 --> 00:42:18,500 >> Nun kio pri tio, x krampo 10 egalas 0? 974 00:42:18,500 --> 00:42:19,470 Arbitra linio de kodo. 975 00:42:19,470 --> 00:42:21,100 Ne atingi ion utilan. 976 00:42:21,100 --> 00:42:26,128 Sed estas interesa, ĉar x krampo 10--? 977 00:42:26,128 --> 00:42:26,628 Yeah? 978 00:42:26,628 --> 00:42:27,912 >> Publiko: [inaudible]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. Malan: x krampo 10 Ne devas esti nula. 980 00:42:30,500 --> 00:42:35,070 La nula detalo nur eniras en ludo kun kordoj, fine de ŝnuro. 981 00:42:35,070 --> 00:42:36,700 Sed bona penso. 982 00:42:36,700 --> 00:42:39,615 >> Kiom granda estas tiu tabelo, eĉ kvankam mi asignitaj 40 bitokoj? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Estas 0 tra naŭ, dekstra? 985 00:42:43,690 --> 00:42:45,120 Ĝi estas 10 ints, entute. 986 00:42:45,120 --> 00:42:48,790 40 bitokoj, sed 10 ints, indeksita 0 tra 0. 987 00:42:48,790 --> 00:42:50,930 >> Do kio estas tiu x krampo 10? 988 00:42:50,930 --> 00:42:53,090 Tie fakte iuj nekonata rubo valoro. 989 00:42:53,090 --> 00:42:54,780 Estas memoro kiu ne apartenas al mi. 990 00:42:54,780 --> 00:42:59,650 Mi ne devas tuŝi ke bajto nombro 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Mi iras iomete tro multe. 992 00:43:01,420 --> 00:43:04,490 >> Kaj efektive, se mi kuros ĉi programo, ĝi povus tre bone frakasi. 993 00:43:04,490 --> 00:43:05,790 Sed kelkfoje, ni ricevos bonŝanca. 994 00:43:05,790 --> 00:43:07,706 Kaj tiel simple pruvi this-- kaj sincere, 995 00:43:07,706 --> 00:43:11,000 vi neniam scias al vi ĉu it-- ni kuras ĉi. 996 00:43:11,000 --> 00:43:12,480 Ĝi fakte ne frakasi. 997 00:43:12,480 --> 00:43:15,032 >> Sed se mi tion, por Ekzemple, esti kiel 1.000, 998 00:43:15,032 --> 00:43:16,740 fari ĉi vere intenca, vidu 999 00:43:16,740 --> 00:43:18,710 se ni povas akiri ĝin frakasi tiu tempo. 1000 00:43:18,710 --> 00:43:20,070 OK, ne frakasi. 1001 00:43:20,070 --> 00:43:22,600 Kiom proksimume 100,000? 1002 00:43:22,600 --> 00:43:25,000 Ni refari ĝin, kaj nun rerun ĝin. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Phew. 1005 00:43:25,960 --> 00:43:26,460 Bone. 1006 00:43:26,460 --> 00:43:29,090 Do ŝajne, denove, tiuj segmentoj de memoro, por tiel diri, 1007 00:43:29,090 --> 00:43:32,660 estas prudente granda, do ni povas akiri bonŝanca denove kaj denove. 1008 00:43:32,660 --> 00:43:36,510 Sed eventuale, kiam vi ricevas ridindan kaj vere iru malproksimen sur la ekrano, 1009 00:43:36,510 --> 00:43:39,120 vi kuntusxigxu memoro kiu vere, vere ne apartenas al vi. 1010 00:43:39,120 --> 00:43:40,870 >> Sed sincere, tiuj specojn de bugs iras 1011 00:43:40,870 --> 00:43:43,020 esti pli kaj pli forta elkompreni sur via propra. 1012 00:43:43,020 --> 00:43:47,880 Sed dankeme, kiel programistoj, ni havas iloj kiuj nin permesas fari tion por ni. 1013 00:43:47,880 --> 00:43:50,140 Do tio estas, eble, unu de la plej malbelaj programoj, 1014 00:43:50,140 --> 00:43:52,060 eĉ pli malbela ol GDB eligo. 1015 00:43:52,060 --> 00:43:55,670 Sed ĝi ĉiam havas linion aŭ du kiu estas súper utila. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind estas programo kiu helpas Vi ne elpurigi programon, per, 1017 00:44:00,310 --> 00:44:03,500 sed trovi memoro-rilata problemoj, specife. 1018 00:44:03,500 --> 00:44:07,590 Ĝi aŭtomate kuri vian kodon por vi kaj serĉi almenaŭ du aferoj. 1019 00:44:07,590 --> 00:44:10,680 Unu, vi faris ion akcidenta kiel takto memoro 1020 00:44:10,680 --> 00:44:11,980 kiu ne apartenas al vi? 1021 00:44:11,980 --> 00:44:13,590 Ĝi helpos vin trovi tiujn kazojn. 1022 00:44:13,590 --> 00:44:15,710 >> Kaj du, ĝi helpos Vi trovos iun nomita 1023 00:44:15,710 --> 00:44:19,270 memoro fugoj, kiun ni havas tute ignoris, naive, 1024 00:44:19,270 --> 00:44:21,380 por iu tempo kaj felicxe. 1025 00:44:21,380 --> 00:44:23,140 Sed rezultu, ĉiuj tiu tempo, kiam 1026 00:44:23,140 --> 00:44:26,620 vi nomas getString en tiom multaj de niaj programoj, 1027 00:44:26,620 --> 00:44:28,930 vi demandas la mastruma sistemo por memoro, 1028 00:44:28,930 --> 00:44:32,070 sed vi havas neniun memoron de iam donante 1029 00:44:32,070 --> 00:44:36,169 reen, farante unalloc aux libera, kiel ĝi nomiĝas. 1030 00:44:36,169 --> 00:44:37,960 Ne, ĉar ni neniam demandis vin fari tion. 1031 00:44:37,960 --> 00:44:41,250 >> Sed ĉiu ĉi tiu tempo, la programoj vi estis skribante en C 1032 00:44:41,250 --> 00:44:43,800 ili iris filtrante memoro, demandante la mastruma 1033 00:44:43,800 --> 00:44:46,190 sistemo por pli kaj pli memoro por kordoj kaj whatnot, 1034 00:44:46,190 --> 00:44:47,870 sed neniam cedi ŝin reen. 1035 00:44:47,870 --> 00:44:50,080 Kaj nun jen estas iom de simplificación, 1036 00:44:50,080 --> 00:44:53,550 sed se vi iam kuri via Mac aŭ via PC faras sufiĉe tempo, malfermo 1037 00:44:53,550 --> 00:44:55,790 multaj programoj, eble fermante programoj, 1038 00:44:55,790 --> 00:44:57,795 kaj eĉ se viaj komputilo ne frakasis, 1039 00:44:57,795 --> 00:45:01,690 ĝi Fariĝas tiel malrapida, kvazaŭ ĝi vere 1040 00:45:01,690 --> 00:45:04,290 uzanta multe da memoro aŭ rimedoj, kvankam, 1041 00:45:04,290 --> 00:45:06,070 Se vi ne estas ankoraŭ tuŝi la klavaro, 1042 00:45:06,070 --> 00:45:10,430 kiu povus be-- sed ne always-- povis esti, ke la programoj vi uzas 1043 00:45:10,430 --> 00:45:11,920 havas mem memoro fugoj. 1044 00:45:11,920 --> 00:45:15,645 Kaj ili gardu petante la VIN por pli kaj pli memoro, sed forgesante pri tio, 1045 00:45:15,645 --> 00:45:18,470 ne vere uzas ĝin, sed do prenante memoro for 1046 00:45:18,470 --> 00:45:20,500 de aliaj programoj kiuj povus voli ĝin. 1047 00:45:20,500 --> 00:45:23,940 Do tio estas komuna klarigo. 1048 00:45:23,940 --> 00:45:25,940 Nun tie estas kie Valgrind La eligo estas tute 1049 00:45:25,940 --> 00:45:29,290 atroz al tiuj malpli kaj pli komforta por egala. 1050 00:45:29,290 --> 00:45:32,690 Sed la interesa stuff estas tuj ĉi tie. 1051 00:45:32,690 --> 00:45:37,060 Oni diras al mi nevalidan registran de grandeco kvar okazas en tiu programo, 1052 00:45:37,060 --> 00:45:40,640 precipe, ĉe linio 21 de memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Se mi iras al linio 21, hm, tie ja estas malvalida registran de grandeco kvar. 1054 00:45:45,450 --> 00:45:46,250 Kial grandeco kvar? 1055 00:45:46,250 --> 00:45:49,500 Nu, ĉi number-- kaj ĝi povus esti anything-- estas int. 1056 00:45:49,500 --> 00:45:50,450 Do estas kvar bajtoj. 1057 00:45:50,450 --> 00:45:52,550 Do mi metis kvar bajtoj kie ne apartenas. 1058 00:45:52,550 --> 00:45:55,080 Tion Valgrind vere diri al mi. 1059 00:45:55,080 --> 00:45:57,600 Plie, ĝi donos ankaŭ diru al mi, kiel ni vidos, 1060 00:45:57,600 --> 00:46:01,490 kiel vi kuros ĉi en futura pset, se kaj kiam vi filtris memoro, kiu ja 1061 00:46:01,490 --> 00:46:05,300 Mi havas, cxar mi vokis malloc, sed mi ne vere 1062 00:46:05,300 --> 00:46:08,010 nomita, en ĉi tiu kazo, libera, kiun ni eventuale vidos 1063 00:46:08,010 --> 00:46:09,830 estas la malo de malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Do nun, mi pensas, fina ekzemplo. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Do ĉi tiu estas iom pli arcane, sed estas eble 1068 00:46:16,690 --> 00:46:19,180 la plej granda kialo por atenti pri memoro, 1069 00:46:19,180 --> 00:46:24,490 kaj la kialo ke multaj programoj kaj / aŭ retserviloj, gxis la nuna tago, 1070 00:46:24,490 --> 00:46:28,200 estas transprenita de malbonaj infanoj ie sur la interreto kiu estas iel 1071 00:46:28,200 --> 00:46:33,390 sendo blufa pakojn por via servilo provas kompromisi viaj kontoj, 1072 00:46:33,390 --> 00:46:36,420 aŭ preni viajn datumojn aŭ simple Ĝenerale transpreni maŝino. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, kiel la nomo sugestas, per 1074 00:46:38,910 --> 00:46:40,740 disversxigxinta ne int, sed buffer. 1075 00:46:40,740 --> 00:46:43,490 Kaj buffer estas nur ornama metodo diri ĝi estas aro da memoro. 1076 00:46:43,490 --> 00:46:46,710 >> Kaj ja, mi nomas ŝnureto antaŭ buffer, anstataŭ s. 1077 00:46:46,710 --> 00:46:49,234 Ĉar se estas buffer, kiel en la YouTube senso, 1078 00:46:49,234 --> 00:46:52,400 aŭ ajna tempo vi rigardante la video, vi eble vidis la vorton buffering, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, punkto. 1080 00:46:53,040 --> 00:46:54,240 Estas nekredeble ĝena. 1081 00:46:54,240 --> 00:46:55,990 Kaj tio nur signifas ke via video ludanto 1082 00:46:55,990 --> 00:46:58,710 provas elŝuti lotojn de bajtoj, multaj bajtoj 1083 00:46:58,710 --> 00:47:00,170 el video de la interreto. 1084 00:47:00,170 --> 00:47:02,920 Sed estas malrapida, do ĝi estas klopodi elŝuti faskon de ili 1085 00:47:02,920 --> 00:47:06,430 plenigi buffer, ujo, por ke Vi havas sufiĉe da bitokoj ke ĝi povas tiam 1086 00:47:06,430 --> 00:47:09,174 montri vin la vídeo, sen paŭzante senĉese. 1087 00:47:09,174 --> 00:47:11,340 Sed rezultu, vi povas havas buffer por tiu granda. 1088 00:47:11,340 --> 00:47:15,710 Sed provu meti ĉi multe datumojn ĝin, kaj tre malbonaj aferoj povas okazi. 1089 00:47:15,710 --> 00:47:22,780 Do ekzemple, ni rigardu ĉi lasta teaser de ekzemplo. 1090 00:47:22,780 --> 00:47:24,720 Tio estas alia programo ke, unuavide, 1091 00:47:24,720 --> 00:47:26,540 ne fari ion súper utila. 1092 00:47:26,540 --> 00:47:29,590 Ĝi ricevis Ĉefa funkcio kiu nomas tiun funkcion, f. 1093 00:47:29,590 --> 00:47:36,640 Kaj tiu funkcio, f, ĝis tie, havas oni char tabelo, nomita c, de grandeco 12. 1094 00:47:36,640 --> 00:47:39,340 Kaj tiam ĝi estas uzanta ĉi nova funkcio nomita strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Ĝi rezultas ke, per tiu simpla, simpla linio de kodo, nur du linioj, 1097 00:47:45,190 --> 00:47:49,130 ni faris mian tutan programon, kaj do mia tuta komputilo, 1098 00:47:49,130 --> 00:47:54,000 kaj mia uzantokonto kaj mia malmola forpelos potenciale vundebla al iu 1099 00:47:54,000 --> 00:47:58,170 kiu scias kaj estas sufiĉe bona por kuri tiu programo kun certa komandlinio 1100 00:47:58,170 --> 00:47:58,900 argumento. 1101 00:47:58,900 --> 00:48:03,400 En aliaj vortoj, se tiu malbona ulo metas ene de argvargv [1] tajpante 1102 00:48:03,400 --> 00:48:08,750 ĉe la klavaro tre speciale laboritaj kordo, ne abc, 123, sed esence, 1103 00:48:08,750 --> 00:48:15,180 duuma simbolojn kiuj reprezentas plenumebla kodo, programo kiu li aŭ ŝi verkis, 1104 00:48:15,180 --> 00:48:19,190 kun tiu simpla programo, kiu estas reprezentanto da programoj 1105 00:48:19,190 --> 00:48:23,610 ke estas simile vundebla, daresay, li aŭ ŝi povas finfine forigi ĉiujn 1106 00:48:23,610 --> 00:48:26,680 la dosieroj sur mia malmola disko, ricevi palpebrumante prompto tiel ke li aŭ ŝi povas 1107 00:48:26,680 --> 00:48:30,170 tajpi komandojn sur ilia propra, retmesaĝi ĉiuj dosieroj al mi. 1108 00:48:30,170 --> 00:48:34,660 Io, kiun mi povas fari, li aŭ ŝi povas fari kun tiu kodo. 1109 00:48:34,660 --> 00:48:36,575 >> Ni ne tute solvi ĉi ankoraŭ. 1110 00:48:36,575 --> 00:48:38,700 Kaj fakte, ĝi tuj engaĝi iom foton 1111 00:48:38,700 --> 00:48:41,470 kiel tiu, kiun ni baldaŭ venos kompreni ĉiuj bonaj. 1112 00:48:41,470 --> 00:48:44,480 Sed por hodiaŭ, ni finos la kio estas, mi esperas, iomete pli 1113 00:48:44,480 --> 00:48:48,360 komprenebla xkcd ŝerco, ĝis ni rekomencos la venontan fojon. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Bone. 1116 00:48:51,600 --> 00:48:53,446 Vidi vin merkredon. 1117 00:48:53,446 --> 00:48:54,754 >> [MUZIKO Ludante] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: Kaj nun, profunda pensoj, per Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Memoro estas kiel salti en amaso de oraj folioj en dimanĉo posttagmeze. 1121 00:49:04,770 --> 00:49:09,000 Vento, ĵetanta vian hair-- ho, mi perdos la tagoj when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Ridado] 1124 00:49:12,650 --> 00:49:13,750