[REPRODUCCIÓ DE MÚSICA] DAVID J. Malan: Molt bé. Això és CS50. I aquest és el començament de la setmana 5. I com t'hauràs adonat, alguns dels materials és cada vegada una mica més complexa, el poc dens. 

I és molt fàcil, especialment si vostè ha estat en l'hàbit durant algun temps, estar tractant de gargots més qualsevol cosa que fem, estem dient a classe. Però s'adonen, que no és potser l'enfocament pedagògic ideals per a l'aprenentatge d'aquest tipus de material, i el material de manera més general. I així tenim el plaer de anunciar pròpia gheng que CS50 Gong ha començat a preparar un conjunt canònic de notes per al curs, l'esperança de i és que, un, aquests no només servir com un de referència i un recurs per revisar el material i va de tornada a través de material que pogués tenir li va escapar la primera vegada, però També perquè els seus caps poden ser més dalt que a baix, quan es arriba el moment de donar una conferència, pel que és possible de participar més pensatiu, com enfront dels més scribbly. 

Dit això, el que trobarà a el lloc web és documents com aquest. I fixin-, a la part superior esquerra, hi ha no només una taula de continguts, sinó també els codis de temps que li saltarà immediatament a la part apropiada en el vídeo en línia. I ho ha fet aquí Chang és, essencialment, documentat el que va succeir en aquest especialment conferència. I moltes de les conferències són ja en línia ara amb aquesta URL. I seguirem per publicar la resta dels que a finals d'aquesta setmana, així que aprofitar aquest recurs. 

Així que sense més preàmbuls, comencem a pelar la capa que ha estat cadena durant algun temps. I ho vam dir una cadena en realitat és la setmana passada? Estrelles Així caràcters. I l'estrella char, així, el que què significa això realment? Bé, tot aquest temps, si hem estat cridada a una funció, com getString i emmagatzematge la crida de retorn valor d'getString en un variable-- es diu s tipus string-- hem estat escrivint la línia de codi que hi ha allà dalt. I és només quan veig al meu escriptura magnificada aquí m'adono del atroç que és això. 

No obstant això, anem a suposar que, en el costat dret és, però, una raonable representació del que és estat succeint tot això temps amb getString. getString, per descomptat, crear una cadena. Però, què significa això realment? En aquest cas es posa un tros de de memòria des del sistema operatiu cridant a una funció, anomenada malloc. Però més sobre això més endavant. I llavors pobla que parteix de la memòria amb les lletres l'usuari té escrit en, seguit de, per descomptat, un caràcter nul, ni la barra invertida zero al final. 

Mentrestant, a la banda esquerra d'aquesta història, tot aquest temps, hem estat declarant una variable, com s. I aquesta variable és el que ara es comença a trucar a un punter. No és una caixa a l'interior posem la cadena, Daven, per se, sinó que posem en aquesta plaça caixa de l'esquerra què és exactament? Sí? 

AUDIÈNCIA: La direcció de on es troba a la memòria. 

DAVID J. Malan: Exactament. La direcció d'on Daven es troba a la memòria. I no en tots Daven es troba, per se, sinó específicament la direcció de què? Sí? 

AUDIÈNCIA: Primer caràcter. 

DAVID J. Malan: El primer caràcter en Daven, que, en aquest cas, Em proposava era arbitrària i poc realista 1, Ox1, que només significa la nombre hexadecimal d'1. Però probablement va en ser un nombre molt més gran que podríem anomenar la amb un 0x com un prefix, representa un caràcter hexadecimal. I pel fet que no necessitem saber on la resta dels caràcters de Daven són, de manera que el disseny senzill decisió que va ser feta fa molts anys? Sí? 

AUDIÈNCIA: backslash 0. DAVID J. Malan: Sí, exactament. La barra invertida 0 li permet, encara que de temps lineal, per travessar la cadena, caminar d'esquerra a dreta, amb un bucle, o un temps llaç, o alguna cosa així això, i determinar, oh, aquí és el final d'aquesta cadena particular. Així que amb només la direcció en el principi d'una cadena, podem accedir a la totalitat de , Perquè durant tot aquest temps, una cadena només ha estat una estrella de carbó. 

Pel que és sens dubte molt bé per continuar utilitzant la biblioteca CS50 i aquesta abstracció, per així dir-ho, però anem a començar a veure exactament el que ha estat passant sota de tot aquest temps. Així que vostè pot recordar aquest exemple, també, de l'última vegada, comparar 0, que no compari realitat. Però vam començar a resoldre això. 

Però com potser un refresc, podria jo interessar a algú en un elefant rosa avui, també fabricada per Chang? ¿I vostè davant? [Inaudible]. Anem amunt. 

I mentrestant, a mesura que sorgeixen, anem a considerar per un moment el que Aquest codi va ser realment fent. Es declara dues variables dalt superior, s i t, i cridant getString. Aquest no és un programa molt fàcil d'usar, perquè no et diu què fer. Però anem a suposar que estem centrant-se en la part sucosa. I llavors el que fem, si s és igual a és igual a t, ha de dir printf, que ha escrit la mateixa cosa. Hola. Quin és el teu nom? 

Janelle: Janelle. DAVID J. Malan: Janelle, Encantada de conèixer-te. Així que el seu desafiament a la mà per a aquest elefant és primer ens facin un dibuix del que és està representat en els dos primers línies. Així que s i t pot ser representat la forma a la pantalla? I només es pot dibuixar amb el dit en aquesta pantalla gran. 

Així que hi ha dues meitats a cada costat de l'equació. Així que hi ha es de l'esquerra, i llavors getString a la dreta. I després hi ha el t de l'esquerra, i després getString a la dreta. Llavors, ¿com podríem començar un dibuix que representa el que està passant aquí a la memòria, què li diries? I m'ho dius a mi deixar-te expliques el que estàs fent sobre la marxa. 

Janelle: OK. Bé, en primer lloc, que estaria demanant a obtenir la cadena d'entrada. I seria almacén-- oh, ho sento. DAVID J. Malan: OK. Bé. I això es diu, ¿què? Oh, OK. Segueix endavant. No vaig voler interrompre. Janelle: Ho sento. Pel que seria l'entrada en la direcció no de-- segur. No puc recordar exactament el nombre, però crec que començava amb 0. 

DAVID J. Malan: Està bé, perquè vaig fer els números cap amunt, així que no hi ha resposta correcta. 

Janelle: A partir de la 0 d'arc. 

DAVID J. Malan: OK, de manera que l'element 0. Clar. 

Janelle: I després, si era com només un dos-letter-- 

DAVID J. Malan: OK, de nou a vostè. 

Janelle: Així que l'element 0, i a continuació, l'element 1 o de l'element 2. DAVID J. Malan: I què peça de la imatge se li dibuixava en aquest moment? La crida a getString? O la declaració de s? 

Janelle: La declaració de s, crec. Oh, la getString, perquè faria ser introduïda en cadascun [? àrea. ?] 

