Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec malloc

Sujet résolu
    17 juin 2006 à 0:05:29

    Coucou tout le monde ! :)

    Je (ré)apprends le C, et j'ai un problème avec le tuto qui concerne l'allocation dynamique de la mémoire, j'ai ce code :

    #include <stdio.h>
    #include <stdlib.h>

    int main(void)
    {
    long* memoire = NULL;

    memoire = malloc(sizeof(long));
    if(memoire == NULL)
    exit(0);

    printf("%ld\n", sizeof(memoire));
    free(memoire);

    system("PAUSE");
    return 0;
    }

    A la compilation, j'ai cette erreur : "Invalid conversion from "void*" to "long int*". Si je remplace "long* memoire = NULL;" par "void* memoire = NULL;", tout fonctionne correctement.
    Est-ce une erreur du tuto où de ma part ?

    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2006 à 0:14:47

      C'est simplement que sizeof retourne un unsigned int au lieu d'un long. Mets %d dans le printf.
      • Partager sur Facebook
      • Partager sur Twitter
        17 juin 2006 à 0:17:55

        Non, ça ne change rien :(
        L'erreur est signalée à cette ligne :
        "memoire = malloc(sizeof(long));"
        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2006 à 0:25:51

          J'ai copier collé ton code et je n'ai qu'un warning. Essaie d'inclure malloc.h peu etre.
          Sinon essaie de caster : var = (long*)malloc(sizeof(long));

          Tiens moi au courant c'est bizar cette erreur.
          • Partager sur Facebook
          • Partager sur Twitter
            17 juin 2006 à 0:43:23

            Ca marche en castant, merci ;)
            • Partager sur Facebook
            • Partager sur Twitter
              17 juin 2006 à 0:46:01

              Tu compiles avec quoi et avec quelles options ? le cast ne devrais pas etre nécéssaire.
              • Partager sur Facebook
              • Partager sur Twitter
                17 juin 2006 à 0:55:52

                DEV C++, par contre les options... :D
                • Partager sur Facebook
                • Partager sur Twitter
                  17 juin 2006 à 0:58:40

                  Serieux c'est vraiment bizar j'ai peur que ca cache un probleme le fait de caster en fait.
                  Quand tu include malloc.h ca change rien ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    17 juin 2006 à 2:21:13

                    Ce warning est tout à fait normal, c'est plutot le fait qu'il n'y soit pas qui serait troublant (compilateur trop permissif).

                    malloc a comme prototype : void * malloc (size_t size);

                    malloc alloue la mémoire voulue, et renvoie le pointeur (si elle a réussis) vers cette mémoire. Mais ce pointeur n'a pas de type (void * = c'est un pointeur vers qql chose). Donc si tu veux utiliser ce pointeur vers ton tableau de long, il faut dire : c'est un pointeur vers des long = long * .
                    Et donc on utilise un cast : (type voulu) qql chose d'un type
                    Les warnings sont la pour aider... donc c'est bien de les comprendre.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2006 à 8:40:03

                      Citation : lexou

                      C'est simplement que sizeof retourne un unsigned int au lieu d'un long. Mets %d dans le printf.



                      Ah bon tu es sûr ? sizeof retourne un type standart size_t qui correspond à un entier non signé mais es tu sûr qu'il s'agisse d'un unsigned int et non pas d'un unsigned long int ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 juin 2006 à 9:29:22

                        Citation : hokkos


                        Et donc on utilise un cast : (type voulu) qql chose d'un type


                        Dans le cas de malloc, il ne faut surtout pas caster ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 juin 2006 à 9:38:31

                          Pour être clair :
                          - En C pas besoin de caster un malloc
                          - En C++ il FAUT caster un malloc. Mais en même temps "new" c'est pas pour les chiens.

                          Ici, le créateur du topic fait du C en C++ sans le savoir, d'où le messsage d'erreur.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 juin 2006 à 10:58:43

                            Pourtant je n'ai fait que recopier ce qu'il y avait d'écrit dans le tuto pour apprendre le C :S
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 juin 2006 à 12:26:15

                              Tu as du faire un projet C++ avec devcpp au lieu d'un projet C... Ou bien pas de projet du tout et par défaut c'est une fichier cpp il me semble.
                              En C c'est inutile de caster le malloc, le type void a été standardisé il y a bien longtemps. Ceci dit tu peux le faire... il se peut je crois que le fait de caster masque une erreur du malloc mais c'est tout.

                              Citation : tebonb


                              Ah bon tu es sûr ? sizeof retourne un type standart size_t qui correspond à un entier non signé mais es tu sûr qu'il s'agisse d'un unsigned int et non pas d'un unsigned long int ?




                              int main(void)
                              {
                                 size_t test=10;
                                 printf("%ld\n",test);
                                 printf("%d\n",test);
                                 return 0;
                              }



                              Compile ca avec toute les erreurs (-Wall) tu verra un warning ligne " printf("%ld\n",test); "
                              C'est donc bien un unsigned int. Sinon man sizeof sur le net.

                              EDIT : Une erreur dans mon raisonnement, voir plus bas.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 juin 2006 à 12:52:07

                                Citation : lexou

                                Citation : tebonb


                                Ah bon tu es sûr ? sizeof retourne un type standart size_t qui correspond à un entier non signé mais es tu sûr qu'il s'agisse d'un unsigned int et non pas d'un unsigned long int ?




                                int main(void)
                                {
                                   size_t test=10;
                                   printf("%ld\n",test);
                                   printf("%d\n",test);
                                   return 0;
                                }



                                Compile ca avec toute les erreurs (-Wall) tu verra un warning ligne " printf("%ld\n",test); "
                                C'est donc bien un unsigned int. Sinon man sizeof sur le net.


                                Sur ton implémentation. Pour que le code soit portable, 2 solutions :

                                C90/C99 :

                                #include <stdio.h>
                                int main(void)
                                {
                                   size_t test = 10;
                                   printf("%lu\n", (unsigned long) test);
                                   return 0;
                                }

                                C99 :

                                #include <stdio.h>
                                int main(void)
                                {
                                   size_t test = 10;
                                   printf("%zu\n", test);
                                   return 0;
                                }

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  17 juin 2006 à 13:15:27

                                  Citation : Kayl

                                  - En C pas besoin de caster un malloc
                                  - En C++ il FAUT caster un malloc. Mais en même temps "new" c'est pas pour les chiens.


                                  Oui, ce warning apparait uniquement lors d'une compilation en C++.

                                  Sinon, malloc() peut servir même en C++, car il a un comportement différent de new (même si personnellement je ne m'en sers jamais, il y a des cas utiles, notamment réserver de la mémoire pour gérer soit-même et rapidement des créations d'objets).
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 juin 2006 à 13:27:34

                                    Je viens de parcourir quelques sites sur le sizeof et tu as raison -ed- il dépend de l'implémentation. Il peut etre soit unsigned long ou unsigned int.
                                    Comme unsigned long peu contenir de toute façon unisgned int alors on le met dans un unsigned long avec un transtypage au cas ou il soit nécessaire.
                                    Voila ce que j'ai compris, le 1er code me plait bien =)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      18 juin 2006 à 3:01:54

                                      Voici un lien qui devrait totalement expliquer ce problème.

                                      Citation : Pas de titre

                                      Doit-on ou ne doit-on pas caster malloc() ?
                                      Cette question est probablement celle qui revient le plus souvent dans la discussion. Et à chaque fois, elle engendre une longue discussion.

                                      Certains intervenants pensent que caster la valeur de retour de malloc() est inutile, voire dangereux. En effet, malloc() renvoie un void *. Or, en C, un pointeur void * est implicitement casté lors d'une affectation vers le type de la variable affectée. Bien sûr, expliciter le cast n'est pas interdit, et est parfois utile. Toutefois, caster le retour de malloc() risque de cacher au compilateur l'oubli du prototype de malloc() . Ce prototype se trouve dans le fichier d'en-tête <stdlib.h>. Sans lui, malloc() sera par défaut une fonction retournant un int et dont les paramètres seront du type des arguments passés, ce qui peut provoquer de sérieux bugs.

                                      La véritable erreur est l'oubli du fichier d'en-tête <stdlib.h>, et non pas le cast de malloc() en lui même. Mais le cast de malloc() risque de cacher au compilateur cette erreur. À noter qu'il existe des outils de vérification de code et des options sur la plupart des compilateurs 4 qui permettent de détecter ce genre d'erreur.

                                      D'autres intervenants jugent qu'il faille tout de même caster le retour de malloc() , afin de conserver une compatibilité avec d'anciens compilateurs pré-ANSI, ou pour intégrer plus facilement le code avec C++. Evidemment, les programmeurs avertis sauront dans quelles situations il est utile ou non de caster les void *.



                                      J'ai souvent du bosser avec des compilateur Pré Ansi C; voila pourquoi je disais de caster, de même en C++ losque je dois faire du malloc -> cast obligatoire.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Problème avec malloc

                                      × 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