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 :

malloc et free


Sujet :

C

  1. #1
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut [Résolu] malloc et free
    Bonjour,

    J'ai un problème que je ne comprends pas bien:

    Imaginons le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [...]
     
    char * st = "0.00";
     
    Obj->Labels.bmlist[i].st = malloc(sizeof(char *));
    memset(Obj->Labels.bmlist[i].st,0,sizeof(char *));
    strcpy(Obj->Labels.bmlist[i].st,st);
     
    free(Obj->Labels.bmlist[i].st);                         //ERREUR A CETTE LIGNE
     
    [...]
    Est-ce que quelqu'un comprend pourquoi j'ai une erreur ici?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    C'set quoi l'erreur exactement ?
    Es-tu sure d'avoir alloué de la mémoire? T'as testé le retour de ton malloc ?

    Nas'

  3. #3
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut l'erreur
    Ben en fait cela fonctionne parfaitement au debug jusqu'à la ligne où j'ai l'erreur. C'est une erreur du type, écriture impossible dans cette zone mémoire, mais comme tout cela est inscrit dans un système très complexe où je gère moi même la mémoire...

    C'est pourquoi je voulais juste savoir si il y a quelque chose de louche dans ces quelques lignes ou si l'erreur mémoire vient d'une autre partie de mon code.

    La chose typique, est-il on non nécessaire de remettre la chaine de caractère à '\0' ou non avant de la désallouer ou un truc comme cela.

    Ou alors est-ce que la fonction strcpy etend bien la zone mémoire réservee ou non?

    Si il n'y a rien de louche alors mon problème vient d'ailleurs dans mon programme.

    Merci d'avance.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Ton code n'a pas trop de sens ...

    Obj->Labels.bmlist[i].st = malloc(sizeof(char *));

    Obj->Labels.bmlist[i].st est un pointeur ...
    malloc(sizeof(char *)); alloue de la mémoire pour un pointeur de char ...
    donc st pointe sur un pointeur de char.

    memset(Obj->Labels.bmlist[i].st,0,sizeof(char *));
    tu initialises ton pointeur pointé par Obj->Labels.bmlist[i].st à 0, soit NULL.

    strcpy(Obj->Labels.bmlist[i].st,st);
    Tu recopies st à l'adresse pointée par Obj->Labels.bmlist[i].st, soit NULL
    => ça plante



    Je pense que tu as voulu faire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char * st = "0.00"; 
     
    Obj->Labels.bmlist[i].len = strlen( st );
    Obj->Labels.bmlist[i].st = calloc((Obj->Labels.bmlist[i].len + 1) * sizeof(char));
    // calloc : malloc + memset(0) en même temps
    strncpy(Obj->Labels.bmlist[i].st,st,Obj->Labels.bmlist[i].len); // utiliser str[b]n[/b]cpy pour plus de sécurité

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

Discussions similaires

  1. Place de malloc() et free()
    Par mikhailo dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2010, 12h13
  2. besoin d'eclaircissement sur malloc et free
    Par Jackyzgood dans le forum C
    Réponses: 8
    Dernier message: 08/02/2010, 17h40
  3. malloc et free pour une liste de 504 bytes
    Par le mage tophinus dans le forum Langage
    Réponses: 2
    Dernier message: 30/10/2008, 12h22
  4. malloc et free en C
    Par aymeric2k dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 09/12/2007, 19h04
  5. malloc et free
    Par petdelascar dans le forum C
    Réponses: 6
    Dernier message: 15/01/2006, 22h08

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