[MUZIKO Ludante] DAVID J. Malan: Bone. Jen CS50. Kaj tio estas la komenco de la semajno 5. Kaj kiel vi eble rimarkis, kelkaj el la materialo fariĝas iom pli kompleksa, la iom pli densa. 

Kaj ĝi estas tre facila, precipe se vi estis la kutimo por iu tempo, esti provante scribble malsupren plej ion ni faras, ni diras en klaso. Sed rimarki, ke ne estas eble la idealo pedagogia alproksimiĝo por lerni ĉi tiu tipo de materialo, kaj materialoj pli ĝenerale. Kaj tial ni ĝojas anonci ke CS50 propra Gheng Gong komencis prepari kanona aro de notoj por la kurso, esperante kio estas ke, oni, tiuj ne nur servas kiel referenco kaj rimedo por revizii materialo kaj tuj reen tra materialo kiu povus havi eskapis vi la unuan fojon ĉirkaŭe, sed ankaŭ tiel, ke viaj kapoj povas esti pli supren ol malsupren, kiam venas la tempo por prelegi, por ke vi povu partopreni pli penseme, kiel kontraste al pli scribbly. 

Kun kiu diris, kion vi trovos en La retejo estas tiaj dokumentoj kiel ĉi. Kaj rimarki, ĉe maldekstra supera, estas Ne nur enhavtabelon, sed ankaux tempon kodoj kiuj Mi tuj salti vin al la konvena parto en la video online. Kaj kio Chang tie faris estas, esence, dokumentita kio okazis en tiu aparta prelego. Kaj multaj el la prelegoj estas Jam enreta nun kun ĉi retadreso. Kaj ni daŭrigos sendi la reston de tiuj por finoj de ĉi tiu semajno, do utiligi tiun rimedon. 

Do sen pli, ni komencis senŝeligi reen la mantelon kiu estis kordo por iu tempo. Kaj kion ni diru ŝnuro efektive estas pasintsemajne? Do char stelo. Kaj char stelo, nu, kio cxu tio vere signifas? Nu, ĉiuj ĉi tempo, se ni estis nomante funkcio, kiel getString kaj provizon la tn reveno valoro de getString en variable-- ĝi nomiĝas s tipo string-- ni estis skribante la linio de kodo tie supre. Kaj ĝi estas nur kiam mi vidas mia manskribo Pligrandigita tie mi rimarkas kiom atroz tio. 

Tamen, ni supozu ke, sur la dekstra flanko Estas, tamen, akceptebla priskribo de kio estas iris sur ĉiuj ĉi tempo kun getString. getString kompreneble ricevas kordo. Sed kion signifas tiu vere signifas? Ĝi signifas metas eron de memoro de la mastruma sistemo nomante funkcio, nomis malloc. Sed pli sur tiu poste. Kaj tiam popolas ke eron de memoro kun la literoj de la uzanto havas tajpita en, sekvita, kompreneble, nula karaktero, aŭ backslash nulo je la fino. 

Dume, sur la maldekstra flanko de tiu rakonto, ĉiu ĉi tiu tempo, ni estis deklari variablon, kiel s. Kaj tiu variablo estas kio nun komencos nomi puntero. Ne skatolo ene de kiu Ni metis la ŝnuron, Daven, per, sed prefere ni metas en tiu kvadrato boksi maldekstre kion ekzakte? Yeah? 

Aŭdienco: La adreso de kie ĝi estas lokita en la memoro. 

DAVID J. Malan: Ĝuste. La adreso de kie Daven situas en memoro. Kaj ne kie ĉiuj Daven situas, per, sed specife la adreso de kio? Yeah? 

Publiko: Unua karaktero. 

DAVID J. Malan: La unua karaktero en Daven, kiuj, en tiu kazo, Mi proponis estis arbitre kaj unrealistically 1an Ox1, kiu signifas nur la deksesuma nombro de 1. Sed ĝi estas probable tuj esti multe pli granda nombro ke ni povu ĉerpi per 0x kiel prefikso, reprezentante deksesuma karaktero. Kaj ĉar ni ne bezonas scii kie la resto de la karakteroj de Daven estas, pro kio simpla dezajno decido kiu estis farita antaŭ multaj jaroj? Yeah? 

Publiko: Deklivo 0. DAVID J. Malan: Jes, ĝuste. La backslash 0 permesas, kvankam en lineara tempo, tra la ŝnuroj, marŝi de maldekstre al dekstre, kun por ciklo, aŭ dum buklo, aŭ io simila kiu, kaj determini, ho, tie Estas la fino de ĉi tiu aparta kordo. Do, kun nur la adreson la komenco de kordo, ni povas aliri la totalo de ĝin, ĉar ĉiuj ĉi tempo, ŝnuro ĵus estis char stelo. 

Do estas certe fajna daŭrigi uzante la CS50 biblioteko kaj tiu abstraktaĵo tiel diri, sed ni komencos vidi ĝuste kio daŭras sub ĉi tiu tuta tempo. Do vi eble memoras tiun ekzemplon, tro, de lasta fojo, kompari 0, kiu fakte ne komparas. Sed ni komencis solvi ĉi. 

Sed kiel eble refresher, eble mi interesos iun en rozkoloran elefanton hodiaŭ, ankaŭ farita de Chang? Kion pri vi antaux? [Inaudible]. Venu supren. 

Kaj dume, kiel vi venis, ni konsideri por ĝuste momento kion tiu kodo estis reale faras. Ĝi deklaras du variabloj supren supro, s kaj t kaj vokas getString. Tiu ne estas tre uzantamika programo, ĉar ne diros al vi kion fari. Sed ni nur supozi ni centrante en la suka parto. Kaj tiam ni faros, se s egalas egalas t, ĝi devus diri printf, vi tajpis la samon. Saluton. Kio estas via nomo? 

Janelle: Janelle. DAVID J. Malan: Janelle, agrable renkonti vin. Do via defio je manon por tiu elefanto estas unue cxerpi ni bildon de kio estas estante reprezentita en tiuj unuaj du linioj. Do s kaj t eblus reprezentitaj kiel sur la ekrano? Kaj vi povas simple desegni ĝin per vian fingron sur tiu granda ekrano. 

Do ekzistas du duonoj por ĉiu flanko de tiu ekvacio. Do tie estas s sur la maldekstra, kaj tiam getString dekstre. Kaj tiam ekzistas t maldekstre kaj tiam getString dekstre. Do kiom eble ni komencu desegni bildon ke reprezentas kio okazas tie en la memoro, vi dirus? Kaj lasu min lasu vin klarigi kion vi faras dum vi iros. 

Janelle: OK. Nu, unue, ĝi estus demandi vin akiri la enigo kordoj. Kaj ĝi store-- ho bedaŭras. DAVID J. Malan: Bone. Bonan. Kaj tio nomiĝas kio? Ho, OK. Konservu iras. Mi ne intencis interrompi. Janelle: Pardonu. Do ĝi farus input ĝin la adreso of-- ne certas. Mi ne povas ekzakte memori la numeron, sed mi kredas, ĝi ekde 0. 

DAVID J. Malan: Tute bone, ĉar mi faris la nombroj ĝis, tial ne estas ĝusta respondo. 

Janelle: Komencante kun la 0 arko. 

DAVID J. Malan: Bone, do ero 0. Certe. 

Janelle Kaj tiam se estis kiel nur du-letter-- 

DAVID J. Malan: Bone, reen al vi. 

Janelle: Do ero 0, kaj tiam elemento 1 aŭ elementon 2. DAVID J. Malan: Kaj kia peco de la bildo vi desegni nun? La alvoko al getString? Aŭ la deklaro de s? 

Janelle: La deklaro de s, mi kredas. Ho, la getString, ĉar ĝi havus esti inputted en ĉiu [? areo. ?] 

