Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Allocation dynamique et valeurs aberrantes

Sujet résolu
    15 janvier 2006 à 14:19:56

    Bonjour,

    unsigned *pretty_array;
    pretty_array = (unsigned *)malloc((max - 1) * sizeof(unsigned));
     
    unsigned i, i2;
    for(i = 2, i2 = 0 ; i <= max ; ++i) {
        if(pn[i] == 1) {
            pretty_array[i2] = i;
            ++i2;
        }
    }


    Problème : les valeurs contenues dans pretty_array au final sont aberrantes (3998864, 1634887535...).

    max est un const unsigned qui ne peut pas poser de problème et le test avec pn[i] est tout à fait bien réalisé.

    Par exemple, tout indique que le code est censé faire :
    pretty_array[0] = 2; [car i2 = 0 et i = 2]
    alors que pretty_array[0] vaudra 3998864.

    J'ai pensé que ce problème venait du malloc (surtout qu'augmenter la valeur à allouer change les valeurs affichées), mais je suis sûr que ce que j'indique est au moins suffisant pour pretty_array..
    Alors, d'où peut venir le problème ?
    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2006 à 14:25:15

      Aucun problème avec malloc, regarde ton test plutôt ; sinon : debug, tu fais un pas à pas sur la boucle et tu verras bien.

      ps : En C non 99, les variables se déclarent au début des blocs ; sinon les codeurs C malloc comme ça :

      unsigned int *p;
      p = malloc(sizeof *p * (max - 1));

      et pas hideusement comme tu fais. :p
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        15 janvier 2006 à 14:33:29

        Moui...
        la aussi : "unsigned i, i2;"
        C'est unsigned char? unsigned int?
        • Partager sur Facebook
        • Partager sur Twitter
          15 janvier 2006 à 14:40:24

          En effet, le malloc est plus simple comme ça :D Je ne sais plus vraiment où j'ai vu cette syntaxe... Pour les variables en début de bloc j'y pense généralement ; en tous cas c'est modifié.

          Mon problème est réglé.
          En fait, j'avais réellement eu un problème, puis j'étais parvenu à le régler au cours de mon debugage (maison) sans m'en rendre compte...

          En tous cas merci.

          victor > il me semble que cette notation n'est pas ambiguë, et est équivalente à unsigned int.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            15 janvier 2006 à 15:10:25

            Citation : Elentar

            victor > il me semble que cette notation n'est pas ambiguë, et est équivalente à unsigned int.

            C'est bien possible, je connais pas le std par coeur :D
            En tout cas, pour des raisons de lisibilité, on devrait toujours placer le type!
            Les syntaxes "long truc;" devraient être a proscrire au profit des "long int truc;", etc :)

            [EDIT] Bon, d'accord rz0.
            • Partager sur Facebook
            • Partager sur Twitter
              15 janvier 2006 à 15:25:18

              Perso j'écris long x; et je pense que la majorité des codeurs (de ce que j'ai vu) utilisent cette syntaxe. int est le type par défaut et si on met juste long, short, unsigned ou signed, ça defaulte à int. En C89, on peut même se passer du type lorsqu'il n'y a pas de qualificatif de longueur :
              auto x = 1;
              C'est interdit en C99.
              On peut dire que raisonnablement la plupart des gens admettent facilement short pour short int et long pour long int, le reste est moins courant.
              • Partager sur Facebook
              • Partager sur Twitter

              [C] Allocation dynamique et valeurs aberrantes

              × 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