DAVID J. Malan: Good. Exactament. Tot i que això efectivament retorna una matriu, el record, quan tornem una cadena, podem índex en aquesta cadena usant 01 i 2. Tècnicament, aquests són probablement representada per les direccions individuals, però això està bé. 

Així que suposem que, si puc només és ràpid remetre a on ho vam deixar l'última vegada, si un les cordes era g a b i, barra invertida 0, la qual cosa representa una de gabe d'entrada, com podríem representar s ara? Si aquesta és la memòria que és estat retornat per getString? 

Janelle: Seria representat per un arc? 

DAVID J. Malan: Per un arc? Bé, no. Diguem, il · lustrat, m'ho dius a mi seguir endavant i proposar que, si això és s, aquest és el valor retornat per getString. I que ha dibuixat això com 0, 1, 2, que és perfectament raonable, perquè pot indexar a la cadena, com a tal. Però només per estar d'acord amb l'última vegada, deixa anar per davant i proposar arbitràriament que aquest és la direcció 1, aquesta és l'adreça 2, Aquesta és l'adreça 3, i així successivament. I així, només per estar súper clar, el que passa anar en si com a resultat d'aquest primera línia de codi, què li diries? 

Janelle: Direcció 1? 

DAVID J. Malan: Exactament. Així abordar 0x1. I mentrestant, deixa que me'n vagi per davant i duplicarien gran part del que has fet i afegir el meu propi t aquí. Si hagués d'escriure gabe de nou, un segon temps, quan se li demani amb getString, on, per descomptat, es gabe anirà? Bé, presumably-- 

Janelle: Igual que en aquesta llista? DAVID J. Malan: Si. Janelle: O és també en les mateixes caixes? DAVID J. Malan: Déjame proposo, sí, exactament, pel que en aquestes caixes addicionals. Però el que és clau ara és que, fins i tot encara que jo he dibuixat aquests molt a prop junts-- 0x1, aquest es 0x2-- en la realitat, això ara podria ser la direcció 0x10, per exemple, i 0x11, i 0x12, i així successivament. I així, si aquest és el cas, el que va a acabar ací, en t? 

Janelle: 0x10? DAVID J. Malan: Exactament. Així 0x10. I ara, la pregunta final. Has, de moment, va haver de treballar el més difícil per a un elefant fins al moment. Per ara, si m'aixeco el codi de nou, quan ho faig, en la línia 3, si s és igual a és igual a t, el que estic realment comparant que hem dibuixat aquí? 

Janelle: Les dues direccions? DAVID J. Malan: Exactament. Així que jo estic dient és S igual igual at? En altres paraules, és igual 1 igual a 10? I, per descomptat, la resposta òbvia ara és, no. I pel que aquest programa és en última instància, va a imprimir el que, què li diries? 

Janelle: Seria, que ha escrit la mateixa cosa? 

DAVID J. Malan: Així que si s és 1 i t és de 10? 

Janelle: Ha escrit diferents coses. 

DAVID J. Malan: Exactament. Ha escrit diferents coses. Bé. Així que un aplaudiment, si poguéssim, aquí. [Aplaudiments] Això va ser dolorós. Ho sé. Molt ben fet. Així que ara anem a veure si no podem esmicolar el que era la solució. I per descomptat, quan ens fixem esto-- que ara vaig a represento a green-- vam fer un parell de millores aquí. En primer lloc, igual que un seny comprovar, estic consultar primer si s és igual a nul i t és igual a zero. I només per ser clars, quan podria s o t ser nul en codi com aquest? Quan poden s o t ser nul. Sí? 

AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: Exactament. Si la cadena que l'usuari teclejat és massa llarg per cabre en la memòria, o alguna cas cantonada estrany com això, getString, com veurem, literalment avui, en la seva documentació, diu que retornarà un valor nul com un valor especial sentinella, o simplement una mena de símbol especial això vol dir que alguna cosa va sortir malament. Així que volem comprovar si hi ha que, perquè resulta que que nul és un valor molt perillós. 

Sovint, si vostè tracta de fer alguna cosa amb nul que implica un function-- passant com a entrada, per instance-- aquesta funció podria molt s'estavellarà i, amb ella, acabar amb tot el seu programa. Així que aquesta tercera línia ara és només un seny comprovar, comprovació d'errors, si es vol. Això és un bon hàbit ara per ens fiquem en qualsevol moment que tractar d'usar un valor que podrien, potencialment, ser nul. 

Ara, en la quarta línia d'aquí, "Si strcmp (s, t)," bé, ¿Quin és el que es refereix a? Bé, vam dir que això era una manera molt succinta funció anomenada per a la comparació de cadenes. I el seu propòsit a la vida és comparar el seu primer argument en contra d'ella en segon lloc, però no en termes de les seves direccions, com ho vam fer sense voler un moment fa amb el codi vermell, però en lloc de comparar els dos cadenes al humanament intuïtiva mitjançant la comparació d'aquesta manera, en contra d'aquest, contra això, contra això, i després s'aturen si i quan un o els dos dels meus dits realitza una barra invertida 0. Strcmp Així que fa anys algú implementades per posar en pràctica per a nosaltres la funcionalitat que esperem ens haguéssim aconseguit només per comparació de dos valors simples. 

Ara, francament, no deixo de dibuix tots aquests diversos nombres. Però la realitat és, que he estat fent aquests cap amunt tot el temps. I així que permetin-me simplement seguir endavant i gargotejar aquestes fora per fer un punt que, al final del dia i es mou cap endavant, no estem realment va a preocupar-se per el que aborda les coses són en realitat en la memòria. Així que no vaig a dibuixar aquests classes de nombres molt més, Sóc només un resum aquesta distància 01:00 poc més amable amb només fletxes. 

En altres paraules, si s és un punter, així, anem a dibuixar és, literalment, com un punter, una fletxa apuntant de si mateix a una altra cosa, i no et preocupis massa més sobre les minúcies d'aquestes adreces que, de nou, vaig fer de totes maneres. Però anem a veure aquestes adreces, de vegades, quan la depuració del codi. 

Ara mentre tant, aquest programa aquí correccions, és clar, aquest problema comparant aquestes dues cadenes. Però ens trobem amb un altre problema. Aquesta era de la còpia programar l'última vegada, amb la qual cosa, jo estava tractant de capitalitzar només el primer caràcter d'una cadena. Però el que era el símptoma vam veure l'última vegada quan un usuari va escriure en un valor, com gabe en minúscules, per s, llavors assignem s en t, com en la tercera línia d'allà, i després vaig tractar de capitalitzar t suport 0? Quin va ser l'efecte de la canviant t suport 0 aquí? 

AUDIÈNCIA: Va canviar s. 

DAVID J. Malan: Sí, Vaig canviar s, també. Perquè el que realment estava passant? Bé, deixa veure si puc netejar aquesta imatge, com segueix. 

Si s és, de nou, la paraula g, a, b, i, barra invertida, 0 i s continuarem dibuix com una caixa aquí, però hi ha més adreces. Anem a deixar de fer les coses. Anem a fer un dibuix per simplificar el món. 

Quan declaro t amb una corda t, que cregui que part de la memòria. Plaça passa a ser 32 bits en la majoria d'ordinadors. De fet, si alguna vegada has sentit parlar d'un ordinador que té una arquitectura de 32 bits, realment de luxe-parlar, que només vol dir que utilitza adreces de 32 bits. I com una tècnica a un costat, si alguna vegada s'ha preguntat ¿Per què els equips més antics, si realment tractat de sopa per dalt amb una gran quantitat de memòria RAM, només podia tenir un màxim de quatre gigabytes de RAM, bé això és perquè, literalment, seu antic equip només podia comptar tan alt com 4 mil milions, 4000000000 de bytes, perquè estava usant 32 bits números d'adreces. 

Però en qualsevol cas, en aquest exemple, d'història molt més simple. t és només un altre punter, o realment una estrella char, també conegut com a cadena. I com és el que vull per actualitzar la imatge ara amb la segona línia de codi, després del punt, punt, punt? Quan faig cadena t és igual a s punt i coma, Com canvia aquesta foto? Sí? 

AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: Si. Exactament. Acabo de posar una fletxa de la t caixa a la mateixa direcció, la mateixa primera lletra va donar. O tècnicament, si això noi estaven encara en 0x1, és com si tingués 0x1 0x1 aquí i aquí. Però, de nou, a qui li importa sobre les direccions? És només la idea que ara importa. Així que això és el que està passant aquí. Així que per descomptat, si ho fa t suport 0, que és la notació de matriu, descomptat-- i, francament, sembla que hi ha una gran varietat aquí, però ara hi ha una cosa estranya. Has de saber que el llenguatge de programació, C, li ofereix aquesta funció, de manera que, fins i tot si t és un punter, o s és un punter, pot seguir utilitzant aquest familiar, claudàtor còmode notació per anar al primer element, o el segon element, o qualsevol element que aquest punter està apuntant a, ja que, presumiblement, es és, com en aquest cas, apuntant en algun matriu. 

Llavors, com podem solucionar aquest problema? Francament, aquí és on es va aconseguir un mica aclaparador a primera vista. Però aquí és una versió nova i millorada. 

Així que primer, m'estic posant desfer-se de la biblioteca CS50, només per exposar que s és de fet una estrella char, només un sinònim. I t és també una estrella de carbó. Però el que està succeint en el costat dret d'aquesta línia on t s'assigna un valor? 

Què és malloc? Què strlen? Què és sizeof (char)? Per què dimonis fa això mirada tan complexa línia? Què fa a un alt nivell? Què s'emmagatzema en t? Sí? AUDIÈNCIA: És l'assignació d'un certa quantitat d'espai de memòria. És per emmagatzemar, suposo, cartes [inaudible]. 

DAVID J. Malan: Perfect. Perfect. És l'assignació d'un determinat quantitat d'espai de memòria per emmagatzemar, presumiblement, cartes futures. I en particular, malloc per tant, està tornant què? 

AUDIÈNCIA: Devolució de la [inaudible]? DAVID J. Malan: Exactament. Tornant la direcció d'aquesta memòria, que és una forma elegant de dir, retorna la direcció de la primer byte d'aquesta memòria. La responsabilitat recau en mi recordar la quantitat de memòria que en realitat assignat o sol · licitat per malloc. 

Ara, quant és això? Bé, tot i que no hi ha un munt de parèntesi aquí, malloc pren un sol argument. I estic especificant strlen de s, de manera que donen em tants bytes com n'hi ha en si, però afegeix un. Per què? Sí? 

AUDIÈNCIA: La barra invertida 0. DAVID J. Malan: Exactament. Hem de fer una mica de neteja. Així que perquè hi ha una barra invertida 0, serà millor record. En cas contrari, anem per crear una cadena que no ha de terminador especial. 

Mentrestant, només per estar súper anal, tinc sizeof (char), per si de cas algú es queda la meva codi no en l'aparell CS50, però potser un equip diferent en total, on caràcters són un byte, per convenció, però dos bytes, o alguna cosa més gran que això. És només de ser súper, súper reticent a errors. Tot i que, en realitat, és més probable que va a ser un 1. 

Ara, mentrestant, segueixo endavant i copio el corda, t suport i és igual a t suport s. I vaig a ajornar fins a la setmana del passat codi font per veure el que està passant. Però el punt clau, i la raó per la qual posar el codi ara en verd, es deu al fet que l'última línia, t suport 0 és igual ToUpper, té l'efecte de capitalització quina cadena? t i / o s? Aquesta última línia de codi. 

Just t, perquè el que és passat aquest temps, si puc desfer una mica l'últim pas, El que passa és, quan dic a malloc, Jo essencialment amb si un tros de memòria que és la mateixa mida que l'original, perquè aquesta és l'aritmètica que vaig fer. Estic emmagatzemant en t la direcció d'aquest tros de memòria. Tot i que aquest es veu bé i bonica, agradable i en blanc, la realitat és que hi ha, el que anem a seguir trucant, els valors d'escombraries aquí. Aquest tros de memòria podria molt així s'han usat abans, uns segons, fa uns minuts. Així que no podria absolutament ser nombres o cartes allà, només per accident. Però no són vàlides, fins que jo poblen aquest tros de memòria amb caràcters reals, com jo fer en aquest bucle allà. Bé? 

Així que ara, el punt culminant de aquests tres exemples que van ser aparentment trencat l'última vegada, aquest exemple d'intercanvi, aquesta funció treballat en el sentit que va canviar a i b. Però no va funcionar en l'altre sentit? Sí? 

AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: Exactament. Si hagués de trucar a aquesta funció de altre-- per exemple, d'una funció com a principal, on Tinc una variable, x i i, com jo ho va fer la setmana passada, el mateix codi, i pas en x i y l'intercanvi, i després trucar a Swap-- això, per descomptat, és la versió correcta és el que estem a punt de veure-- no va funcionar. Llavors, ¿quina és la solució? 

Bé, de manera que només per estar clar, deixa anar per davant y-- dóna'm un segon aquí, i veure si et puc mostrar l'última, que serà en-- anem a veure si puc trobar aquesta veritable Acceptar fast--, [inaudible]. Bé, aquí està. Així que ignora les ordres Només estic escrivint. Vull que es recuperi en l'últim minut un exemple de l'última vegada, que ara es diu no swap. 

Així que no és d'intercanvi on el deixem l'última vegada, per la qual cosa, I inicialitza x i i d'1 a 2. Llavors jo dic swap, que passa a 1 i 2. I llavors aquesta funció treballat en algun sentit, però no tenia permanent efectuar en xi y. Així que la pregunta en qüestió és, com ara és el que realment solucioni aquest problema? Quina és la solució a la mà? 

Bé, en swap.c, que és nou avui, compte un parell de diferències. x i i són el mateix. Però el que és clarament diferent en la línia 25? Què hi ha de nou allà, si vostè recorda el que semblava fa un segon? 

AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: Si. Així que els símbols d'unió són una nova peça de la sintaxi, no només en aquest programa, sinó també de forma més general a CS50. Fins ara, no crec hem vist alguns exemples o realment parlat d'ells en qualsevol detall, que no sigui, potser, de forma preventiva en secció, un símbol d'unió així. Bé, resulta que signe és un de les últimes peces de nova sintaxi anem a aprendre. L'únic que significa és la direcció d'alguna variable. En quina direcció ho fa x viuen? Però, ¿quina direcció i què viuen? Perquè si el problema fonamental abans es es van anar passant que x i y com còpies, el que realment volem fer es proporcionarà Intercanvi amb com un tresor mapa que condueix a on x i y en realitat són a la memòria RAM, de manera que Intercanviar pot seguir aquest mapa i anar a on vulgui x o i marca el lloc i canviar els valors actuals 1 i 2 Ja està. 

Així Intercanviar ha de canviar una mica massa. I a primera vista, això podria semblar una mica similar a l'estrella de carbó. I de fet ho és. Així que a és un punter a quin tipus de dades, basat en aquesta porció ressaltada? Així que és un int. 

Així que una ja no és un int, que és la direcció d'un int. I de manera similar, b ara va és la direcció d'un int. Així que quan dono la paraula d'intercanvi de principal, Jo no vaig a donar Intercanvi 1 i 2. Vaig a donar-li com Ox-alguna cosa i Ox-alguna cosa, dues direccions que condueixin Canviar per les seves ubicacions reals a la memòria del meu ordinador. 

Així que ara, la meva implementació restant ha de canviar una mica. Quin és òbviament diferent ara en aquestes tres línies de codi? Hi ha aquestes maleïdes totes les estrelles el lloc, d'acord? Llavors, què està passant aquí? Sí? 

AUDIÈNCIA: Òbviament és [inaudible]. 

DAVID J. Malan: Exactament. Així que en aquest contexto-- i això no era la millor decisió de disseny, cal reconèixer-ho, fa anys. En aquest context, on només hi ha una estrella, i vostè no té un tipus de dades, com int, immediatament a l'esquerra, en canvi vostè té un signe igual, amb claredat, en aquest context, quan dius protagonitzar una, això significa anar a la direcció que està en un. Seguiu el mapa del tresor, per així dir-ho. 

I mentrestant, en la línia 37, que significa el mateix. Aneu a la direcció d'una, i posar el que hi ha? Tot el que és en l' ubicació que especifica b. En altres paraules, aneu a b. Obtenir aquest valor. Anar a una i, per la igualtat signar, l'operador d'assignació, ja que el valor allà. 

De la mateixa manera, int temp és només un int. Res ha de canviar de temp. És només un got de recanvi de Annenberg una mica de llet o suc de taronja. Però jo necessito dir, aneu a b. Anar a aquest destí i posar el valor en temp allà. Llavors, què està passant llavors? Quan en realitat dic Canvieu aquest moment, si aquesta primera safata aquí representa Main, aquesta segona safata representa swap, quan Pas ampersand x i símbol d'unió i des Principal a swap, per ser clars, Què és això pila marc de recepció? Sí? 

AUDIÈNCIA: [inaudible]. DAVID J. Malan: Exactament. La direcció de la direcció de xi de y. I vostè pot pensar en aquests com adreces postals. 33 Oxford Street i 35 Oxford Street, i vostè desitgi moure els dos edificis que es troben en aquests llocs. 

És una espècie d'una idea ridícula, però això és tot el que volem dir amb la direcció. On en el món pot a trobar aquests dos sencers? On en el món es pot trobar els dos edificis? Així que si, finalment, després de tant temps em entrar en el codi font d'avui i compilar Intercanviar i córrer ./swap, finalment, per al primera vegada que fem realment per veure que els meus valors tenen a la veritat ha intercanviat amb èxit. I ara, fins i tot podem tenir nota d'aquesta, diguem, en gdb. 

Així que m'ho dius a mi anar en el mateix arxiu. Déjame anar per davant i córrer gdb de ./swap. I ara, al Swap, aniré endavant i establir un punt de ruptura en principal. I ara me'n vaig a anar endavant i executar el programa. I ara veiem meu codi detingut en aquesta línia. 

Si segueixo endavant i imprimir x, el que he de veure aquí? És una pregunta. Digues-ho de nou? 

AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: Així números a l'atzar, potser. Potser tinc sort, i és agradable i simple, com 0. Però potser és una mica de nombres aleatoris. En aquest cas, vaig tenir sort. És només passa a ser 0. Però sí que és sort, perquè no fins que escrigui al costat i després print x ha de línia de codi, la línia 19, ha executat. 

Mentrestant, si escric la propera vegada, i Ara imprimir i, vaig a veure 2. Ara, si escric següent, que serà ser una mica confús, perquè ara, el printf va a aparèixer en la pantalla, com ho va fer. x és 1. 

Anem a fer això de nou. I ara, aquí és on les coses es posen interessants. Abans que jo dic Intercanviar o fins i tot pas en ella, anem a fer un petit cop d'ull. x és, de nou, 1. I és, per descomptat, el seny ràpida comprovar, 2, de manera que no és difícil que hi ha. Però el que és signe x? Resposta, és una espècie de funky cerca. Però el int estrelles de parèntesis és només forma de dir això del PIB és una adreça. No és un int, que és un punter a un int, o també coneguda com una adreça. 

Què és aquesta bogeria? Mai hem vist una mica tan així abans. Així que aquesta és la direcció en el meu equip de record d'on x passa a viure. És Ox-alguna cosa. I això és, francament, per què He començat a dibuixar fletxes, en lloc de nombres, ja que realment es preocupa que la seva int es troba en un determinat direcció que és tan gran. Però bffff0c4, aquests són tots de fet dígits hexadecimals, que són de 0 a f. 

Així que no insistirem massa molt del que són aquestes coses. Però si imprimeixo i, per descomptat, veig 2. Però ampersand i, veig aquesta direcció. I fixin-, per als curiosos, Quina distància separa x i i? Pot passar per alt la major part de la direcció. Quatre bytes. I això és consistent amb la nostra abans afirmar que el gran és un int? Quatre bytes. Així que sembla que la guarnició de tot cap amunt molt bé, com era d'esperar, a la memòria. 

Així que ara, anem a avançar ràpidament fins al final d'aquesta història. Seguirem endavant i escriviu pas, submergir-se en la funció Swap. Ara noti, si escric una, és idèntica a la direcció de x. Si el tipus B, que és idèntica a l'adreça de i. Llavors, què he de veure si diuen, aneu a la direcció d'un? Així imprimir protagonitzar un. Així estrella significa anar-hi, en aquest context. Ampersand significa el que és l'adreça d'. Així estrella un mitjà 1. I print star b em fa 2. 

I m'ho dius a mi assumeixo, de moment, que almenys el codi que procedeix a executar pot ser ara motivat a través d'aquesta manera. Però ens tornarem a visitar aquesta idea en poc temps. Així que aquesta versió d'Intercanvi ara és correcta i permet ens canviem a aquest tipus de dades en particular. 

Així que qualsevol pregunta llavors swap? Per estrella? En la direcció d'? I veuràs, amb problemes 4, classe de, però problemes 5, sens dubte, com es coses són ajudes i molt més còmode amb ells, com a resultat. Qualsevol cosa en absolut? Bé. Així malloc és, de nou, aquesta funció que només assigna memòria, la memòria l'assignació. I per què és això útil? Bé, tot aquest temps, vostè ha estat utilitzant malloc. Si es té en compte ara com getString obres, presumiblement, és estat demanant a algú per un tros de la memòria, en qualsevol moment l'usuari escriu una cadena en, ja que sens dubte no sabia, ja que el personal CS50, el gran que aquestes cadenes que els humans van a escriure podria ser. 

Així que anem a, per primera vegada, comencen a Peli com funciona la biblioteca CS50, per mitjà d'un parell d'exemples que ens portarà allà. Així que si obro el gedit i obrir scanf 0, anem a veure el següent codi. Scanf 0, disponible al lloc web per avui en dia, té relativament poques línies de codi aquí, 14 a través de 20. I anem a veure el que està fent. Es declara un int, anomenat x. Diu una cosa així com: nombre per favor. I ara diu, scanf% i, i x. Així que hi ha un munt de coses noves allà. 

Però scanf, quin tipus de es pugui imaginar de com el contrari printf. printf, per descomptat, s'imprimeix a la pantalla. tipus scanf d'exploracions des de l'usuari de teclat cosa que ell o ella ha escrit. 

% I és igual que printf. Això vol dir esperar que el usuari escriviu un int. I ara, per què creus que podria passar scanf i x? Si el propòsit en la vida de scanf és aconseguir alguna cosa de l'usuari, Quin és el significat de passar, i x, ara? Sí? 

AUDIÈNCIA: [inaudible]. DAVID J. Malan: Exactament. El que jo, l'ésser humà, escric en la meva entrada serà fora de perill en aquest lloc. No n'hi ha prou, recordem, a Va esdevenir en x, perquè hem vist ja, cada vegada que passen només una variable prima, com un int, per a alguna altra funció, Segur, pot canviar això variable, però no de forma permanent. No pot tenir un efecte sobre Principal. Només pot canviar la seva pròpia còpia local. Però si, en canvi, no ho fa dóna'm el int real, però vostè em dóna adreces a que int, ara, sent scanf, sens dubte, puc seguir aquest abordar i posar un nombre no pel que té accés a ell també. 

Així que quan executo aquest programa, anem a veure. Fer scanf 0 punt slash, scanf 0. I si ara estic escrivint un nombre com 50, gràcies pel 50. Si ara escric un nombre com 1 negatiu, pel negatiu 1. Ara estic escrivint un nombre com 1.5, hm. Per què el meu programa em ignoren? Bé, perquè simplement, li vaig dir d'esperar només un int. Bé. Així que aquesta és una versió d'aquest. Anem a prendre les coses a un nivell superior i proposen que això no és bo. I aquí rau un exemple molt senzill de com podem començar a escriure codi que altres persones puguin explotar o comprometre en fer coses dolentes. Així que la línia 16, tan similar en esperit d'abans, però no vaig a declarar int aquest moment. Estic declarant que l'estrella char, també conegut com a cadena. 

Però, què significa això realment? Així que si no específic 1 address-- i Estic trucant de manera arbitrària, tampó, però vaig poder dic és, per ser simple-- i després faig això, explico a mi, si pogués, basat en l'anterior lògica, el que està fent scanf en la línia 18, si s passi% i tampó, que és l'adreça? Què és scanf, si s'aplica el exactament la mateixa lògica que la versió 0, va a tractar de fer aquí, quan l'usuari escriu alguna cosa en? Sí? 

AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: Exactament. Scanf, per la lògica anterior, es prendrà la cadena que el mecanografiada humana en-- ara és una cadena, no és un nombre, és de suposar, si ell o ella cooperates-- i que va a tractar de posar aquest cadena a la memòria en qualsevol direcció memòria intermèdia específica. I això és molt bo, perquè memòria intermèdia és de fet la intenció de ser una adreça. 

Però jo sostinc aquest programa està lliure d'errors en un manera molt greu, perquè ¿quin valor té esmorteir per defecte? Què he inicialitzat a? El tros de memòria? Jo no tinc, no? 

Així que tot i que ha assignat un estrella de carbó que ja no es diu s, es diu en lloc, per la buffer-- anem a dibuixar el nom de la variable ara com buffer-- si no tinc getString trucada o malloc aquí, això vol dir efectivament que tampó és només un valor d'escombraries. 

Ara, què vol dir això? Significa que jo he dit scanf esperar una cadena de l'usuari. I saps què? Sigui el que està apuntant A-- i dibuix signe d'interrogació, però en realitat, que serà una mena Ox1, 2, 3, no? És cert valor fals que només passa a ser-hi des d'abans. Així que dit d'una altra manera, és com si tampó és només que apunta a alguna cosa en la memòria. No tinc ni idea de què. 

Així que si escric en gabe ara, va per tractar de posar g-a-b-e / 0 no. Però, ¿qui sap el que és això? I en el passat, qualsevol temps hem tractat de tocar memòria que no li pertany a nosaltres, ¿què ha passat? O gairebé sempre. Decisió de segmentació, oi? 

Aquesta fletxa, no tinc ni idea d'on és assenyalant. és només un valor aleatori. I per descomptat, si vostè interpreta un valor aleatori com una adreça, vostè va a anar a alguna destinació a l'atzar. Així gabe podria efectivament accident el meu programa en aquest cas aquí. 

Llavors, què podem fer això és gairebé tan dolent? Penseu aquesta tercera i últim exemple d'scanf. Aquesta versió és millor en quin sentit? Si se sent còmode amb el problema anterior, això és millor. Per què? 

AUDIÈNCIA: [inaudible]. DAVID J. Malan: Good. Així que aquest cas de la línia 16 és millor, en el sentit que estem explícitament l'assignació d'una certa memòria. No estem usant malloc, estem usant la setmana 2 enfocament de simplement declarar una matriu. I hem dit abans que una cadena és només un conjunt de caràcters, així que això és totalment legítim. Però és, per descomptat, com nota, grandària fixa, 16. 

Així que aquest programa és totalment segur, si escric en les cadenes d'un personatge, de dos caràcters cadenes, 15 cadenes de caràcters. Però tan aviat com em poso a escriure 16, 17, 18, 1000, cadenes de caràcters on està aquesta cadena va a acabar? Es va a acabar en part aquí. Però llavors, ¿qui sap què més està més enllà de les fronteres d'aquesta sèrie en particular? 

És com si jo tinc declarat 16 caixes aquí. Així que en lloc de treure els 16, anem a només pretenc que he dibuixat 16. Però si llavors intento llegir un string això és molt més llarg, com 50 caràcters, Vaig a començar a posar a, b, c, d, x, i, z. I això és, presumiblement, algun altre segment de memòria que, de nou, podria causar meu programa es bloquegi, perquè jo no he demanat res més que 16 bytes. 

Així que a qui li importa? Bé, aquí està la biblioteca CS50. I la majoria d'això és només com instruccions de dalt. La biblioteca CS50, tot aquest temps, ha tingut aquesta línia en la línia 52. Hem vist typedef, o veurà typedef en conjunt de processadors 4, que només crea un Sinònim qual estrella carbó pot ser més referència simplement com a cadena. Així que aquest és un dels poques rodes d'entrenament hem utilitzat secretament sota de la caputxa. 

Mentrestant, aquí hi ha la funció getchar. Ara, aparentment, no hi ha cos per a això. I de fet, si segueixo desplaçament, no ho sé en realitat veure les implementacions d'aquestes funcions. Com una comprovació de validesa, per què és això? 

AUDIÈNCIA: [inaudible]. DAVID J. Malan: Si. Així que aquest és l'arxiu de capçalera. I els arxius de capçalera contenen prototips, a més d'algunes altres coses, pel que sembla, com typedefs. Però en CS50.c, que hem Mai li ha donat absoluta, però ha estat en l'aparell CS50 tot aquesta vegada, en el fons de les seves carpetes, compte que hi ha un conjunt munt de funcions aquí. 

De fet, anem a desplaçar-se cap avall. Anem a ignorar la majoria d'ells, per ara. Però desplaceu-vos cap avall per getInt i vegi com funciona getInt. Així que aquí és getInt. I si alguna vegada realment importava com arribar int funciona, aquí està la seva documentació. I entre les coses que diu és el que diu el que els rangs de valors que poden tornar. És essencialment negatiu 2000000000 a positiu 2 mil milions, més o menys. 

I resulta que, tot això temps, tot i que mai hem calia trobar-lo, si alguna cosa surt malament, resulta que tot aquest temps, getInt té ha de tornar un especial constant, no nul, sinó més aviat INT_MAX, que és convenció a només un programador. Això significa aquí és un valor especial. Assegureu-vos de comprovar això, simplement en cas que alguna cosa va malament. Però mai hem molestat amb que fins a la data, perquè, de nou, aquest s'entén per simplificar. 

Però, com aconseguir getInt implementat? Bé, un, que no té arguments. Sabem que. Retorna un int. Sabem que. Així que, com funciona sota de la caputxa? 

Així que hi ha pel que sembla un infinit llaç, almenys l'aparença d'un. Noteu que estem fent servir getString. Així que això és interessant. getInt crida la nostra pròpia funció, getString. I ara, ¿podria ser aquest el cas? Per què estic sent defensiva aquí en línia de 165? Què podria passar en línia 164, per ser clars? És la mateixa resposta que abans. Podria simplement estar fora de la memòria. Alguna cosa va malament amb getString, hem de ser capaços de manejar això. I la raó per la qual no torna nul és que, tècnicament, és un punter nul. getInt ha de retornar un int. Així que he arbitràriament decidit, en essència, que 2 mil milions, més o menys, va ser un valor especial que mai pot en realitat arribar des de l'usuari. És només el valor que jo vaig perdre per representar un codi d'error. 

Així que ara, les coses es posen una mica de fantasia. I no és exactament la mateixa funció com abans, però és molt similar. Llavors noto, declaro aquí, en línia 172, tant en un int n i un char c. I llavors jo faig servir aquesta línia covard, sscanf, el que resulta no analitza una cadena des del teclat. Es destaca una cadena existent que l'usuari ja ha teclejat. Així que ja vaig trucar getString, que vol dir que tinc una cadena a la memòria. sscanf és el que cridar a una funció d'anàlisi. Es veu en la cadena que he teclejat, caràcter per caràcter, i fa alguna cosa útil. Aquesta cadena s'emmagatzema en línia. I sé que només per anar una còpia de seguretat aquí i dir, oh, OK, Vaig trucar a no s aquest cop, però la línia. 

I ara això és una mica diferent. Però això significa, efectivament, per raons anem una mica agitem les nostres mans en l'actualitat, que estem comprovant a veure si l'usuari va escriure en i int i potser un altre caràcter. Si l'usuari va escriure en un int, és va a emmagatzemar en n, perquè sóc l'aprovació d'aquesta per la direcció, el nou truc que hem vist avui. Si l'usuari també escriu com en 123x, que x es va a acabar un carta de caràcter c. 

Ara resulta que sscanf em diran, intel · ligent, quants diferents variables es sscanf èxit capaç d'omplir. Esta és la lògica, si la funció Estic d'execució és getInt, però jo estic comprovant, potencialment, per a l'usuari haver escrit en un int seguit per una altra cosa, Què vull de sscanf valor de retorn de veritat que sigui? Si el propòsit és aconseguir només un int de l'usuari? 

Així que si sscanf devolucions 2, què significa això? L'usuari va escriure en alguna cosa així com, literalment, 123x, que és una tonteria. És una condició d'error, i Vull comprovar per això. 

Així que si l'usuari escriu això en, per aquesta lògica, el que fa sscanf tornar, Què li diries? Així que va a tornar 2, perquè el 123 va anar aquí, i la x va a acabar ací. Però jo no vull que la x per aconseguir ple. Vull sscanf només per tenir èxit en omplir la primera de les seves variables. I per això és que jo Vull sscanf per tornar 1. 

I si això és una mica més del cap de moment, això és totalment bé. Adonar però, que un dels valors de getInt i getString és que nosaltres estem fent una diables d'un gran quantitat de comprovació d'errors com aquest, així que, fins ara, vostè pot gairebé escriure res en el seu teclat, i anem a atrapar. I sens dubte, la personal, definitivament no ho farà ser la font d'un error en la seva programa, perquè estem a la defensiva la comprovació de tots els estúpids coses que un usuari podria fer, com escriure una cadena, quan realment volia int. Així que per ara-- vindrem de nou a això abans long-- però tot aquest temps, getString i getInt tenen estat per sota de la campana, amb aquest idea bàsica d'adreces de memòria. 

Així que ara, farem les coses una poc més fàcil d'utilitzar. Com es recordarà, des Binky última temps-- si el meu ratolí cooperate-- així vam tenir el codi, que francament, és bastant absurd. Aquest codi no aconsegueix res útil, però era l'exemple aquest professor Parlant utilitzat per representar el que estava passant en un programa que involucra la memòria. 

Així que anem a tornar a contar aquesta història molt breument. Aquestes dues primeres línies, en Anglès, què què, què li diries? Just in raonablement humà, però lleugerament termes tècnics, prendre una punyalada. AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: OK, que està establint adreces per les seves variables x i y. No del tot, perquè x i i no són variables en el sentit tradicional. x i y són adreces o emmagatzemarà la direcció. Així que anem a provar això una vegada més. No és un mal començament, però. Sí? 

