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 :

[Allocation mémoire] Ecrasement lors du realloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 113
    Par défaut [Allocation mémoire] Ecrasement lors du realloc
    Bonjour à tous,

    J'ai un petit souci lors d'allocation mémoire dans une de mes programmes.
    J'alloue dynamiquement de la mémoire pour pouvoir conserver des pointeurs su des caracteres (le but étant de marquer certains caracteres d'une chaine et d'en conserver une trace).
    Je dois donc allouer plusieurs fois une taille égale à n*sizeof(char *) ou n*4 dan smon cas.
    Cependant lorsque j'effectue mon realloc, celui-ci m'écrase une partide ma mémoire allouée précédemment, comme si il ne pointait plus au bon endroit.

    Voila mon code simplifé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      strcpy(chaine, "Bonjour/a/tous");
      lS_tok = (char**) malloc (4);
      *(lS_tok) = chaine;
      lS_tok = (char**) realloc (lS_tok, 8);
      *(lS_tok+4) = (chaine+8);
      lS_tok = (char**) realloc (lS_tok, 12);
      *(lS_tok+8) = (chaine+10);
    Quelqu'un aurait une idée ? A moins que je n'aie pas tout compris !!!

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    - Si lS_tok est un char**, l'incrémentation n'est pas correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *(lS_tok+1) = (chaine+8); // ou lS_tok[1] = chaine+8;
    *(lS_tok+2) = (chaine+10); // ou lS_tok[2] = chaine+10;
    - Ne pas se préoccuper de la taille d'un pointeur, le compilateur la connait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      lS_tok = malloc (sizeof *lS_tok);
      lS_tok = realloc (lS_tok, 2*sizeof *lS_tok);
      lS_tok =  realloc (lS_tok, 3*sizeof *lS_tok);
    - Attention, le realloc peut échouer et dans ce cas il renvoie NULL. Dans ce cas,et dans ton code, l'adresse précédente est perdue et la mémoire qui reste allouée devient inaccessible.
    En général on procède de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      p= realloc (lS_tok, 2*sizeof *lS_tok);
      if(p!= NULL) lS_tok = p;
      else 
      {
      // erreur de la réallocation. Les données sont toujours pointées par lS_tok
      }

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 113
    Par défaut
    Merci diogene...

    Pour :
    - Si lS_tok est un char**, l'incrémentation n'est pas correcte :
    Effectivement, a force de tourner en rond, je me suis embrouillé moi-meme !!

    Pour :
    - Ne pas se préoccuper de la taille d'un pointeur, le compilateur la connait :
    Je suppose que tu parles de (char**) devant le realloc ? On m'a deja dit ca, mais mon compilateur (VC++6) me sort une erreur . Est-ce parceque j'ai indiqué un projet C++ ?

    Pour :
    - Attention, le realloc peut échouer et dans ce cas il renvoie NULL
    Je le savais et ne l'ai pas mis en œuvre. Je pense que c'est le probleme majeur dans mon code...

    Merci bien pour ton aide !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Par défaut
    Citation Envoyé par xc78370 Voir le message
    Est-ce parceque j'ai indiqué un projet C++ ?
    Oui, probablement, car en c++, on est obligé de caster tous les (void*) explicitement.

    Sinon une dernière remarque, il est préférable d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    malloc( 4 * sizeof( char ) )
    meme si sizeof( char ) vaut toujours 1. En effet, c'est mieux de dire "je réserve de la mémoire pour 4 char" plutot que "je réserve 4 octets en mémoire".

    EDIT : oups, j'avait pas complètement lu la réponse de diogene qui avait déjà traité la question.

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

Discussions similaires

  1. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23
  2. Limite Allocation Mémoire d'un tableau d'entier
    Par l9ft b9hind dans le forum C++
    Réponses: 5
    Dernier message: 27/10/2005, 19h29
  3. Allocation mémoire
    Par DestyNov@ dans le forum C++
    Réponses: 9
    Dernier message: 23/08/2005, 08h09
  4. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  5. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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