DAVID J. Malan: Bone. Ĝuste. Eĉ kvankam ĉi efike Revenas tabelo, revokon, kiam ni reiros cxeno, ni povas indekson en tiu ŝnuro uzante 01 kaj 2. Teknike, tiuj estas verŝajne reprezentita de individuaj adresoj, sed tio estas bone. 

Do supozu, se mi povas nur rapide plusendu al kie ni cxesis lasta fojo, se unu el la kordoj estis g b e, backslash 0, tio reprezentas Gabe La enigo, kiom eble ni reprezentas s nun? Se ĉi tiu estas la memoro tio estis redonita de getString? 

Janelle: Ĉu estus reprezentita de arko? 

DAVID J. Malan: Per arko? Nu, ne. Ni nur diras, pictóricamente, lasu min nur antaŭeniri kaj proponi ke, se tiu estas s, ĉi estas la reveno valoro de getString. Kaj vi nomis tion kiel 0, 1, 2, kiu estas perfekte racia, ĉar ni povas indekson en la kordo, kiel tia. Sed nur por esti konsekvenca kun lasta momento, lasu min iri antaŭen kaj arbitre proponas ke tiu estas adreso 1, ĉi tiu estas adreso 2 tiu estas adreso 3, kaj tiel plu. Kaj tiel, nur por esti súper klara, kio okazas iri s kiel rezulto de tiu unua linio de kodo, vi dirus? 

Janelle: Adreso 1? 

DAVID J. Malan: Ĝuste. Do trakti 0x1. Kaj dume, lasu min antaŭeniri kaj duobligi tre de kion vi faris kaj aldoni mian propran t tie. Se mi tajpas Gabe denove, duan fojon, kiam invitite getString, kie, kompreneble, estas Gabe tuj iros? Nu, presumably-- 

Janelle: Kiel ĉi tie? DAVID J. Malan: Jes. Janelle: Aŭ ĝi estas ankaŭ en la sama skatolojn? DAVID J. Malan: Lasu min proponi, yeah, akurate, tiel en tiuj pliaj skatoloj. Sed kio estas klavo nun estas, ke eĉ kvankam mi eltiris tiujn belajn proksime together-- 0x1, tiu Estas 0x2-- reale, ĉi nun eble adreso 0x10, Ekzemple, kaj 0x11 kaj 0x12, ks. Kaj tiel, se tio estas la kazo, kio tuj finos tie en t? 

Janelle: 0x10? DAVID J. Malan: Ĝuste. Do 0x10. Kaj nun, lasta demando. Vi, por for, devis prilabori la plej malfacila por elefanto tiom. Per nun, se mi elsxiros kodo denove, kiam mi faras, en linio tri, se s egalas egalas t, kion mi reale Komparante ke ni eltiris ĉi tie? 

Janelle: La du adresojn? DAVID J. Malan: Ĝuste. Do mi diris s egala egala al t? En aliaj vortoj, estas 1 egala egala al 10? Kaj kompreneble, la evidenta respondo nun estas, neniu. Kaj tiu programo estas finfine tuj presi kio, ĉu vi diras? 

Janelle: Ĉu estus, vi tajpis la saman aferon? 

DAVID J. Malan: Do se s 1 kaj t estas 10? 

Janelle: Vi tajpis malsamaj aĵoj. 

DAVID J. Malan: Ĝuste. Vi tajpis malsamaj aĵoj. Bone. Do ĉirkaŭvojon de aplaŭdoj, se ni povus, tie. [Aplaŭdo] Tio estis dolora. Mi scias. Nicely farita. Do nun ni vidu, se ni ne povas turmentus aparte kio la embaraso estis. Kaj kompreneble, kiam ni fiksis this-- kiun mi nun reprezentas en green-- ni faris paron de plibonigoj tie. Unue, ĝuste kiel prudento kontrolu, mi unue kontrolas se s egalas nula kaj t egalas nula. Kaj ĝuste por esti klara, kiam potenco s aŭ t nula en kodo kiel ĉi tiu? Kiam eble s aŭ t esti nula. Yeah? 

Publiko: [inaudible]. 

DAVID J. Malan: Ĝuste. Se la ŝnuro kiun la uzanto tajpita en estas tro longa por persvadi en memoro, aŭ iu weird angulo kazo kiel tiu, getString, kiel ni vidos, laŭvorte hodiaŭ, en lia dokumentado, diras revenos rifuzis speciala gardostaranto valoro, aŭ simple speco de speciala simbolo kiuj signifas iun iris malbone. Do ni volas kontroli ke, ĉar ĝi rezultas ke nula estas tre danĝera valoro. 

Ofte, se vi provos fari iun kun null engaĝante function-- preter kiel enigo por instance-- domadministranto povus tre devos frakasi kaj, kun ĝi, deprenu viajn tuta programo. Do tiu tria linio nun estas nur la prudento kontrolu, eraro kontrolanta, se vi volas. Tio estas bona kutimo nun por nin al eniri ajnan tempon ni provu uzi valoro kiu povus, potenciale, nula. 

Nun, en la kvara linio tie, "Se strcmp (s, t)," bone, kio estas ke raportante al? Nu, ni diris ĉi estis tre koncize nomita funkcio por arĉinstrumenta komparo. Kaj lia celo en la vivo estas kompari lia unua argumento kontraux gxi dua, sed ne en terminoj de iliaj adresoj, kiel ni faris senintence momenton monato kun la ruĝa kodo, sed prefere kompari tiujn du kordoj en la home intuicia vojo komparante ĉi, kontraŭ tio, kontraŭ ĉi, kontraŭ tio, kaj tiam halti se kaj kiam oni aŭ ambaŭ de miaj fingroj kolizias kun backslash 0. Do iu jarojn implementado strcmp implementar por ni la funcionalidad ke ni esperis, ni estus alvenintaj per simple komparante du simplajn valorojn. 

Nun sincere, mi gardas desegno ĉiuj tiuj diversaj nombroj. Sed la realo estas, mi estis farante tiujn la tutan tempon. Kaj lasu min nur antaŭeniri kaj scribble tiuj el fari punkto kiu, fine de la tago kaj movanta antaŭen, ni ne vere tuj zorgas pri kio turnas aferoj estas reale en memoro. Do mi ne tuj eltiros tiuj specojn de nombroj tiel plu, Mi estas nur abstrakta ĉi foririnte iom pli amika kun nur sagojn. 

En aliaj vortoj, se s estas puntero, Nu, ni nur desegni ĝin, laŭvorte, kiel puntero, sago montras el al io alia, kaj ne tro maltrankviliĝu pli pri la minutia el tiuj adresoj kiuj, denove, mi formitaj ĉiuokaze. Sed ni vidos tiujn adresojn, foje, kiam elpurigi kodon. 

Nun dume, ĉi programo tien fiksa, kompreneble, ke problemo komparante tiuj du ŝnuroj. Sed ni kuris al alia problemo. Tio estis el la kopio plani lasta fojo, per Mi provis kapitaligi nur la unua gravulo en ĉeno. Sed kio estis la simptomo ni vidis lastan fojon kiam uzanto tajpas en valoro, kiel Gabe en minuskla, por s, tiam ni atribuis s en t, kiel en la tria linio tie, kaj tiam mi provis capitalizar t krampo 0? Kio estis la efiko de ŝanĝi t krampo 0 tien? 

Publikon: ĝi ŝanĝis s. 

DAVID J. Malan: Jes, Mi ŝanĝis s, tiel. Pro kio vere okazas? Nu, mi volas vidi se mi povas purigi tiun bildon, kiel sekvas. 

Se s estas, denove, la vorto g, a, b, e, backslash, 0, kaj s ni devos daŭrigi desegno kiel skatolo ĉi tie, sed ne pli adresoj. Ni haltas farante aĵojn. Ni simple desegni bildon simpligi la mondo. 

