Partage
  • Partager sur Facebook
  • Partager sur Twitter

Allocation dynamique d'un tableau de pointeurs

    14 novembre 2019 à 12:05:59

    Bonjour,

    Je souhaite faire une allocation dynamique d'un tableau de pointeurs. Je voudrais savoir si mon code est correct et bien optimisé.

    L'intérêt est de stocker un nombre n de chaînes de caractères (donné par l'utilisateur) en optimisant au mieux la mémoire. 

    char *param;
    char **tableau = calloc(n,sizeof(param));
    char buffer[50];
    fgets(buffer,50,stdin);
    tableau[0] = calloc(strlen(buffer)+1,sizeof(param));
    strcpy(tableau[0],buffer);

    Je vous remercie d'avance,

    -
    Edité par Elexir 14 novembre 2019 à 12:06:26

    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2019 à 17:22:15

      Hello,

      La ligne 5 n'est pas correcte. Tu alloues strlen()+1 fois la taille d'un pointeur, alors que tu devrais allouer strlen()+1 fois la taille d'un élément.

      Un code plus "clair": 

      int n=....;
      char **tableau=calloc(n,sizeof(*tableau));
      
      for(int i=0;i<n;i++) {
      	char buffer[....];
      	fgets(buffer,sizeof(buffer),stdin);
      	tableau[i]=calloc(strlen(buffer)+1,sizeof(**tableau));
      	strcpy(tableau[i],buffer);
      }

      Mais pourquoi utiliser calloc() ? Il n'y a aucune raison d'initialiser les zones allouées à zéro. Un malloc() fonctionnera très bien.

      -
      Edité par edgarjacobs 14 novembre 2019 à 17:46:23

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        20 novembre 2019 à 14:04:12

        strdup() est maintenant une fonction standard C (elle était dans POSIX depuis longtemps), qui alloue une chaine contenant  une copie de celle qu'on lui donne en paramètre.

        La vie est trop courte pour s'emmerder avec malloc+strlen(+1)+strcpy.

        tableau[i] = strdup(buffer);
        

        https://en.cppreference.com/w/c/experimental/dynamic/strdup

        PS:  sizeof(**tableau) vaut 1, qui est plus court à taper.

        Ici **tableau est un octet (char), il n'y a aucune raison que ça change un jour parce les fonctions strxxx manipulent des octets, et sizeof(char) est par définition égal à 1. Arrêtez de vous compliquer la vie.

        -
        Edité par michelbillaud 20 novembre 2019 à 14:13:56

        • Partager sur Facebook
        • Partager sur Twitter
          20 novembre 2019 à 17:08:41

          michelbillaud a écrit:

          Ici **tableau est un octet (char), il n'y a aucune raison que ça change un jour parce les fonctions strxxx manipulent des octets, et sizeof(char) est par définition égal à 1. Arrêtez de vous compliquer la vie.

          D'accord, mais si tableau est du type int **tableau (ou float, double, struct), sizeof est le bienvenu
          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            20 novembre 2019 à 22:09:10

            Oui, sizeof(int)  si c'étaient des entiers.

            Mais ici, la réalité c'est que c'est un tableau de pointeurs vers des chaînes, et sizeof(**tableau), c'est une manière inutilement compliquée de dire  1.

            Quand tu relis ce code, il faut un certain temps pour décoder et voir que ça fait 1, et un peu plus à se demander pourquoi il était vraiment nécessaire d'écrire sizeof (**tableau) et pas 1, et la conclusion c'est que ce n'etait pas necessaire, le type qui a écrit ça a simplement l'esprit tordu et fait perdre son temps aux autres.

            Le truc qui fout de bonne humeur pour la journée .

            -
            Edité par michelbillaud 20 novembre 2019 à 22:17:23

            • Partager sur Facebook
            • Partager sur Twitter

            Allocation dynamique d'un tableau de pointeurs

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown