>> [Reproducció de música]
>> DAVID J. Malan: Bé això és CS50 i aquest és el començament de la cinquena setmana.
Així que avui, per sota dels coixins dels seients, no trobaràs res.
Però abans, vostè ha de trobar aquests un petita mostra del nostre agraïment per
tota la feina que es posa en el joc dels Quinze.
Simplement tregui el petit cercle en el sota per començar a jugar per al
resta de la classe.
>> Així que recorda que, o saber que problema plantejat 04:00, que va sortir aquest cap de setmana,
implica escriure un altre joc.
Però aquesta vegada es tracta d'utilitzar un interfície gràfica d'usuari real, no una
de textual com Joc dels Quinze era.
I el joc que està davant teu, si encara no has vist aquesta propera,
es veu una mica d'alguna cosa com això.
Vaig a entrar en el meu terminal aquí a BGF finestra.
I jo seguiré endavant i executar el necessitat de personal, que es pot accedir
després d'executar l'actualització 50, com de costum.
>> Però em vaig a posar en una mica de manera secreta, un petit ou de Pasqua,
anomenat mode Déu, posar a Déu en argv1.
I he de seguir les meves pròpies adreces, executar en la meva pròpia
problema de configurar el directori.
Així que ja ho veus una versió completa del joc de Breakout.
De fet, aquest és la manera de no-mans.
Així que en realitat és -
captivar tot i que podria ser -
bastant trivial per implementar la manera Déu en Breakout, a diferència del joc dels Quinze,
que alguns de vostès han abordat per a l'edició dels pirates cibernètics.
>> En Breakout ha prou en Déu la manera amb què es faci el que,
intuïtivament amb la pala?
Així que tingui la mateixa sigui quin sigui el posició horitzontal de la pilota.
I mentre ho fa al mateix ritme amb la pilota en moviment el joc es
Mai, mai, mai perdis la pilota i que guanyarà cada vegada.
>> Però en l'edició pirata de la setmana hi ha alguna cosa més que la manera de Déu.
Hi ha un nombre d'altres característiques.
Entre ells, els làsers.
Així que si vostè realment aconsegueix impacient que pot iniciar l'enderroc dels maons
i alguns altres.
I per a aquells de vostès que li agradaria calibrar estàndard versus hackers
edició, veig que d'aquesta setmana edició pirata informàtic deliberadament una
poc més factible, per exemple, que Déu manera va ser amb el joc dels Quinze.
>> Així que si vostè està a la recerca d'un tram i vostè està buscant una mica de diversió addicional
característiques fan busseig en si d'interessos.
Ara més pràcticament, permetin-me assenyalar a terme una cosa així.
GDB, que alguns de vosaltres encara no poden tenir tocat personalment, cosa que està bé.
Però ara és realment el temps per acostumar a això i còmode amb aquesta eina
ja que farà que les seves vides molt més fàcil, realment.
>> Per la conferència de Rob en GDB un parell de setmanes enrere, recordar
que GDB és un depurador.
És una eina que li permet executar el seu programa, però el porta pas a pas, la línia
per línia, perquè pugui furgar, perquè vegis les coses que succeeixen, pel
que es pot imprimir valors de les variables.
En poques paraules, li dóna molt més energia que printDef fa.
>> Ara és cert, la interfície és bastant misteriós.
Interfície de text en blanc i negre en la seva major part.
Les comandes són una mica difícils per recordar al primer.
Però tot i que podria haver de mitjana una hora, una hora, per dir que per avançat
inversió de temps en ella, confia en mi.
Certament, abans de final de semestre es guardarà que un ordre de magnitud més
temps que això.
>> Així que a principis de la setmana capbussar
I en termes de Breakout, sap que pot fer-ho sempre que vostè té
el codi de distribució o el seu propi codi en curs en el directori Pst4.
Sàpiga que vostè pot executar gdb. / Ruptura.
>> Això va a obrir una finestra com aquesta.
Deixeu-me em lliuro més d'una finestra de terminal.
I llavors el que vaig a seguir endavant i fer, és no només el dirigeix.
Vaig a establir per primera vegada un punt d'inflexió recordo, que li permet fer una pausa
execució en un determinat lloc.
>> Només per mantenir les coses simples que vaig trencar en la línia un amb tan sols escriure
el número u.
Permetin-me realment tornar a obrir aquesta finestra perquè s'està fent un
mica petit allà.
Així que el que ara faré aquí és si obro la meva finestra de terminal.
Anem, aquí anem.
>> Així que ara si torno a dropbox, Pst4 i executar gdb. / breakout entrar, es va adonar
Vaig a trencar un per establir un punt de trencament en la línia un.
I ara em vaig a anar endavant i escriviu run.
I quan ho faci, observi res sembla succeir.
>> No hi ha pop up.
No hi ha gràfic interfície d'usuari encara.
Però això és comprensible perquè estic literalment, en la línia que està en el meu programa.
I noto que he avança ràpidament, específicament ara a 62, perquè tots
les coses a la part superior d'aquest arxiu és coses com els comentaris i les constants i
sense interès material per ara.
>> Així que ara estic dins del principal, pel que sembla, en la línia 62.
I això és només la distribució codi, el record.
Si obro aquesta per anar, de manera similar, en el meu directori de bústia a Pst4,
en breakout.c.
I si em desplaço cap avall i avall i avall, i vull seguir endavant i encenc
els meus números de línia.
>> El que vaig a veure si em desplaço fins línia 62, és exactament la línia que
hem aturar a.
Així que aquesta línia d'aquí, 62 anys, és quan estem a punt de ser-ho.
Així que ara a GDB, si segueixo endavant i escric ia continuació, escrigui que va a
executar aquesta línia.
I voila, tenim la l'anomenada finestra de g.
Si no està familiaritzat amb el que una GWindow és a dir, que no es preocupés.
L'especificació li donarà a conèixer, com així com una sèrie de vídeos tutorial
incrustat en l'especificació.
>> Però ara anem a fer d'aquest un mica més interessant.
Vaig a moure aquesta finestra a través de a un costat una mica.
Permetin-me fer una mica la finestra gran perquè pugui veure més.
>> I ara me n'aniré per davant i fer la propera vegada.
I no són els meus maons.
Si escric propera vegada ara veig la pilota.
I si escric propera vegada ara veig la paleta.
>> I afortunadament això no és gedit realment cooperar mostrant
tot el que vull.
Però si faig el següent una altra vegada, següent una altra vegada, estic
declarar algunes variables.
I puc imprimir qualsevol d'aquests nois.
Maons d'impressió, impressions vides.
>> I ara, si segueixo fent següent, noto que seré
a l'interior d'aquest bucle.
No obstant això, el codi es va a executar exactament el que jo esperava.
Així que quan vaig arribar a aquesta funció, esperi de Click, que farà
literalment això.
Així que em semblava haver perdut el control sobre el programa.
>> BGF no em dóna un altre avís.
Però no es preocupi.
Aneu al meu joc, feu clic a algun lloc.
>> I ja està, ara es procedeix a la línia 86.
Així que de nou, és molt valuosa, en última instància, per als problemes de depuració.
Perquè vostè pot caminar literalment a través el seu codi, imprimir coses i molt més,
molt, més.
Però per ara, les eines per si sols ha t'ofereix molt més.
>> Així que estem, per descomptat, fer una ullada en Gràfiques ara, de cop i volta.
I ara el nostre món es torna una mica més interessant.
I vostè sap, potser, d'alguns dels vídeos en línia que tenim aquests
curts que has estat veient com a part de conjunts de problemes.
>> I han estat afusellats, deliberadament, contra un teló de fons blanc.
I alguns d'ells tenen l'ensenyament Els becaris de dibuix un text en el
pantalla que se superposa al costat d'ells.
Però, és clar, això no és tot el que interessant en el món real.
Això és només una sala de conferències amb una pantalla gran de color blanc i un teló de fons.
I el nostre increïble equip de producció tipus de fa que tot sembli bonic
després dels fets pels quals afloren o superposició de res
que fem o no volem.
>> Ara només has de motivar aquesta setmana i realment, on es pot anar, en última instància,
amb la informàtica.
No només després de problema plantejat 04:00.
Però després d'un altre curs o un enter currículum és increïble el que es pot
fer en aquests dies, en termes de gràfics en particular.
>> Alguns de vosaltres heu vist aquest flueix al voltant en línia.
Però vaig pensar que t'anava a presentar, per un parell de minuts, una visió del
tecnologia informàtica i el que CGI, gràfics d'ordinador poden fer en aquests dies
amb una cançó coneguda i potser pel · lícula.
>> [MUSIC - LLANA DE L'RAY, "JOVE I BELLA]
>> ALTAVEU 1: És només una mica increïble, potser, el
omnipresent -
>> [Aplaudiments]
>> ALTAVEU 1: Acabo de descarregar ell.
Però és realment increïble, crec que, igual com el programari omnipresent i codi i
eines com aquesta realitat.
Així que això és una mostra de la direcció en el qual es pot anar.
Oh, no més Appliance avui.
Bé, això és realment tràgic moment donat al punt que només vaig tractar de fer.
>> Molt bé, així que anem a llançar Fusió de nou.
Recordar més tard.
Molt bé, i que hauria d'haver aconseguit una correu electrònic en un a part si es va fer un
compte així.
Molt bé, així que recordar que la setmana passada comencem a pelar aquest
més tard conegut com a cadena.
>> string recorda un tipus de dades que és declarat a la biblioteca CS50.
I és part de les rodes d'entrenament que ara començarà a enlairar-se.
Era un concepte útil des del principi.
Però ara es posarà més interessant i més poderosa per
realment veure que sota el capó, una cadena és just el que, ens vam dir?
>> Sí, així que és una crida char *.
I el * denota que no hi ha algun tipus de direcció dels involucrats.
I així, quan vostè diu char * només dir una variable el tipus de dades és un
punter ara.
El fet que no hi ha l'estrella simplement vol dir que vostè està declarant un
els anomenats punter.
I aquest punter va a semblar emmagatzemar la direcció de, per
Per descomptat, un char.
>> Ara, per què té sentit?
Bé, el que és una cadena sota de la caputxa?
Bé, fa temps que hem estat dient que una cadena sota de la campana és
només h-I-l-l-o, per exemple.
>> Però ja hem parlat d'això com sent, en essència, una matriu.
I un conjunt llavors mirar una mica de la mateixa família, amb cada un d'aquests
fer un mos.
I hem dit que hi ha alguna cosa especial tornar aquí, el
barra invertida 0 o terminador nul.
>> Així que tot aquest temps, això aquí ha estat una cadena.
Però, en realitat, una cadena és en realitat una direcció.
I les direccions, com veurem, són sovint amb el prefix 0x per convenció.
Què denoten 0x?
Algú ho sap?
>> Tan sols significa hexadecimal.
Així que vostè pot recordar, en realitat, des Pst 1, crec, una de les d'escalfament
preguntes realment els va preguntar sobre notació hexadecimal, a més de
binari i decimal.
I la motivació aquí és que amb hexadecimal que té 16
els dígits a la seva disposició.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, seguit per a, b, c, d, e, f.
>> I si es compten tots els de dalt, s'obté un total de 16.
Així que això és en contrast amb decimal, on tenim 10
dígits, del 0 al 9.
És en contrast amb el binari on només tenim 0 i 1.
>> Però al final del dia vostè pot simplement representar els mateixos números, però
alguna cosa diferent.
I hexadecimal és comú, ja que resulta que - i veurem aquesta
més endavant en el curs - fins i tot quan ens a la programació web en el context de
HTML i els codis de color, hexadecimal és agradable.
Com que cada dígit, resulta que, representa quatre bits perfectament.
Per tant, només una mica de línies molt bé com veurem amb el temps veiem.
Així que això podria ser Ox123 o alguna cosa així, que denota la direcció 123
en algun lloc dins meu la memòria de l'ordinador.
>> Però, és clar, sorgeixen alguns problemes a causa d'això subjacent
aplicació.
I recordo que vaig prendre una punyalada en implementació d'una funció com aquesta -
comparar tauler 0 punts c la setmana passada, que tot i que semblava que era
bé, simplement no es pot comparar dues cordes correctament.
>> He tirat principal, i m'he llançat lluny els comentaris dels clients es centrin en l'
el codi que és d'interès aquí.
I és en vermell perquè és erroni.
Per quina raó?
>> Bé, a la part superior existeix quan vaig declarar una cadena, el que realment estava passant
sota de la caputxa?
Bé, deixa anar a la Aquí la pantalla i dibuixar això.
Així que jo vaig declarar, de nou, string s GetString.
>> Així que seguiré endavant i ara s per dibuixar el que realment és.
Serà una plaça aquí.
I vaig a reclamar que això és 32 bits.
Almenys en general és, almenys en el CS50
aparell en una gran quantitat d'equips.
Vaig a cridar s.
>> Però ara recordo que anomenada GetString.
Així que torna GetString, per descomptat, una cadena.
Si l'usuari escriu en h-e-l-l-o entren la cadena hola es retorna.
I aquesta cadena, com acabem de dir, acaba a la memòria del seu ordinador a algun lloc
amb una barra invertida 0 al final.
Vaig a trucar aquesta com la matriu - o bloc contigu de caràcters -
que en realitat és.
>> I ara, què és getString fet tornar?
Què ha estat tornant getString tot aquest temps?
Bé, diem, en setmanes anteriors, retorna una cadena.
No obstant això, més tècnicament, el que fa GetString retorn semblar?
>> AUDIÈNCIA: Una adreça.
>> ALTAVEU 1: Una adreça.
Específicament, es torna la direcció de la primera mossegada, el que sigui.
Segueixo fent servir un, dos, tres perquè és convenient.
>> Es retorna l'adreça de la primera caràcter en la cadena.
I vam dir la setmana passada que que és suficient.
Perquè sempre podem esbrinar on al final de la cadena amb només
iterar sobre ella, potser, amb una de llaç o bucle while o alguna cosa així
que, només a la recerca de "barra invertida 0", el caràcter especial sentinella.
>> I sabem que la cadena passa a ser de longitud -
en aquest cas -
05:00.
Així que tècnicament ho fa GetString es torna Ox123 en aquest cas.
I tècnicament el que passa llavors és que emmagatzemem, a l'interior de s, Ox123.
Al final del dia, tot i que aquest és nou concepte, els punters, són
només variables.
Però succeeix que emmagatzemar bits que representar col · lectivament una adreça.
Així que tècnicament tot el que obté emmagatzemats en si és Ox123.
>> Però nosaltres, com a éssers humans -
inclòs avui en endavant -
realment no s'importarà, en general, quina és l'adreça real és
d'alguna part de la memòria.
És només que a menor nivell de detall ser intel · lectualment interessant.
Així que em vaig a desfer això.
I en canvi, més alt nivell, simplement dir que quan estem parlant de punters
Jo només vaig a trucar més arrow fàcil d'usar que transmet la
mateixa idea i abstreu els detalls del que l'actual
Direcció subjacent.
>> Ara bé, si ens remuntem en el codi, el que va passar la setmana passada si tenim cadena t
és igual a GetString?
Bé, si de nou, escriviu hola aquesta vegada ho aconseguiré
altra part de la memòria.
h-I-l-l-o barra invertida 0.
>> Però perquè vaig trucar GetString per segona vegada -
i sé que això de mirar la codi font per GetString - fins i tot
encara que és una coincidència que hola era escrit en dues ocasions, GetString no és
anem a tractar d'optimitzar i ser intel · ligent.
No només va a aconseguir un altre tros de la memòria de l'ordinador, que és
serà en una altra direcció.
Anem a dir simplement arbitrària 456.
>> I llavors, què es va a tornar?
Es va a tornar 456 i deseu-lo en t.
Llavors, què està passant en realitat, al esquerra és que tinc un altre tros
de la memòria, típicament 32 bits.
I aquí es va a anar Ox456.
Però, de nou, no estic interessat en aquests números particulars més.
Jo només vaig a abstractament dibuixar com una fletxa.
>> Així que aquesta és ara una nova explicació.
Però és la mateixa idea exacta que és vingut succeint durant tot aquest temps.
I així, la raó, doncs, que aquesta primera versió de comparació era amb errors
la setmana passada és la raó?
Quan ho faci, si s és igual a igual t ¿Quins són realment
sota de la caputxa comparant?
>> Vostè està comparant les direccions.
I només intuïtivament, clarament, Ox123 no va a la igualtat Ox456.
Aquests números, aquests bits són només diferents.
>> I així, constantment, la setmana passada, va dir escriu coses diferents, encara que el
paraules van ser textualment la mateixa.
Així que podem solucionar aquest problema.
En termes senzills, quina va ser la solució?
>> AUDIÈNCIA: Utilitzeu una funció.
>> ALTAVEU 1: Utilitzeu una funció.
O les estrelles són sens dubte involucrats, però l'ús d'una funció per fer què?
>> AUDIÈNCIA: Comparar les cordes.
>> ALTAVEU 1: Comparar les cordes.
Així que el problema fonamental era que només estava pensant en la
qualitat de cadenes a ser definida per comparació de les seves direccions.
I, òbviament, això és tonto ara, un cop vostè entén el que està passant
sota de la caputxa.
Per comparar realment les cadenes per veure si que són iguals en la forma en què un ésser humà
es consideren dues cadenes són iguals necessitem comparar caràcter de
caràcter a caràcter.
>> Ara jo podria haver fet aquesta molt prolixament.
Però familiarment, estem utilitzant un bucle.
I just comparar s abraçadora i contra el suport t i.
s i suport més 1 contra t suport i + 1, i així successivament, a l'interior
algun tipus de bucle.
I si veig qualsevol dels dos personatges que són diferents, o si m'adono que ooh, s és
més curt que t o més llarg que t El que puc dir immediatament fals,
no són el mateix.
>> Però si em poso a través de s i t i dir mateix, la mateixa, igual, igual, igual, final de
ambdues cadenes, puc dir cert, són iguals.
Fa Bé, per sort, any a algú escriure que codifiquen per a nosaltres.
>> I ho van cridar STRCOMP per a la comparació de cadenes.
I tot i que és un petit taulell intuïtiva, StrComp retorna 0 si els
dues cadenes, s i t són els mateixos.
Però torna valor negatiu si s ha de venir abans de t alfabètic o
valor positiu si s'hauria després de t alfabèticament.
>> Així que si mai voleu ordenar alguna cosa, resulta que StrComp és útil.
A causa que no es limita a dir si o no, iguals o no.
Li dóna un sentit d'ordenar com una força diccionari.
Així StrComp, s comes t és igual a és igual a 0 significa que el
cadenes són realment iguals.
Perquè qui va escriure aquesta funció Fa anys utilitzat presumiblement un bucle
o un bucle while o alguna cosa així per integrar més dels caràcters de nou
i una i altra vegada.
>> No obstant això, dos problemes van sorgir aquí.
Aquest era copy0.c.
I els dos en vermell és perquè és defectuós.
I el que vam fer aquí?
Bé, primer que vaig trucar GetString.
I vaig guardar el valor de retorn en si.
Així que això és més o menys el mateix que aquesta part superior de la imatge.
>> Però, què ve després?
Bé, deixa anar endavant i desfaig d'un munt d'això.
Anem a rebobinar en el temps per al qual només que s, que ara és consistent amb
línia un allà.
>> Reviso.
Si s és igual a és igual a 0.
Ara, una nota ràpida, quan podria GetString tornar 0?
No hi ha prou memòria.
Cert?
>> És estrany que això va a succeir, sens dubte en un equip que està
té centenars de megues o fins i tot gigues de RAM.
Però podria, en teoria, tornar 0, especialment si el
usuari no coopera.
Hi ha maneres de fer veure que no ho ha fet res d'entrada i el parany
GetString a la volta 0 eficaçment.
>> Així que va a comprovar això.
Perquè si algun de vostès han començat a aconseguir, ja, de segment -
que probablement ha estat una font de certa frustració -
aquests són gairebé sempre el resultat d'error relacionat amb la memòria.
D'alguna manera en mal estat respecte a un punter, encara que no es va adonar
hi va haver un punter.
Així que podria haver induït la segmentació defectes tan aviat com la primera setmana amb
alguna cosa així com un bucle o un temps llaç i una matriu per anar massa lluny
més enllà dels límits de la matriu que alguns vostè va declarar, en la segona setmana de
en particular.
>> És possible que hagi fet, fins i tot en un problema establir 4 amb Breakout.
Tot i que probablement no ha vist les estrelles en el codi de distribució per
Breakout, resulta que els GRect i GOVAL i altres coses,
aquests són en realitat punters sota de la caputxa.
>> Però Stanford, igual que nosaltres, més o menys oculta que detalli almenys per a les biblioteques
fins, igual que fem de corda i char *.
Però GRect i GOVAL i tots els coses que vostès estan o van a utilitzar
aquesta setmana són en última instància, adreces de memòria.
Simplement no ho saps.
>> Així que no és sorprenent, llavors, potser, que podria ensopegar amb alguna
errors de segmentació.
Però l'interessant aquí, si després comprovem el 0 que fem
cadena t aconsegueix s.
Bé, deixa declaro t.
Vaig a dibuixar un quadrat, 32 bits, anomenat t.
I llavors em vaig a fer es s.
>> Bé, què significa això?
Bé, és una mica difícil pensar respecte quadre savi.
Però anem a pensar en el que hi ha dins de x?
Què és, literalment, dins d'aquesta variable?
El Ox123 valor.
>> Així que quan dic cadena t aconsegueix s, que només literalment significa prendre el nombre
en si, que és Ox123 i el va posar Ox123.
O gràficament, si tipus de resum lluny de detall que té la
efecte de fer literalment això també.
>> Ara, pensi en la setmana passada quan es va procedir a la capitalista T. I
fer T bracket 0.
Bé, T bracket 0, tot i que es tracta d'un indicador, es pot tractar com si
és una matriu, amb un quadrat notació de claudàtors.
>> Llavors, ¿on és el suport T 0?
Bé, és l'hora.
I així, quan s'utilitza la línia de codi, dos superiors, que està que c type.h
arxiu de capçalera, que és on està declarada.
Vostè està capitalitzant aquesta H. Però, Per descomptat, aquesta és la mateixa h exacta que és
interior de s, per dir-ho.
I ara que ha canviat o capitalitzat tant l'original com la
l'anomenada còpia.
Perquè vostè no va fer una còpia al forma en què un ésser humà voldria que fos.
>> Llavors, quin era el punt de referència aquí, en copy1.c setmana passada?
Funcions, així que podríem copiar la cadena.
I fonamentalment, què és el que necessitem fer per copiar la cadena?
>> Bé, en aquesta versió de la imatge aquí estic farem un nivell força baix.
En realitat, hi ha funcions podrien ajudar amb això.
Però la més bàsica i la més 01:00 familiar, almenys, aviat serà
familiar per a nosaltres, és la següent -
pel que un a la primera línia de codi en verd ara.
>> Em va tornar a escriure com char * s.
No hi ha funcional diferència.
Em vaig desfer de la biblioteca i CS50 Estic trucant a ser el que és, un char *.
>> Ara, punt, punt, punt, perquè no eren comprovació d'errors que no és
interessant parlar de nou.
Així que ara t es declara.
També ell és un char *.
Així que vaig dibuixar una placeta la pantalla com abans.
>> Però al costat de la dreta, malloc, vam dir és assignar memòria.
Així que assignar part tros de memòria.
I quants bytes és el que realment vol assignar, què sembla?
>> Doncs bé, la longitud de la cadena del s.
Així que si és hola això és va a ser cinc.
Direm h-e-l-l-o.
Així 05:00 bytes.
>> Però llavors, més 1, ¿per què 1?
El caràcter 0.
Si no deixem espai per a aquest tipus que podria crear una situació accidental
on la cadena és h-e-l-l-o.
I llavors la propera vegada GetString és Vaig trucar i em introdueixo en, per exemple,
David D-a-v-i-d, l'equip va pensar que s és en realitat
h-e-l-l-o-d-a-v-i-d perquè no hi ha sense descans entre les paraules.
>> Així que hem de trencar.
Així que no volem 05:00.
Volem 06:00 bytes.
>> I em diuen bytes.
Però és la mida realment el temps de la xerrada.
Tècnicament char és gairebé sempre un sol byte.
>> Però per fer que el nostre codi portable, per així dir-ho, de manera que funciona a
diferents sistemes encara que podria ser diferent sota de la
campana, vaig a genèricament dir que la mida de la xerrada perquè
el meu codi sempre funciona.
I jo no he de tornar a compilar només perquè jo actualitzo el meu ordinador o ús
alguna plataforma diferent.
>> Així que tinc 6 vegades la mida de un char, que passa a ser 1.
Així que això significa malloc podrien dóna'm 6 bytes.
El que estan fent realment?
Bé, deixa Fer Retrocedir en el temps aquí d'on som en la història.
>> Així que si torno aquí, he declarat un char * trucada t.
Ara he trucat malloc durant sis bytes.
I ara em vaig a treure els sis bytes igual que la matriu anterior.
Però en realitat no sé el que és dins d'aquesta gamma.
>> Si s'assigna memòria resulta que no es pot confiar que hi ha una mica de
valor conegut allà.
Podria haver estat utilitzat per alguna cosa una altra cosa, alguna altra funció, alguna altra
línia de codi que vostè va escriure.
Així que tindrem generalment anomenem a aquestes escombraries valors i dibuixar ells, potser, com
signes d'interrogació, just el que indica que no saben el que en realitat existeix.
I això no és gran cosa, sempre i quan ens són prou intel · ligents com per sobreescriure les
valors d'escombraries amb números o caràcters que ens interessen.
>> Així que en aquest cas, què faré?
Bé, el codi de la meva línia de següent, tinc quatre.
int i obtenir 0, n obté el longitud de la cadena del s.
Així que un familiar per bucle.
I és menor o igual a n, que en general està per sobre.
>> Però aquesta vegada és deliberada.
R + +, i després simplement em faig t i suport es s.
A causa de que la meva imatge es veu així en Actualment, emmagatzemada en t és el
direcció d'aquest fragment a l'atzar de la memòria els valors són desconeguts.
Però tan aviat com jo t suport 0 que em posi aquí.
>> I el que acaba sent atrets?
Acabem posant h.
Perquè això és el que està en el suport s 0.
I el mateix per I, i L, i L, i o.
>> n, per què vaig anar a través d' igual al núm?
A causa del caràcter 0.
Així que per ser clars, llavors, si realment esborrar qualsevol que aquestes escombraries
valors i després en realitat es basen en el que espero, és s suport 1, 2,
3, 4, a més de que està arrossegant nou personatge.
>> I ara, si seguim més enllà del punt, punt, punt en aquesta versió correcta
i capitalitzat t bracket 0 Ho faria, de Per descomptat, es capitalitza només per aquesta
tipus aquí, que conceptualment, era en última instància la meta.
Així que això és tot el que el punter es troba.
>> I vostè ha estat utilitzant durant setmanes ara en el context de cadenes.
Però sota de la caputxa són una mica més complex.
Però si es pensa en ells en aquest forma pictòrica proposo que estan
Probablement no és tan difícil com es podria semblar a primera vista, a primera vista,
particularment per tal nova sintaxi.
Teniu preguntes sobre els punters, cordes o carbons?
Sí?
>> AUDIÈNCIA: Es pot tornar a la [inaudible]?
>> ALTAVEU 1: Per descomptat.
>> AUDIÈNCIA: Llavors com és que en el seu últim línia, vostè no té una línia * t
i * s en la línia?
No tens la referència a la -
>> ALTAVEU 1: Ah, una molt bona pregunta.
Per què no tinc un t * ja * s?
A causa breument, la setmana passada, igual que en el nostre funció d'intercanvi, jo he dit que quan
tens un punter el mitjà pel que vas allà com vam
físicament a l'escenari, era en realitat utilitzar l'operador estrelles.
>> Resulta que aquest claudàtor notació és el que anomenarem sintàctica
sucre, que és només una forma atractiva d' dient que és la notació abreujada de
exactament el que estàs descrivint.
Però és una mica més intuïtiu.
I a risc de fer que això sembli més complicat del que ha de ser,
el que realment està passant aquí és el següent -
Si dic * t que significa anar a la direcció emmagatzemada en t.
>> Així que, literalment, si t és l'emmagatzematge la direcció d'aquest h
Inicialment, * t vol dir anar aquí.
Ara, què significa t bracket 0?
Exactament el mateix.
És una mica més fàcil amigable per escriure.
>> Però no he acabat encara.
No puc dir * t * s aconsegueix.
Perquè el que estaria fent llavors?
Estaria posant h, h, h, h, h llarg de tot l'assumpte.
Cert?
>> A causa de * t és anar a la direcció en t.
Però estem dins d'un bucle.
¿I quin valor he incrementant, per descomptat, en cada iteració?
i.
>> Però hi ha una oportunitat aquí, oi?
Tot i que això se sent com s'està fent una mica més sofisticat
de la notació de claudàtors hem utilitzat durant algun temps -
m'ho dius a mi desfer el meu canvi h allà -
tot i que això està posant una mica elegant, la idea bàsica, si * t
significa aquí i * t és anar a la direcció en t.
>> Però quina era la direcció en t?
El nombre seguim usant?
Com Ox456, anem a portar aquest nou només pel bé de la discussió.
Bé, si vull arribar a la direcció en t string, només vull anar,
essencialment, 456.
>> O més aviat, 457.
Només he d'afegir un.
Però no puc fer això, oi?
Perquè t, encara que segueixo dibuix ara com una fletxa, que és només una
nombre, Ox456.
I si afegeixo un d'això, o més Generalment, si afegeixo que perquè pugui
realment aconseguir exactament on vull.
Així que si realment faig -
i això és el que s'anomena ara aritmètica de punters -
Puc eliminar aquesta línia.
Què és, francament, crec que més clar i una mica més fàcil d'usar per llegir.
Però això no és menys correcte.
>> Aquesta línia de codi ara està utilitzant aritmètica de punters.
És a dir anar a la seguint la direcció -
qualsevol que sigui l'inici d't és, que és t més i, que inicialment
és 0, la qual cosa és genial.
Perquè això vol dir que l'inici de t més 1, més 2, més 3, i així successivament.
I el mateix acord amb s.
>> Així sucre sintàctica per això.
Però la comprensió del que realment està passant sota de la caputxa, jo diria,
és en realitat útil en i de si mateix.
Perquè vol dir que ja no hi ha molt més la màgia passa
sota de la caputxa.
No seran molts més capes que es pot pelar per a vostè.
Aquesta és c.
I aquesta és la programació.
Molt bona pregunta.
>> Molt bé, així que això va ser que amb errors programa que em referia abans.
intercanvi era defectuós.
Si sembla funcionar.
Recordem que igual que amb la llet i el suc de taronja - que vaig començar
beure la manifestació d'avui.
Així que igual que amb el suc de taronja i la llet, que havia de fer servir un
variable temporal, tmp, per celebrar una temporalment perquè poguéssim llavors
canviar el seu valor i després actualitzar b.
>> Però aquesta funció, es va dir, o aquesta programa en què aquesta funció era
escrit estava equivocat i erroni, per què?
Sí?
>> AUDIÈNCIA: [inaudible].
>> ALTAVEU 1: Exactament, quan cridar swap -
o, més generalment, quan es trucar a gairebé qualsevol funció -
si els arguments d'aquesta funció són primitius, per dir-ho, enters i caràcters
i dobles i carrosses, coses sense estrelles, està de pas en una còpia de
l'argument.
Així que si era 1 x i i era 2, una va que és 1 i b va a ser 2.
Però ells seran diferents trossos dels bits, els diferents trossos de
memòria que passen a ser l'emmagatzematge valors idèntics.
>> Així que aquest codi és molt perfecta en l'intercanvi a i b.
No és bo per a l'intercanvi -
en l'exemple de la setmana passada -
x i y.
Perquè de nou, són en l'àmbit equivocat.
>> Ara, com arreglarem això?
Vam haver de fer la funció mirar una mica més lleig.
Però un cop més, tingui en compte el això només significa.
>> I, de fet, em va deixar, per coherència, canviar una cosa pel que és idèntic al
el que acabem de fer.
Com diu la setmana passada, no ho fa importa a on va.
De fet, en general vostè posaria la estrella al costat del nom de la variable.
Però crec que seria una mica més fàcil per considerar el * al costat de la
tipus de dades en el sentit que és un punter a un int en aquest cas.
>> Llavors, què estic fent aquí?
Jo estic dient que no em donen un int seguit d'un altre int,
cridant-los a i b.
Dóna'm la direcció d'un int.
Dóna'm la direcció d'un altre int.
Truqui a aquestes adreces a i b.
>> I a continuació, utilitzant la notació baix * a continuació, anar a cadascuna de les direccions
segons sigui necessari per obtenir ja sigui o establir el seu valor.
Però hi ha una excepció.
Per què no tinc un asterisc al costat del tmp?
Per què no puc fer això, per exemple?
Se sent com si hagués d'anar tots sortir i corregir tot.
Sí?
>> AUDIÈNCIA: [inaudible].
>> ALTAVEU 1: No he declarat tmp com una cadena.
Així que això anava a declarar, en aquest cas, 01:00 tmp ser la direcció d'un int.
Però això no és tot el que vull, per un parell de raons.
>> AUDIÈNCIA: No vol per intercanviar-les.
>> ALTAVEU 1: Exactament, jo no vull canviar res amb tmp. tmp és només
setmana-una cosa.
Tot el que vull és una variable per emmagatzemar un nombre.
Ni tan sols em preocupo per les direccions en aquest moment.
>> Només necessito 32 bits o així que per guardar un int.
I vull posar en aquests 32 bits tot el que no està en una, per així dir-ho, però
el que està en una, per ser més precisos.
Perquè si a és una adreça, un mitjà * anar-hi i obtenir el valor 1.
Per exemple, en l'exemple de la setmana passada o en el cas de b, obtenir el valor de 2.
>> Així que el que realment està passant?
Permetin-me que assenyali una imatge aquí on es només esmicolar part d'avui.
Però això seguirà apareixent des de fa força temps.
>> Això, reclam, és el que l'equip de la memòria es veu com quan s'executa una
programa, qualsevol programa.
Quan s'executa un programa a la part superior de memòria RAM de l'ordinador - així que pensar en
aquest rectangle, en veritat, ja que el seu RAM o la memòria de l'ordinador, tot 101
milers de milions de bytes de la mateixa, tot dos milions de bytes, els dos gigabytes de la mateixa,
qualsevol que sigui la quantitat que es té és, anem a dibuixar com un rectangle.
I afirmo que quan s'executa un programa com Microsoft Word o Chrome
ni res d'això, els bits que Microsoft o Google que va escriure -
en els casos dels programes -
es carreguen a la memòria de l'equip en què es poden executar més
ràpidament i s'introdueix en la CPU, la qual cosa és el cervell de l'ordinador.
>> I en TAM estan emmagatzemats en el mateix la part superior del seu programa, per així dir-ho.
En altres paraules, si es tracta d'un tros de memòria, en fer doble clic a
Microsoft Word, els bits arriben de la unitat de disc dur.
Ells es carreguen a la memòria RAM.
I ens empenyem cap amunt a la part superior d'aquest rectangle conceptualment.
>> Bé, la resta de la seva memòria és usat per a diferents coses.
A la part superior es veu inicialitzar de dades i desinicializar dades.
Això té a veure, en la seva major part, amb constants o variables globals
que tenen valors.
Però més sobre això en un altre moment.
>> Llavors vostè té la pila, el que tornarem a.
Però en el fons és la part que és particularment pertinent en aquests moments.
És l'anomenada pila.
Així que igual que en gairebé qualsevol sala D aquí a campus, que té aquestes safates que
simplement apilar una a sobre d'una altra en la qual vostè pot posar el menjar i altres coses.
La pila en un sistema informàtic és molt similar.
Excepte mentre que la safata, com s'utilitza en el menjador, per descomptat, s'entén
per portar les coses de les safates o els marcs -
com els anomenarem - en un ordinador d' la memòria s'utilitza per mantenir
variables i valors.
>> Així que el que realment passa sota de la caputxa?
Bé, deixeu-me donar-li la volta a la pantalla aquí.
I ens centrarem només en la part inferior per un moment.
Si aquesta és la part inferior de la meva la memòria de l'ordinador és quan
cridar a la funció principal - que resulta, francament,
automàticament per a mi -
Tinc un tros de memòria a la fons de la meva memòria RAM per dir-ho.
I aquí és on la principal és variables locals van.
És el lloc on argc i argv potser anar, i les variables d'E
declarar dins del principal.
Acaben a la part inferior de la memòria RAM de l'ordinador.
>> Ara suposem que les crides a funcions principals com swap, com ho va fer la setmana passada?
Bé, bàsicament posem una nova safata, 1 nou marc, en el meu tros de memòria.
I jo vaig a descriure això com pertinença a la funció d'intercanvi.
>> Ara el que hi ha dins de bescanvi?
Bé, basat en el programa de la setmana passada i la que acabem de veure un fragment de,
dins del marc de l'intercanvi, o en intercanvi d' safata, són el que les variables?
Bé, a i b.
Perquè aquests eren els seus arguments locals, més una tercera, tmp.
Així que en realitat, podria arribar a aquesta una mica més neta.
Deixin-me seguir endavant i desfer l'etiqueta.
I permetin-me pretenc que vostè sap el que?
>> 1 és probablement va a acabar aquí.
B va a acabar aquí.
I tmp va a acabar aquí.
Ara, l'ordre podria ser una mica diferent.
Però conceptualment aquesta és la idea.
>> I només col · lectivament, això és el que anomenarem marc d'intercanvi, o
safata de menjador-sala.
I el mateix s'ocupen de principal.
Però no vaig a tornar a dibuixar això.
Però aquí és on argc i argv i qualsevol de les seves variables locals com x i y
podria ser així.
>> Així que ara considerar el que realment està succeint quan es diu intercanvi.
Quan es diu a swap, executar codi com això, vostè està passant, al
versió amb errors, a i b com còpies de x i y.
Així que si ho faig ara extrec aquesta a la pantalla -
ha de millorar en això -
pel que la història que m'estava dient a mi mateix va ser en aquesta versió amb errors, quan
truqui a intercanviar passant literalment a i b com enters, el que realment està passant?
>> Bé, el que realment està succeint és això.
Deixin-me seguir endavant i desfer simplement per esborrar una mica d'espai aquí.
Així que aquesta és la memòria del meu ordinador.
>> Així que si jo, per exemple -
En realitat ho farem d'aquesta manera -
si afirmo que això és x, l'emmagatzematge el valor 1 al igual que la setmana passada.
I això és, emmagatzemar el valor 2 igual que la setmana passada.
I aquest és el principal, quan dic swap, el que em dóna accés a una i
b i tmp que vaig a dir que aquesta és una i aquesta és 1.
>> Això és b.
Això és 2.
Això es diu tmp.
>> I en un principi, té un valor escombraries fins que ho retinc en una,
que és 1.
Llavors segueixo endavant i canviar un ésser què?
El valor de B.
>> I així que ara tinc dos aquí.
I llavors vam dir b aconsegueix tmp.
Un cop més, igual que un xec del seny, la tercera línia de codi aquí és simplement això
un, b aconsegueix tmp.
>> I finalment, què faig?
Segueixo endavant i canviar de b sigui el que sigui el valor d'tmp és, que és 1.
No toco tmp nou.
>> Però ara, el problema és que tan aviat com swap devolucions, perquè no està lliurant
còpia d'algun valor, no hi ha retorn declaració explícitament en ella.
Què està succeint realment?
Bé, bàsicament tot això de memòria -
Bé, pel que sembla, l'esborrany li agrada només un dit a la vegada -
simplement desapareix.
>> Ara bé, en realitat no ho és enlloc.
Però vostè pot pensar en ell ara com signes d'interrogació.
Com que ja no és realment en ús.
I no es fa res amb aquests valors.
>> Així en el cas de la versió verda de aquest codi, el que en el seu lloc està sent
passat a intercanvi?
Així que s'adreça.
Així la direcció de x i la direcció de i.
Així que si tornar a explicar aquesta història una última temps, i que en realitat dibuixar intercanvi de nou,
però amb punters, sent aquesta una, aquesta on b, i sent tmp, el que és
efectivament emmagatzemada en una en aquest verd versió del codi en què estic passant
en direccions?
>> Serà un punter a x.
Així que podria dibuixar una fletxa.
Però farem servir la mateixa arbitrària exemple com abans.
Diguem que es tracta d' alguna cosa així com Ox123.
I això serà perquè Ox127 és quatre bytes de distància perquè és un
int, per la Ox127.
>> I una altra vegada, estic prenent algunes llibertats amb els números.
Són molt més petits del que seria ser en realitat i en un ordre diferent.
Però així és com la imatge ara és diferent.
>> Però quan s'utilitza aquest codi verd i jo tmp int obtinc * a.
* Un mitjà per fer el següent, prengui la enfront del que està en un i anar a la mateixa,
que és 1.
I això és el que es va posar en tmp.
Mentrestant, en la següent línia de codi aquí, * a obté b, què vol dir això?
>> Bé, * a, així que veu aquí aconsegueix * b, el que significa anar-hi.
I això vol dir posar el valor a allà.
Finalment, l'última línia de codi simplement va dir * b es tmp.
>> Així b diu anar-hi i sobreescriure amb tmp que, en aquest cas, es va
ser, de nou, 1.
I aquesta és la raó per la versió verda de nostre codi funciona, mentre que el vermell
versió mai ho va fer.
Tot es redueix només a la forma en la memòria es gestiona i on és
efectivament despatxat al seu RAM de l'ordinador.
I per ara, això és una de les coses que la pila s'està utilitzant per.
>> Preguntes sobre el disseny?
En els punters?
O l'intercanvi?
>> D'acord, malloc, recordo, va fer alguna cosa com això.
Aquest va ser un exemple super simple.
I aquest va ser el que Binky ens va presentar, encara que bastant
ràpidament, al final de la classe.
Maleïda sigui, aquí anem de nou.
>> Així recordar que aquest va ser l'exemple que Binky ens va presentar, encara que
alguna cosa ràpidament al final de la classe.
I aquí hem utilitzat malloc realment per la segona vegada.
A causa de que la primera vegada que el fem servir per crear prou RAM, assignar prou memòria RAM
per emmagatzemar una cadena.
>> Aquesta vegada Binky mantenir simple.
Així que és per emmagatzemar només 01:00 int, pel que sembla.
I això és totalment bé.
És una mica estrany, la veritat, a la utilitzar malloc per assignar un int.
Però el punt d'animació amb plastilina de Nick era realment explicar la història del que
passa o no passa quan maltractes memòria.
>> Així doncs, en aquest cas, aquest programa va fer un parell de coses.
En el primer cas aquí, que declara un punter anomenat x a un int.
A continuació, es declara un punter i va cridar a un int.
A continuació, emmagatzema en x, què?
Una altra persona ara.
El que s'emmagatzema en x d'acord amb la tercera línia d'aquest programa?
>> AUDIÈNCIA: [inaudible].
>> ALTAVEU 1: Bé, no del tot bytes, per dir.
Sigui més precís ara.
El que s'emmagatzema en x?
Una adreça, crec que ho vaig escoltar.
>> Llavors, ¿què tornar malloc?
malloc comportament assigna un tros de memòria.
Però com se li dóna accés a ella?
Retorna què?
La direcció del primer byte en el bloc de memòria.
>> Ara, això és molt simple.
És només un byte, el que significa que el Abordem estem tornant és el
direcció de tot l'assumpte.
Així emmagatzemat en x, llavors, és l'adreça d'aquest tros de memòria.
Mentrestant, què passa després?
Així que en realitat, seguirem endavant i dibuixar això molt ràpid.
>> Així que si anem a la pantalla d'aquí i juguem això int * x i int * i
que va a fer el que a mi?
Jo sostinc que només va a fer alguna cosa com això i dir-x, i
això i en diuen i.
Mentrestant, la tercera línia de codi és va a assignar la mida d'un int,
que passa a ser - ho sento si vaig dir un abans em referia 01:00 int -
04:00 bytes en un ordinador típic.
Almenys amb l'aparell CS50.
>> Així que això va a assignar , ¿Qui sap?
En algun lloc per aquí.
I això s'emmagatzema en algun Direcció del Bou, qui sap?
Però, què quedarà tornat és aquesta direcció.
Però anem a dibuixar aquest pictòricament tan sols una fletxa així.
>> Ara, en la següent línia * x rep 42.
Què fa * x significa en termes simples?
Només has d'anar-hi.
Anar a aquesta direcció.
O en altres paraules, seguir el fletxa i posar 42 allà.
Però llavors una cosa dolenta va passar a Binky, oi?
>> Recordem que la línia cinc aquí, * i es 13, de fet un nombre de mala sort,
va fer el que per a nosaltres?
Bé, * vol dir que I hi van.
Bé, això no s'ha donat un valor encara, oi?
El codi no té sent i inicialitzat a res.
Havíem x s'inicialitza a una adreça.
No obstant això, i va ser declarat per la part superior.
Però llavors, un punt i coma, sense valor es va posar realment en ell.
Així que és just dir que aquest un valor escombraries.
Qui sap el que hi ha?
És les restes de bits que es van utilitzar per alguna línia de codi anterior en
el meu programa.
>> Així que si em diuen que vagi allà, això és com, No tinc ni idea d'on aquesta fletxa és
va a acabar.
I aquí és quan normalment aconseguir una fallada de segmentació.
Si accidentalment eliminar la referència, pel que parlar, o anar a una direcció que no és
en realitat una adreça legítima, passen coses dolentes.
>> I això és exactament el que va passar pensar Binky.
Així que recorda que la història que Nick era dient aquí és la mateixa idea que el
He dibuixat amb la il · lusió de guix al tauler allà.
X i Y es declaren.
>> Després ens van donar la mida de 01:00 int i emmagatzemats en x.
A continuació, la següent línia que vam fer * x.
Aquesta va ser la vareta màgica de Nick d'eliminació de referències.
Això va posar 42 en la memòria assenyalat per x.
>> Però aquí és on les coses va sortir horriblement malament.
Cert?
Hem tractat d'eliminar la referència a.
No obstant això, i tenia un valor fals, no?
>> Aquesta fletxa a la part inferior esquerra cantonada, no és
en realitat apunta a res.
És una espècie de fer el que va fer aquí al tauler.
Així que les coses dolentes li succeeixen, la segmentació culpa o Binky culpa, en aquest cas.
>> Però si ens fixem llavors que al fer x obté i com canvia la història?
Bé, si ho faig x aconsegueix i, això és efectivament el mateix que dir
sigui el que sigui, Ox-cosa serà el mateix aquí,
Ox-alguna cosa.
O gràficament anem a dibuixar una fletxa.
>> Així que aquí en el tauler amb Binky, amb la línia de
codi, * i significa anar-hi.
On hi ha?
Això vol dir que per aquí.
>> I quan ens posem al dia que per ser 13 només haurà d'anar, i
escriure 13 aquí.
Així que potser no completament senzill a primera vista.
Però per recapitular i per utilitzar la mateixa argot que Binky estava usant aquí, així
els dos primers assignar els punters, x i y, però no els pointees.
I no és un pointees usat generalment termini.
No obstant això, és absolutament punter.
Però és el que es va assenyalar en la nomenclatura de Binky.
>> Aquesta línia següent, per descomptat, assigna un pointee int.
Així que una bona part de la memòria - que vaig dibuixar sobre el el costat dret allà - i setembre
x igual a apuntar a ell.
Això elimina referències x per guardar 42 a la memòria que s'està assenyalant.
I a continuació, això, per descomptat, era una cosa dolenta.
Perquè i no apuntava en res.
Això ho arregla.
Així que això segueix sent el programa amb errors.
El fet que estem bufant a través de la codi línia per línia i dir, bé,
deixa que xoc allà.
Això és una mala cosa.
El més probable és el programa només va a avortar per complet en aquesta línia.
Però si hagués de treure la estavellar alinear i substituir-la per les dues últimes
línies cal assigna -
amb assignació de punter - i perquè apunti a x com a punt T.
I després dereference I d'una manera molt segura.
>> Llavors, on ens deixa això?
Bé, resulta que sota el capó a la biblioteca CS50, els punters són
utilitzat al llarg.
I nosaltres realment comencem a pelar nou aquesta capa en poc temps.
Però resulta també, una expressió que alguns de vostès podrien estar familiaritzats amb,
en particular els més còmode, és en realitat el d'una molt popular
lloc web, o de desbordament de pila, en aquests dies.
>> Però això en realitat té molt significat tècnic.
Ara sabem el que és una pila.
És com una pila de safates a l'interior d'un menjador.
>> O a l'interior del seu equip de memòria its aquests marcs
que són utilitzats per les funcions.
Bé, resulta que, a causa que molt simple aplicació de
la memòria i els marcs de l'anomenada pila, vostè pot prendre el control
d'un sistema informàtic amb força facilitat.
Pot introduir-se en un sistema si la gent com nosaltres no hem escrit el nostre codi
particularment bé.
>> Si la gent com nosaltres utilitzen trossos de memòria o l'ús arrays -
fins i tot més comunament -
però de vegades s'oblidi de comprovar la límits de la nostra gamma com pot ser que
Deixar-se vegades i iterada massa lluny més enllà del final d'una matriu.
En el millor dels casos, el programa d' només podria bloquejar-se.
Decisió de segmentació, tipus de vergonya.
No és genial, però no és necessàriament una enorme mala cosa.
>> Però si el programa és en realitat el veritable equips dels usuaris, si s'està executant
en un lloc web que la gent a l'atzar reals a l'Internet estan colpejant, deixant
persones indueixen coses dolentes en el teu codi és generalment no és una bona cosa perquè
que significa una oportunitat per el control de l'equip.
I això es va a veure una mica críptic.
Però jo vaig pensar que et espanto amb aquest últim exemple.
>> Heus aquí un exemple de codi.
I hi ha una bona Wikipedia article que camina a través d'
això amb més detall.
Tinc principal a la part inferior anomenada foo, passant de argv 1.
I això és només perquè pugui executar el programa i passar
una entrada arbitrària.
>> I llavors foo es declara la superior com l'acceptació d'una cadena, o més
Precisament, un char *.
A continuació, es declara una matriu de caràcters.
Diguem que és un tampó, més en general, de cos 12.
Així que 12 caràcters poden cabre dins d'aquesta matriu anomenada c.
>> I a continuació, utilitza aquesta nova funció, que és nou, però no és difícil d'
entendre, còpia de la memòria.
Es copia la memòria del bar, que era el passat variable n, qualsevol que sigui el
usuari va escriure en argv 1 al c.
Quants bytes?
La longitud de la cadena de la barra.
>> En altres paraules, si l'usuari escriu al h-e-l-l-o enter, la longitud de la cadena
hola és de cinc.
Així que cinc d'aquests bytes es posarà còpia en la matriu anomenada c, que
és de grandària 12.
Però el que l'usuari escriu en un molt més temps paraula que és 13 caràcters o 14
caràcters o 100 caràcters o més?
>> A on van a anar?
Bé, aquest marc, aquesta safata a la pila de menjador-saló,
que van a anar-hi.
I només va a començar a sobreescriure altres coses que ja
a la pila, que desborda la pila, per així dir-ho.
>> Així pictòricament, pensar d'aquesta manera.
Aquesta és només una versió acolorida de la imatge que hem vingut assenyalant.
A la part inferior, diguem, és el principal.
I a la part superior, el que estem veient ara és el marc, codi de color ara, per a un
funció anomenada foo.
Però l'interessant aquí sobre foo és que aquí és el seu marc.
Així es dibuixa com jo ho va fer, però en color blau clar.
I ara, aquest és el lloc on c bracket 0 va.
I aquí és on c abraçadora 11 va a acabar.
>> En altres paraules, es passa a ser representat com un quadrat.
Però si et quedes plopping bytes avall - o caràcters - que van a acabar
fins a la posició 0 fins al final fins a 11 perquè és 0 indexat.
>> Però on és el caràcter 13 va a acabar?
On és el 14?
On és el caràcter número 50 va a acabar?
>> Es va a seguir baixant.
Perquè tot i que hem tret el imatge amb la pila creixia, la
adreces, resulta que van des petites adreces, petita
punters, a les grans direccions.
Per tant, només segueix pujant i pujant.
>> Així que si l'usuari escriu en hola, això és genial.
No hi ha errors, cap problema, segur de tots.
Però si l'usuari escriu en el que anem a cridar codi acusatori, representada
genèricament com un atac, atac, atac, atac, què pot passar?
>> Doncs bé, si la totalitat de l'entrada que l'usuari teclejat no és només un amistós
o una cadena de caràcters ofensius.
En realitat és una seqüència de caràcters que si ho va compilar,
el que realment és codi.
Potser és el codi que elimina tota la arxius en el seu disc dur o envia correu brossa
o alguna cosa per l'estil.
Tingueu en compte que el que és clau aquí és que si el dolent de la pel · lícula té la sort de
sobreescriure el tros vermell de la memòria -
el que no em baso en la meva imatge, però aquesta foto Wikipedia té aquí -
seva crida remet.
>> Quan torna el menjar, quan torna d'intercanvi, Com sap l'ordinador per anar de
aquí a aquí?
O en el segment de tecnologia per sobre, com Com sap que anar a la permuta
codi - el 0 i 1 de que componen swap -
tornar a l'inici?
Hi ha una adreça anomenada volta emmagatzemada en el mateix marc de pila, en
la mateixa safata de cafeteria.
>> Així que si el dolent de la pel · lícula és prou intel ligent com per posar codi d'atac, el codi d'atac, atac
codi, i obtenir la sort -
sovint a través d'assaig i error - a sobreescriure aquest remitent vermell,
amb la direcció i l'avís la part superior.
Avís 0835C080.
Ha escrit a l'inrevés sobre de la tapa de raons per les quals potser va a visitar.
Aquest és aquest número.
>> Així que si el dolent de la pel · lícula es la sort o és prou intel ligent com per sobreescriure el vermell
despullar de la memòria amb la direcció de codi que ell o ella té d'alguna manera
injecta en l'equip, suposo que codi serà retornat a
tan aviat com foo es fa executant?
>> Codi del dolent.
Així que aquest codi d'atac, AAA, de nou, podria enviar correu no desitjat, pot eliminar tots els arxius
en el seu disc dur.
Però això és el veritablement un desbordament de pila és, o una saturació de la memòria intermèdia, o un
atac de desbordament de la memòria intermèdia.
>> I és molt, molt comú a aquest dia amb programes escrits en
C, C + +, i fins i tot alguns altres idiomes.
En aquest sentit por, anem a acabar amb una broma.
>> [El]
>> Ens veiem dimecres.
En la següent CS50 -
Així que m'he quedat sense llums de disc actual, però espera, sense greix llet, mitja el telèfon
llibre, el suc de taronja que vaig beure avui.
Cable USB, una clau anglesa.
>> [Reproducció de música]