un tableau en mémoire

Publié le par JJ

L'autre jour j'insistais pour dire qu'il faut connaître son compilateur ... Je vais donner un exemple.

ennoncé: on souhaite créer en mémoire un tableau de taille constante mais de valeur inconnue pour chaque exécution. Qu'est ce que propose le C pour faire ceci?

Pour commencer la première méthode est inspirée par l'adage soyons prévoyants et on réserve au bonheur 1000 octets et on fait ses prières.

 int fonction (char * msg){

        char buffer[1000];
   
         /* code long et compliqué */

        sprintf(buffer, "%c", msg);
   
        
/* code long et compliqué */
}


Ici c'est sur on perd un peu de place... la norme C89 (ANSI X3.159-1989) que tous les profs connaissent propose une méthode plus économe en espace basée sur l'adage on verra au dernier moment ...  on fait de l'allocation dynamique!



int fonction (char* msg){
        char* pointeur;

        /* creation de l'espace mémoire dans le tas*/
         pt = malloc( (strlen(msg)+1)  *  sizeof (char) );

        /* verification de la valeur de retour: en Java on aurai fait une exception */
         if (pt == NULL){
             perror("malloc fail");
             return -1;
         }


          /* code long est compliqué */


         
sprintf(buffer, "%c", msg);

         
/* code long est compliqué */

           /* liberation du tas (obligatoire) */  
           free(pt); pt = NULL;

}

Enfin on a la possibilité de faire une chose formidable avec le C99, je vous laisse essayer (attention sous VB6 marche pas !!!)



int fonction (char*  msg){

    /* sur la pile*/
    char buffer[strlen(msg)+1];



    /* code long et compliqué */

    sprintf(buffer, "%c", msg);
   
   
/* code long et compliqué */
}



et voilà ;)
attention: pour les entêtés allez cette fois ci vous référer aux  pages de manuels (man 3 ... / man 2 ...)


je donne un complément d'information sur la longueur à reserver:

La chaîne msg est une chaîne qui se represente comme ça: "abcde12345". Sa provenance est inconnue: cad qu'elle peut venir d'un calcul interne du logiciel ou d'une saisie de l'utilisateur. On n'a donc aucune garantie sur la taille de la chaîne. C'est pour cela qu'il ne faudrait pas coder la premiere méthode, car le tampon pourait être trop petit.


strlen(const char* ) donne la longeur de la chaine. Dans notre exemple "abcde12345"  strlen() retourne 10. Dès lors pourquoi réserver strlen+1 ?  simplement pour  pouvoir  stocker le caractère de fin de chaine: '\0'

Publié dans Divers

Commenter cet article

Taron 02/05/2006 01:44

Y'a une faute, dans le premier exemple le caractère de formatage doit être %s et non pas %c... de plus tu utilises sprintf au lieu de snprintf qui est sécurisé...