JASON Hirschhorn: Välkommen till A5, alla. Vi har en spännande vecka framför oss, mest för att det finns så många nya ansikten i det här rummet. Det är underbart. Många av er är här av en slump, vilket är ännu bättre. Så förhoppningsvis du kommer att hålla med oss. Den här veckan ska vi spendera huvuddelen av sektionen förbereder sig för testet. Så enligt vår dagordning, ska vi prata lite om resurser för klassen, utan även för frågesport och sedan, återigen, tillbringar större delen av klassen talar om frågor. När vi är klar svara på din frågor, eller om dina frågor naturligtvis leda oss till någon kodning, jag har exempelproblem från mitten på terminen förflutna som vi kommer att koda bor i avsnitt tillsammans att också ta upp en annan bra ämnen att täcka. Så först, eftersom vi har gått igenom för senaste veckorna för att påminna dig killar, det finns massor av resurser tillgängligt för denna kurs. Många av dem kommer att vara otroligt hjälpsamma till dig som du fortsätter att studera för frågesport 0, eftersom Det är tisdag eftermiddag. Så ni alla har varit studerar för lite. Det finns föreläsningsanteckningar och käll kod som du bör definitivt kolla in. Titta på shortsen. Kolla study.cs50.net. Och sedan, som anges nedan, ett antal av andra källor. Återigen är frågesport 0 morgon vid 01:00. Om du inte redan har gjort det, kolla ut Om Quiz 0 dokument på kursens hemsida för att räkna ut där du tar testet. Testet börjar kl 01:10 och slutar 70 minuter senare. Så om du dyker upp efter 01:10, du är kommer att få det många färre minuter än 70 för att ta testet. Så se till att du är där i tid. Om du är en förlängnings student eller har några andra överväganden testa, det kanske inte på 01:00 i morgon. Men återigen, kolla om Quiz 0 dokumentera för att se till att du vet när du tar testet. Jag skrev 75 minuter upp här. Jag tror att det är rätt, inte 70. Den omfattar allt material från en vecka 0 till förra veckans föreläsning på onsdag. Och återigen, för det här testet, per den dokument får du en dubbelsidig och 8 1/2 med 11 pappersark som du får att använda som anteckningar under testet. Många, om inte de flesta människor, har fann att den enskilt mest användbara sätt att studera för testet är att göra en studie ark, en en-sider, av sina egna. Så titta på retroaktivt om du har sett tidigare sådana. Nå ut till vänner för att se vad de är att sätta på deras. Men händerna nedåt, det bästa sättet du kan studie är att gå igenom allt och skära ner det till vad som bör eller ska inte hemma på den papper papper, eftersom det är bara en riktigt bra sätt för dig att se till att du går igenom allt och har viss erfarenhet av det. De flesta människor, finner vi, trots att de ha papperet sitter rätt bredvid dem på frågesport, inte vända till det, eftersom, återigen, att mycket processen att gå igenom den information som har hjälpt dem att lära sig det. Är det någon som har några frågor om frågesport 0? Har alla - Jag tänker inte göra en handuppräckning. Aldrig sinne. Jag tänkte fråga vem började studera. Men jag vill inte göra dig allt inte höja händerna. Så som jag sa - ja, AVI, gå vidare. AVI: Vad skulle vara en bra sak för att sätta på en personsökare? STUDENT: Det är upp till dig. JASON Hirschhorn: Du får att använda ditt omdöme. Användbara saker att sätta på den en-personsökare, Om du är förvirrad om den stora O runtime av olika typer av sökningar och sorterar, sätta det på det i ett händig dandy diagrammet. Detta sätt, om du blir ombedd att på frågesport, behöver du inte försöka siffra ut eller orsak genom runtime. Du kan bara kopiera ner det. Om man tittar på frågesporter förflutna, en hel del gånger, det har gångtid frågor. Så det skulle vara ett exempel på en bra sak att sätta på en personsökare. Andra bra saker att sätta på, om du är förvirrad om hur man deklarerar en funktion eller vad de olika delarna av funktionsdeklarationen är, skriver att på det, en generisk version och då kanske ett exempel. Om du är förvirrad om pekare, ett diagram över hur pekare arbete är förmodligen riktigt bra. Om du är förvirrad om rekursion, en prova rekursiv funktion på det kan också visa sig vara riktigt bra. Betyder det att ge dig några idéer? AVI: Du måste förstå hela sammanställningen processen, liksom hur det hela fungerar? JASON Hirschhorn: Everything som har täckts kunde dyker upp på testet. Frågor - men återigen, kommer vissa saker att vara viktas tyngre än andra. Vissa saker har kommit upp igen och återigen i klassen, i föreläsning, och avsnitt. Andra saker har inte komma upp så ofta. Vi har pratat mycket om # include och -L något och vad de betyder i kompileringsprocessen. Vi har pratat mycket om GDB, klänga, de olika flaggor som vi använder när Vi sammanställer något, och vad make15 exempelvis verkligen innebär och verkligen gör. Vi har inte pratar så mycket om varje steg i kompileringsprocessen. Vi har fortfarande pratat om det. Så det är fortfarande något som du bör känna till. Men återigen, vi kommer inte att vara - saker som kommer upp oftare i klassen är mer benägna att komma upp mer ofta och vara mer kraftigt viktas på frågesport. Cool. Alla andra frågor om quiz 0? OK, så jag satte en lista med ämnen på tavlan. Jag gick igenom kursplanen. Jag gick igenom avsnittet översyn från igår kväll och de glider att komma upp med en icke uttömmande förteckning över ämnen att vi har täckt hittills i CS50 och saker som kanske visas på frågesport. Så jag tänker inte gå igenom varenda en av dessa. Det skulle ta mycket mer tid än vad vi har nu. Men jag lägger upp det här för att förhoppningsvis jogga ditt minne om saker som kan eller kanske inte så bekant med dig. Och jag skulle älska att tillbringa större delen av avsnitt besvara dina frågor om dessa ämnen, ämnen som omfattas inte här. Vi kan skriva pseudokod. Vi kan skriva riktiga kod att se till att du - Jag kan besvara din fråga och hjälpa alla i grunden förstå en många av dessa frågor, så att du kommer att känna förberedda och bekväm att gå in frågesport imorgon. Så läs igenom listan. Du förhoppningsvis har kommit till avsnittet med några frågor också. När du är redo, räck upp handen och vi kommer att komma igång. Tänk på de frågor du har, det finns inga dumma frågor. Vi har hört att en hel del. Och de frågor du har, jag är villig att satsa, många andra människor, både sitter här och tittar på nätet har också. Så du kan bara hjälpa människor genom att ställa frågor. Marcus. MARCUS: Mellan stacken och hög, är det en pre-tilldelade procentdelen minne som är definierat som detta är för stacken eller för hög? Eller hur fungerar det egentligen? JASON Hirschhorn: Bra fråga. Jag kommer att backa spåra lite. Får alla - vänligen vara ärliga här. Jag vet att jag ber dig att höja din handen framför dina kamrater. Men finns det människor som känner obekväm med stacken och heap och skulle vilja gå över till att och vad de betyder? Räck upp handen om - OK. Tack. Så vi kommer att gå över till stacken och högen verkligen snabbt och sedan flytta in i att besvara din fråga. Så om vi drar ut en låda för att representera minne på datorn, vad är några saker som går i den här rutan? Main. En huvudfunktion. Vart tar viktigaste vägen? STUDENTEN [OHÖRBAR]. JASON Hirschhorn: Så vi ska sätta huvud här nere. Vad går i den här rutan? STUDENT: De funktioner som du ringer. JASON Hirschhorn: Funktionerna som vi kallar. Och vart tar de vägen? STUDENT: i stapeln. JASON Hirschhorn: De gå i stapeln. Så vi kommer att kalla detta sak här nere i stacken. Och där uppe, har vi högen. Så minnet är inte en låda precis som denna. Men det är faktiskt ganska lika. Det kommer att bli en hel del lådor över och över, beroende på hur stor din Datorn är eller hur stort ditt minne är. Vid citat-unquote "botten" är stapeln. Och det finns flera saker att gå på stacken. Och de som är beroende av de funktioner du har i din kod. Du har alltid en funktion i din kod som kallas huvud, så det finns alltid en avsnitt här nere i stack ägnas åt huvud. Dessa avsnitt i stapeln kallas stackramar. När du ringer en annan funktion, säger huvud kallar en binär sökfunktion, vi sätter en annan ram på stacken. Mer specifikt kommer vi att donera en bit av minnet på vår dator för att lagra binär sökning lokala variabler och köra det binära sökkod. Så vi kallar binär sökning. I denna del av minnet, vi ska att lagra sina lokala variabler. Vi kommer att lagra sina printf samtal. Vad som än händer, är denna funktion kommer att lagras där. Binär sökning kommer att köra. Det kommer att slutföra exekvering. Vad är ordet i C som betecknar att en funktion bör slutföra sin avrättning? STUDENT: Return. JASON Hirschhorn: Tillbaka. Så när du ser en återgång uttalande, funktions ändarna när den träffar det. Så binär sökning kommer att träffa sin återkomst. Denna del av minnet kommer i huvudsak frigöras. Och viktigaste kommer att gå tillbaka till avrättning. Så huvud pausar varhelst var, samtal binär sökning, få lite returvärde, och fortsätta exekveringen. Denna stack ram kommer att försvinna. Om vi ​​kallar en rekursiv funktion, vilket är en funktion som kallar sig över och över, kan vi få - säger vi gjorde binär sökning rekursivt. Vi kanske blir binär sökning version ett, binär sökning två, binär sökning tre, binär sökning fyra, binär sökning fem. Och sedan denna sista binära sökningen fem kommer att drabba basfallet, och stacken ramar kommer att gå tillbaka och hålla stängning tills vi kommer tillbaka till huvud. Vi kan gå över rekursion i lite. Men allt detta är att säga, om du är ringer flera funktioner samtidigt, blir det flera stack ramar på stacken. Högen, å andra sidan, en ökning här, inte för funktioner, inte för lokala variabler. Det är för att dynamiskt allokeras variabler. Så dessa är variabler som kan initieras i antingen huvud eller en fungera som huvud samtal. Var som helst i koden, de kan initieras. Och för att initiera ett dynamiskt tilldelade variabeln. Vilken funktion i C använder vi? STUDENTEN Malloc. JASON Hirschhorn: Malloc. Du ringer malloc. Du får en plats i minnet. Och det utrymmet av minnet är på heap-minnet. Och det utrymmet i minnet stannar där tills du ringa gratis. Så dynamiskt tilldelade variabler i upplag kommer att existera så länge som du vill att de ska existera, och de kommer inte gå bort tills du uttryckligen berätta för dem att försvinna. Du kan skapa dem i en funktion. Den funktionen stack ram kommer att försvinna. Men den variabeln fortfarande existerar i högen, tills den är frigjord, eventuellt av den funktion som kallas binär sökning eller vad som helst. Så de heap variabler stanna där så länge du vill dem att stanna där. Och de får sätta här. Och sedan nästa man får sätta dit. De håller blir ifyllt, och de stanna där tills du ringa gratis. Och huvudsak högen och stapeln, komma till Marcus fråga, växa mot varandra. Och om de stöter på varandra, du har förbrukat allt minne i din dator, och programmet kommer att sluta eftersom du inte har något mer minne kvar att använda. Mellan dem finns det potentiellt andra saker. Men för ramen för denna kurs, du behöver inte bekymra dig om det. Så det var svaret på din fråga. BRY DIG INTE OM DET. Men det var det långa svaret. Allt du behöver veta är den och stacken kommer - en börjar vid botten. Stapeln gör. Högen är uppe. De kommer att närma sig varandra. Och om de röra, det är ett problem. Du fick slut på minne. Men också, förutom att veta var de är, vad som är lagrad i både stack och heap. Curtis. CURTIS: När de kolliderar, är att en stack overflow? JASON Hirschhorn: När de kolliderar, det är inte en stack overflow. En stack overflow är ett annat område att vi kan gå över om du vill. OK, vi ska återkomma till det i lite. STUDENTEN Vad är det ord som heter när de träffar varandra, varvid stapla och högen? JASON Hirschhorn: För nu, oroa dig inte om. Bara vet - Jag kommer att svara på den frågan efter lektionen. Om de stöter på varandra, du sprang ut minne, för det finns inte mer utrymme där. STUDENT: Förlåt, vad är en seg fel? JASON Hirschhorn: Ett segment fel kan kallas för - det beror varför seg felet är kallade. Ibland din stack overflow, det ska säger seg fel som felet. STUDENT: Hur dereferencing en nollvariabel? Är det en seg fel? JASON Hirschhorn: dereferencing en null-pekare - OK, så om du har en pekare som du lika med null, pekare, återkallelse, lagra minnesadresser eftersom deras värden. Och en null-pekare är i huvudsak lagring 0, den 0: te itu i den variabeln. Så 0x, 0, 0, 0, 0, et cetera. Detta 0-te adress i minnet som inte är i vår bild, det är där uppe någonstans, som är reserverad för datorn. Vi ska inte röra det. Så när ditt program är att köra, om något försöker att gå till minnet adress 0, vet den att som är ett tomt värde. Den vet ingenting borde vara där. Så om du försöker använda något där och behandla något liknande där eller försöker gå till den platsen, är du kommer att få en seg fel eller ett fel. Besvarar det din fråga? Och nu går vi tillbaka att stapla spill. Saker i högen, eftersom ni har sett förut, i - låt oss dra en nära upp av en stapel ramen. Kan alla se det? Så vi har vår stack ram. Vi sparar en array som en lokal variabel i denna funktion. Så säger vår samling har fem platser. Alla fem av dem som kommer att lagras i denna stack ramen. Om vi ​​börjar skriva bortom gränserna för denna samling - så om vi börjar skriva in, låt oss säga att det är 0. Det är de fem indexen av vår array. Om vi ​​börjar skriva i index 5, vilket vi har inte när vi har en matris med storlek 5, börjar vi skriva in index 6, 7, 8, 9, kan vi få en stack Overflow fel. I allmänhet är det inte - du kommer förmodligen att hamna i trubbel om du går över efter en. Men i allmänhet, kommer du komma in i mest problem om du går över av mycket och du går så långt över att du skriver över den returadress i nämnda funktion, som är belägen vid stapelns botten ramen. Därför att, eller hur? Du - i - sorry. Inte "eftersom rätt." I stacken ramen, har du lokala variabler. Längst ned i bunten Ramen är returadressen. Det är där den funktion går när det är över. Och om du skriver över att avkastningen adress, sedan när detta stack ram, När du går genom stapeln utforma och genomföra varje rad, du kommer att gå till din nya returadress som skrivs där i stället för den verkliga en. Och det är hur vi har sett några säkerhetsöverträdelser kan hända med datorer. Så stack overflow, kort sagt, är när du skriva över den delen i stapeln du ska använda, den lokala variabel du ska använda, och särskilt när du börjar skriva viktiga saker som returadress. Och det är där du får ett felmeddelande. Eller kanske du kan börja även skriva in - säga binär sökning var precis ovanför huvud. Om du skrivit över en hel del, som du kunde skriva in i main. Men i allmänhet, får du ett felmeddelande innan då, eftersom datorn känner du gör något som du inte bör göra. Yeah. STUDENT: Vad är skillnaden mellan en stack overflow och ett buffertspill? JASON Hirschhorn: Buffertspill är en mer generisk typ av vad jag just beskrivit. STUDENT: Så en stack overflow är en exempel på ett buffertspill. JASON Hirschhorn: Exakt. Det här är en samling som vi kan tänka på som en buffert, ett utrymme för saker att gå i. Detta är ett stackbuffertspill. Vi skulle kunna ha ett heap-buffertspill. Om det fanns en buffert, som det ofta är en matris högen, och vi skrivit över dessa gränser, då skulle vi har en heap-buffertspill. Och utanför ramen för denna kurs, de är upptäckt lite annorlunda. Kompilatorn har speciella sätt att upptäcka varandra. Men ett buffertspill är en mer allmän typ av vad jag beskrev, vilket var en stackbuffertspill. Visste att svara på din fråga? Söt. Fanns det några andra frågor relaterade till stacken eller högen? Yeah. STUDENT: Jag vet att du måste fria strängar eftersom de är i högen och du inte vill att läcka minne. Men har du att befria globala variabler och sånt? Eller är de automatiskt befrias? JASON Hirschhorn: Bra fråga. Så i CS50.H, skapar vi den här grejen för att du ringde en sträng. En sträng är egentligen vad? STUDENT: Char stjärna. JASON Hirschhorn: En röding stjärna, en pekare för ett tecken, en pekare till en array av tecken. Det är vad strängen är. Så vi måste frigöra den, eftersom getString, som vi använde en hel del - strängnamn lika getString - som mallocs för oss lite minne på heap och returnerar en pekare till första tecknet i det sträng, en röding stjärna. Så skenbart, om du inte har varit skriva fritt på någon av dina strängar att du har ringt hittills, har du läckt lite minne. Naturligtvis har vi inte pratat om det, så ingen har kommit i problem för att göra det. Men framöver, ja. När du ringer getString, du mallocing utrymme på högen. Och om du inte ringer gratis senare att sträng, du har en minnesläcka. Som svar på din fråga? Ja STUDENT: Så för att göra det, använder vi gratis precis innan retur? Liksom, inom ramen för, antar jag, om vi säger, liksom, int main, inom omfattningen av den kod som finns inom de krullparenteser, just innan - du vet var du skulle brukar sätta avkastning. Har du lagt fri innan dess? JASON Hirschhorn: Så kan du få gratis var du vill placera gratis. Eftersom dessa är dynamiskt allokeras variabler, eftersom de kan lever utanför ramen för en viss funktion, om du ringer malloc i en separat funktion, till exempel, getString, kan du ringa gratis i main. Du behöver inte kalla det i den specifika funktionen där malloc heter. Men du behöver för att kalla det före huvud avkastning. Och det beror egentligen. Det beror på varför du malloced att utrymmet i första hand. Vissa människor kommer att ringa frigöra ganska snabbt. Vissa människor kommer inte att ringa gratis till I slutet av sitt program. Och de kommer att gå igenom och fri allt. Det beror på varför du ringde malloc. STUDENT: Och vad skulle du säga om du ringde användning getString? Du skulle säga fri vad? JASON Hirschhorn: Så syntaxen gratis är helt enkelt fria, öppna föräldra, nära föräldra, och namnet på pekaren. Så om du skriver String namn jämlikar getString, sätta dig namn på här. Det är namnet på pekaren. Och den vet att frigöra det minne. STUDENT: Så när det frigör det minnet, pekaren fortfarande pekar på den platsen i minnet? Eller är pekaren också töms på den adress som den pekar på. JASON Hirschhorn: Vi borde prova det. Vi borde koda det. Låt oss komma tillbaka när vi kommer till kodning, och låt oss koda det. Och om du vill räkna ut svaret till det, kan du även kod som under tiden. Men det är en bra fråga. STUDENT: Är det möjligt att fri något för tidigt? Så du fortfarande behöver det för ditt program, och du befriade det minnesutrymme? JASON Hirschhorn: Ja. Det är möjligt, om du fri något och sedan använda den igen, kommer du stöter på ett fel. Men det är på dig, eftersom du befriade något och sedan kallade det senare. Så det var en programmerare misstag. Men ja. Du kan skriva det. Några fler frågor om - Ja. STUDENT: Så om du ska bara befria det i allmänhet innan den Programmet avslutas, betyder det, om programmet avslutas och du inte befria det, att minnet allokeras fortfarande? JASON Hirschhorn: Om programmet avslutas och du glömmer att frigöra något, då att minnet tilldelades hela livslängden på ditt program. När programmet stängs helt, att minnet inte kommer att stanna där för evigt. Datorn är smart nog att veta att när programmet avslutas, det bör bli av allt minne som var associerat med det programmet. Men det finns verktyg som du kan köra på ett program för att upptäcka om det, när Programmet är klar, du glömde att frigöra minne. Och för din nästa problem in där du kommer att använda malloc och använda pekare, kommer du att köra det här programmera på ditt program för att se om, när huvud avkastning, hade du några saker som var kvar unfreed. Så de kommer inte att stanna malloced för alltid i din dator. Det skulle vara slösaktig, eftersom mycket snabbt, datorer skulle få slut på minne. Men om de kör till slutet av ditt programmera och de är inte befriade och din Programmet går ut, det är fortfarande ett problem att detta verktyg kommer att hjälpa dig att möta. STUDENT: Är det Valgrind? JASON Hirschhorn: Det är kallas Valgrind. Och du kommer att bli - STUDENT: Men vi behöver inte veta att för testet, men? Jag menar, var det omtalade lite i föreläsning. JASON Hirschhorn: Så Valgrind är namnet på det verktyget. Att veta vad den gör är nog för frågesport. Men du har inte använt den ännu på Problemet inställd eftersom vi inte har haft en Problemet uppsättning som uttryckligen har behandlat med malloc eller du använder malloc. Så du inte har använt Valgrind ännu. Men du kommer att använda det förr snarare än senare. STUDENT: Kan du upprepa vad Valgrind är? JASON Hirschhorn: Förlåt? STUDENT: Kan du upprepa vad syftet med Valgring är? JASON Hirschhorn: Valgrind är namnet - som GDB hjälper dig att felsöka program, Valgrind hjälper dig att räkna ut om saker har inte befriats när programmet stängs. Så du kommer att köra det på ditt program. Och ditt program kommer ut, och det ska säga ditt program som heter malloc här många tider för detta många byte, och du endast kallade fria här många gånger. Och så du lämnade dessa många byte utan att bli befriade. Eller det kommer att säga att du har befriat allt. Bra jobbat. STUDENT: OK. Och det kallas Valgring? JASON Hirschhorn: V-A-L-G-R-I-N-D. STUDENT: En fråga om pekare. Så säger du har n stjärna x är lika med något. Det är lika, oavsett vad du lägger det, är att det som sätts på insidan vad x pekar på, eller pekaren på x? JASON Hirschhorn: Kan du upprepa frågan? Kan vi dra det när du säger det? STUDENTEN I frågesport, faktiskt, det en som du skickade oss, det var som, röding stjärniga sanning lika CS50 stenar, eller hur? Så betyder det att att CS50 stenar är vad sanningen pekar på? JASON Hirschhorn: Så du pratar om en röding stjärna i ett snöre, hur som fungerar? Yeah. OK. Låt oss dra det här. [SIDE SAMTAL] JASON Hirschhorn: Så denna variabel kommer att vara av typen char stjärna. Hur stor är en variabel av typen char stjärna? Hur många byte? STUDENTER: Fyra. JASON Hirschhorn: Det är fyra byte. Hur många rättigheter är en variabel av typen int stjärna? STUDENTER: Fyra. JASON Hirschhorn: Fyra bitgrupper. Om det är en pekare, så är det alltid fyra byte, eftersom pekare, deras värdet är en minnesadress. Och minnesadresser på CS50 apparaten är fyra byte lång. Så när vi kallar getString, eller när vi säg, lika stringname, och sedan i citationstecken sätta en sträng, vi lägger - Tja, det är lite annorlunda. Vi ska göra GetString som exempel. Eller röding stjärna något lika med strängen. Tyvärr, ge mig exempel att du läser? STUDENT: char stjärna sanning är lika "CS50 rocks" i citationstecken. JASON Hirschhorn: Så denna stjärna, detta Vi kallar den här variabeln x för vår allmänna ändamål. Vi har skapat en variabel som heter x. Det är typ char stjärna. Det är en pekare till en serie karaktärer. Så här nere - Så det här är hur detta skulle arbeta i minnet. Detta skulle lagra en minnesadress. Det skulle lagra minnesadressen för det första tecknet i arrayen. Och sedan när du följt pekaren, skulle du får det första tecknet. Och om du läser det här som en sträng, är datorn smarta nog att veta, läsa allt det här innan den kommer till en backlash 0. Men om du läser det ett tecken på en tid, så att du iterera igenom denna sträng, då kommer du bara läsa en tecken i taget tills du kommer till snedstreck 0. Det kan inte svara på din fråga, dock. STUDENT: Ja, men du har inte malloced det utrymmet ännu för denna pekare. JASON Hirschhorn: Så jag är inte helt säker exakt vad du tittar på, eftersom jag gjorde inte det frågesport. Det var tänkt att vara en hjälp resurs från en annan TF. Om du skapar en sträng på stapla eller som en lokal variabel, kommer den bara vara matris av laddningar snarare än allmänhet en char stjärna som pekar på en annan sträng. Men jag vet inte. Det skulle kunna vara en pekare till en annan strängen på stacken också. Yeah. STUDENT: Jag vet att du behöver allokera minne om pekaren är bli förklarade inuti av en annan funktion. Behöver du göra samma sak om det är deklareras inuti huvud, du använder den inne i huvud? JASON Hirschhorn: Så ja. Du kan deklarera en pekare till någon minnesadress i minnet. Det kan vara minnesadressen för en lokal variabel, men ofta nog, människor inte förklara minnesadresser till lokala variabler eftersom de går bort en gång att funktionen returnerar, vilket är därför vi malloc allmänhet saker. Men ja, kan du deklarera en pekare till en annan lokal variabel. Det är bara i allmänhet inte gjort. Men jag kan ta en titt på det specifik sak efter klass. Yeah. STUDENT: Jag tror att det är en slags om vad som ställs. Det verkar konstigt att initialisera en pekare inte som en adress, men som vad verkar som ett värde. Det verkar som om CS50 är vad som finns inuti den sak som pekade på och inte själva adressen, eller hur? JASON Hirschhorn: Så det är inte är fallet, även om. Det är inte vad som händer. När du deklarerar en röding stjärna, det är en minnesadress. Pointers är alla minnesadresser pekar på något annat. Att något annat skulle vara på stacken, men nästan alltid är på heap på det sätt vi kommer att se det används. Men stringname lika dubbel-citat "GetString," kan vi se att vi kan titta igenom det och koda det. getString sträng inte sparas i den variabeln, eller vad strängen Namnet är inte sparas i det variabel, inte för att det är så pekare fungerar. Låter det vettigt? STUDENT: Ja. JASON Hirschhorn: OK. Förhoppningsvis var det inte förvirrande för någon. Men om det var, kan vi titta på det igen i lite, eftersom vi faktiskt kommer att koda något som förhoppningsvis arbeta med stråkar och hjälpa dig att känna mer bekväm med dem. Alla andra frågor som rör dessa ämnen eller andra ämnen som Jag lägger tillbaka upp? Och - just nu. Ja, Alden. ALDEN: Så det här är helt orelaterade, men kan vi gå drygt riktigt snabbt vad vi behöver veta om skillnaden mellan en 32 och 64-bitars maskin? JASON Hirschhorn: Ja. Så 32 bitar är hur många byte? ALDEN: Det är fyra byte. JASON Hirschhorn: Det är fyra byte. Och 64 bitar är hur många byte? STUDENT: Åtta. JASON Hirschhorn: Åtta byte. Så återigen, är åtta bitar en byte. Din CS50 apparat är en 32-bitars maskin. Så minnesadresser är fyra bitgrupper långa. Det finns 2 till 32 minnesadresser. 0 till 2 till 32 minus ett. Och jag är inte positiv, men det är förmodligen omfattningen av vad du behöver vet för ett 32-bitars maskin, det minne adresser är, återigen, fyra byte lång, och det är det högsta belopp av minnesadresser. Även datatyper - detta kan vara något som ja det är värt att notera. Storleken på en datatyp beror på maskinen som du arbetar med. Så en röding, ett tecken, är hur många byte på vår CS50 apparaten? En byte. Och det är faktiskt en byte som väl på en 64-bitars maskin. Och de flesta datatyper är lika många för byte på båda maskinerna. Men vissa datatyper kommer att vara annorlunda på båda maskinerna. Så det skulle vara potentiellt enda du behöver veta. Men även det, tror jag, är bortom gränserna - Jag är nästan säker, om man tittar tillbaka på gamla frågesporter, den säger, antar för kodning problem du använder en 32-bitars maskin. Men det finns, att gå med på det i Om du är intresserad, det finns datatyper som är samma storlek på alla maskiner. Om du har sett något liknande uint32_t, kan du eller kan har inte sett det. Det är en datatyp. Det säger, vara 32 bitar oavsett vilken maskin det är på. Så när folk skriver bärbara kod, de förmodligen inte kommer att använda ints. De kommer i stället använda dessa andra data typer som de vet kommer att vara samma storleken på varje enskild maskin. Madhu. Madhu: Jag hade en fråga om kompileringsprocessen. Så om du skriver ett program som använder ett bibliotek som CS50 eller något så där, jag vet att det biblioteket har att, någon gång, vara kompileras och länkas in Men hur mycket av det som händer under sammanställning av ditt program? Vilken del av det biblioteket process uppstår när du är sammanställa ett eget program? JASON Hirschhorn: Så låt oss gå över generellt stegen i denna process. Du skriver ditt. C-fil. I ditt. C-fil, du # inkludera din header-bibliotek, till exempel, cs50.h. Vad gör det skarpa inkluderar line gör att ditt program? Akchar. AKCHAR: Det lägger prototyper av funktionerna från huvudet filer i biblioteken. JASON Hirschhorn: Exakt. Det ger dessa funktionsprototyper till din kod. Så när din kod sammanställs i ett tidigt skede, kompilatorn vet att dessa funktioner verkligen existerar, och det någonstans de har definierats. De. H filerna inkluderar inte definitioner för dessa funktioner eller hur de faktiskt arbetar. Cs50.h innehåller bara något som säger getString är en äkta vara som kan hända. Och standardio.h säger printf är en riktig sak som kan hända. Så din C språket med denna. Header fil blir förvandlas till något maskinläsbar kod, som så småningom förvandlas till binär kod, 0 s och 1 s. Och det är den kod som i slutändan blir avrättade. Den-l CS50 linjen - till exempel när du skriver klang - och då inkludera-l CS50, du skriver det i. Och du ser det. När du skriver att göra, kommer du se att rada upp här. Och vi ser att i ett andra när vi koda eller senare när vi koden. Men det-l CS50 linje gör något lite annorlunda än # include cs50.h. Vad betyder det-l CS50 linje göra? Avi? AVI: Jag vill säga att den länkar biblioteket till funktionen ring, liksom o filer.. JASON Hirschhorn: Så mycket nära, om inte perfekta. Den-l CS50 tar binär fil och går samman den med din binär fil. Så cs50.h, det finns ingen mening med att vända cs50.h från C-språk till binära varje enda gången den används. Det skulle vara dumt, eftersom det skulle slösa bort en massa tid. Så det har redan sammanställts och förvandlas till ett körbart. Och nu kommer det att slås samman med filen i slutet. Så de 1: or och 0 kommer att gå samman med dina kära och 0 är i slutet. Så nu att du faktiskt har den verkliga 1 och 0: att definiera hur getString, till exempel, fungerar, eller hur printf, till exempel, fungerar. Och för mer information, det finns en korta kompilatorer som Nate ger att du bör kolla som går igenom dessa steg. Men - Ja. STUDENT: Är de alltid i o-filer. när de är i biblioteket form, redo att slås ihop, kopplas - som de är i binär kod? JASON Hirschhorn: OK. Vad - STUDENT: Är det alltid fallet för biblioteken när du länkar dem? JASON Hirschhorn: Ja. Så det finns. S filer, som kommer att maskinkod, som också kommer att vara kryptiskt för dig. Du behöver inte oroa dig för dem. Men i allmänhet, ja, de ska vara. o filer redo att gå. STUDENT: Så när du sänder till ett bibliotek, behöver du bara fartyget den. h. och. o? Du behöver inte skicka. C. eller. S.. JASON Hirschhorn: So - och det är i detta kort och, om så denna information verkar komma en liten snabbt. Men den korta på kompilatorer talar om detta också. När du skickar ett bibliotek, om du skickar den. h, sidhuvudfilen, de funktionsprototyper och den 1: s och 0 s, det är allt du behöver för att ge. Du behöver inte ge hur Funktionen fungerar det. c-fil. Eftersom punkten för abstraktion, eller peka API: er, den punkt vid denna SPL, Stanford bärbara biblioteket, är det för dig att inte oroa sig för hur nya GRect fungerar, eller hur flytta verk, eller hur lägger fungerar. Allt du behöver veta är att add är en funktion som du kan använda, och det gör det. Så du egentligen inte behöver veta hur det är skrivet i C. Du behöver bara vet, här är de funktioner, vad de göra, och här är de 1: or och 0 när du verkligen vill använda dem. Cool. Några fler frågor om kompilatorer eller andra ämnen på tavlan? STUDENT: Jag har en fråga om genomförande rekursiva funktioner. En fråga om rekursion. Jag hade en känsla som skulle komma upp. Så låt oss snabbt gå igenom rekursion med en specifik exempelvis en faktoriell funktion. Eftersom detta är ett exempel som ofta kommer upp eller används att illustrera rekursion. Så "4!" läses som 4 fakulteten. Och vad betyder 4 faktoriell detta? Vad gör det? Hur beräknar 4 faktoriell? 4 gånger 3 gånger 2 gånger 1. Så ett annat sätt att skriva 4 faktoriell är att skriva det här. 4 gånger 3 faktoriell. Eftersom tre faktoriell är 3 gånger 2 gånger 1. Så 4 gånger 3 fakultet är 4 gånger 3 gånger 2 gånger 1. Därför fakultet är en stor kandidat för rekursion, eftersom det är klart att det är något som händer om och om och om igen på en mindre antal saker tills du kommer till slutet. När du når 1, är 1 faktoriell 1. Du kan inte gå mycket längre. 0 faktoriell är också definieras som en. Så när du kommer till 1 eller 0, du är i slutet, och du kan börja gå upp igen. Så om vi ville skriva en rekursiv funktion för att beräkna en faktoriell, vi kommer att skriva några pseudokod för det nu. Innan vi skriver att pseudo - Jag ska ge er ett par minuter att skriva pseudokod eller bara tänka om det - det finns två saker som var rekursiv funktion behöver. Vilka är dessa två saker? JACK: Det har att kalla sig. JASON Hirschhorn: Noah? Åh, Jack. Varsågod. JACK: Det har att kalla sig. JASON Hirschhorn: Så en rekursiv Funktionen kräver ett rekursivt anrop, en kalla till sig själv. Det är ett. Och vad är den andra saken? JACK: Ett basfall. JASON Hirschhorn: Ett basfall. Ett basfall är, här är när vi slutar. Så din funktion anropas. Basen fall kommer först. Du vill veta om du är i slutet. Och om du inte är i slutet, du gör din rekursivt anrop. Och du går igenom den här funktionen igen, kolla din bas fallet igen. Om du inte är slutet, du gör ett rekursivt anrop, et cetera, et cetera. Därför rekursiva funktioner alltid behöver dessa grundfall och de rekursiva anrop. Om du inte har ett rekursivt anrop, det skulle inte vara en rekursiv funktion. Om du inte har ett basfall, du skulle gå för evigt och skulle det inte finnas något slut. Och basfallet kommer alltid först, eftersom du alltid vill kontrollera om du är i slutet först. Så innan vi gör något pseudo, varför behöver du inte ta en minut att tänka på hur en rekursiv faktor funktion skulle skrivas? Också, så många som du gör, skrift den ut på ett pappersark som är vad du kommer att behöva göra på frågesport i morgon. Så antagligen bra att göra Kontrollera koden du skriver ner på papper - eller så kan du göra det. Du vet var semikolon är. Du kommer ihåg syntaxen. Eftersom du inte kunna ha en kompilator berätta gjort ett fel. Även i denna riktning, i morgon, när du har kodningsproblem, om du rusade för tid, eller om du är mycket förvirrad om hur du ska skriver viss sak i c, det skulle BÖRA dig att skriva pseudokod eller skriva kommentarer i också. Eftersom det finns partiell kredit för en Många av frågorna på frågesporten. Så du kan vara rusade, eller du skulle bara bli förvirrad. Att skriva in kommentarer eller pseudo-kod är ofta ett sätt som du kan få del av krediten. Så inte lämna något tomt på frågesport. Det finns inga straff för sätta saker i. Faktum är att sätta i pseudo-kod eller kommentarer kommer att hjälpa grader räkna ut om du verkligen vet vad du pratar om, och kanske utmärkelse du någon partiell kredit för det. Också i den stilen, skriva klart. Om vi ​​kan inte riktigt vad du skriver, Vi kommer inte att ringa dig vid midnatt i morgon figur ut vad du skrev. Vi ska bara ta bort punkter. Skriv tydligt så att vi kan höra, eller snarare, vi kan läsa vad du skrev. Och om det står två meningar, inte skriva ett stycke. Följ instruktionerna. Skriv tydligt. Och skriver i dessa kommentarer eller pseudokod för frågor som skulle kunna utmärkelse partiell kredit. OK, låt oss gå till factorial. Så vi har en funktion fakulteten. Om jag skulle faktiskt skriva detta i C, Vad behöver jag för att sätta före namnet av funktionen? Typen retur, som i detta fall ger vi det int. Och sedan innanför klammerparenteserna, är vad går innanför klammerparenteserna för en funktion? STUDENTER: Argument typ. JASON Hirschhorn: Dess argument. Så fakultet kommer förmodligen ta ett argument. Det kommer nog bara ta ett argument. Och vi säger det tar ett heltal som kallas x. Och återigen, när du skriver en prototyp av en funktion eller skriva funktionen i koden innan du definierar det, du skriva datatypen och namnet på den variabeln för endast den funktionen. Så du kan skicka några nummer i detta funktion, kommer det att kallas x internt. Vi har vår fakulteten. Vi behöver två saker, ett basfall och ett rekursivt anrop. Vad är basfallet för faktor? Någon som skrev ut det och vem har inte talat ännu, vad är basen fall för fakultet? STUDENT: Om n är mindre än 2, returnera 1. JASON Hirschhorn: Om n är mindre än 2, returnera 1. Jag gillar det, för det tar hand om 0 och 1. Så vi ska göra x <2, avkastning 1. Om vi ​​få passerat 0, om vi får passerade 1, denna funktion kommer omedelbart åter 1. Om vi ​​få passerat några nummer större än eller lika med 2, kommer vi att har vår rekursiva anrop. Och så hur ska det gå till? Kan någon annan som arbetat med detta vem har inte pratat ännu ge mig rekursivt anrop till denna funktion i pseudokod? Om vi ​​få passerat i ett tal x och det är större än 2, vilken vill vi göra? Vi har också ett exempel skrivet på sida som kan ge dig en ledtråd. STUDENT: Kalla x gånger fakulteten av x minus 1? JASON Hirschhorn: Exakt rätt. Vi kommer att återvända x gånger fakulteten för x minus 1. Och det, trots att jag skrev upp, i grund och botten, det du sa på engelska, denna faktoriell funktion kommer att få kallas igen. Det kommer att köras på x minus 1. Det kommer tillbaka med något heltal, och då det kommer att multiplicera dessa två tillsammans, och detta värde kommer att vara tillbaka till vad som kallas det faktoriell funktion, vilket kan vara en annan instans av denna fakulteten. Så det är ett exempel på en rekursiv funktion, en mycket enkel rekursiv funktion. Men de flesta av dem kommer att vara så här. Om du vill ha en bra rekursiv utmaning för frågesport, prova kodning binär sökning rekursivt. För om du gjorde binär sökning efter Problemet set tre, gjorde du antagligen det iterativt i en while-slinga. Men det kan också vara skrivet rekursivt. Du kommer att behöva skriva en egen separat funktion som tar lite olika kommandoradsargument - eller inte kommandoradsargument, vissa olika bara vanliga argument. Men du kan skriva binär sökning rekursivt också. STUDENT: Så du kunde har också skrivit, istället för x minus 1, du kunde också skrivit x minus minus, eller du kan ha skriftlig minus minus x. Kan du förklara riktigt snabbt varför de skulle vara olika saker, liksom vad skillnaden är mellan x minus minus och minus minus x? JASON Hirschhorn: Nej, jag är inte kommer att gå in i det. Men jag kommer att prata med dig om det efter klass. x minus minus minus minus x dekrementera x med 1. Men de gör det lite annorlunda. Men jag vill inte gå in på det. Övriga frågor om rekursion eller den här funktionen? Det är egentligen inte ens pseudokod. Det är i grunden koden i C du skulle skriva om detta. OK, några andra frågor om ämnen här uppe? Yeah. STUDENT: Jag har en snabb genomgång av flyttal och precision. JASON Hirschhorn: Flytande punkt och precision. Kan någon verkligen snabbt ge mig en genomgång av flyttal och precision? Ni alla var tvungna att göra det för din problem set, så du är allt bekant med den. Eller kanske inte alla av er. Någon? Ge mig ett började fläck. Flyttals och precision. Vad är problemet? Ja. Victoria? VANESSA: Vanessa. JASON Hirschhorn: Vanessa. Ursäkta. VANESSA: Det finns bara ett begränsat antal av tal som kan representeras eftersom du är på en, i vårt fallet, ett 32-bitars system. Så du slags måste göra upp några siffror. JASON Hirschhorn: Så det är exakt rätt. Det finns bara en viss mängd siffror som kan vara representerade. Om du multiplicerar två mycket stora antal, det kan svämma över den mängd platser du måste representera ett heltal. Det är därför vi ibland använder en lång lång istället för en int. Det har mer utrymmen. Det kan hålla ett större antal. Flyttal precision har att göra med som, men har också att göra med faktum att decimaltal är inte alltid representerade. Ursäkta. Låt mig uttrycka det tillbaka upp. Det decimaltal 1.0 är inte alltid representerade som du förväntar dig, 1,000000000. Det är ibland representeras som 1,000000001 eller 0,999999999. Det kan vara till och med 89 kastas där någonstans. Så de decimaltal inte representerade precis som du skulle förvänta oss att vara representerade. Så i problembild - var det två? - Problemet set två, där vi behandlat flyttal, när vi ville dem att representera exakt vad vi ville dem för att representera, antalet av pennies, eller antalet cent, vi multiplicera med 100. Vi rundade dem. Och då vi avbröt allt bakom decimaltecknet. Det var för att de skulle faktiskt lika exakt vad vi ville dem till lika. För när du tar något som är en flyta och förvandla det till en int, du avskurna allt till höger om decimalkommat. Eftersom det finns vissa flyttal vaghet, 100.000 kanske representerade som 99,999999999. Och om du bara klippa bort allt till rätt på en gång, du kommer att får fel nummer. Yeah. STUDENT: Jag hade en fråga om gjutning. Vilken ordning förekommer det i? Om du skulle göra float, fästen, 1 uppdelad med 10, det gör 1 delat med 10, sedan få 0,1, slå sedan den i en flottör? JASON Hirschhorn: Om du gör flyta 1 dividerat med 10 - STUDENT: Ja, och sedan lika - Tja, skulle det normalt ha det lika i - Yeah. Du vill göra det en flottör, eller hur? JASON Hirschhorn: OK, så vi ska använda det för att segue in räkna ut svaren på dessa frågor genom kodning. Eftersom du förmodligen har en hel del dessa små frågor, och ett bra sätt att lösa dem är genom kodning. Så vi kommer att koda detta just nu, och sedan ska vi gå tillbaka och koda den fråga du hade. Så den första raden - Jag borde inte ha skrivit det - vad är det första vi vill göra när vi öppna upp en ny fil i gedit? STUDENT: Inkludera. JASON Hirschhorn: Ta med vad? STUDENTEN CS50 bibliotek. JASON Hirschhorn: OK. Vad ska vi med? Vi ska bara kolla vad som händer när du kastar något på ett flöte. Men vad behöver vi för att inkludera om vi ska skriva en C-programmet? STUDENT: Standard I / O. JASON Hirschhorn: stdio.h. Vi egentligen inte behöver, för detta program, cs50.h, även om det är alltid bra att ta med den. Men vi behöver alltid stdio.h. STUDENT: Vid kodning i C? JASON Hirschhorn: Vid kodning i C. Så jag sparar den som detta. C-fil. Jag får några trevliga syntaxmarkering. Jag skrev tomrum inuti huvud. Vad betyder tomrum detta? STUDENTEN inte vidtar några kommandoradsargument. JASON Hirschhorn: Utgår medel, i detta fall inte huvud inte vidta några kommandoradsargument. I andra fall, innebär det att funktionen tar inte kommandoradsargument. Eller funktionen, om jag skulle skriva ogiltiga main (void), skulle det säga huvud s inte returnera någonting. Så tomrum bara betyder ingenting. Vad skulle jag skriva om jag skulle ta kommandoradsargument? STUDENT: int arc c sträng båge v. JASON Hirschhorn: int argc sträng argv. Är det rätt? STUDENT: Det är röding stjärna argv parentes. JASON Hirschhorn: Så du kan skriva sträng argv fästen eller röding stjärna argv konsoler, men du behöver konsolerna. Eftersom argv är en array strängar, minns. Det är inte bara en sträng. Så sträng argv är, här är en sträng som heter argv. String argv parentes är, här är en array av strängar. Så int argc sträng argv parentes skulle vara något som jag skulle förmodligen skriva. Så du vill spara i ett heltal? STUDENT: Ja, heltal. Eller i ett flöte. JASON Hirschhorn: I en flottör? Liksom, lika float x 1 delat med 10. JASON Hirschhorn: OK. Hur skriver jag ut en flottör i printf? Vad? STUDENTEN% f.. JASON Hirschhorn:% f. Vad är ett heltal? d eller jag. Vad är en sträng? STUDENT: s. JASON Hirschhorn: s. Hur får jag en ny rad? STUDENT: omvänt snedstreck n. JASON Hirschhorn: Vad ska jag tillbaka om huvud körs på rätt sätt? STUDENT: 0. Behöver jag skriva den linjen, men? STUDENT: Nej. OK, vi kommer inte att skriva det, då. Kan alla läsa det? Det ser lite liten. Kan alla se, eller bör Jag gör den större? Jag tror att kameran gör vi det lite större, men. JASON Hirschhorn: Om jag vill stänga av denna . C-filen till en körbar, vad skriver jag? STUDENT: Gör testet. JASON Hirschhorn: Förlåt? STUDENT: Gör testet. JASON Hirschhorn: Gör testet. Vi pratade om denna linje tidigare. Klang. Vad är det klang? Namnet på kompilatorn. Vad är det här raden? STUDENT: Ställer upp för användning av GDB. JASON Hirschhorn: Ställer det upp för användning av GDB. Denna linje, vad är det? STUDENT: Källkod. JASON Hirschhorn: Det är den källfilen, den. c-fil. Vad har dessa två linjer gör? Eller dessa två inte linjer. STUDENT: It namnger den testar. JASON Hirschhorn: Så streck o säger, namnge den något annorlunda. Och här du kallar det testet. Om jag inte hade det i, vad skulle det nämna detta? STUDENT: a.out. JASON Hirschhorn: a.out. Vad gör detta? STUDENTEN Länkar mattebiblioteket. JASON Hirschhorn: Den länkar i mattebiblioteket. Vi inkluderade inte mattebiblioteket, men eftersom det är så vanligt, de har skrift gör att alltid inkludera mattebiblioteket. Och på samma sätt, detta inkluderar den CS50 biblioteket. OK, så om vi lista, nu har vi en körbar heter test. För att köra det, jag skriver prov. Jag ser att min flyttal, som väntat, är lika med 0. Gör det - så - STUDENT: Sedan om du sätter flyter nu, som om du kastar det som float - JASON Hirschhorn: Medverkande den 1 till ett flöte? STUDENT: Nej, kasta hela saken - ja. Om du gjorde det, skulle som gör det 0,1? JASON Hirschhorn: OK, så riktigt snabbt, 1 dividerat med 10, de är heltal som delas. Så när du delar heltal, de är 0, och du sparar som 0 i en flyta, eftersom snedstreck är bara heltalsdivision. Så nu vi vänder något in i en flottör. Låt oss se vad som händer. Vi kommer att göra testet. Så nu ser vi att det snedstreck var inte heltalsdivision visade det flytande talsdivision. Eftersom ett av argumenten hade gjutits till ett flöte. Så nu var det sagt, behandla detta uppdelning som vi har att göra med flytande punkter, inte med heltal. Och så får vi svar som vi förväntar oss. Låt oss se vad som händer - oops. Om jag ville skriva ut mer decimal fläckar, hur kunde jag göra det? STUDENTEN Point prick f, eller så många decimaler som du vill. JASON Hirschhorn: Så jag skriver ut 10 decimal fläckar. Och vi ser nu att vi får några konstiga saker. Och som går tillbaka till din fråga om flyttal vaghet. Det finns konstiga saker som lagras i här. OK, gör som svar på din fråga? Vad ville du att koda snabbt? STUDENT: Jag ville bara se om inte, om du frigjort en del pekare, oavsett om det pekaren fortfarande hade lagrats i den adressen till vad det hade varit pekar på tidigare. JASON Hirschhorn: OK, så låt oss göra det. Char stjärna ptr, skapar detta en variabel kallas ptr av typen char stjärna. Hur skriver jag malloc? Alden? ALDEN: Bara malloc. Men då måste det vara storlek, och i det här fallet, jag antar att du skulle peka att förkolna. Så det skulle vara röding. JASON Hirschhorn: OK, så mer allmänt, Inside - Låt oss redigera. Inne malloc, vill du numret bitgrupper på heap-minnet. Generellt, vad vi har sett att vi är gör är att vi kommer att malloc strängar, till exempel, eller arrayer av heltal. Så om vi vill 10 heltal, eller 10 tecken, 10 kommer att ge oss 10. Och sedan storlek på tecken skulle ge oss att storleken på tecken, som i detta fall är 1 byte. Vi får 10 bytes. Om vi ​​skulle skriva storlek på int, som skulle ge oss 40 byte. Så mer allmänt, insidan av malloc är antalet byte som du vill ha. I det här fallet, vi får 1 byte. Vilket verkar vara en konstig användning av malloc, men för vår syften vettigt. Så det är det. Vi kommer att ringa gratis. Vi bli av med det och vi använder ptr igen. Och vad ville du kolla? STUDENT: Jag ville bara kontrollera om eller det var inte något inne i den. JASON Hirschhorn: Så oavsett Det pekade på någonting? STUDENT: Ja, exakt, oavsett om det fortfarande hade en minnesadress. JASON Hirschhorn: Så du vill att kontrollera värdet av ptr? STUDENT: Ja, exakt. JASON Hirschhorn: Vad skriver jag här om jag vill kontrollera värdet av punkt - vad är, Jordanien sade värdet? Eller vad som lagras inuti ptr? STUDENT: En minnesadress. JASON Hirschhorn: En minnesadress. Så om jag skriver just detta, kommer det ge mig värdet av ptr. Och hur jag skriver ut en minnesadress? Vad är formatsträngen för en minnesadress? STUDENTEN% p. JASON Hirschhorn:% p. % S är en sträng. % P för pekare. Är det rätt? Det är rätt. Så ptr lika - det har fortfarande något i det. Detta är förmodligen en mer intressant fråga. Vad gör den linjen gör? STUDENT: Seg fel. JASON Hirschhorn: Vad? STUDENT: Jag tror att det seg fel. JASON Hirschhorn: Hm? STUDENT: Jag tror att det ska SEG fel. JASON Hirschhorn: Så här raden av kod, stjärn ptr, vad betyder stjärnan detta? STUDENTEN innehåll. JASON Hirschhorn: Ja. Gå att få innehållet i. Så detta kommer att gå till minnet itu med det och ge mig det. Jag använde% c just här eftersom det finns tecken som lagras där. Så vi kommer att gå till den adressen som vi bara såg - eller det kommer förmodligen att bli en lite annorlunda den här När vi kör programmet. Men vi kommer att gå till den adressen som vi vet fortfarande existerar och se vad som finns där. Så det inte SEG fel. Det bara inte ge oss någonting. Det kanske har faktiskt gett oss något, vi kan bara inte se det. Och som går tillbaka till denna idé - och vi kommer inte att få för mycket i detta, eftersom det är utanför ramen för denna kurs. Men vi pratade om här, om vi gick utöver gränserna för matrisen med 1, vi kanske inte får problem. Ibland, när du bara gå ut med 1, du gör något fel, och du kunde råka illa ut. Men du behöver inte alltid hamna i problem. Det beror på hur mycket av en dålig sak som du gör, du kommer att få problem. Vilket inte är att säga, vara slarvig med din kod. Men det är att säga, kommer programmet inte alltid sluta, även om du går någonstans du ska inte gå. Ett bra exempel på det är, en hel del människor i deras problem set 3, som var 15, inte kontrollera gränserna för styrelsen. Så du tittat till vänster, såg till rätt, såg till toppen, såg till botten. Men du inte kontrollera om toppen faktiskt kommer att vara på bordet. Och en hel del människor som gjorde det och vände det in, arbetade deras program perfekt, eftersom de fall styrelsen var lagras i minnet, om du gick en ovanför eller kontrollerat att minnet adress, det var inte något särskilt hemskt om det, så ditt program var inte kommer att skrika på dig. Men vi skulle ändå ta bort poäng om du inte kontrollera det, eftersom du gjorde något du inte var tänkt att göra, och du kan ha fått i trubbel. Oddsen är, men du gjorde antagligen inte. Så det här är att visa att, ja, Vi kan fortfarande gå till den. Och vi kommer inte att komma in problem i detta fall. Om vi ​​försökte göra läsa nästa 100 tecken, vi skulle förmodligen få problem. Och du kan koda på nästa 100 tecken om du vill ha genom att göra några slags för slinga. Yeah. STUDENT: Eftersom vi blev tilldelade att utrymme ett faktiskt värde, vi skulle inte faktiskt kunna se någonting. Ska vi prova det med inställningen att motsvarar gillar c eller något? JASON Hirschhorn: Bra fråga. Hur ställer jag in det värdet - vilken kodrad skriver jag på linjen sju att göra det du sa? STUDENTEN Star ptr är lika enkel quote c avslutar enda anbud. JASON Hirschhorn: Så det är att sätta en karaktär, c, vid den platsen, eftersom igen, stjärna som innebär att gå till där. Och när den används på den vänstra sidan av en tilldelningsoperator, är lika stor som underteckna, vi kommer inte att få det värde så mycket som satt det värdet. Nu ska vi se vad som händer. Vi lägger något där och det var där. Vi kallade fria. Vissa grejer förmodligen hänt på heap-minnet. Så det är inte där längre. Men återigen, vi får inte i trubbel för att gå dit. Jag gör detta i koden för att illustrera att en hel del av dessa frågor som du har, de är riktigt intressant svarar på en hel del tid. Och de är riktigt bra frågor. Och du kan lista ut dem på egen hand om, till exempel, vi är inte i avsnittet. Yeah. STUDENT: Eftersom du inte skickar pekaren någonstans, behöver du använda malloc? JASON Hirschhorn: Så här går tillbaka på din första fråga. [? ?] Är det bara en lokal variabel? Malloc här är inte så övertygande. Användningen av malloc här är inte som övertygande eftersom det är bara en lokal variabel. STUDENT: Så kan du göra röding stjärniga ptr lika hej? JASON Hirschhorn: Oh. Så ska vi nu få tillbaka på din första fråga. Jag tror att du inte var nöjd med mitt svar. OK? Så? STUDENT: Ja. Vänta. JASON Hirschhorn: Och var vill du skriva ut? Så vi ska skriva ut en sträng så? STUDENT: Intressant. JASON Hirschhorn: Så här säger att detta Argumentet har typ av ett tecken. Så det här borde vara ett tecken. STUDENTEN tar bara den första. JASON Hirschhorn: Så här är vad jag sade tidigare. Som jag sa, det är inte att lagra sträng inne variabel pekare. Det förvaring - STUDENT: Det första värdet av strängen. JASON Hirschhorn: Adressen till det första värdet av strängen. Om vi ​​skulle skriva ut det här, vi är far värdet inuti pekaren. Och vi får se det är, faktiskt, en minnesadress. Låter det vettigt? Ursäkta. Vänta, gör som svar på din fråga, men? STUDENT: Ja. JASON Hirschhorn: Denna kodrad är att skapa en sträng och sedan en annan variabel pekare som är riktad till den sträng, som matris. Yeah. STUDENT: Så om vi gick ett minne itu vidare, skulle vi få den h? Har det lagras som en sträng? JASON Hirschhorn: Precis, gjorde vi - så detta är värdefullt att göra. Detta är punkten aritmetik, som ni har sett förut och bör vara relativt bekväm med. Det är som att skriva - om vi skulle skriva denna rad kod, Vi har sett array notation innan. Detta borde ge oss den andra värde i denna array, tim. Om vi ​​gjorde det, bör detta också ge oss det andra värdet i matrisen. Eftersom det kommer inte till minnet adressen för den första, men den minnesadress för den sak man över. Och då stjärnoperatörs dereferences som pekare. Och återigen, låt oss se. Vi får h igen. STUDENT: Exakt vad avreferera detta? JASON Hirschhorn: avreferera är ett finare ord för att gå till. Gå till det och få vad som finns där är att dereference en pekare. Det är bara ett finare ord för det. STUDENT: Om vi ​​ville skriva ut hela strängen, kunde vi do ampersand pekare? JASON Hirschhorn: OK, är vi kommer att göra en paus här. Vi kommer att sluta här. Ampersand ger dig adressen till en plats, så när du gör et-tecken på en variabel, det ger dig adress där den variabeln lagras. Ampersand pekare ger dig adress ptr där ptr är i minnet. Vi kommer inte att gå på med detta exempel. Du kan räkna ut dessa saker på egen hand. Men återigen, det kanske till och med på gränsen en lite längre än vad du behöver veta för omfattningen av denna halvtids - eller det här testet, snarare. Ursäkta. Vi kommer att gå vidare, för att jag skulle vilja göra en kodning problem innan tiden är slut. Och vi kommer att koda vad jag tycker är den mest övertygande av dessa exemplen atoi. Så detta var en fråga om en frågesport två år sedan. Och jag har det på tavlan här. Folk ombads på frågesport - de fick lite mer tesxt i frågan, men jag eliminerat text för att det var onödigt för våra syften nu. Det var bara lite bakgrunds på vad atoi gjorde. Men ni alla vet och är mycket bekant med atoi. Jag föreslår att du koda det här på ett papper. Jag föreslår också att du använder den strategi att vi har gått över mycket i vår avdelning. Kontrollera först att du förstår vad atoi s gör. Rita en bild eller komma med några mental bild av det i huvudet. Därefter skriva ut pseudokod för detta. På frågesport, om allt du får är pseudokod, åtminstone du lägga ner något. Och sedan mappa den pseudo på C. Om du har en kontroll i ditt pseudokod, som kontrollerar om något är 1, kartor som på ett om tillstånd och så vidare. Och slutligen, koda program i C. Så gå tillbaka till atoi och ta fem minuter att koda detta på ett ark papper, vilket förmodligen om tid du skulle ta på en quiz till kod atoi. Fem till 15 minuter, fem till 12, fem till 10 minuter, om mängden tid du skulle spendera på detta fråga i frågesporten. Så ta fem minuter nu, snälla. Och om du har några frågor, höja din hand och jag ska komma runt. [sidan konversationer] JASON Hirschhorn: OK, så det var fem minuter. Det var nog ungefär hur mycket tid du skulle spendera på det på en frågesport, kanske den lägre delen av den tiden. Vi återblick på lite. Låt oss börja koda detta. Och om vi inte får hela vägen igenom, svaren på det här och det här frågesport fråga är tillgängliga, återigen, Hösten 2011 är när denna fråga dök upp på testet. Och det var värt åtta poäng på testet då. Åtta poäng är på den övre delen av antal poäng något är värt. De flesta frågorna är i intervallet av 1-6 poäng. Så det här är en mer utmanande fråga, för säker. Kan vem som helst få mig igång? Generellt, vad ska vi att vilja göra med detta fungera atoi, logiskt? Vad vill vi göra? Så vi kommer att skriva några pseudokod. STUDENT: Konvertera tecken in heltal. JASON Hirschhorn: Konvertera tecken in heltal. OK. Så hur många tecken är vi kommer att behöva gå igenom? STUDENT: Alla av dem. STUDENT: Alla tecken i strängen. JASON Hirschhorn: Samtliga av tecken i strängen. Så om vi ville gå igenom varje tecken i en sträng, det är en sak i C som vi har sett som har gjort oss att gå igenom varje tecken i en sträng? STUDENTER: A för slinga. JASON Hirschhorn: A för slinga. Så vi kommer att slinga genom varje tecken i talet. Men vad ska vi vilja göra när vi får ett visst tecken? Säg att vi blir passerade en 90. Vi får 9. Det är ett tecken. Vad vill vi göra med tecknet 9? STUDENT: Subtrahera det från tecken 0? STUDENT: Lägg 0? JASON Hirschhorn: Subtrahera det från tecken 0? STUDENT: Ja. JASON Hirschhorn: Varför du vill göra det? STUDENTEN [OHÖRBAR] värde. Dess int värde. JASON Hirschhorn: OK, så vi tar det karaktär 9, subtrahera den från tecken 0 för att få en faktiska tal 9. Söt. Och hur vet du det tecknet 9 minus 0 tecken är 9? Vad diagram tittade du på? STUDENT: Det finns logiskt nio platser mellan 9 och 0. Eller så kan du titta på ASCII-tabellen. JASON Hirschhorn: ASCII tabell. Men ja, du är rätt också. Så vi subtraherar 0. Så nu har vi heltalet 9. Och vad vill vi göra med det? Om vi ​​har 90, det är den första heltal vi har, vad vi vill göra? STUDENT: Jag skulle sätta in en tillfällig heltal array, sedan göra matematik till det senare för att göra det till slut. JASON Hirschhorn: OK. STUDENT: Du kan börja i slutet av arrayen och sedan gå vidare så att varje gång du rör dig framåt, du multiplicera det med 10. JASON Hirschhorn: OK. Det låter som ett ganska övertygande idé. Vi kan börja i slutet av vår samling, och vi kan använda strleng. Vi kan använda strleng in här. Vi tar längden på vår sträng. Vi börjar i slutet. Och + det första, vi bara ta det heltal, och kanske vi skapar som en nya heltalsvariabel upp toppen där vi lagrar allt. Så vi slinga genom varje röding is från bakfram, subtrahera vi 0, och då tar vi det, och beroende på där det är, vi multiplicera det med en kraft av 10. Eftersom den första, vad gör vi multiplicera tecknet längst till höger efter? STUDENT: 10 till 0. JASON Hirschhorn: 10 till 0. Vad ska vi multiplicera den andra längst till höger karaktär genom? STUDENTEN [OHÖRBAR]. JASON Hirschhorn: Vad? STUDENT: 10 till 1. JASON Hirschhorn: 10 till 1. Det tredje tecknet längst till höger? STUDENT: 10 till 2. JASON Hirschhorn: 10 till 2. STUDENT: Förlåt, jag förstår inte vad vi gör här. JASON Hirschhorn: OK, låt oss gå tillbaka, då. Så vi kommer att få gått i en sträng. Eftersom vi skriver atoi. Så vi få passerat i ett snöre. Säg att vi blir passerade i strängen 90. Det första vi ska göra är att ställa en ny heltalsvariabel som vi är bara kommer att skapa som vår nya heltal. Det är vad vi ska att återvända i slutet. Vi måste gå igenom varje tecken i strängen för att vi har fastställt att vi måste röra var och en och sedan lägga till det nya heltal. Men vi kan inte bara lägga till den som ett tal. Vi kan inte bara ta 9 och lägg 9 till vår heltal. Det beror på vilken plats det är i strängen. Vi kommer att behöva multiplicera det med en kraft av 10. Därför att det är hur basen 10 verk. Så vi kommer att få den faktiska karaktär, eller den faktiska tal nummer, genom att subtrahera tecken 0 från karaktär 9 som vi gjorde med subtrahera teckenkapital A från oavsett karaktär som vi hade i en av dessa problem. Så vi ska faktiskt få ett nummer från 0 till 9 sparas som ett reellt tal, och vi kommer multiplicera det med en kraft av 10 beroende på var vi är i strängen. Och sedan ska vi lägga den tillbaka in i vårt nya heltalsvariabel. Så vad detta skulle se ut skulle vara - vi ska dra hit. Om vi ​​få passerat i strängen 90 - STUDENTEN [OHÖRBAR]. JASON Hirschhorn: Men atoi tar en sträng. Så vi kommer att gå igenom innehavet. Vi kommer att få passerat under 90. Vi går från baksidan till framsidan. Vi tar det 0. STUDENT: Jag är ledsen. Kanske det är dumt. Om vi ​​får passeras i en sträng, Varför är 90 vad vi är bli passerade i? Eftersom 90 är ett heltal. JASON Hirschhorn: Eftersom atoi tar en sträng och förvandlar den till heltal representation av den strängen. Men strängen 90 inte är heltalet 90 eller antalet 90. Strängen 90 är en uppsättning av två eller tre tecken, snarare, den 9 karaktär, den 0 tecken, och den omvända sned 0 tecken. Och vi skriver atoi eftersom till exempel när du tar kommandot line argument, och den sparas i argv, det sparas som en sträng. Men om du vill behandla det som ett antal, du behöver för att konvertera den till en faktiska heltal. Vilket vi gjorde en av våra problemsamlingar. Som vi gjorde i ett antal av våra problemsamlingar. Alla som tog ett heltal som en kommandorad argument. Så det är därför vår atoi funktion tar en sträng. Så återigen, i vårt exempel här, vi är kommer att ta den sista. Vi kommer att dra av tecknet 0 från det, eftersom tecknen 0 subtraheras från tecknet 0 ger dig det faktiska antalet 0, enligt ASCII matematik som vi gör. Eftersom tecken representeras som annorlunda än deras faktiska - det personen en, till exempel, gement a är 97. Det är inte - oops! Det är inte vad du förväntar dig det ska vara, 0, till exempel. Så du måste dra av karaktär en att få 0. Så vi kommer att göra det här för att få det verkliga antalet. Och då ska vi multiplicera det med en effekt av 10 beroende på var den finns i strängen, och sedan ta det och lägga till det platshållare variabel så att vi kan komma med vår sista nya heltal. Är det vettigt att alla? Så vi kommer inte att koda detta just nu, eftersom vi är få ont om tid. Jag ber om ursäkt för tidpunkten för det. Men det är det som, förhoppningsvis, skulle du kunna göra på frågesport - på stone få denna pseudo skrivits ut. Och sedan, om vi skulle skriva pseudokod, faktiskt, kan vi göra det här ganska snabbt. Varje rad av kommentarer vi att vi skrev här kan översättas till cirka en linje av C-kod. Deklarera en ny variabel, skrift en ögla, en del subtraktion, en del multiplikation, och vissa uppdrag. Vi skulle nog också vilja skriva en returledning. Vi kanske också vill lägga vissa kontroller i här. Yeah. STUDENT: Så kan vi behandlar s som själva strängen? Eftersom jag vet att det är bara en adress. Liksom, hur skulle du få längden på strängen som passerade? JASON Hirschhorn: Så hur gjorde längden av en sträng? Strlen. STUDENTEN strlen, ja. Men kan ni sätta er som argument för det? JASON Hirschhorn: Så strlen tar en char stjärna. Och det följer att röding stjärna, och det fortsätter att räkna tills det blir till en snedstreck 0. strlen var faktiskt en av de andra program vi skulle till kod. Det är en annan bra till kod. Att man är lite lättare, för om du kommer att tänka på det konceptuellt - Jag bara sa det högt - strlen följer en pekare och fortsätter att gå och räkna och hålla reda tills du når ett omvänt snedstreck 0. STUDENT: OK, fick det. JASON Hirschhorn: Så bäst av lycka till på quiz 0 imorgon. Om du har några frågor, jag vara ute efter detta. Tveka inte att maila mig. Nå ut till din egen TF om du är inte i min avdelning, eller få min e-post om du vill det. Om du vill galen och bara skicka mig en e-post, en Freakout e-post, kommer jag skicka tillbaka, liksom, en smiley, eller, som, ett skämt eller något. Så välkommen att göra det också. Lycka till igen, och jag ska se er alla nästa vecka.