AUDIÈNCIA: [inaudible]. DAVID J. Malan: Good. Crec que això és una mica més net. La declaració de dos punters, dos enters. I els estem cridant x i y. O si haguéssim de dibuixar això com una imatge, de nou, recordar simplement que tots que estem fent amb aquesta primera línia està dibuixant un quadre com aquest, amb un valor d'escombraries en ella, i dir que és X, i després un altre quadre com aquest, amb un valor d'escombraries en ella, cridant i. Hem declarat dos punters que en última instància emmagatzemarà la direcció d'un int. Així que això és tot el que hi ha. 

Així que quan Binky va fer això, el argila només es veia així. I Nick només tipus de embolicat en les fletxes, com si no estan apuntant en qualsevol lloc en particular, perquè són just valors d'escombraries. No estan inicialitzats explícitament en qualsevol lloc en particular. 

Ara, la següent línia de codi, el record, era això. Així que en raonablement fàcil d'usar, però anglès bé tècnic, el que és aquesta línia de codi fent? Sí? 

AUDIÈNCIA: [inaudible]. 

DAVID J. Malan: Perfect. És l'assignació de la part de la memòria que és de la mida d'un int. I això és la meitat de la resposta. Ha respost la dreta mitjà de l'expressió. El que està passant a l' costat esquerre del signe igual? Sí? AUDIÈNCIA: I cessionaris a la variable x? 

DAVID J. Malan: I cessionaris a la variable x. Així que per recapitular, assigna del costat dret suficient memòria per emmagatzemar un int. Però malloc específicament retorna l'adreça d'aquest tros de memòria, el que vostè té acaba de proposar s'emmagatzema en x. 

Així que el que Nick va fer l'última vegada amb Binky és arrossegar a aquest punter a terme, l'argila, apuntar ara en un tros blanc de la memòria que és igual a la grandària d'un int. I de fet, això significava per representar quatre bytes. 

Ara, la següent línia de codi va fer això, estrella x aconsegueix 42. Així 42 és senzill en el costat dret, sentit de la vida. Costat esquerre, estrella x vol dir què? Això també podria tenir gone-- això està bé. Okay. 

AUDIÈNCIA: Bàsicament, anar a la [inaudible] DAVID J. Malan: Good. AUDIÈNCIA: [inaudible]. DAVID J. Malan: Exactament. Costat esquerre significa anar a x. x és la direcció. És com 33 Oxford Street, o Ox1. I l'estrella x significa anar a aquest abordar i posar el que hi ha? 42. 

Així que de fet, això és exactament el que Nick va fer. Va començar amb per, essencialment, mental assenyalant amb el dit a x, seguint la fletxa per al quadre blanc a la mà dreta banda, i posant el número 42 allà. Però després les coses es van posar un poc perillós, oi? Binky està a punt de perdre el cap. 

Estrella i és igual a 13, la mala sort, vol dir què? Així que cap mitjà estrelles van a la direcció en i. Però quina és la direcció en i? Molt bé, és el valor d'escombraries, oi? El vaig dibuixar com un signe d'interrogació. Nick el va dibuixar com una fletxa arraulit. I tan aviat com vostè tracta de fer estrella i, paraula, veu allà, però no hi ha una legítima direcció, que és una ubicació falsa, el programa va a estavellar. I el cap de Binky va a volar aquí, com ho va fer. 

Així que al final, aquest programa era només falla a tota màquina. Va ser un programa amb errors. I cal que es fixi. I l'única manera, en realitat, per arreglar seria, per exemple, aquesta línia, que ni tan sols vam poder, perquè el programa es va estavellar abans d'hora. Però si anéssim a solucionar aquest problema, el que efecte fa fer i x tenen iguals? Bé, que apunta essencialment a en qualsevol valor x està apuntant. 

Així que en la història de Nick, o la història de Binky, tant x i i assenyalaven el tros blanc de la memòria, de manera que, finalment, quan es no és igual a 13 en estrella I de nou, acabes posant 13 a la ubicació adequada. Així que totes aquestes línies són perfectament legítim, a excepció d'aquest, quan va succeir abans realitat i assignat un valor. 

Ara per sort, no ho fa de raonar a través de tots d'aquest tipus de problemes pel seu compte. Déjame anar endavant i obrir una finestra de terminal aquí i obrir, per un moment, un programa súper curt que També és una mena de sentit. És lleig. No aconseguir res útil. Però sí demostra qüestions de la memòria, així que anem a fer una ullada. 

Principal, super simple. Pel que sembla crida a una funció, f i, a continuació, retorna 0. És una mica difícil d'arruïnar això. Així principal és bastant bo, fins ara. 

Així que f és problemàtica. I simplement no posar gaire esforç en nomenar- aquí, per mantenir l'atenció en el codi. f té dues línies. I anem a veure el que està passant ara. Així, d'una banda aquí-- i permetin-me fer aquesta consistent amb l'anterior exemple-- d'una banda, el costat esquerre és fent el que, en anglès? És és-- AUDIÈNCIA: Creació d'un punter. DAVID J. Malan: Creació d'un punter a un int i dir que és x. Així que és la creació d'una d'aquestes caixes Segueixo dibuixant a la pantalla tàctil. I ara, a la mà dreta banda, malloc, és clar, és l'assignació d'una part de la memòria. I perquè quedi clar, com quantitat de memòria que aparentment assignació, si només tipus de fer els càlculs aquí? 

Així que és de 40 bytes. I sé que només perquè sé que un int, en l'aparell CS50, almenys, és de quatre bytes. Així que 10 vegades 4 és 40. Així que aquest és l'emmagatzematge d'una x, la direcció del primer dels 40 punts que s'han assignat espai enrere, cap enrere, cap enrere, cap enrere. 

I això és el que és clau sobre malloc. No es necessita una mica de memòria aquí, una mica aquí, una mica aquí. Li dóna un tros de memòria, contigua, de l'operació sistema. 

Ara què passa amb això, x suport 10 és igual a 0? Línia arbitrària de codi. No aconseguir res útil. Però és interessant, perquè x suport 10--? Sí? 

AUDIÈNCIA: [inaudible]? 

DAVID J. Malan: x suport 10 no ha de ser nul. El detall nul només entra en joc amb cordes, al final d'una cadena. Però un bon pensament. 

Què tan gran és aquesta matriu, fins i tot encara que he assignar 40 bytes? És 0 al nou, no? És 10 ints, total. 40 bytes, però 10 intercepcions, 0 0 indexades a través. 

Llavors, què és que x suport de 10? En realitat és una mica escombraries valor desconegut. És la memòria que no pertany a mi. No hauria d'estar tocant que número 41, 42, 43, 44 byte. M'estic tornant una mica massa lluny. 

I de fet, si em quedo aquesta programa, que molt bé podria estavellar-se. Però de vegades, tinguem sort. I el que acaba de demostrar esto-- i, francament, mai se sap abans de Què it-- anem a córrer això. És en realitat no bloquegi. 

