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 de realloc(): invalid next size


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Par défaut Problème de realloc(): invalid next size
    Bonjour,

    J'ai un code qui lors de mon realloc indique l'erreur realloc(): invalid next size: 0x00000000018d8010 ***.
    Pouvez-vous m'aider ?
    Voici la fonction qui me donne l'erreur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    int     make_map(char *file, t_serv *serv)
    {
      int           l;
      int           size;
      FILE          *fd;
      char          *line;
      void          *test;
      size_t        i;
      if ((serv->map = malloc(sizeof(char *) * 2)) == NULL ||
          (line = malloc(sizeof(char))) == NULL)
        return (1);
      if ((fd = fopen(file, "r")) == NULL)
        return (2);
      serv->h = 0;
      i = 0;
      while (size = getline(&line, &i, fd) != -1)
        {
          serv->h++;
          if ((test = realloc(serv->map, sizeof(char *) * (serv->h + 2))) == NULL
              || (serv->map[serv->h] = malloc(sizeof(char) * (size + 1))) == NULL)
            return (1);
          l = -1;
          while (line[++l] != 0)
            serv->map[serv->h][l] = line[l];
        }
      return (end_map(serv));
    }
    C'est la ligne en gras (19) qui me retourne l'erreur.
    Merci de toute aide que vous m'apporterez.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,

    a priori, je pencherai pour un manque de mémoire, mais c'est seulement une suggestion.

    Par ailleurs, pour présenter du code, il y a la balise [code], produite par le bouton # (ou [codeinline](=[c]) pour mettre dans une phrase).

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Par défaut
    Merci de votre indication pour la mise en page.

    Pour le manque de mémoire cela me semble étrange vu que tout ce que je malloc dans mon code ce trouve dans cette fonction.
    Et ma mémoire est sencé pouvoir supporter bien plus que ces quelques char *.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    il me semble aussi qu'il faut remplacer le pointeur réalloué par la valeur de retour de realloc.

  5. #5
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,
    La piste de Leternel me semble à creuser. Tu réalloues serv->map et du coup l'espace pointé peut ne plus être valide et pourtant tu l'utilises dans la seconde partie de ton ou. Il faut scinder ta conditionnelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ( (test = realloc(serv->map, sizeof(char *) * (serv->h + 2)))) == NULL)
      gestion de l'erreur avec des free sans doute
      return 1;
    else  {
      serv->map=test;
      if ( (serv->map[serv->h] = malloc(sizeof(char) * (size + 1))) == NULL) {
        gestion de l'erreur avec des free sans doute
        return 1;
    }
    ici tout est ok

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    le || était une fausse bonne idée, ca permet de ne faire le malloc que si le realloc aurait échoué. C'est le bon usage de ||, mais pas avec realloc.
    Si le realloc a échoué, malloc devrait le faire aussi.

    Realloc peut déplacer le pointé, en général quand il n'y a pas assez de place après lui pour simplement l'étendre.

  7. #7
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    Je suis d'avis avec picodev sur le contrôle des allocations.
    Cependant, pourquoi faire une ré-allocation ou allocation mémoire sur un pointeur générique si(admettant allouer la mémoire de la variable "test"), celle-ci n'est pas utilisée et pourquoi realloc et à quoi cette zone mémoire servira-t-elle ?

    Citation Envoyé par r49448 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((test = realloc(serv->map, sizeof(char *) * (serv->h + 2))) == NULL
              || (serv->map[serv->h] = malloc(sizeof(char) * (size + 1))) == NULL)
    Pour le bout de code qui suit, je doute qu'elle soit correcte
    Pourrais-tu nous dire ce que ta fonction doit faire voir plus de détails sur la partie ci-dessous ?
    Citation Envoyé par r49448 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          l = -1;
          while (line[++l] != 0)
            serv->map[serv->h][l] = line[l];
      return (end_map(serv));
    }
    Citation Envoyé par leternel Voir le message
    le || était une fausse bonne idée, ca permet de ne faire le malloc que si le realloc aurait échoué. C'est le bon usage de ||, mais pas avec realloc.
    j'en doute car le ou booléen est un peu vicieux admettant une variable X
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [NULL == (X = ALLOC 2) ||  NULL == ( Y =ALLOC 2) ]
    si X dont l'allocation est NULL répond a la condition NULL == (X = NULL), ( donc vrais ), le ou n'effectuera pas les autres testent et exécutera l'instruction prévue à cet effet ici "return (1)" et sans free des autres mémoires allouer précédemment on omettant même de fermer le fichier "fd" ouvert ( s'il est ouvert) que ça soit après traitement ou en cas d'erreur.

    à bientôt

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Par défaut
    Merci à tous pour votre aide.

    J'ai fini par changer d'approche car mon realloc change d'erreur au fur et à mesure que j'avançais.
    J'ai donc lu mon fichier deux fois afin de savoir d'avance la taille de mon tableau.
    Ce n'est certes pas très économique ni très beau.
    Mais ça a l’avantage de marcher.

    Merci à tous encore une fois.
    Bonne journée.

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    tu aurais pu penser à la liste chainée, qui ne réalloue pas.

  10. #10
    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 r49448 Voir le message
    J'ai un code qui lors de mon realloc indique l'erreur realloc(): invalid next size: 0x00000000018d8010 ***.
    Pouvez-vous m'aider ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    int     make_map(char *file, t_serv *serv)
    {
      int           l;
      int           size;
      FILE          *fd;
      char          *line;
      void          *test;
      size_t        i;
      if ((serv->map = malloc(sizeof(char *) * 2)) == NULL ||
          (line = malloc(sizeof(char))) == NULL)
        return (1);
      if ((fd = fopen(file, "r")) == NULL)
        return (2);
      serv->h = 0;
      i = 0;
      while (size = getline(&line, &i, fd) != -1)
        {
          serv->h++;
          if ((test = realloc(serv->map, sizeof(char *) * (serv->h + 2))) == NULL
              || (serv->map[serv->h] = malloc(sizeof(char) * (size + 1))) == NULL)
            return (1);
          l = -1;
          while (line[++l] != 0)
            serv->map[serv->h][l] = line[l];
        }
      return (end_map(serv));
    }
    C'est la ligne en gras (19) qui me retourne l'erreur.
    Bonjour

    Très mauvaise gestion des erreurs. Si le fichier n'est pas ouvert, on quitte la fonction avec line qui a été alloué (et pas libéré). Idem si l'allocation de line réussit mais que celle de serv->map ne réussit pas. Grosse fuite de mémoire assurée.

    Ce qui amène l'allocation suivante test = realloc(serv->map, sizeof(char *) * (serv->h + 2)) dans une boucle sans que le contenu de la zone réallouée (et stocké dans la variable "test") soit utilisé. Normal que ça plante au bout d'un moment. Et t'as de la chance que ton prog plante au bon endroit parce que moi j'aurais été le processeur j'aurais fait semblant que tout marche bien et je t'aurais planté ton programme dans une fonction située à 8000km de celle-là...
    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]

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

Discussions similaires

  1. realloc(): invalid next size
    Par Bktero dans le forum C
    Réponses: 9
    Dernier message: 01/02/2012, 15h20
  2. free(): invalid next size (normal)
    Par Heimdall dans le forum C
    Réponses: 18
    Dernier message: 02/01/2008, 11h25
  3. Réponses: 0
    Dernier message: 18/09/2007, 19h07
  4. Réponses: 5
    Dernier message: 04/11/2005, 18h59
  5. Re-problème avec realloc() (désolé)
    Par Yabo dans le forum C
    Réponses: 8
    Dernier message: 30/07/2003, 22h07

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