Kiam mi rakontos t kun kordo t, kiu kreas ke eron de memoro. Kvadrata okazas al esti 32 bitojn en plej komputiloj. Fakte, se vi iam aŭdis pri komputilo havante 32-bita arkitekturo, vere fancy-paroli, ke nur signifas uzas 32-bita adresoj. Kaj kiel teknika flanko, Se vi iam scivolis kial pli malnovaj komputiloj, se vi reale provis supon ilin kun multaj RAM, povis nur havi maksimuman de kvar gigabajtoj de RAM, nu tio estas ĉar, laŭvorte, via malnova komputilo povis nur rakonti kiel altan kiel 4 miliardo, 4 miliardoj bajtoj, ĉar ĝi uzas 32-bita nombroj por adresoj. 

Sed ĉiuokaze, en tiu Ekzemple, rakonto de multe pli simpla. t estas nur alia puntero, aŭ vere char stelo, alias kordo. Kaj kiel mi volas ĝisdatigi ĉi bildo nun kun tiu dua linio de kodo, post la punkto, ĝi pentras, ĝi pentras? Kiam mi faras ĉenon t egalas s punktokomo, kiel tiu ĉi bildo ŝanĝi? Yeah? 

Publiko: [inaudible]. 

DAVID J. Malan: Jes. Ĝuste. Mi ĵus metis la sagon el la t skatolon al la sama adreso, la sama unua letero en donis. Aŭ teknike, se tiu ulo estis ankoraŭ ĉe 0x1, estas kvazaŭ mi havis 0x1 tie kaj 0x1 tie. Sed denove, kiu zorgas pri la adresojn? Estas nur la ideo, ke nun importas. Do tio estas kio okazas tie. Do kompreneble, se vi faras t krampo 0, kio estas tabelo skribmaniero, de course-- kaj sincere, ĝi aspektas kiel ekzistas tabelo tien, sed nun ekzistas tiu stranga afero. Sciu, ke la lingvo de programado, C, proponas al vi tiun karakterizaĵon, per, eĉ se t estas pointer, aŭ s estas puntero, vi povas ankoraŭ uzi tiun familiara, komforta kvadrata krampo skribmaniero por iri al la unua elemento, aŭ la dua elemento, aŭ ajna elemento ke tio montrilo notas por ke, supozeble, ĝi Estas, kiel en ĉi tiu kazo, indikante en iu tabelo. 

Do kiel ni riparos tion? Sincere, ĉi tiu estas kie akiris iom blindiga unuavide. Sed ĉi tie estas nova kaj plibonigita versio. 

Do unue mi ricevas senigi de la CS50 biblioteko, nur elmontri ke s estas ja oni char stelo, simple sinonimon. Kaj t estas ankaŭ char stelo. Sed kio okazas en la dekstra flanko de tiu linio kie t estas asignita valoro? 

Kio estas malloc? Kio ĝi estas strlen? Kio estas sizeof (char)? Kial la heck faras ĉi linio rigardon tiel kompleksa? Kio ĝi faras al alta nivelo? Kio ĝi stokante en t? Yeah? Publiko: Ĝi estas atribuo de certa kvanto de memora spaco. Estas stoki, mi supozas, literojn [inaudible]. 

DAVID J. Malan: Perfekta. Perfekta. Ĝi atribuo certa kvanto de memora spaco stoki, supozeble, futura literoj. Kaj precipe, malloc Estas do reveni kio? 

Publiko: Revenante la [inaudible]? DAVID J. Malan: Ĝuste. Revenante al la adreso de tiu memoro, kio estas fantazio maniero diri, redonas la adreson de la unua bitoko de tiu memoro. La onus estas ĉe mi rememori kiom memoro mi reale asignitaj aŭ demandis malloc por. 

Nun kiom estas tio? Nu, eĉ se ekzistas multan krampoj tie, malloc prenas nur unu argumenton. Kaj mi preciziganta strlen de s, tial donu mi kiel multaj bajtoj kiel estas en s, sed aldoni unu. Kial? Yeah? 

Aŭdienco: La backslash 0. DAVID J. Malan: Ĝuste. Ni devas fari iom apartan domon. Do ĉar tie estas backslash 0, prefere ni memoros tion. Alie, ni iras krei ĉenon ke ne havas tiun specialan finilo. 

Dume, nur por esti súper anal, mi havas sizeof (char) ĉiaokaze iu kuras mia kodo ne sur la CS50 aparaton, sed eble malsama komputilo tute kie signoj Estas unu bajto, per konvencio, sed du bajtoj, aŭ iu pli granda ol tio. Estas nur por esti súper, súper adversa al eraroj. Kvankam, fakte, estas probable tuj estos 1. 

Nun, dume, mi iras antaŭen kaj kopii la kordo, t krampo i egalas t krampo s. Kaj mi cedu al lasta semajno fontkodon por vidi kio okazas. Sed la ŝlosilo takeaway kaj la Tial mi metas la kodo nun en verdo, Estas pro tiu lasta linio, t krampo 0 egalas toupper, havas la efekton de kapitaligi kiu kordo? t kaj / aŭ s? Tiu lasta linio de kodo. 

Nur t, ĉar kio estas okazis tiu fojo, se mi iomete malfari tiun lastan paŝon, kio okazis estas, kiam mi vokas malloc, Mi esence akiras eron de memoro kiu estas la sama grandeco kiel la originala, ĉar tio estas la aritmetika mi faris. Mi stokante en t la adreso de tiu bloko de memoro. Eĉ kvankam tio aspektas bela kaj bela, bela kaj blanka, la realo ekzistas, kion ni subteni nomante, rubo valoroj en ĉi tie. Tio eron de memoro multobligita tre bone estis uzita antaŭe, kelkaj sekundoj, antaŭ kelkaj minutoj. Do povus absolute esti nombroj aŭ literojn tie, nur hazarde. Sed ili ne estas validaj, ĝis mi mi popolas ĉi eron de memoro kun realaj signoj, kiel mi fari en tiu por buklo tie. Ĉiuj rajtas? 

Do nun, la kulmino de tiuj tri ekzemploj kiuj ŝajne rompita lasta fojo, ĉi Swap ekzemplo, ĉi tiu funkcio laboris en la senco ke interŝanĝis kaj b. Sed ĝi ne funkcias en kio alia senco? Yeah? 

Publiko: [inaudible]. 

DAVID J. Malan: Ĝuste. Se mi nomas tiun funkcion el another-- ekzemple, de funkcio kiel ĉefa, kie Mi havas variablo x kaj y, kiel mi faris pasintsemajne, sama kodo, kaj mi pasas en x kaj y al Permuta kaj tiam nomita Swap-- ĉi, kompreneble, estas la korekta versio Estas kion ni volis see-- tio ne funkciis. Do kio estas la embaraso? 

Nu, do nur esti klara, lasu min iri antaŭen kaj- donu al mi duan tien kaj vidu se mi povas montri al vi la lasta, kiu Estos in-- ni vidu se mi povas trovi tiu reala fast-- OK, [inaudible]. OK, tie ĝi estas. Do ignoras la ordonojn mi simple tajpante. Mi volas ĝin retrovi ĉe la lasta minuto ekzemplo de lasta momento, kiun nun estas nomita neniu Swap. 

Do neniu Swap estas kie ni cxesis lasta fojo, per Mi inicializado x al 1 kaj y 2. Mi tiam nomita Swap, pasante en 1 kaj 2. Kaj tiam tiu funkcio laboris en iu senso, sed havis neniun permanentan efektiviĝo de x kaj y. Do la demando en mano estas, kiel nun ĉu ni efektive ripari tiun problemon? Kio estas la solvo en la mano? 

Nu, en swap.c, kiuj estas novaj hodiaŭ, rimarki kelkaj diferencoj. x kaj y estas la sama. Sed kio estas klare malsamaj pri linio 25? Kio novas tie, se vi memoras kio aspektis kiel dua monato? 