Però si canvi d'això, per exemple, que sigui com 1000, per fer això realment deliberada, vegem si podem aconseguir que es bloquegi aquest moment. Bé, no es va estavellar. Què hi ha de 100.000? Anem a refer, i ara tornar a executar-lo. Okay. Ufff. Bé. Així que pel que sembla, una vegada més, aquests segments de memòria, per així dir-ho, són bastant grans, pel que podem tenir sort una i altra vegada. Però amb el temps, una vegada que arribi ridícul i realment anar molt lluny a la pantalla, toca de memòria que realment, realment no pertany a vostè. 

Però, francament, aquests tipus de bestioles van a ser més difícil i més difícil esbrinar pel seu compte. Però, per sort, com programadors, tenim eines que ens permeten fer això per nosaltres. Així que aquesta és, potser, un dels programes més lletges, fins i tot més lleig que la sortida de gdb. Però sempre té una línia o 2 que són molt útils. 

Valgrind és un programa que ajuda a no depurar un programa, per se, però troba relacionada amb la memòria problemes, específicament. S'executarà automàticament el codi per vostè i busca almenys dues coses. Un, ¿vas fer alguna cosa accidental com la memòria tàctil això no et pertany? L'ajudarà a trobar aquests casos. 

I dos, que l'ajudarà a trobar alguna cosa que es diu pèrdues de memòria, que tenim completament ignorat, ingènuament, durant algun temps i feliçment. Però resulta que, tot aquesta vegada, sempre que sigui vostè ha cridat getString a així que molts dels nostres programes, vostè està demanant l'operatiu sistema per a la memòria, però tens cap record de tant donant esquena, fent unalloc, o lliure, com se l'anomena. No, perquè mai hem Li ha demanat que ho faci. 

Però tot aquest temps, els programes de que has estat escrivint en C han estat fuites de memòria, demanant a l'operació sistema per obtenir més i més memòria per a les cadenes i tot això, però mai va tornar. I ara això és una mica d'una simplificació excessiva, però si alguna vegada t'has dirigit teu Mac o teu PC des de fa força temps, l'obertura un munt de programes, potser tancar els programes, i malgrat que la seva equip no s'ha estavellat, cada vegada és molt més lent, com si realment utilitzant una gran quantitat de memòria o recursos, tot i que, si vostè no és encara Tocar el teclat, que podria ser-- però no podia sempre-- ser que els programes que s'estan executant tenen a si mateixos les pèrdues de memòria. I segueixen demanant al OS de més i més memòria, però oblidant d'això, en realitat no l'utilitzi, però Per tant, tenint la memòria de distància d'altres programes que vulguin ell. Així que aquesta és una explicació comuna. Ara aquí és on Valgrind de sortida és completament atroç als menys i més semblants còmode. Però l'interessant coses és just aquí. M'està dient una escriptura no vàlida de talla 4 succeeix en aquest programa, en particular, en la línia 21 de memory.c. 

Si vaig a la línia 21, hm, aquí sí és una escriptura no vàlid de mida 4. Per què la mida 4? Bé, això number-- i podria ser qualsevol cosa-- és un int. Així que és quatre bytes. Així que em vaig a posar 4 bytes on no pertanyen. Això és el que Valgrind és en realitat em diu. D'altra banda, també ho farà digues-me, com veurem, ja que es corre aquest en un conjunt de processadors futurs, sempre i quan has filtraste memòria, el que de fet Que tinc, perquè jo he anomenat malloc, però no ho he fet realitat anomenat, en aquest cas, lliure, que veurem amb el temps és el contrari malloc. 

Així que ara, crec, un últim exemple. Així que aquest és una mica més arcà, però és potser la raó més gran per anar amb compte amb la memòria, i la raó que molts programes i / o servidors web, fins i tot a aquest dia, són assumides pels nois dolents en algun lloc a l'Internet que són d'alguna manera l'enviament de paquets falsos al seu servidor tractant de comprometre els seus comptes, o prendre les seves dades, o simplement generalment fer-se càrrec d'una màquina. Desbordament de memòria intermèdia, com la nom indica, mitjans desbordant no un int, però un memòria intermèdia. I un tampó és només una forma elegant de dir que és un munt de memòria. 

I, de fet, vaig trucar a una cadena abans de tampó, en lloc de s. Perquè si és una memòria intermèdia, com en el sentit de YouTube, o en qualsevol moment que estiguis veient un vídeo, que podria haver vist la paraula buffering, dot, dot, dot. És increïblement molest. I això només significa que el seu reproductor de vídeo està tractant de descarregar un munt de bytes, un munt de bytes d'un vídeo d'internet. Però és lent, pel que està tractant per descarregar un munt d'ells per omplir un tampó, un contenidor, de manera que vostè té suficients bytes que pot llavors li mostrarà el vídeo, sense aturar constantment. Però resulta que, vostè pot tenir un buffer per aquesta mida. Però tractar de posar aquesta quantitat de dades en , I molt dolentes coses poden succeir. Així, per exemple, donem una ullada a aquest desafiament per a la final d'un exemple. Aquest és un altre programa que, a primera vista, no fa res super útil. Té una funció principal que crida a aquesta funció, f. I aquesta funció, f, fins aquí, té una matriu de caràcters, anomenat c, de cos 12. I després hi ha l'ús d'aquest nova funció anomenada strncpy. 

Resulta que, amb aquest senzill, simple línia de codi, a només dos línies, hem fet tota la meva programa, i per tant, tot el meu equip, i el meu compte d'usuari, i el meu disc conduir potencialment vulnerable a qualsevol que sap i és prou bo per córrer aquest programa amb una línia d'ordres certa argument. En altres paraules, si aquest noi dolent posa dins argvargv [1] escrivint en el teclat d'un molt especialment dissenyat cadena, no abc, 123, però en essència, símbols binaris que representen executable codi, un programa que ell o ella va escriure, amb aquest senzill programa, que és representant de milers de programes de que són igualment vulnerables, m'atreveixo a dir, ell o ella en última instància, pot esborrar tots els arxius en el meu disc dur, aconseguir un parpelleig ràpid perquè ell o ella pot escriure ordres pel seu compte, correu electrònic tots els arxius a mi mateix. Tot el que puc fer, o ella pot fer amb aquest codi. 

No anem a resoldre aquest bastant encara. I, de fet, va implicar una petita imatge així, que aviat vindrem per entendre millor. Però per ara, anem a acabar en el que és, amb sort, una mica més broma XKCD comprensible, fins que reprenguem la propera vegada. Bé. Ens veiem dimecres. 

[REPRODUCCIÓ DE MÚSICA] 

ALTAVEU: I ara, en el fons pensaments, per Daven Farnham. La memòria és com saltar en un pila de fulles d'or en una tarda de diumenge. Bufat vent, llançant la seva hair-- oh, trobo a faltar els dies cuando-- 

[Rialles]