1 / 23

C:s minnesmodell

C:s minnesmodell. C:s minnemodell – var hamnar variabler?. #include &lt;stdio.h&gt; int a = 17 ; int main( void ) { int b = 18 ; int * c; c = malloc( sizeof ( int ) ); *c = 19 ; printf( &quot;a = %d at address %x<br>&quot; , a, &amp;a); printf( &quot;b = %d at address %x<br>&quot; , b, &amp;b);

Download Presentation

C:s minnesmodell

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C:s minnesmodell William Sandqvist william@kth.se

  2. C:s minnemodell – var hamnar variabler? #include <stdio.h> inta = 17; intmain(void) { intb = 18; int*c; c = malloc( sizeof(int) ); *c = 19; printf("a = %d at address %x\n", a, &a); printf("b = %d at address %x\n", b, &b); printf("c = %d at address %x\n", *c, c); free(c); system("PAUSE"); return0; } Global variabel = Data segmentet Automatisk variabel = Stack Dynamisk variabel = Heap Återställ dynamiskt minne! William Sandqvist william@kth.se

  3. Data-segmentet ”Globala” variabler, dvs variabler som deklarerats utanför programmets funktioner hamnar i datasegmentet. Initialiserade variabler förses med sina startvärden. Oinitialiserade variabler placeras för sig (.bss), de kan då enkelt åtminstone 0-ställas. I datasegmentet kan också konstanter och strängkonstanter lagras. Datasegmentet är statiskt, variablerna upptar plats under hela programkörningen både när de används och när de inte används. Nackdelen med de globala variablerna är att de kan nås från alla funktioner. De kan vara både parametrar och returvärden på en och samma gång för alla funktioner som använder dem – på ett oöverskådligt sätt – som gjort för problem! William Sandqvist william@kth.se

  4. Stacken När en funktion anropas så skapas en aktivitetspost på stacken. Den består av utrymme för funktionens parametrar och returvärde, samt de variabler som deklareras inuti funktionen ( = lokala variabler ). Nios-II är en registerrik processor och då ligger en del parametrar (upp till 4 st) och returvärdet i register. När en funktion avslutas så tas aktivitetsposten bort från stacken. William Sandqvist william@kth.se

  5. main()aktivitetspost Stacken När en funktion anropas så skapas en aktivitetspost på stacken. Den består av utrymme för funktionens parametrar och returvärde, samt de variabler som deklareras inuti funktionen ( = lokala variabler ). Nios-II är en registerrik processor och då ligger en del parametrar (upp till 4 st) och returvärdet i register. När en funktion avslutas så tas aktivitetsposten bort från stacken. Funktionen main() är speciell genom att den avslutas först när hela programmet kört klart. Dess aktivitetspost ligger kvar under programkörningen. William Sandqvist william@kth.se

  6. Automatiska variabler main() anropar funktionen funk1(). En ny aktivitetspost skapas nu på stacken för den funktionens variabler. main()aktivitetspost William Sandqvist william@kth.se

  7. Automatiska variabler main() anropar funktionen funk1(). En ny aktivitetspost skapas nu på stacken för den funktionens variabler. main()aktivitetspost William Sandqvist william@kth.se

  8. Automatiska variabler main() anropar funktionen funk1(). En ny aktivitetspost skapas nu på stacken för den funktionens variabler. När funktionen kört klart returnerar den till main() och aktivitetposten tas bort. main()aktivitetspost William Sandqvist william@kth.se

  9. funk2() Automatiska variabler main() anropar funktionen funk1(). En ny aktivitetspost skapas nu på stacken för den funktionens variabler. När funktionen kört klart returnerar den till main() och aktivitetposten tas bort. Nu anropas en annan funktion funk2(). Den funktionens aktivitetspost kan nu utnyttja samma minne på stacken. main()aktivitetspost William Sandqvist william@kth.se

  10. funk2() Automatiska variabler main() anropar funktionen funk1(). En ny aktivitetspost skapas nu på stacken för den funktionens variabler. När funktionen kört klart returnerar den till main() och aktivitetposten tas bort. Nu anropas en annan funktion funk2(). Den funktionens aktivitetspost kan nu utnyttja samma minne på stacken. main()aktivitetspost Funktionernas variabler på stacken kallas för automatiskavariabler. Minnesutrymmet på stacken återanvänds av funktionerna och utnyttjas därmed effektivt. William Sandqvist william@kth.se

  11. En funktion som genererar data Antag att funktionen funk2() genererar data och lagrar dessai en lokal array[] på stacken. William Sandqvist william@kth.se

  12. array[] En funktion som genererar data Antag att funktionen funk2() genererar data och lagrar dessai en lokal array[] på stacken. William Sandqvist william@kth.se

  13. array[] En funktion som genererar data Antag att funktionen funk2() genererar data och lagrar dessai en lokal array[] på stacken. Funktionen returnerar arrayens adress till main(), med hjälp av adressen kan main()nå ochanvända datat. William Sandqvist william@kth.se

  14. array[] En funktion som genererar data Antag att funktionen funk2() genererar data och lagrar dessai en lokal array[] på stacken. Funktionen returnerar arrayens adress till main(), med hjälp av adressen kan main()nå ochanvända datat. William Sandqvist william@kth.se

  15. array[] funk3() array[] En funktion som genererar data Antag att funktionen funk2() genererar data och lagrar dessai en lokal array[] på stacken. Funktionen returnerar arrayens adress till main(), med hjälp av adressen kan main()nå ochanvända datat. Datat på stacken lever farligt! Om en ny funktion, funk3(), körs så skrivs datat över. William Sandqvist william@kth.se

  16. array[] funk3() array[] En funktion som genererar data Antag att funktionen funk2() genererar data och lagrar dessai en lokal array[] på stacken. Funktionen returnerar arrayens adress till main(), med hjälp av adressen kan main()nå ochanvända datat. Datat på stacken lever farligt! Om en ny funktion, funk3(), körs så skrivs datat över. Det behövs någon annan plats för datat. – Var skulle det kunna vara? William Sandqvist william@kth.se

  17. funk2() Heapen Funktionen funk2() behöver lagra sina data någon annanstans. William Sandqvist william@kth.se

  18. array[] funk2() Heapen Funktionen funk2() behöver lagra sina data någon annanstans. Den kan anropa C:s funktion malloc() för att få utrymme på heapen. William Sandqvist william@kth.se

  19. array[] Heapen Funktionen funk2() behöver lagra sina data någon annanstans. Den kan anropa C:s funktion malloc() för att få utrymme på heapen. funk2() returnerar nu arrayens adress till main(). William Sandqvist william@kth.se

  20. array[] funk2() funk3() Heapen Funktionen funk2() behöver lagra sina data någon annanstans. Den kan anropa C:s funktion malloc() för att få utrymme på heapen. funk2() returnerar nu arrayens adress till main(). Datat finns fortfarande kvar om en ny funktion funk3() ska köra. William Sandqvist william@kth.se

  21. array[] free() funk2() funk3() Heapen Funktionen funk2() behöver lagra sina data någon annanstans. Den kan anropa C:s funktion malloc() för att få utrymme på heapen. funk2() returnerar nu arrayens adress till main(). Datat finns fortfarande kvar om en ny funktion funk3() ska köra. Minnesutrymmet frigörs när man anropar funktionen free(). William Sandqvist william@kth.se

  22. funk2() funk3() Heapen Funktionen funk2() behöver lagra sina data någon annanstans. Den kan anropa C:s funktion malloc() för att få utrymme på heapen. funk2() returnerar nu arrayens adress till main(). Datat finns fortfarande kvar om en ny funktion funk3() ska köra. Minnesutrymmet frigörs när man anropar funktionen free(). Om C:s minneshanterare är bra skriven utnyttjas minnesutrymmet på heapen effektivt. William Sandqvist william@kth.se

  23. William Sandqvist william@kth.se

More Related