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()


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Par défaut problème de realloc()
    Bonjour,

    Je m'arrache les cheveux depuis plusieurs heures car je ne parvien pas à résoudre mon problème :

    Voici la sortie de mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    *** glibc detected *** ./irawk: realloc(): invalid next size: 0x0804b0a8 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e5d3aa]
    /lib/tls/i686/cmov/libc.so.6(__libc_realloc+0xff)[0xb7e5dcdf]
    ./irawk[0x80487cd]
    ./irawk[0x8048d2a]
    ./irawk[0x8048fab]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7e0a8cc]
    ./irawk[0x8048591]
    Je pense que l'erreur vien de ce code la :
    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
     
    for (str = instruction, count = 0 ; ; str = NULL) {
          token = strtok_r(str, "\"", &saveptr);
          if (token == NULL)
                break;
           printf("token : %s\n", token);
           instruction_tab = (char **)realloc(instruction_tab, (sizeof(char*)));
           if(instruction_tab == NULL){
           		printf("erreur d'allocation mémoire\n");
           		return NULL;
           }
           instruction_tab[count] = (char*)malloc(sizeof(token));
           if(instruction_tab[count] == NULL){
           printf("erreur d'allocation mémoire\n");
           		for(i = 0; i < count ; i++){
           			free(instruction_tab[i]);
           		}
           		free(instruction_tab);
           		free (instruction);
    		return NULL;
    	}
    	strcpy(instruction_tab[count], token);
            count ++;
     }
    Est-ce que vous voyez une erreur?
    Une idée ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           instruction_tab = (char **)realloc(instruction_tab, (sizeof(char*)));
    Ca serait pas plutot ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           instruction_tab = (char **)realloc(instruction_tab, (sizeof(char*))*count);

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    2 erreurs majeures :

    1) Count démarre à 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           instruction_tab = (char **)realloc(instruction_tab, (sizeof(char*)*(count+1)));
    2) une chaîne doit être allouée avec la place pour le caractère de fin '\0' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           instruction_tab[count] = (char*)malloc(strlen(token)+1);
    Et enfin comment est défini instruction_tab ??

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    1. On ne connait pas le type de token, mais si c'est un char* aussi, tu es mal barré.
    2. Pas de cast du retour de malloc() en C.
    3. Mauvais usage de realloc(). Voir ici : http://emmanuel-delahaye.developpez....es.htm#realloc
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc
    1. On ne connait pas le type de token, mais si c'est un char* aussi, tu es mal barré.
    aujoudh'ui tu tires plus vite que ton ombre...

    mais il a fait appel a strtok donc c'est un char *...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Par défaut
    Merci beaucoup souviron, ça marche tout de suite mieux comme ça

    A plus et merci encore

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Par défaut
    Bonjour,

    Nouveau problème de realloc()!! décidément cette fonction ne m'aime pas!

    le code qui contient le realloc :
    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
    30
    31
    32
    33
     
    nbevar++;
    tabvar = (variable *)realloc(tabvar, (nbevar * sizeof(variable)));
    if (tabvar == NULL){
    	printf("erreur d'allocation memoire\n");
    	exit(-1);
    }
    //on nomme la variable
    tabvar[nbevar].name = (char *)malloc(strlen(name));
    if (tabvar[nbevar].name == NULL){
    	printf("erreur d'allocation memoire\n");
    	free(tabvar+ nbevar);
    	nbevar--;
    	free_tabvar();
    	exit(-1);
    }
    strcpy(tabvar[nbevar].name, name);
    if(is_num(val) == 1){// si c'est un nombre
    	tabvar[nbevar].is_int = 1;
    	tabvar[nbevar].val = atoi(val);
    	strcpy(tabvar[nbevar].name, name);
    }else{// si c'est une chaîne
    	tabvar[nbevar].is_int = 0;
    	tabvar[nbevar].value = (char *)malloc(strlen(val));
    	if (tabvar[nbevar].value == NULL){
    		printf("erreur d'allocation memoire\n");
    		free(tabvar+ nbevar);
    	        nbevar--;
                    free_tabvar();
                    exit(-1);
           }
    }
    strcpy(tabvar[nbevar].value, val);
    ma structure variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct _variable{
    	char * value;
    	char * name;
    	int  val;
    	int is_int;	//0 ou 1
    }variable;
    l'erreur retournée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    *** glibc detected *** ./irawk: realloc(): invalid next size: 0x0804c0a0 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e503aa]
    /lib/tls/i686/cmov/libc.so.6(__libc_realloc+0xff)[0xb7e50cdf]
    ./irawk[0x804886c]
    ./irawk[0x804a206]
    ./irawk[0x804a467]
    ./irawk[0x804a6eb]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7dfd8cc]
    ./irawk[0x80485f1]
    ======= Memory map: ========
    etc.......
    etc.....
    Un nouveau Help à vous messieurs.... please

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par daweed
    le code qui contient le realloc :
    Ca ne compile pas...

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    même erreur, même punition !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabvar[nbevar].name = (char *)malloc(strlen(name)+1);
    et aussi tu ne fais pas l'allocation pour value ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(tabvar[nbevar].value, val);  // allouée ou ???

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 21
    Par défaut
    Pour info ça compile très bien, je n'ai pas mis tout mon code pour vous épargner.

    petite rectification :
    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
    30
    31
    32
    nbevar++;
    tabvar = (variable *)realloc(tabvar, (nbevar * sizeof(variable)));
    if (tabvar == NULL){
    	printf("erreur d'allocation memoire\n");
    	exit(-1);
    }
    //on nomme la variable
    tabvar[nbevar].name = (char *)malloc(strlen(name));
    if (tabvar[nbevar].name == NULL){
    	printf("erreur d'allocation memoire\n");
    	free(tabvar+ nbevar);
    	nbevar--;
    	free_tabvar();
    	exit(-1);
    }
    strcpy(tabvar[nbevar].name, name);
    if(is_num(val) == 1){// si c'est un nombre
    	tabvar[nbevar].is_int = 1;
    	tabvar[nbevar].val = atoi(val);
    	strcpy(tabvar[nbevar].name, name);
    }else{// si c'est une chaîne
    	tabvar[nbevar].is_int = 0;
    	tabvar[nbevar].value = (char *)malloc(strlen(val));
    	if (tabvar[nbevar].value == NULL){
    		printf("erreur d'allocation memoire\n");
    		free(tabvar+ nbevar);
    	        nbevar--;
                    free_tabvar();
                    exit(-1);
           }
            strcpy(tabvar[nbevar].value, val);
    }
    Du coup value est bien allouée.

    name et val sont deux paramêtres passés à la fonction.
    tabvar et nbevar sont des variables globales.

    Le problème vien du réalloc, pour moi.

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    il te manque toujours le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabvar[nbevar].name = (char *)malloc(strlen(name) +1 );
    et pareil pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	tabvar[nbevar].value = (char *)malloc(strlen(val)+1 );

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabvar = (variable *)realloc(tabvar, (nbevar * sizeof(variable)));
    En générale il est préférable d'utiliser un pointeur temporaire du même type bien entendu soit une realloc correct et digne de ce nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    type * tmp = realloc (tabvar, nbvar * sizeof (* tabvar));
     
    if (tmp != NULL)
    {
       tabvar = tmp;
    }
    ...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Problème avec realloc
    Par darkwall_37 dans le forum Débuter
    Réponses: 28
    Dernier message: 10/12/2009, 17h37
  2. Réponses: 13
    Dernier message: 21/03/2009, 20h49
  3. Problème avec realloc et struct
    Par _SamSoft_ dans le forum Bibliothèque standard
    Réponses: 38
    Dernier message: 27/12/2007, 10h13
  4. [C, Realloc] problème de reallocation
    Par samtheh dans le forum C
    Réponses: 9
    Dernier message: 26/05/2006, 20h44
  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