8c. Dynamische arrays

2021-02-28
slides.com/jod/pt_8c

Docent: Jo Devriendt

Assistent: Ann Philips

Coördinator: Joost Vennekens

voornaam.achternaam@kuleuven.be

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Waar is dynamisch geheugenbeheer goed voor?

  • Wat is de maximumlengte van arrays of strings?
  • Hoeveel getallen ga je maximum inlezen uit een bestand?
  • Hoe groot wordt je databank?

Wanneer je niet op voorhand weet hoeveel geheugen je nodig hebt

Typisch bepaalt de input voor je programma hoeveel geheugen je nodig hebt.

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Dynamische array

#include <stdlib.h>
#include <stdio.h>
#define N 10

int main(int argc, char* argv[]) {
  int aantal = atoi(argv[1]);
  if(aantal<2){
    return 1;
  }
  
  long long x[N];
  x[0]=0;
  x[1]=1;
  printf("0\n1\n");
  
  for(int i=2; i<aantal; ++i){
    x[i]=x[i-1]+x[i-2];
    printf("%lld\n",x[i]);
  }
}

Berekent getallen van Fibonacci door ze te stockeren in array

Hard-coded max lengte

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Dynamische array

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
  int aantal = atoi(argv[1]);
  if(aantal<2){
    return 1;
  }
  
  long long* x = (long long*) 
    malloc(sizeof(long long)*aantal);
  x[0]=0;
  x[1]=1;
  printf("0\n1\n");
  
  for(int i=2; i<aantal; ++i){
    x[i]=x[i-1]+x[i-2];
    printf("%lld\n",x[i]);
  }
  
  free(x);
}

Dynamische lengte, afhankelijk van input

Berekent getallen van Fibonacci door ze te stockeren in array

Voor de rest identiek aan statische arrays

... behalve free() niet vergeten ;)

Pointer, want array is geen lvalue

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Tweedimensionele array

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
  int n = atoi(argv[1]);
  
  int** x = (int**) malloc(sizeof(int*)*n);
  for(int i=0; i<n; ++i){
    x[i] = (int*) malloc(sizeof(int)*n);
    
    for(int j=0; j<n; ++j){
      x[i][j] = i-j;
      printf("%3d ",x[i][j]);
    }
    printf("\n");
  }
  
  for(int i=0; i<n; ++i){
    free(x[i]);
  }
  free(x);
}

Dus: pointer naar pointers

Tweedimensionele array: array van arrays

Binnenste array moet ook gealloceerd worden

...

...
en terug gedealloceerd

Opgepast:

sizeof(int*) != sizeof(int)

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Samenvatting

  • Dynamisch geheugenbeheer laat toe om stukken geheugen van veranderlijke grootte aan te spreken
  • Dynamische arrays worden voorgesteld door pointers
  • Meer-dimensionele arrays zijn dan pointers naar pointers
    • elke dimensie moet individueel gealloceerd worden

8c. Dynamische arrays

By Jo Devriendt

8c. Dynamische arrays

  • 484