Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Relevanta dokument
Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Övning från förra gången: readword

*Pekarvärden *Pekarvariabler & *

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

2 Pekare och dynamiska variabler.

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 10. Pekare (Pointers)

Det finns många flaggor till g++,

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

HI1024 Programmering, grundkurs TEN

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Filer och structer Del 2

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Poster ( structar ) Postdeklarationer

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Föreläsning 13. In- och utmatning

Enkla datatyper minne

Att använda pekare i. C-kod

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Kapitel 6 - Undantag

Föreläsning 6: Metoder och fält (arrays)

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Grundläggande programmering med C# 7,5 högskolepoäng

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

C++-programmets beståndsdelar

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Programmeringsteknik med C och Matlab

F5: Högnivåprogrammering

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

F5: Högnivåprogrammering

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

TDDD78 Objektorientering: Lagring och livstid

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Föreläsning 5: Introduktion av pekare

C-programmering, föreläsning 2 Jesper Wilhelmsson

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Classes och Interfaces, Objects och References, Initialization

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 6: Introduktion av listor

Föreläsning 5-6 Innehåll

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Övningar Dag 2 En första klass

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

TDIU01 - Programmering i C++, grundkurs

Objektorientering: Lagring, räckvidd och livstid

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Objektorientering: Lagring och livstid

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Tentamen i Programmering grundkurs och Programmering C

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Tentamen i. Programmering i språket C

Tentamen TEN1 HI

Deklarera en struct som kan användas för att representera en rät linje

Tentamen OOP

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Pekare och arrayer. Indexering och avreferering

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TDIU01 - Programmering i C++, grundkurs

Stack och subrutiner Programmeringskonventionen

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Programmering B med Visual C

Innehåll. Pekare Exempel

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Innehåll. Pekare Exempel

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Föreläsning 2, vecka 8: Repetition

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Transkript:

Dynamiskt minne Agenda Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Minne Datorns primärminne används till olika ändamål De flesta system partitionerar minnet efter användningen: Programkoden Variablerna: Globala (+statiska) Lokala Dynamiskt allokerade

Programkod Globala+statiska Stacken (lokala variabler) Minne Fix storlek, känt efter kompilering Växer/krymper under körning Heapen (dynamiskt minne)

Stacken Låt oss se vad som händer då ett program körs. Vi intresserar oss för variablerna och speciellt hur stacken används då funktionerna körs.

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner X: Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner A: X: Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner B: A: X: Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner C: B: A: X: Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner B: A: X: Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner A: X: Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner X: Stacken

void baz(void) { int C[100]; void bar(void) { float B[100]; baz(); void foo(void) { double A[100]; bar(); int main(void) { short X[100]; foo(); return 0; Några funktioner Stacken

Stack vs. Heap Lokalt deklarerade arrayer (dvs på stacken) kan ha dynamisk storlek Enkelt att hantera - automatisk återäming Begränsad livstid Dynamiskt allokerat minne (dvs på heapen) Kan behållas så länge man önskar Räcker att allokera det som behövs för tillfället Ägandet kan relatera till objekt istället för funktioner Måste lämnas tillbaks exakt en gång lätt att missa

Skapa dynamiskt minne i C Det är i huvudsak två funktioner du behöver använda: malloc free malloc tar minne i anspråk Motsvarar att deklarera en variabel Data är dock inte bundet till en viss funktion Kom ihåg: Lokala variabler försvinner då funktionen lämnas dock ej dyn. minne

Återlämna dynamiskt minne free återlämnar ett dynamiskt allokerat minne Då minnet inte försvinner automatiskt så är det ditt ansvar som programmerare att återlämna det

Kodfragment struct CAR *carp; int n=20; // Allokera en array av 20 element: carp = malloc(sizeof(struct CAR)*n); if (carp) {... // Gör något roligt... // Arbetet klart: lämna tillbaks minnet free(carp);

Kodfragment struct CAR *carp; int n=20; // Allokera en array av 20 element: carp = malloc(sizeof(struct CAR)*n); if (carp) {... // Gör något roligt... // Arbetet klart: lämna tillbaks minnet free(carp); Allokering och återlämnande behöver inte ske i samma funktion

Funktionerna void *malloc(int size); Returnerar en pekare till dynamiskt minne eller NULL om det inte finns något ledigt av tillräcklig storlek void free(void *mem); Återlämnar till systemet det minne som pekas ut av 'mem'. Detta är tidigare allokerat med malloc

Access av dynamiskt minne Eftersom vi når det via pekare så tillkommer inget nytt. När vi skickat arrayer som argument till funktioner så skickades egentligen pekare. Pekare vet inte om ifall de pekar på arrayer eller dynamiskt minne. Metoden för access är alltså densamma

Access struct CAR *carp; int n=20; // Allokera en array av 20 element: carp = malloc(sizeof(struct CAR)*n); if (carp) {... for (i=0; i<n; i++) scanf( %d, &carp[i].doors);... // Arbetet klart: lämna tillbaks minnet free(carp);

Returnera arrayer? Ibland vill man returnera en större mängd data från en funktion: struct CAR *load_cars(void) { struct CAR bilar[100]; FILE *fp = fopen( cars, rb ); if (fp) { fread(bilar, sizeof(struct CAR), 100, fp); fclose(fp); return bilar;

Returnera arrayer - nej! Ibland vill man returnera en större mängd data från en funktion: struct CAR *load_cars(void) { struct CAR bilar[100]; FILE *fp = fopen( cars, rb ); if (fp) { FEL!!! fread(bilar, sizeof(struct CAR), 100, fp); fclose(fp); return bilar;

Returnera arrayer - nej! Ibland vill man returnera en större mängd data från en funktion: struct CAR *load_cars(void) { struct CAR bilar[100]; FILE *fp = fopen( cars, rb ); if (fp) { fread(bilar, sizeof(struct CAR), 100, fp); fclose(fp); return bilar; FEL!!! Syntaktiskt korrekt, men: bilar försvinner när load_cars returnerar

Returnera dynamiskt minne! Gör om gör rätt! struct CAR *load_cars(void) { struct CAR *bilar= malloc(sizeof(struct CAR)*100); FILE *fp = fopen( cars, rb ); if (fp && bilar) { fread(bilar, sizeof(struct CAR), 100, fp); fclose(fp); return bilar;

Returnera dynamiskt minne! Gör om gör rätt! struct CAR *load_cars(void) { struct CAR *bilar= malloc(sizeof(struct CAR)*100); FILE *fp = fopen( cars, rb ); if (fp && bilar) { fread(bilar, sizeof(struct CAR), 100, fp); fclose(fp); return bilar; Dynamiskt minne finns kvar tills man gör free

Övning Skriv en funktion som allokerar dynamiskt minne till ett heltal och låter användaren skriva in data till detta. Skriv en annan funktion som skriver ut det inmatade värdet. Båda funktionerna anropas från main. Minnet ska återlämnas så snart det inte längre behövs.

Övning 2 Skriv ett program som: läser in ett antal flyttal från en fil räknar hur många nollor som finns bland talen skriver ut detta En testfil finns på hemsidan (rätt utskrift:305784). Först i filen finns ett heltal som anger antal element Låt koden återge problemets delar, dvs: float *load_numbers(int *n); Funktionen läser in data från filen till dynamiskt allokerat minne. int count_zeros(float *arr, int n); Funktionen returnerar antalet nollor i arrayen som pekas ut av arr. n anger antalet element. Utskriften görs i main Var återlämnar du minnet?