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 libération de mémoire après des realloc


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 5
    Points : 9
    Points
    9
    Par défaut Problème de libération de mémoire après des realloc
    Bonjour,

    Je réalise un programme dans lequel je dois allouer dynamiquement de la mémoire, mais j'ai un souci lorsque je dois libérer celle-ci.
    Je ne poste pas l'intégralité du programme, car il est vraiment trop long, mais un exemple qui me renvoie exactement la même erreur.

    Le but ici est de lire les arguments du main

    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
    28
    29
    int main(int argc, char *argv[]){
     
    	char **tab = NULL;
    	int i;
     
    	for(i=0; i<argc-1; i++){
    		//Allocation du pointeur
    		tab = (char**)realloc(tab, sizeof(char*));
    		//Allocation de la chaine
    		tab[i] = (char*)malloc((strlen(argv[i+1])+1)*sizeof(char));
    		//Copie
    		strcpy(tab[i], argv[i+1]);
    	}
     
     
    	//Affichage des arguments
    	for(i=0; i<argc-1; i++){
    		printf("tab[%d] = %s\n",i,tab[i]);
     
    	}
     
    	//Libération de la mémoire
    	for(i=0; i<argc-1; i++){
    		free(tab[i]);
    	}
    	free(tab);
     
    	return 0;
    }
    Ce qui est étrange c'est que tous ce passe bien tant que je n'entre pas plus de 3 arguments. Au delà, j'ai une erreur lors de la libération de la première case de tab du type "double free or corruption (out)".
    Il y a quelque chose qui m'échappe, mais comme ça fait presque trois heures que je tourne en rond, je fais appel à votre aide =)

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Avec ce code, tu alloues toujours un seul pointeur dans tab...

    PS: On n'a pas à caster le retour de malloc() en C. Assure-toi que tu compiles bien en C et non en C++.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Je ne sais pas si j'ai bien compris la réponse, mais vous me dîtes que je realloue le même pointeur à chaque itération ?
    Je pensais que le realloc créait un nouveau pointeur à chaque fois..
    Mais alors pourquoi lorsque j'affiche le contenu de tab je retrouve bien tous mes arguments ? Si j'utilise le même pointeur la chaîne de caractère devrait être écrasée à chaque tour de boucle non ?
    Et pourquoi tout ce passe bien tant que je ne dépasse pas 3 arguments ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Comportement indéfini. Tu peux taper toujours dans la même page tant que tu ne sors pas d'une certaine taille, etc.

    La correction minimale, bien sûr, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = (char**)realloc(tab, sizeof(char*) * (i+1));

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Bien sur !!! le deuxième argument de realloc est la nouvelle taille du pointeur et non la taille à ajouter...

    Merci beaucoup je pense que j'aurais mis beaucoup de temps à trouver...

    Merci aussi d'avoir répondu si vite.

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

Discussions similaires

  1. [Mémoire] Problème de libération de mémoire
    Par CTotophe85 dans le forum C++
    Réponses: 7
    Dernier message: 24/11/2008, 12h47
  2. Problème de libération de mémoire
    Par ridecat dans le forum C
    Réponses: 13
    Dernier message: 06/05/2008, 08h36
  3. problème de libération de mémoire
    Par hamoudasafira dans le forum C++
    Réponses: 3
    Dernier message: 19/03/2007, 18h54
  4. Problème de libération de mémoire
    Par saturne13 dans le forum Linux
    Réponses: 9
    Dernier message: 06/02/2007, 09h18
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

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