Allocazione dinamica della memoria crescente nel tempo

di il
8 risposte

Allocazione dinamica della memoria crescente nel tempo

Ciao ragazzi, vorrei chiedervi un aiuto sull'allocazione dinamica della memoria.

Devo costruire un array bidimensionale del tipo array[M][N] in cui M assume un valore compreso tra 0 e MAX ed N è un valore che può crescere nel tempo fino ad un valore massimo dato da MAX. Dunque avrò alcuni elementi in cui N non cresce o cresce poco, ed altri elementi in cui N sarà (quasi) uguale a MAX. Siccome non vorrei sprecare memoria per gli elementi in cui N non cresce (MAX è dell'ordine delle decine di migliaia) vorrei poter allocare una memoria crescente in base al valore di N.
E' possibile fare qualcosa del genere?

Grazie a tutti per l'aiuto!

8 Risposte

  • Re: Allocazione dinamica della memoria crescente nel tempo

    Che linguaggio???
    malloc/realloc???
  • Re: Allocazione dinamica della memoria crescente nel tempo

    In C. Se uso realloc gli elementi salvati nell'array prima di reallocare la memoria restano salvati?
  • Re: Allocazione dinamica della memoria crescente nel tempo

    Sì, ma bisogna capire come hai usato la malloc/realloc per la matrice.
  • Re: Allocazione dinamica della memoria crescente nel tempo

    Vi scrivo le parti di codice che riguardano questa matrice, l'indice i corrisponde a quello che prima ho chiamato M, l'indice j ad N:
      
    #define   MAX          10000
    
    int   i, j;
    int  **vicini;
    
    vicini = malloc(MAX * sizeof(int *));
    
    for (i = 0; i < MAX; i++)
    	{
    		vicini[i] = malloc(MAX * sizeof(int));
    	}
    
    
    e poi inizializzo i vari elementi ponendoli uguali a -1 (il -1 è un valore che mi indica che non sono ancora stati considerati. Poi nel corso del programma assumeranno un valore maggiore o uguale a 0):
    
    for (i = 0; i < MAX; i++)
    	{
    	for (j = 0; j < MAX; j++)
    		{
    			vicini[i][j] = -1;
    		}
    	}
    
    in questo modo utilizzo la memoria occupata da una matrice MAX * MAX di interi.
    Ma, come dicevo prima, la maggior parte degli elementi avrà l'indice j che non supera poche unità, quindi una matrice così grande è uno spreco assurdo di memoria.

    Posso in qualche modo utilizzare realloc per aumentare l'indice j solo per gli elementi i che mi interessano?
  • Re: Allocazione dinamica della memoria crescente nel tempo

    Sì ... puoi farlo.
  • Re: Allocazione dinamica della memoria crescente nel tempo

    Quindi supponendo che inizialmente ho allocato la memoria in modo che ad ogni i corrispondano 5 elementi, cioè:
    
    vicini = malloc(MAX * sizeof(int *));
    	
    for (i = 0; i < MAX; i++)
    	{
    		vicini[i] = malloc(5 * sizeof(int));
    	}
    
    per aggiungere un elemento j ad un certo elemento i dovrò semplicemente fare:
    
    vicini[i] = realloc(vicini[i], (6 * sizeof(int));
    
    conservando in memoria il valore dei primi 5 elementi j e aggiungendo memoria per un 6° elemento, giusto?
  • Re: Allocazione dinamica della memoria crescente nel tempo

    Giusto
  • Re: Allocazione dinamica della memoria crescente nel tempo

    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
8 risposte