Publiko: [inaudible]. 

DAVID J. Malan: Jes. Do la ampersands estas nova peco de sintakso ne nur en tiu programo, sed ankaŭ pli ĝenerale en CS50. Ĝis nun, mi ne kredas Ni vidis neniun ekzemploj aŭ vere parolis pri ili en ajna detalo, krom, eble, preventa en tiu sekcio, kaj-simbolo ŝatas ĉi. Nu, tio rezultas-simbolo estas el la lastaj pecoj de nova sintakso Ni iras al lerni. Ĉio tio signifas estas la adreso de iu variablo. Je kio adreso ne x vivas? Sed kion adreso ne y vivi? Ĉar se la fundamentan problemon antaŭe Estis ke x kaj y oni aprobotaj kiel kopioj, kion ni vere volas fari estas provizi Swap kun kiel trezoron mapo kiu kondukas al kie x kaj y reale Estas en RAM, tiel ke Swap povas sekvi tiun mapon kaj iru, kien x aŭ y markas la lokon kaj ŝanĝi la efektivaj valoroj 1 kaj 2 tie. 

Do Swap bezonas ŝanĝi iomete tro. Kaj unuavide, tiu potenco simili iom simila al char stelo. Kaj ja estas. Do estas puntero al kio tipo de datumoj, bazita sur ĉi reliefigis parto? Do ĝi estas int. 

Do ne plu estas int, ĝi estas la adreso de int. Kaj simile, b estas ankoraux esti la adreso de int. Do kiam mi nun nomos Swap de Main, Mi ne donos al Swap 1 kaj 2. Mi tuj donos ĝin kiel Bovo-io kaj Ox-io, du adresoj kiuj kondukos Swap iliaj realaj lokoj en mia komputilo la memoro. 

Do nun, miaj ceteraj efektivigo bezonas ŝanĝi tad. Kio estas evidente malsama nun en tiuj tri linioj de kodo? Ekzistas tiuj malbenita steloj ĉiuj super la loko, ĉiuj rajtas? Do kio okazas ĉi tie? Yeah? 

Publiko: Estas evidente [inaudible]. 

DAVID J. Malan: Ĝuste. Do en ĉi context-- kaj tio ne estis la bona dezajno decido, rekoni, jarojn. En tiu kunteksto, kie Vi nur devas stelo, kaj vi ne havos datumtipo, kiel int, tuj al la maldekstra, anstataŭ vi havas egalan signon, klare, en tiu kunteksto, kiam vi diras star a, tio signifas iri al la adreso tio en. Sekvu la trezoro mapo, por tiel diri. 

Kaj dume, en linio 37, signifas la samon. Iru al la adreso al, kaj metis kio? Kio ajn estas la situo ke b specifas. En aliaj vortoj, iru al b. Akiri tiun valoron. Iru al kaj, por la egaleco subskribi, la asigno operatoro, enkalkulu valoron tie. 

Simile, int temp estas nur int. Nenio bezonas ŝanĝi pri temp. Estas nur anstataŭigoj vitro el Annenberg por iu lakto aŭ oranĝa suko. Sed mi bezonas diri, iru al b. Iru al tiu destino kaj meti la valoron en temp tie. Do kio okazas tiam? Kiam mi vere nomas Permuta tiu tempo, se tiu unua pleto tie reprezentas Main, tiu dua pleto reprezentas Swap, kiam Mi pasos-simbolo x kaj-signo y el Ĉefa al Permuta, nur por esti klara, kio estas tiu stako kadro akcepto? Yeah? 

Publiko: [inaudible]. DAVID J. Malan: Ĝuste. La adreso de x kaj la adreso de y. Kaj vi povas pensi pri tiuj kiel poŝta adresoj. 33 Oxford Street kaj 35 Oxford Street, kaj vi volas movi la du konstruaĵoj ke estas ĉe tiuj lokoj. 

Ĝi estas speco de ridinda ideo, sed tio kion ni celas diri per adreso. Kie en la mondo povas Vi trovos tiujn du ints? Kie en la mondo vi povas trovi tiuj du konstruaĵoj? Do se fine, post cxio cxi tio mi iru en la hodiaŭa fontkodo kaj kompili Swap kaj kuritaj ./swap, fine, por la unuafoje ni vere vidos ke miaj valoroj havas ja estis interŝanĝitaj sukcese. Kaj nun ni povas eĉ preni rimarkigi ĉi en, ekzemple, GDB. 

Do lasu min iri en la sama dosiero. Lasu min kaj kuras GDB de ./swap. Kaj nun, en Swap, mi tuj iros antaŭeniris kaj metis ripozon punkto Ĉefa. Kaj nun mi estas ironta antaŭen kaj kuri la programon. Kaj nun ni vidu mian kodo paŭzis ĉe tiu linio. 

Se mi iras antaŭen kaj presita x, kion mi devus vidi ĉi tie? Estas demando. Diru denove? 

Publiko: [inaudible]. 

DAVID J. Malan: Do hazardaj nombroj, eble. Eble mi akiri bonŝanca, kaj estas bela kaj simpla, kiel 0. Sed eble estas iuj hazardaj nombraj. En ĉi tiu kazo, mi havas sorton. Tio simple okazas al esti 0. Sed estas ja sorton, ĉar ne ĝis mi tajpi proksima kaj tiam presi x havas tiun linio de kodo, linio 19, estis ekzekutitaj. 

Dume, se mi tajpas apud denove, kaj nun presi y, Mi iras vidi 2. Nun, se mi tajpas proksima, ĝi tuj preni iom konfuza, ĉar nun, la printf tuj aperas sur la ekrano, kiel faris. x estas 1. 

Ni faru tion denove. Kaj nun, jen kie aĵoj interesa. Antaŭ mi nomas Swap aŭ eĉ ŝtupo en ĝin, ni prenu iom peek. x estas, denove, 1. Y estas kompreneble rapida prudento kontrolu, 2, do ne peza tie. Sed kio estas signo x? Respondo: Estas speco de funky rigardis. Sed la int stelo en krampoj estas nur GDP la maniero diri ĉi estas adreso. Ĝi ne estas int, estas puntero al int, aŭ alie sciata kiel adreso. 

Kio estas ĉi tiu freneza afero? Ni neniam vidis ion tute same kiel tio antaŭe. Do tiu estas la adreso en mia komputilo memoro de kie x okazas vivi. Estas Ox-io. Kaj tio estas, sincere, kial Mi komencis desegni sagoj, anstataŭ numeroj ĉar kiu vere zorgas ke via int estas aparta adreso tio ke granda. Sed bffff0c4, tiuj estas ĉiuj ja deksesumaj ciferoj, kio estas 0 tra f. 

Do ni ne tuj logxas tro longa sur kio tiuj aferoj. Sed se mi presi y, kompreneble, mi vidas 2. Sed signo y, mi vidas ĉi adreso. Kaj avizo, la kurioza, kiom aparte estas x kaj y? Vi povas ignori la plejparto de la adreso. Kvar bajtoj. Kaj tio estas konsekvenca kun niaj fruaj asertas ke kiom granda estas int? Kvar bajtoj. Tiel ĝi aspektas kiel ĉio tegaĵo supren bele, kiel vi povus atendi, en memoro. 

Do nun, ni simple rapida antaŭen al la fino de ĉi tiu rakonto. Ni iru antaŭen kaj tajpu paŝo, plonĝi en la Swap funkcio. Nun rimarki, se mi tajpi, estas identa al la adreso de x. Se mi tajpas b, estas identa al la adreso de y. Do kion devus mi vidas se mi diri, iru al la adreso de? Do presi star a. Do stelo signifas iri tie, en tiu kunteksto. Kaj-signo signifas kio estas la adreso de. Do star rimedo 1. Kaj print stelo b donas al mi 2. 

