[Music kucheza]
>> DOUG LLOYD: OK hivyo pendekezo kabla ya kuanza hapa.
Kama si watched video juu ya kuyatumia unaweza kutaka kufanya hivyo kwanza.
Kwa sababu video hii ni mwingine njia ya kufanya kazi na kuyatumia.
>> Hivyo ni kwenda kuzungumza kuhusu baadhi ya dhana
kwamba sisi cover katika kuyatumia video, na tuko
kwenda Gloss juu yao sasa, kuchukua kwamba wao uko tayari
aina ya kueleweka.
Hivyo hiyo ni onyo tu yako ya haki kwamba kama wewe ni kuona video hii
na hawajaona kuyatumia video, inaweza aina ya
kuruka juu ya kichwa yako kidogo.
Na hivyo inaweza kuwa bora kuangalia ni ili.
>> Hivyo tumeona moja njia ya kufanya kazi na kuyatumia,
ambayo ni sisi kutangaza kutofautiana, na kisha sisi
kutangaza mwingine kutofautiana, pointer kutofautiana, kwamba pointi kwa hilo.
Hivyo tumeunda kutofautiana kwa jina, tumekuwa
umba kutofautiana pili kwa jina, na sisi uhakika kwamba kutofautiana pili
wakati huo wa kwanza.
Hii ina aina ya Tatizo ingawa, kwa sababu
inahitaji sisi kujua hasa ni kiasi gani kumbukumbu tuko
kwenda haja sasa mpango wetu ni ulioandaliwa.
>> Kwanini hivyo?
Kwa sababu tunahitaji kuwa na uwezo wa kutaja au kutambua yote ya vigezo iwezekanavyo
sisi kukutana.
Tupate kuwa na safu hiyo inaweza kuwa ni uwezo wa kushikilia mengi ya habari,
lakini bado si hasa sahihi kutosha.
Nini kama hatujui, nini kama hatuna wazo
kiasi gani tutaweza haja wakati kukusanya?
Au nini kama mpango wetu mapenzi kukimbia kwa kweli kwa muda mrefu,
kukubali mtumiaji mbalimbali data, na hatuwezi kwa kweli
makisio kama tuko kwenda haja vitengo 1,000?
>> Siyo kama tunaweza kusema katika mstari amri
kuingia vitu ngapi unafikiri itabidi.
Naam nini kama kwamba nadhani ni sahihi?
Mgao wa nguvu kumbukumbu aina ya inaruhusu sisi njia
kupata kote na tatizo hili fulani.
Na njia ni gani ni kwa kutumia kuyatumia.
>> Tunaweza kutumia kuyatumia kwa kupata dynamically
zilizotengwa kumbukumbu, kumbukumbu kwamba ni zilizotengwa kama mpango wako ni mbio.
Siyo zilizotengwa wakati kukusanya.
Wakati dynamically kutenga kumbukumbu inatoka pool
ya kumbukumbu inayojulikana kama chungu.
Hapo awali zote kumbukumbu tumekuwa ikifanya kazi na katika kozi
imekuwa kuja kutoka bwawa ya kumbukumbu inayojulikana kama stack.
Njia nzuri ya ujumla kuweka katika utawala mind-- na hii
daima haina kushikilia kweli, lakini pretty much karibu
daima ana true-- ni kwamba yoyote wakati unaweza kumpa jina kutofautiana ni
pengine anaishi juu ya stack.
Na wakati wowote huna kutoa kutofautiana jina,
ambayo unaweza kufanya na kumbukumbu ya nguvu mgao, ni anaishi kwenye lundo.
>> Sasa mimi nina aina ya kuwasilisha hii kama kama kuna mabwawa haya mawili ya kumbukumbu.
Lakini unaweza tumeona hii mchoro, ambayo kwa ujumla ni
uwakilishi wa nini kumbukumbu inaonekana kama,
na sisi siyo kwenda kwa huduma ya juu zote mambo kwa juu na chini.
Nini sisi huduma ya juu ni sehemu huu katika katikati hapa, chungu na stack.
Kama unaweza kuona na kuangalia mchoro huu,
hizi kweli si wawili mabwawa tofauti ya kumbukumbu.
Ni moja ya pamoja bwawa la kumbukumbu ambapo kuanza, katika hii Visual
kuanza chini na kuanza kujaza juu
kuanzia chini kwa stack, na wewe kuanza juu na kuanza kujaza juu
kutoka juu kwenda chini na lundo.
Lakini kwa kweli ni sawa pool, ni tu
matangazo mbalimbali, maeneo mbalimbali katika kumbukumbu kuwa ni kuwa zilizotengwa.
Na unaweza kukimbia nje ya kumbukumbu kwa aidha kuwa
lundo kwenda njia yote hadi chini, au kuwa na
stack kwenda njia yote ya juu, au kuwa na lundo na stack
kukutana dhidi ya kila mmoja.
Wote wa wale inaweza kuwa masharti vinavyosababisha mpango wako
kukimbia nje ya kumbukumbu.
Hivyo kuendelea kuwa katika akili.
Tunapozungumzia kuhusu lundo na stack
sisi ni kweli kuzungumza juu ya sawa mkuu chunk ya kumbukumbu, tu
sehemu mbalimbali za kumbukumbu hiyo.
>> Hivyo ni jinsi gani sisi kupata dynamically kumbukumbu zilizotengwa katika nafasi ya kwanza?
Ni kwa jinsi gani mpango wetu kupata kumbukumbu kama ni mbio?
Naam C hutoa kazi kuitwa malloc, kumbukumbu allocator, ambayo
wewe kufanya wito kwa, na wewe kupita katika jinsi ka ya kumbukumbu kwamba unataka mingi.
Hivyo kama mpango wako ni mbio na unataka integer Runtime,
unaweza mallock ka nne ya , malloc kumbukumbu mabano nne.
>> mallock watapitia kutafuta njia chungu,
kwa sababu tuko dynamically kugawa kumbukumbu,
na itakuwa kurudi wewe pointer kwamba kumbukumbu.
Haina kukupa kwamba memory-- haina kuwapa jina,
inakupa pointer yake.
Na hivyo ndiyo sababu tena nikasema kuwa ni muhimu labda
waliangalia kuyatumia video kabla ya sisi kupata mbali mno katika hili.
Hivyo malloc kinaendelea kukupa nyuma pointer.
>> Kama mallock hawezi kukupa yoyote kumbukumbu kwa sababu umefanya kukimbia nje,
kutakuwa na kukupa nyuma pointer null.
Je, unakumbuka kile kinachotokea kama sisi kujaribu dereference na pointer null?
Sisi kuteseka seg kosa, sawa?
Kwamba pengine si mzuri.
>> Hivyo kila wakati kufanya wito malloc wewe daima, daima
haja ya kuangalia kama au pointer lilitoa wewe nyuma ni null.
Kama ni, unahitaji kumaliza mpango wako kwa sababu kama wewe kujaribu dereference na
pointer null wewe ni kwenda kuteseka segmentation kosa
na mpango wako ni kwenda kwa ajali anyway.
Hivyo ni jinsi gani sisi statically kupata integer?
>> int x.
Tumekuwa pengine amefanya hivyo rundo la nyakati, sawa?
Hii inajenga kutofautiana kuitwa x kwamba anaishi juu ya stack.
Je, sisi dynamically kupata integer?
Int nyota px sawa na malloc 4.
>> Au zaidi ipasavyo tunatarajia kusema int nyota px
sawa malloc ukubwa wa int, tu kutupa baadhi wachache
idadi uchawi kuzunguka mpango wetu.
Hii ni kwenda kupata kwa ajili yetu ka nne ya kumbukumbu kutoka lundo,
na pointer tunapata nyuma ni kuitwa px.
Na kisha tu kama tumekuwa tokea hapo sisi
Unaweza dereference px kwa kupata kwamba kumbukumbu.
Jinsi gani sisi kupata integer kutoka kwa mtumiaji?
Tunaweza kusema int x sawa kupata int.
Hiyo ni pretty moja kwa moja.
Nini kama tunataka kujenga safu ya x ikifungwa kwamba kuishi katika stack?
kuelea stack_array-- hiyo ni jina ya yetu array-- mabano mraba x.
Ambayo kujenga kwa ajili yetu safu ya x ikifungwa wanaoishi juu ya stack.
Tunaweza kujenga safu ya ikifungwa kwamba anaishi juu ya lundo, pia.
Syntax ili kuangalia zaidi kidogo mbaya,
lakini tunaweza kusema kuelea nyota heap_array sawa na
malloc x mara ukubwa wa kuelea.
Nahitaji nafasi ya kutosha kushikilia x yaliyo maadili uhakika.
Hivyo kusema nahitaji 100 ikifungwa, au ikifungwa 1,000.
Hivyo katika kesi kwamba itakuwa 400 ka kwa 100 ikifungwa,
au 4,000 ka kwa ikifungwa 1000, kwa sababu kila kuelea unachukua
ka nne wa nafasi.
>> Baada ya kufanya hivyo naweza kutumia Mabano ya mraba syntax juu ya heap_array.
Kama tu napenda juu ya stack_array, mimi Unaweza kupata mambo yake binafsi
kutumia heap_array sifuri, heap_array moja.
Lakini kukumbuka sababu tunaweza kufanya hivyo ni kwa sababu jina la safu katika C
ni kweli pointer kwamba safu ya kwanza kipengele.
Hivyo ukweli kwamba sisi ni kutangaza safu ya ikifungwa juu ya stack hapa
ni kweli kidogo kupotosha.
Sisi kwa kweli ni katika mstari wa pili wa kanuni huko
pia kujenga pointer chunk ya kumbukumbu kwamba sisi kisha kufanya baadhi ya kazi kwa.
>> Hapa ni tatizo kubwa na dynamically zilizotengwa kumbukumbu ingawa,
na hii ni kwa nini ni kweli muhimu kuendeleza baadhi tabia nzuri
wakati wewe ni kazi kwa hayo.
Tofauti na statically alitangaza kumbukumbu, kumbukumbu yako
si moja kwa moja alirudi mfumo wakati kazi yako ni kosa.
Hivyo kama tuna kuu, na kuu wito kazi
f, f wakati finishes chochote ni kufanya na anarudi udhibiti wa mpango
nyuma kuu, yote ya kumbukumbu kwamba f kutumika anapewa nyuma.
Ni inaweza kutumika tena na baadhi ya mpango mengine,
au baadhi ya kazi nyingine ambazo anapata kuitwa baadaye katika kuu.
Inaweza kutumia kwamba kumbukumbu hiyo tena.
>> Kama dynamically kutenga kumbukumbu ingawa
una kupanga kuwaambia mfumo kuwa wewe ni kosa kwa hayo.
Kutakuwa na kushikilia kwenye hiyo kwa ajili yenu, ambayo inaweza kusababisha tatizo la wewe unapita
wa kumbukumbu.
Na kwa kweli sisi wakati mwingine kutaja kwa hili kama kumbukumbu kuvuja.
Na wakati mwingine uvujaji hizi kumbukumbu kweli anaweza kweli makubwa
kwa mfumo wa utendaji.
>> Kama wewe ni mara kwa mara biashara ya mtumiaji unaweza kutumia baadhi ya browsers mtandao,
na mimi si jina majina hapa, lakini kuna baadhi ya browsers mtandao huko nje
kuwa ni sifa mbaya kwa kweli kuwa uvujaji kumbukumbu ambazo si kupata fasta.
Na kama wewe kuondoka browser yako wazi kwa kipindi cha muda mrefu sana, siku
na siku, au wiki, wakati mwingine taarifa kwamba mfumo wako
ni mbio kweli, kweli polepole.
Na sababu ya kuwa ni kwamba kisakuzi imetenga kumbukumbu,
lakini kisha si aliiambia mfumo kuwa ni kosa kwa hayo.
Na hivyo kwamba majani chini ya kumbukumbu inapatikana kwa wote wa programu yako mengine
kuwa na kushiriki, kwa sababu wewe ni leaking-- kwamba kivinjari
mpango ni kinachovuja kumbukumbu.
Je, sisi kutoa kumbukumbu nyuma wakati sisi ni kosa kwa hayo?
Vizuri kwa bahati nzuri ni njia rahisi sana ya kufanya hivyo.
Sisi tu bure hilo.
Kuna kazi kuitwa bure, anapokea pointer kumbukumbu,
na sisi ni vizuri kwenda.
>> Basi hebu kusema tuko katika katikati ya mpango wetu,
tunataka malloc wahusika 50.
Tunataka malloc safu ambayo yanaweza uwezo wa kufanya wahusika 50.
Na wakati tunapata pointer nyuma kwamba, jina kwamba pointer ni neno.
Sisi kufanya lolote tuko kwenda kufanya na neno,
na kisha wakati tuko amefanya sisi tu huru yake.
Na sasa sisi wamerejea wale 50 ka ya kumbukumbu nyuma na mfumo.
Baadhi ya kazi nyingine wanaweza kuzitumia.
Hatuna wasiwasi kuhusu mateso kumbukumbu kuvuja kwa sababu tuna huru neno.
Tumekuwa kupewa kumbukumbu nyuma, hivyo sisi ni kosa kufanya kazi kwa hayo.
Hivyo kuna tatu sheria ya dhahabu kuwa lazima
iwekwe akilini wakati wowote uko dynamically kugawa kumbukumbu
kwa malloc.
Kila block ya kumbukumbu kwamba wewe malloc ni lazima lifunguliwe
kabla ya mpango wako alimaliza mbio.
Sasa tena, katika appliance au katika IDE hii aina ya ikitokea kwa wewe anyway
wakati you-- hii kutokea anyway wakati mpango wako ni terminated,
kumbukumbu zote zitatolewa.
Lakini ni nzuri kwa ujumla coding mazoezi kwa siku zote, wakati wewe ni kosa,
bure yale mallocd.
>> Alisema kwamba, mambo tu kwamba wameweza mallocd inapaswa kuwa huru.
Kama statically kutangaza integer, int x nusu ya matumbo,
kwamba anaishi juu ya stack, wewe si basi wanataka bure x.
Mambo tu kwamba wameweza mallocd inapaswa kuwa huru.
>> Na Mwisho, hawana bure kitu mara mbili.
Ambayo inaweza kusababisha hali nyingine weird.
Hivyo kila kitu ambacho umefanya mallocd ina kuwa huru.
Mambo tu kwamba wameweza malloc inapaswa kuwa huru.
Na hawana bure kitu mara mbili.
>> Basi hebu kwenda kupitia mfano hapa kile baadhi dynamically zilizotengwa
kumbukumbu ili kuangalia kama mchanganyiko na baadhi ya kumbukumbu tuli.
Nini kinaweza kutokea hapa?
Kuona kama unaweza kufuata pamoja na nadhani nini
kinaenda kutokea kama sisi kwenda kupitia mistari haya yote ya kificho.
>> Hivyo tunasema int m.
Nini kinatokea hapa?
Naam hii ni pretty moja kwa moja.
Mimi kuunda integer variable kuitwa m.
Mimi rangi yake ya kijani, kwa sababu hiyo ni rangi
kwamba mimi kutumia wakati mimi kuzungumza kuhusu integer vigezo.
Ni eneo la hatari.
Ni wito m, na unaweza kuhifadhi integers ndani yake.
>> Nini kama mimi kisha kusema int nyota?
Vizuri kwamba ni pretty sawa.
Mimi kujenga sanduku aitwaye.
Ni uwezo wa kufanya int nyota, kuyatumia kwa integers.
Hivyo mimi nina kuipaka rangi ya kijani-ish pia.
>> Najua ina kitu cha kufanya na integer,
lakini siyo yenyewe integer.
Lakini wazo moja kiasi pretty.
Nimekuwa kuundwa eneo la hatari.
Wote hawa haki sasa wanaishi juu ya stack.
Nimekuwa amewapa majina yote mawili.
>> int nyota b sawa na malloc ukubwa wa int.
Hii moja inaweza kuwa ni kidogo suala gumu.
Kuchukua pili na kufikiri juu ya nini bila kutarajia kutokea kwenye mchoro huu.
int nyota b sawa na malloc ukubwa wa int.
>> Naam hii haina tu kujenga sanduku moja.
Hii kweli inajenga masanduku mawili.
Na mahusiano, pia itaanzisha hatua katika uhusiano.
Tumekuwa zilizotengwa kuzuia moja ya kumbukumbu juu ya lundo.
Taarifa kwamba juu sanduku sahihi kuna hana jina.
>> Sisi mallocd yake.
Ipo juu ya lundo.
Lakini b ina jina.
Ni pointer kutofautiana kuitwa b.
Kwamba anaishi juu ya stack.
>> Hivyo ni kipande cha kumbukumbu kwamba pointi kwa mtu mwingine.
b ina anuani ya kwamba block ya kumbukumbu.
Haina jina vinginevyo.
Lakini inaelekeza katika hilo.
Hivyo wakati sisi kusema int nyota b sawa na malloc ukubwa wa int, kwamba haki pale,
kwamba mshale kwamba popped up juu ya upande wa kulia huko, jambo ambalo kwa ujumla,
Mimi itabidi hivyo kuonekana tena, ni nini kinatokea.
Yote hayo hufanyika katika kwamba line moja ya kanuni.
Sasa tutaweza kupata zaidi kidogo moja kwa moja tena.
a sawa na ampersand m.
Je, unakumbuka kile sawa ampersand m ni?
Naam hiyo ndiyo anapata m ya mahali.
Au kuweka zaidi diagrammatically, pointi kwa m.
>> a sawa na b.
OK hivyo hapa ni mtu mwingine.
A sawa na b.
Nini kitatokea kwa mchoro wakati huu?
>> Vizuri kukumbuka kuwa matendo operator zoezi
na kumshirikisha thamani ya Haki ya thamani upande wa kushoto.
Hivyo badala ya akizungumzia m, sasa anazungumzia sehemu moja kwamba pointi b.
a hana uhakika na b, anasema pointi ambapo b.
>> Kama alisema b kwamba ingekuwa wamekuwa sawa na ampersand b.
Lakini badala sawa na b tu ina maana kwamba na b ni sasa
akizungumzia anuani hiyo, kwa sababu ndani ya b ni mahali.
Na sasa ndani ya ni anuani hiyo.
m ni sawa na 10, pengine zaidi jambo moja kwa moja
tumefanya katika kidogo.
Kuweka 10 katika eneo la hatari.
Star b sawa na m pamoja na 2, kukumbuka kutoka wetu kuyatumia video kile nyota b maana yake.
Tunakwenda dereference b na kuweka baadhi thamani kwa kuwa kumbukumbu eneo.
Katika kesi hiyo 12.
>> Hivyo wakati sisi dereference hatua ya kukumbuka sisi tu kusafiri chini mshale.
Au kuweka njia nyingine, sisi kwenda kuwa kumbukumbu anuani
na sisi kuendesha kwa namna fulani.
Sisi kuweka baadhi ya thamani katika huko.
Katika kesi hii nyota b sawa m pamoja na 2 ni tu
kwenda kutofautiana alisema kwa b, kwenda kumbukumbu alisema kwa b,
na kuweka m plus 2 katika huko, 12.
>> Sasa mimi bure b.
Kile kinachotokea wakati mimi bure b?
Kumbuka kile alisema njia ya bure.
Nataka kusema nini wakati mimi bure b?
>> Mimi kosa kufanya kazi na hayo, haki?
Mimi kimsingi kutoa juu ya kumbukumbu.
Mimi kuwapa nyuma na mfumo.
Sina haja hii tena ni nini mimi kuwaambia, sawa?
>> Sasa kama mimi kusema nyota a sawa 11 pengine unaweza
tayari kuwaambia kwamba kitu mbaya kinaenda kutokea hapa, sawa?
Na hakika kama mimi walijaribu kuwa mimi pengine wangepata segmentation kosa.
Kwa sababu sasa, ingawa awali kwamba chunk ya kumbukumbu
ni jambo ambalo sikuwa upatikanaji wa, katika hatua hii
sasa mimi nina kupata kumbukumbu kwamba si kisheria kwa ajili yangu na kupata.
>> Na kama sisi pengine kukumbuka, wakati sisi kupata kumbukumbu
kwamba sisi siyo zinatakiwa kugusa, hiyo ni sababu ya kawaida
ya segmentation kosa. Na hivyo mpango wangu
ingekuwa ajali kama mimi walijaribu kufanya hii.
Hivyo tena ni wazo nzuri ya kupata nzuri mazoezi na nzuri tabia ingrained
wakati wa kufanya kazi kwa malloc na bure, hivyo kwamba huna kuteseka segmentation
makosa, na kwamba matumizi yako dynamically zilizotengwa
kumbukumbu uwajibikaji.
>> Mimi nina Doug Lloyd hii ni CS50.