wiki:C99ArrayDinamici

Version 2 (modified by mancausoft, 15 years ago) (diff)

--

Cercavo un modo veloce e ottimizzato per creare Array bidimensionali in C, quando parlandone in chat su irc, Scinziatu mi illumina dicendo:

14:50:12    @scinziatu | void f(int x) {
14:50:13    @scinziatu |   int array[x][x];
14:50:14    @scinziatu | } 
14:50:17    @scinziatu | compila

Dopo questo cercando scopriamo che dal C99 in poi supporta gli array dinamici, allora incuriosito provo le potenzialita':

#include <stdio.h>
typedef struct {
    int x;
    int y;
} msize_t;

static msize_t size;

/** Dichiaro una funzione che ha come parametro un'array bidimensionale 
  * la cui dimensione dipende da size
  */
void funzione(int matrice[size.x][size.y])
{
    int a =  matrice[5][2];
    printf( "%d\n", a);
}

int main()
{
    size.x = 10;
    size.y = 10;
    int m1[size.x][size.y];
    m1[5][2] = 10;
    // Mi spetto che stampi 10
    funzione(m1);
    size.x = 6;
    size.y = 5;
    // Cambiando size mi aspetto Che mi stampi un valore diverso da 10.
    funzione(m1);

}

Infatti lanciando il codice:

 $ ./prova
10
32707

Per chi e' abituato a linguaggi ad altro livello puo' sembrare una sciocchezza da nulla e anche un modo molto rozzo per gestire gli array dinamici, ma e' molto comodo se si deve sviluppare in C, considerando che prima di C99 bisognava fare cosi:

 // Allocare i puntatori alle righe
 array = malloc( sizeof(int*) * size.x );
 
 // Allocare per ogni riga gli elementi delle colonne 
 for(i=0; i<size.x; i++)
 {
 mat[i] = malloc(sizeof(int) * size.y );
 }

Immaginiamoci se invece di bidimensionali, volevamo un array tridimensionale o a piu' dimensioni.

Grazie a Scinziatu per avermi fatto conoscere questa caratteristica del C99!

Per le altre caratteristiche del C99 vi consiglio di leggere Wikipedia in inglese la pagina in italiano contiene meno informazioni.