Kaj mi supozas, por la momento, ke almenaŭ la kodo kiu procedas ekzekuti nun povas esti rezonis per en tiu vojo. Sed ni reviziti tiun ideon antaŭ longe. Do tiu versio de Swap nun estas korekta kaj permesas ni interŝanĝu tiun apartan datumtipo. 

Do demandojn tiam Swap? Sur stelo? Sur adreso de? Kaj vi vidos, kun problemo starigis 4, ia, sed problemo starigis 5, definitive, kiel tiuj aferoj estas utilaj kaj akiri multe pli komforta kun ili, kiel rezulto. Io ajn? Bone. Do malloc estas, denove, ĉi tiu funkcio ke ĝuste atribuas memoro, memoro atribuo. Kaj kial tio estas utila? Nu, ĉio ĉi momento, vi estis uzante malloc. Se vi konsideras nun kiel getString verkoj, supozeble, estas estis demandante iun por peco de memoro, ĉiutempe la uzanto tipoj ŝnuro en, ĉar ni certe ne sciis, kiel CS50 bastonon kiom granda tiujn ĉenojn kiuj homoj tuj tajpi povus esti. 

Do ni, por la unua fojo, komenci hollejo reen kiel la CS50 biblioteko verkoj per vojo de paro de ekzemploj ke kondukos nin tie. Do se mi malfermas gedit kaj malfermu scanf 0, Ni tuj vidos la sekvan kodon. Scanf 0, havebla sur la retejo por hodiaŭ, ĝi havas relative malmultajn liniojn de kodo tie, 14 tra 20. Kaj ni vidos kion faras. Ĝi deklaras int, nomata x. Ĝi diras ion kiel, numeron bonvolu. Kaj nun diras, scanf% i, e x. Do ekzistas aro da novaj aĵoj tie. 

Sed scanf, vi povas ia opinias de kiel la malo de printf. printf kompreneble impresoj al la ekrano. scanf ia skanadoj de la uzanto klavaro io aŭ ŝi tajpita. 

% I estas simple kiel printf. Tio signifas atendi la uzanto entajpi int. Kaj nun kial vi pensas ke mi povus esti pasante scanf & x? Se la celo en la vivo de scanf estas akiri ion de la uzanto, kio estas la signifo de pasante ĝin, & x, nun? Yeah? 

Publiko: [inaudible]. DAVID J. Malan: Ĝuste. Kion ajn mi, la homa, entajpu, mia eniro tuj estos savitaj en tiu loko. Ĝi estas ne sufiĉa, memoru, ke nur pasas en x, ĉar ni vidis jam, ajna tempo pasas nur krudan variablo, kiel int, al iu alia funkcio, Kompreneble, tio povas ŝanĝi tion variablo, sed ne ĉiam. Ĝi ne povas havi efikon sur Main. Ĝi povas nur ŝanĝi sian propran lokan kopion. Sed se, kontraŭe, vi ne donu al mi la reala int, sed vi donas al mi direktoj ke int, mi nun, estante scanf, certe mi povas sekvi ke alparoli kaj metis numeron tie tial vi havas aliron al ĝi tiel. 

Do kiam mi kuros ĉi programo, vidu. Faru scanf 0 dot oblikvo, scanf 0. Kaj se mi nun tajpas nombro kiel 50, dankon por la 50. Se mi nun tajpas nombro ŝatas negativa 1, cxar la negativa 1. Mi nun tajpas nombro kiel 1,5, hm. Kial mia programo ignori min? Nu, ĉar simple mi rakontis ĝin atendi int nur. Bone. Do jen unu version de tiu. Ni prenu tion supren muesca kaj proponas ke tiu ne estas bona. Kaj en tio kuŝas tre simpla ekzemplo de kiel ni povas komenci skribi kodo ke aliaj homoj eblas ekspluati aŭ kompromisi farante malbonaj aĵoj. Do linio 16, tiel similaj spirite al antaŭ, sed mi ne deklarante ĝin int tiu tempo. Mi deklarante ĝin char stelo, alias kordo. 

Sed kion signifas tiu vere signifas? Do, se mi ne specifi address-- kaj Mi nomas ĝin arbitre, bufro, sed mi povis nomi lin s, esti simple-- kaj tiam mi faras tion, klarigi al mi, se vi povis, bazita sur la antaŭa logiko, kio scanf faras en linio 18, se pass% s kaj bufro, kio estas adreso? Kio estas scanf, se vi apliki la ĝusta sama logiko kiel versio 0, tuj provos fari ĉi tien, kiam la uzanto tajpas ion en? Yeah? 

Publiko: [inaudible]. 

DAVID J. Malan: Ĝuste. Scanf per la logiko antaŭe, tuj prenos la kordo ke la homa tajpita in-- estas nun cxeno, ĝi ne estas nombro, supozeble, se li aŭ ŝi cooperates-- kaj tuj provas meti tiun kordo memore je ajn adreso buffer specifas. Kaj tiu estas granda, ĉar la buffer Estas ja signifis esti adreson. 

Sed mi asertas ĉi programo estas kalesxon en tre serioza maniero, ĉar kio valoro estas buffer defaŭlte? Kion mi inicializado en? Kio eron de memoro? Mi ne havas, ĉu ne? 

Do kvankam mi asignitaj al char stelo kiu ne plu nomis s, ĝi estas anstataŭe nomita, buffer-- tiel ni desegni la variablo nomo nun kiel buffer-- se mi ne nomata getString aŭ malloc tie, ke efektive signifas ke buffer estas nur iuj rubo valoro. 

Nun kion tio signifas? Ĝi signifas ke mi rakontis scanf atendi ĉenon de la uzanto. Kaj vi scias kion? Kion ajn tion notas to-- kaj mi tiros demandosigno, sed fakte, ĝi tuj estos iu kiel Ox1, 2, 3, dekstra? Estas iuj blufa valoro kiu ĵus sekvinbero al esti tie antaŭe. Do metu alia maniero, estas kvazaŭ skusorbilo estas nur montras ion en la memoro. Mi havas neniun ideon kion. 

Do se mi tajpas en Gabe nun, ĝi okazas provi meti g-a-b-e / 0 tie. Sed kiu scias, kio tio estas? Kaj en la pasinteco, ajna tempo ni provis tuŝi memoro kiu ne apartenas al ni, kio okazis? Aŭ preskaŭ ĉiufoje. Segmentación kulpo, dekstra? 

Ĉi sagon, mi ne havas ideon kie ĝi estas notante. estas nur iuj hazardaj valoro. Kaj kompreneble, se vi interpretas hazarda valoro kiel adreso, vi tuj iru al iuj hazardaj celloko. Do Gabe eble ja kraŝo mia programo en tiu kazo tie. 

Do kion ni povas fari, ke estas preskaŭ tiel malbona? Konsideri ĉi tria kaj lasta ekzemplo de scanf. Tiu versio estas pli bona en kiu senco? Se vi estas komforta kun la antaŭa problemo, tiu estas bona. Kial? 

Publiko: [inaudible]. DAVID J. Malan: Bone. Do tiu kazo de linio 16 estas bona, en la senco ke ni estas eksplicite atribuo iu memoro. Ni ne uzante malloc, ni uzas la semajno 2 alproksimiĝo de nur deklarante tabelo. Kaj ni diris antaŭ tiu ŝnureto estas nur tabelo de signoj, tial tiu estas totalmente leĝa. Sed estas, kompreneble, kiel Vi rimarku, fiksa grandeco 16. 

Do tiu programo estas plene sekura, se mi tajpas en unu karaktero ŝnuroj, du karaktero kordoj, 15 karaktero ŝnuroj. Sed kiam mi ektajpu 16 17, 18, 1000 karaktero ŝnuroj, kie estas tiu kordo tuj finos? Ĝi tuj finos parte tie. Sed tiam, kiu scias kion alian estas preter la limoj de tiu aparta tabelo? 

Estas kvazaŭ mi havas deklaris 16 skatoloj tie. Do anstataŭ elingigos ĉiuj 16an ni ĝuste ŝajnigi, ke mi desegnis 16. Sed se mi tiam provos legi kordo ke estas multe pli longa, kiel 50 karakteroj, Mi tuj komenci metante a, b, c, d, x, y, z. Kaj tio estas supozeble iu alia memoro segmento ke, denove, igu mia programo kolapsas, ĉar mi ne petis io pli ol nur 16 bajtoj. 

Do kiu zorgas? Nu, jen la CS50 biblioteko. Kaj plejparto de tio estas nur kiel instrukcioj ĝis supro. La CS50 biblioteko, ĉiu ĉi tiu tempo, havis tiun linion en linio 52. Ni vidis typedef aux vi vidos typedef en pset 4, kiu ĵus kreas sinonimo per char stelo povas esti pli simple referita al kiel kordo. Do ĉi tiu estas unu el la malmultaj trejnado radoj ni uzis sekrete sub la kapuĉo. 

Dume, jen la funkcio, getchar. Nun ŝajne, ne estas korpo al ĝi. Kaj fakte, se mi konservos movo, mi ne vere vidi ajnan implementaciones de tiuj funkcioj. Kiel prudento ĉeko, kial do? 

Publiko: [inaudible]. DAVID J. Malan: Jes. Do tio estas la kaplinion dosiero. Kaj kaplinion dosieroj enhavas prototipoj, pli iuj aliaj aĵoj, ĝi ŝajnas, kiel typedefs. Sed en CS50.c, kiun ni neniam donis al vi sincere, sed estis en la CS50 aparaton ĉiuj tiu tempo, profunde ene de lia dosierujoj, rimarki ke ekzistas tuta faskon da funkcioj en ĉi tie. 

Fakte, ni rulumu malsupren. Ni ignoru la plimulto de ili, por nun. Sed rulumu malsupren getInt kaj vidi kiel getInt funkcias. Do jen getInt. Kaj se vi iam vere zorgis kiel akiri int funkcias, tie estas ĝia dokumentado. Kaj inter la aferoj ĝi diras estas tio informas vin kion la rangoj de valoroj povas reveni. Ĝi estas esence negativa 2 miliardoj pozitivajn 2 miliardoj, donu aŭ preni. 

Kaj ĝi rezultas, ĉiuj ĉi tempo, kvankam ni neniam estis vi kontrolu ŝin, se iu eliras malbone, Ĝi rezultas ke ĉiuj tiu tempo, getInt havas estis reveni speciala konstanta, ne nula, sed prefere int_max, kio estas nur programisto an konvencion. Ĝi signifas tie estas speciala valoro. Fari certe kontroli tion, nur en kazo iu eliras malbone. Sed ni neniam tedis kun kiu al dato, ĉar denove, tiu celas simpligi. 

Sed kiel getInt get implementado? Nu, oni, ĝi prenas neniun argumenton. Ni scias tion. Ĝi redonas int. Ni scias tion. Do kiel funkcias sub la kapuĉo? 

Do ekzistas ŝajne senfinan buklo, almenaŭ la ŝajnon de unu. Rimarku ke ni uzas getString. Do tio estas interesa. getInt nomas nian propran funkcion, getString. Kaj nun kial povus ĉi estus la kazo? Kial mi esti defenda tie en linio 165? Kio povus okazi en linio 164, nur por esti klara? Ĝi estas la sama respondo kiel antaŭe. Povus esti simple el memoro. Iu iras malbone kun getString, ni devas povi trakti tion. Kaj la kialo mi ne revenos nula estas ke teknike, nula estas montrilo. getInt devas reveni al int. Do mi arbitre decidis, esence, ke 2 bilionoj, donu aŭ preni, tuj esti speciala valoro kiun mi neniam povas reale preni de la uzanto. Estas nur unu valoro Mi iras malŝpari reprezenti eraro kodo. 

Do nun, la aĵoj iom kaprico. Kaj ĝi ne estas tute la sama funkcio kiel antaŭe, sed estas tre simila. Do rimarki, mi deklaras tie ĉi, en linio 172, ambaŭ estas int n kaj char c. Kaj tiam mi uzas ĉi funky linio, sscanf, kiu rezultu ne skani ĉenon de la klavaro. Ĝi staras ekzistantan ĉeno kiu la uzanto jam tajpis en. Do mi jam nomis getString, kiu signifas Mi havas ĉenon en memoro. sscanf estas kion vi volas voki analiza funkcio. Ĝi rigardas la kordo Mi havas tajpita en, karaktero de karaktero, kaj faras ion utilan. Ke kordoj estas stokita en linio. Kaj mi scias, ke nur irante asist tie kaj jene: Ho, bone, Mi nomis ĝin ne tio tempo, sed lineo. 

Kaj nun jen estas iom malsama. Sed tio efektive signifas, por kialoj ni iomete skuu niajn manojn hodiaŭ, ke ni kontrolanta por vidi se la uzanto tajpas en kaj int kaj eble alian karakteron. Se la uzanto tajpas en int, estas tuj estos stokitaj en n, ĉar mi pasante ĉi per adreso, la nova lertaĵo ni vidis hodiaŭ. Se la uzanto ankaŭ tajpitaj same 123x, ke x tuj finos supren letero en karaktero c. 

Nun ĝi rezultas ke sscanf rakontos al mi, inteligente, kiom variabloj estis sscanf sukcese povis plenigi. Do per tiu logiko, se la funkcio Mi efektivigo estas getInt, sed mi kontrolanta, potenciale, por la uzanto esti tajpita en int sekvita de iu alia, Kion mi volas sscanf La reveno valoro vere esti? Se la celo estas akiri nur int de la uzanto? 

Do se sscanf revenoj 2, kion tio signifas? La uzanto tajpas en ion kiel, laŭvorte, 123x, kiu estas nur sensencaĵo. Estas eraro kondiĉo, kaj Mi volas kontroli tion. 

Do se la uzanto tajpas ĉi en, per tiu logiko, kion faras sscanf reveni, vi dirus? Do tuj revenos 2, ĉar la 123 tuj iros tien, kaj la x tuj finos en ĉi tie. Sed mi ne volas, ke la x al get plenigis. Mi volas sscanf nur sukcesos plenigante la unua el ĝiaj variabloj. Kaj tial mi volas sscanf reveni 1. 

Kaj se tio estas iom super la kapo por la momento, estas tute bone. Rimarkas tamen, ke unu el la valoroj de getInt kaj getString estas ke ni faras heck de multan eraro kontrolanta kiel ĉi tio ke, ĝis nun, vi povas sufiĉe tre tajpi ion en via klavaro, kaj ni kaptos ŝin. Kaj certe ni, La bastono, definitive ne esti la fonto de cimo en via programo, ĉar ni defende kontrolanta por ĉiuj stultaj aferojn kiujn uzanto povus fari, kiel tajpado cxeno, kiam vi vere volis int. Do por now-- ni venos reen al tiu antaŭ long-- sed ĉiu ĉi tiu tempo, getString kaj getInt havas estis sub la kapuĉo uzanta ĉi baza ideo de adresoj de memoro. 

Do nun, ni faru tion oni iom pli uzantamika. Kiel vi eble memoras, de Binky lasta time-- se mia muso cooperate-- tiel ni havis ĉi tiun kodon, kiu sincere, estas sufiĉe sensenca. Tiu kodo nenion atingas utila, sed ĝi estis la ekzemplo ke instruisto Parlante uzata por reprezenti kio okazas en programo engaĝante memoro. 

Do ni retell ĉi rakonto súper mallonge. Tiuj unuaj du linioj, en Angla, do kion, vi dirus? Nur en laŭkaŭze homa, sed iomete teknika terminoj, preni ponardopiko. Publiko: [inaudible]. 

DAVID J. Malan: Bone, vi establante adresoj por via x kaj y variabloj. Ne tute, ĉar x kaj y estas ne variabloj en la tradicia senco. x kaj y estas adresoj aŭ stokos adreso. Do ni provu ĉi ankoraŭfoje. Ne malbona komenco, kvankam. Yeah? 

Publiko: [inaudible]. DAVID J. Malan: Bone. Mi kredas ke estas iom pli pura. Deklarante du punteros, du entjeroj. Kaj ni vokas ilin x kaj y. Aŭ se oni devis desegni tion kiel bildo, denove, memoras tute simple ke ĉiuj ni faras kun tiu unua linio skizas skatolo ŝatas ĉi, kun iuj rubo valoron en ĝi, kaj nomante ĝin X, kaj tiam alian skatolon kiel tiu, kun iuj rubo valoro en ĝi, nomante ĝin y. Ni deklaras du punteros kiu finfine konservos la adreso de int. Do jen ĉio tie. 

Do kiam Binky faris tion, la argilo simple rigardis kiel tiu. Kaj Nick ĝuste speco de envolvis la sagojn kvazaŭ ili ne montras ie precipe, ĉar ili estas nur rubo valoroj. Ili ne eksplicite inicializado ie en aparta. 

Nun la sekva linio kodo, revokon, estis jena. Do en laŭkaŭze uzantamika, sed iu teknika angla, kio estas tiu linio de kodo faras? Yeah? 

Publiko: [inaudible]. 

DAVID J. Malan: Perfekta. Ĝi atribuante la eron de la memoro kiu estas la grandeco de int. Kaj tio estas la duono de la respondo. Vi respondis dekstre duono de la esprimo. Kio okazas en la maldekstra flanko de la egala signo? Yeah? Publiko: Kaj atribuas al la variablo x? 

DAVID J. Malan: Kaj atribuas al la variablo x. Do por recap, dekstra flanko atribuas sufiĉa memoro por stoki int. Sed malloc specife Revenas la adreso de tiu bloko de memoro, kiun vi havas nur proponis prenas stokitaj en x. 

Do kio Nick faris lastan fojon kun Binky estas Li trenis ke puntero ekstere, argilon, atentigi nun blankan eron de memoro kiu estas egala al la grandeco de int. Kaj efektive, tio signifis reprezenti kvar bajtoj. 

Nun, la sekvanta linio de kodo faris tion, stelo x prenas 42. Do 42 estas simpla en la dekstra flanko, signifo de la vivo. Maldekstra flanko, stelo x signifas kion? Tio tro havu gone-- tio OK. OK. 

Publiko: Esence, iru al la [inaudible] DAVID J. Malan: Bone. Publiko: [inaudible]. DAVID J. Malan: Ĝuste. Maldekstra flanko signifas iri al x. x estas adreso. Estas kiel 33 Oxford Street, aŭ Ox1. Kaj stelo x signifas iri al tiu alparoli kaj metis kio? 42. 

Do ja, tio estas ĝuste kion Nick faris. Li komencis kun pretere, esence, mense indikante fingro x, sekvante la sagon la blanka skatolo sur la dekstra mano flanko, kaj metante la numero 42 tie. Sed tiam tio akiris iom danĝera, ĉu ne? Binky la perdonta sian kapon. 

Stelo y egalas 13, malbona sorto, ĝi signifas kion? Do stelo y signifas iri al la adreso en y. Sed kio estas la adreso en y? Bone, ĝi estas rubo valoro, ĉu ne? Mi tiris ŝin kiel demandosigno. Noĉjo tiris ĝin kiel kurbigitaj sago. Kaj kiam vi provas fari stelo y, dirante iri tien, sed ne ekzistas leĝa adreso, estas iuj blufa situo, la programo tuj frakasi. Kaj Binky kapo tuj flugi for tie, kiel ĝi faris. 

Do, en la fino, tiu programo Estis nur plata el difekto. Estis kalesxo programo. Kaj ĝi devis esti riparita. Kaj la sola maniero, vere, ripari ĝin estus, ekzemple, tiu linio, kiun ni eĉ ne atingas, ĉar la programo frakasis tro frue. Sed se ni devis ripari tion, kio efekto faras fari y egala x havas? Nu, tio esence antaŭ y je ajn valoro x fingromontrante. 

Do Noĉjo historio, aŭ Binky historio, ambaŭ x kaj y oni fingromontrante la blanka chunk de memoro, tiel ke, fine, kiam vi ĉu star y egalas 13 denove, vi finas metante 13 la taŭga loko. Do ĉiuj ĉi tiuj linioj estas perfekte legitima, krom ĉi tiu, kiam okazis antaŭ vi fakte atribuis y iu valoro. 

Nun dankeme, vi ne devas rezoni per ĉiuj de tiuj specoj de aferoj en via propra. Lasu min kaj malfermu supren terminalfenestro tie kaj malfermu, por momento, super mallonga programo kiu ankaŭ estas speco de sencela. Ĝi estas malbela. Ne atingi ion utilan. Sed tio pruvas temoj de memoro, do ni rigardu. 

Artikolo, súper simpla. Ĝi ŝajne nomas funkcio, f, kaj tiam revenas 0. Estas speco de malfacile salato ĉi supre. Do Ĉefa estas sufiĉe bona, tiel for. 

Do f estas problema. Kaj simple ne metis multan penado en enoficigi ĝin tie, teni la fokuson sur la kodon. f havas du liniojn. Kaj ni vidos kio nun okazas. Tiel unuflanke here-- kaj lasu min fari tio kongruas kun la antaŭa example-- unuflanke, la maldekstra flanko estas faras kion, en la angla? Ĝi is-- Publiko: Kreante montrilo. DAVID J. Malan: Kreante montrilo al int kaj nomante lin x. Do ĝi estas kreante unu el tiuj skatoloj Mi dauxre utiligante la ekrano táctil. Kaj nun, je la dekstra mano flanko, malloc, kompreneble, estas atribuo eron de memoro. Kaj ĝuste por esti klara, kiom multan memoron estas ŝajne atribuo, se vi nur speco de fari la math tie? 

Do estas 40 bajtoj. Kaj mi scias, ke nur ĉar mi konas int, la CS50 aparaton, almenaŭ, Estas kvar bajtoj. Do 10 fojojn 4 estas 40. Do tiu estas stokante x, la adreso de la unua el 40 ints ke estis asignitaj spaco dorso, apogi, apogi, por dorso. 

Kaj tio estas kio estas ŝlosila pri malloc. Ĝi ne portas iom memoro tie, iom tie, iom cxi tie. Ĝi donas al vi unu pecon da memoro, contiguously, de la mastruma sistemon. 

Nun kio pri tio, x krampo 10 egalas 0? Arbitra linio de kodo. Ne atingi ion utilan. Sed estas interesa, ĉar x krampo 10--? Yeah? 

Publiko: [inaudible]? 

DAVID J. Malan: x krampo 10 Ne devas esti nula. La nula detalo nur eniras en ludo kun kordoj, fine de ŝnuro. Sed bona penso. 

Kiom granda estas tiu tabelo, eĉ kvankam mi asignitaj 40 bitokoj? Estas 0 tra naŭ, dekstra? Ĝi estas 10 ints, entute. 40 bitokoj, sed 10 ints, indeksita 0 tra 0. 

Do kio estas tiu x krampo 10? Tie fakte iuj nekonata rubo valoro. Estas memoro kiu ne apartenas al mi. Mi ne devas tuŝi ke bajto nombro 41, 42, 43, 44. Mi iras iomete tro multe. 

