IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème dans le malloc et realloc


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut Problème dans le malloc et realloc
    Bonjour, j'ai un problème avec le code suivant:
    Je veux créer un tableau de la taille 5. Cependant, cette affectation me donne une taille de 4 en permanence (meme lorsque j'essaye avec une taille de 2 fois la taille d'un caractère). De plus, j'aimerais ensuite changer la taille de ce tableau mais le compilateur me met une erreur et me sort le manuel de la fonction realloc.
    Merci de votre aide et bonne journée


    char *date;

    dateb=(char *)malloc(2*sizeof(char)); (Lorsque je met printf("%d", sizeof(dateb)); , cela me renvoie 4 )


    dateb=realloc(dateb, 3*sizeof(char));

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ricomix2 Voir le message
    Bonjour, j'ai un problème avec le code suivant:
    Je veux créer un tableau de la taille 5. Cependant, cette affectation me donne une taille de 4 en permanence (meme lorsque j'essaye avec une taille de 2 fois la taille d'un caractère). De plus, j'aimerais ensuite changer la taille de ce tableau mais le compilateur me met une erreur et me sort le manuel de la fonction realloc.
    Merci de votre aide et bonne journée


    char *date;

    dateb=(char *)malloc(2*sizeof(char)); (Lorsque je met printf("%d", sizeof(dateb)); , cela me renvoie 4 )


    dateb=realloc(dateb, 3*sizeof(char));
    1) faut pas confondre "taille allouée" et "taille de la variable"
    La variable "dateb" est un pointeur donc sa taille est de 4 octets. Maintenant malloc() réserve quelque part dans la mémoire une zone correspondant à ta demande et renvoie le début de cette zone que tu vas stocker dans dateb. Mais la taille du pointeur ne change pas...

    2) pour le realloc je ne vois pas ce qui choque. As-tu bien inclus <stdlib.h> ???
    PS: Faut pas caster le malloc. Ca peut te masquer des avertissements utiles (par exemple si t'as oublié stdlib.h)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ricomix2 Voir le message
    char *date;

    dateb=(char *)malloc(2*sizeof(char)); (Lorsque je met printf("%d", sizeof(dateb)); , cela me renvoie 4 )
    Ce qui est normal si sur ta plateforme, un pointeur a une taille de 4 bytes.

    Tu confonds tableau et pointeur. Relis ton cours de C sur le fonctionnement de malloc().

    Si tu as besoin de la taille, il faut la garder en mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t taille = 2;
    char *date = malloc (taille);
    http://emmanuel-delahaye.developpez....tes.htm#malloc
    http://emmanuel-delahaye.developpez....es.htm#realloc

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut
    si je laisse là, est-ce que j'ai bien un tableau dateb de la taille que je désire ou non?
    autrement, il y a bien <stlib.h>

    Merci de la réponse

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut
    Merci de votre réponse et de votre rapidité

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ricomix2 Voir le message
    si je laisse là, est-ce que j'ai bien un tableau dateb de la taille que je désire ou non?
    Oui, la mémoire a été réservée et en te basant sur dateb qui pointe sur le premier octet de cette zone tu pourras aller ensuite sur l'octet suivant et le suivant etc comme pour un tableau. Mais tu ne pourras jamais demander la taille de la zone car le compilo n'a pas gardé cette info...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par ricomix2 Voir le message
    Bonjour, j'ai un problème avec le code suivant:
    Je veux créer un tableau de la taille 5. Cependant, cette affectation me donne une taille de 4 en permanence (meme lorsque j'essaye avec une taille de 2 fois la taille d'un caractère). De plus, j'aimerais ensuite changer la taille de ce tableau mais le compilateur me met une erreur et me sort le manuel de la fonction realloc.
    Merci de votre aide et bonne journée


    char *date;

    dateb=(char *)malloc(2*sizeof(char)); (Lorsque je met printf("%d", sizeof(dateb)); , cela me renvoie 4 )


    dateb=realloc(dateb, 3*sizeof(char));
    A part le problème évoqué plus haut, je ne vois pas l'utilité d'utiliser sizeof(char) qui vaut 1 par définition (sauf éventuellement à but documentaire). Personnellement je procède comme ceci (et je vérifie toujours la valeur retournée par malloc()):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *date = NULL;
    dateb = malloc(2 * sizeof *dateb);
    if (dateb != NULL)
    {
        /*...*/
    }
    En ce qui concerne realloc(), il est fortement conseillé d'utiliser un pointeur temporaire pour l'affectation. En effet, si la réallocation de mémoire échoue, cette fonction renvoit NULL. Si tu l'utilises comme tu l'as fait, dateb reçoit donc la valeur NULL et l'adresse précédamment stockée dans dateb est perdue, créant ainsi une fuite de mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *p = NULL;
    /*...*/
    p = realloc(dateb, 3 * sizeof *dateb);
    if (p != NULL)
    {
        dateb = p;
        /*...*/
    }
    En ce qui concerne le cast de malloc(), tu peut lire les messages postés sur ce fil pour te faire une opinion: http://www.developpez.net/forums/sho...d.php?t=504855.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de core dump dans un malloc
    Par zooro dans le forum C
    Réponses: 8
    Dernier message: 19/07/2007, 20h47
  2. problème dans l'hebergement
    Par Redouane dans le forum ASP
    Réponses: 9
    Dernier message: 31/12/2003, 23h34
  3. Quel est le problème dans ce code ?
    Par Luther13 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2003, 16h09
  4. Problème dans analisys Manager
    Par ien_ien23 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 11/07/2003, 14h38
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo