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 :

glibc detected *** realloc(): invalid next size


Sujet :

C

  1. #1
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut glibc detected *** realloc(): invalid next size
    Bonjour à tous.

    J'execute un programme sous c et un problème a lieu, voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** glibc detected *** realloc(): invalid next size: 0x0804b088 ***
    Je pense que l'erreur viens de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pop->tab = (PPersonne*)realloc(pop->tab,sizeof(PPersonne));
    voici à quoi correspondent PPersonne (c'est en fait un pointeur de Personne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct
    {
    	t_id id;
    	char nom[32];
    	char prenom[32];
     
    	int codepostal_naissance;
    	char pays_naissance[32];
    } Personne;
     
     
    typedef Personne* PPersonne;
    et pop->tab est un PopTab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
    	PPersonne* tab;									// Tableau de PPersonne (PPersonne etant un pointeur sur une Personne)
     
    	// Personne* *tab;								// On peut aussi l'ecrire comme ca
    	unsigned int taille_pop;
     
    	unsigned int taille_tab;
     
    } PopTab;
    Quelqu'un aurait-il une idée... ça fait un moment que je planche dessus...


    Voilà, j'espère avoir été assez clair... si ça n'est pas le cas n'hésitez pas à me le faire remarquer !


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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: glibc detected *** realloc(): invalid next size
    Citation Envoyé par Miksimus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** glibc detected *** realloc(): invalid next size: 0x0804b088 ***
    Je pense que l'erreur viens de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pop->tab = (PPersonne*)realloc(pop->tab,sizeof(PPersonne));
    L'erreur est detectée ici à l'exécution, mais la cause et probablement ailleurs.

    Est-tu sûr que 'pop->tab' contient une adresse valide pour un realloc(), c'est à dire NULL ou une valeur retournée par *alloc() ?

    Sinon, recherches habituelles :

    - pointeurs non initialisés
    - débordement de tableau...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut Re: glibc detected *** realloc(): invalid next size
    Citation Envoyé par Miksimus
    Je pense que l'erreur viens de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pop->tab = (PPersonne*)realloc(pop->tab,sizeof(PPersonne));
    Déjà, le cast est inutile.
    Ensuite, difficile de savoir ce qui ne va pas sans une vue d'ensemble, mais...ce realloc() me paraît suspect.
    Normalement, on utilise realloc() pour modifier la taille d'une zone précédemment allouée par malloc(), donc le dernier paramètre est en général une variable dont la valeur a été obtenue par calcul ou une expression a priori non constante.
    Là, la valeur utilisée est constante.
    Donc, la question que je me pose est : n'essayes-tu pas de faire un malloc() sans malloc() ?
    Si oui, es-tu certain que pop->tab contient NULL au moment de l'appel ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  4. #4
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut realloc avant malloc
    Merci de vos réponses...

    Pour être plus clair, voici les fichiers au complet : http://miksimus.free.fr/population.zip

    effectivement, je crois bien que j'utilise realloc sans utiliser malloc au préallable... Cependant comment dois-je faire pour "agrandir" la taille de tab d'1 personne ? Je pensais qu'on pouvais le faire de cette façon...

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pop->tab = (PPersonne*)realloc(pop->tab,sizeof(PPersonne));
    Le dernier argument de realloc spécifie la nouvelle taille totale qu'on souhaite, pas l'augmentation de taille. Si tu veux l'augmenter de 1, il faut garder en mémoire la taille précédemment allouée . C'est pouquoi, bien que ce puisse être une constante, c'est rarement le cas en pratique.
    Le premier argument doit désigner
    - une adresse d'un bloc précédemment obtenu par allocation dynamique ( et non libéré) comme le dit Emmanuel
    - ou NULL (pour la première utilisation) auquel cas la fonction joue le rôle d'un malloc
    Consulte la FAQ pour la gestion des erreurs d'allocation sur realloc. Ce n'est pas aussi évident qu'il y parait
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre régulier
    Avatar de Miksimus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 84
    Points
    84
    Par défaut
    Ok merci, je vais voir ça plus en détail...

    je vous tient au courant...

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. glibc detected.. realloc pbm
    Par djynwk dans le forum C
    Réponses: 3
    Dernier message: 28/04/2007, 19h13
  5. * glibc detected * free(): invalid pointer
    Par ViRouF dans le forum C
    Réponses: 4
    Dernier message: 28/03/2007, 17h10

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