2010-05-12 4 views
0

gcc 4.4.3 c89Initialisation d'un tableau après déclaration

J'ai le code suivant comme exemple de ce que j'essaie de faire. Je ne connais pas la taille réelle du tableau, jusqu'à ce que j'entre dans la fonction. Cependant, je ne pense pas pouvoir définir la taille du tableau après l'avoir déclaré. J'en ai besoin global comme certaines autres fonctions devront accéder aux noms d'appareil.

Un grand merci pour toutes les suggestions,

/* global */ 
char *devices_names[]; 

void fill_devices(size_t num_devices) 
{ 
    devices_names[num_devices]; 

    /* start filling */ 
} 

Répondre

2

Vous aurez besoin d'allouer dynamiquement la mémoire à l'aide malloc:

char **device_names; 

void fill_devices(size_t num_devices) 
{ 
    device_names = malloc(num_devices * sizeof(char*)); 
} 

Et puis utilisez free(device_names); pour libérer la mémoire lorsque vous ne avez plus besoin .

+0

Excuses, sepp2k. J'ai accidentellement édité votre réponse au lieu de la mienne. –

3

rendre dynamique:

char **g_device_names; 
int g_num_devices; 

void fill_devices(size_t num_devices) { 
    g_device_names = malloc(sizeof(char*) * num_devices); 
    g_num_devices = num_devices; 
    ... 
} 
2

Vous devez utiliser un pointeur, alors quand vous entrez dans la méthode du tableau est toujours pas déclaré. Vous pouvez utiliser malloc pour définir la taille correcte. Regardez cet article: arrays and malloc

3

Si vous utilisez un tableau global, vous devez connaître sa taille (ou sa taille maximale) au moment où vous le déclarez. Par exemple.

char *devices_names[MAX_DEVICES]; 

Si vous ne pouvez pas le faire, vous n'avez pas d'autre choix que d'utiliser un pointeur et de la mémoire allouée dynamiquement.

E.g.

char **devices_names = 0; 

void fill_devices(size_t num_devices) 
{ 
    devices_names = malloc(num_devices * sizeof *devices_names); 

    /* ... */ 
} 

Bien sûr, cela a des implications telles que comment empêcher les gens d'accéder à la matrice avant qu'elle ne soit allouée et quand la libérez-vous?