Kaj efektive, se mi kuros ĉi programo, ĝi povus tre bone frakasi. Sed kelkfoje, ni ricevos bonŝanca. Kaj tiel simple pruvi this-- kaj sincere, vi neniam scias al vi ĉu it-- ni kuras ĉi. Ĝi fakte ne frakasi. 

Sed se mi tion, por Ekzemple, esti kiel 1.000, fari ĉi vere intenca, vidu se ni povas akiri ĝin frakasi tiu tempo. OK, ne frakasi. Kiom proksimume 100,000? Ni refari ĝin, kaj nun rerun ĝin. OK. Phew. Bone. Do ŝajne, denove, tiuj segmentoj de memoro, por tiel diri, estas prudente granda, do ni povas akiri bonŝanca denove kaj denove. Sed eventuale, kiam vi ricevas ridindan kaj vere iru malproksimen sur la ekrano, vi kuntusxigxu memoro kiu vere, vere ne apartenas al vi. 

Sed sincere, tiuj specojn de bugs iras esti pli kaj pli forta elkompreni sur via propra. Sed dankeme, kiel programistoj, ni havas iloj kiuj nin permesas fari tion por ni. Do tio estas, eble, unu de la plej malbelaj programoj, eĉ pli malbela ol GDB eligo. Sed ĝi ĉiam havas linion aŭ du kiu estas súper utila. 

Valgrind estas programo kiu helpas Vi ne elpurigi programon, per, sed trovi memoro-rilata problemoj, specife. Ĝi aŭtomate kuri vian kodon por vi kaj serĉi almenaŭ du aferoj. Unu, vi faris ion akcidenta kiel takto memoro kiu ne apartenas al vi? Ĝi helpos vin trovi tiujn kazojn. 

Kaj du, ĝi helpos Vi trovos iun nomita memoro fugoj, kiun ni havas tute ignoris, naive, por iu tempo kaj felicxe. Sed rezultu, ĉiuj tiu tempo, kiam vi nomas getString en tiom multaj de niaj programoj, vi demandas la mastruma sistemo por memoro, sed vi havas neniun memoron de iam donante reen, farante unalloc aux libera, kiel ĝi nomiĝas. Ne, ĉar ni neniam demandis vin fari tion. 

Sed ĉiu ĉi tiu tempo, la programoj vi estis skribante en C ili iris filtrante memoro, demandante la mastruma sistemo por pli kaj pli memoro por kordoj kaj whatnot, sed neniam cedi ŝin reen. Kaj nun jen estas iom de simplificación, sed se vi iam kuri via Mac aŭ via PC faras sufiĉe tempo, malfermo multaj programoj, eble fermante programoj, kaj eĉ se viaj komputilo ne frakasis, ĝi Fariĝas tiel malrapida, kvazaŭ ĝi vere uzanta multe da memoro aŭ rimedoj, kvankam, Se vi ne estas ankoraŭ tuŝi la klavaro, kiu povus be-- sed ne always-- povis esti, ke la programoj vi uzas havas mem memoro fugoj. Kaj ili gardu petante la VIN por pli kaj pli memoro, sed forgesante pri tio, ne vere uzas ĝin, sed do prenante memoro for de aliaj programoj kiuj povus voli ĝin. Do tio estas komuna klarigo. Nun tie estas kie Valgrind La eligo estas tute atroz al tiuj malpli kaj pli komforta por egala. Sed la interesa stuff estas tuj ĉi tie. Oni diras al mi nevalidan registran de grandeco kvar okazas en tiu programo, precipe, ĉe linio 21 de memory.c. 

Se mi iras al linio 21, hm, tie ja estas malvalida registran de grandeco kvar. Kial grandeco kvar? Nu, ĉi number-- kaj ĝi povus esti anything-- estas int. Do estas kvar bajtoj. Do mi metis kvar bajtoj kie ne apartenas. Tion Valgrind vere diri al mi. Plie, ĝi donos ankaŭ diru al mi, kiel ni vidos, kiel vi kuros ĉi en futura pset, se kaj kiam vi filtris memoro, kiu ja Mi havas, cxar mi vokis malloc, sed mi ne vere nomita, en ĉi tiu kazo, libera, kiun ni eventuale vidos estas la malo de malloc. 

Do nun, mi pensas, fina ekzemplo. Do ĉi tiu estas iom pli arcane, sed estas eble la plej granda kialo por atenti pri memoro, kaj la kialo ke multaj programoj kaj / aŭ retserviloj, gxis la nuna tago, estas transprenita de malbonaj infanoj ie sur la interreto kiu estas iel sendo blufa pakojn por via servilo provas kompromisi viaj kontoj, aŭ preni viajn datumojn aŭ simple Ĝenerale transpreni maŝino. Buffer overflow, kiel la nomo sugestas, per disversxigxinta ne int, sed buffer. Kaj buffer estas nur ornama metodo diri ĝi estas aro da memoro. 

Kaj ja, mi nomas ŝnureto antaŭ buffer, anstataŭ s. Ĉar se estas buffer, kiel en la YouTube senso, aŭ ajna tempo vi rigardante la video, vi eble vidis la vorton buffering, dot, dot, punkto. Estas nekredeble ĝena. Kaj tio nur signifas ke via video ludanto provas elŝuti lotojn de bajtoj, multaj bajtoj el video de la interreto. Sed estas malrapida, do ĝi estas klopodi elŝuti faskon de ili plenigi buffer, ujo, por ke Vi havas sufiĉe da bitokoj ke ĝi povas tiam montri vin la vídeo, sen paŭzante senĉese. Sed rezultu, vi povas havas buffer por tiu granda. Sed provu meti ĉi multe datumojn ĝin, kaj tre malbonaj aferoj povas okazi. Do ekzemple, ni rigardu ĉi lasta teaser de ekzemplo. Tio estas alia programo ke, unuavide, ne fari ion súper utila. Ĝi ricevis Ĉefa funkcio kiu nomas tiun funkcion, f. Kaj tiu funkcio, f, ĝis tie, havas oni char tabelo, nomita c, de grandeco 12. Kaj tiam ĝi estas uzanta ĉi nova funkcio nomita strncpy. 

Ĝi rezultas ke, per tiu simpla, simpla linio de kodo, nur du linioj, ni faris mian tutan programon, kaj do mia tuta komputilo, kaj mia uzantokonto kaj mia malmola forpelos potenciale vundebla al iu kiu scias kaj estas sufiĉe bona por kuri tiu programo kun certa komandlinio argumento. En aliaj vortoj, se tiu malbona ulo metas ene de argvargv [1] tajpante ĉe la klavaro tre speciale laboritaj kordo, ne abc, 123, sed esence, duuma simbolojn kiuj reprezentas plenumebla kodo, programo kiu li aŭ ŝi verkis, kun tiu simpla programo, kiu estas reprezentanto da programoj ke estas simile vundebla, daresay, li aŭ ŝi povas finfine forigi ĉiujn la dosieroj sur mia malmola disko, ricevi palpebrumante prompto tiel ke li aŭ ŝi povas tajpi komandojn sur ilia propra, retmesaĝi ĉiuj dosieroj al mi. Io, kiun mi povas fari, li aŭ ŝi povas fari kun tiu kodo. 

Ni ne tute solvi ĉi ankoraŭ. Kaj fakte, ĝi tuj engaĝi iom foton kiel tiu, kiun ni baldaŭ venos kompreni ĉiuj bonaj. Sed por hodiaŭ, ni finos la kio estas, mi esperas, iomete pli komprenebla xkcd ŝerco, ĝis ni rekomencos la venontan fojon. Bone. Vidi vin merkredon. 

[MUZIKO Ludante] 

SPEAKER: Kaj nun, profunda pensoj, per Daven Farnham. Memoro estas kiel salti en amaso de oraj folioj en dimanĉo posttagmeze. Vento, ĵetanta vian hair-- ho, mi perdos la tagoj when-- 

[Ridado]