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 de pointeur passé en paramètre de fonction


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Problème de realloc de pointeur passé en paramètre de fonction
    Bonjour à tous,

    Je fais face à une erreur lorsque je tente de reallouer l'espace mémoire d'un pointeur passé en paramètre d'une fonction.

    Voici mon pseudo code qui modifie juste la taille de ma variable X:

    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
    int main (void)
    {
         double *X;
         X	= (double*)calloc(10,sizeof(double));
     
    //   pour i=0 jusqu'à 10 X[i] = i ;
     
         fonction(X);
    }
     
    fonction( double *X)
    {
         int newDim = 15;
         X = realloc(X, newDim*sizeof(double));
    }
    A la compilation je n'ai pas de problème, mais lorsque je lance le programme j'ai cette erreur :

    *** glibc detected *** ./myProg: realloc(): invalid next size: 0x000000000462a670 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x3dfcc7421b]
    /lib64/libc.so.6(realloc+0x1d0)[0x3dfcc751a0]

    [...]
    Merci pour votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Si tu veux modifier un pointeur passé en paramètre à une fonction, il faut passer l'adresse du pointeur, pas directement le pointeur. Bref ça doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void
    fonction(double **x)
    {
        *x = realloc(*x, 15 * sizeof(double));
    }
     
    int
    main()
    {
        ...
        fonction(&x);
        ...
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par matafan Voir le message
    Si tu veux modifier un pointeur passé en paramètre à une fonction, il faut passer l'adresse du pointeur, pas directement le pointeur. Bref ça doit ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void
    fonction(double **x)
    {
        *x = realloc(*x, 15 * sizeof(double));
    }
     
    int
    main()
    {
        ...
        fonction(&x);
        ...
    }
    Merci pour ton aide, j'ai essayé comme tu m'as dit mais j'ai toujours le même bug.

    J'ai déclaré mon X en double ** dans la fonction main et j'ai initialisé comme ça :

    X = (double**)calloc(10,sizeof(double*));

  4. #4
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Peux-tu isoler le bout de code qui pose problème et nous le montrer ?
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par cedric83400 Voir le message
    Merci pour ton aide, j'ai essayé comme tu m'as dit mais j'ai toujours le même bug.

    J'ai déclaré mon X en double ** dans la fonction main et j'ai initialisé comme ça :

    X = (double**)calloc(10,sizeof(double*));
    Il faut que X reste un double * dans main. Par contre tu passes &x en argument à function(), donc dans function() c'est un double **.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par crocodilex Voir le message
    Peux-tu isoler le bout de code qui pose problème et nous le montrer ?
    Alors là maintenant je ne l'ai pas sur moi mais je le récupererai demain. (mais mon code est vraiment identique à mon pseudo-code)

    C'est la ligne avec le realloc qui fait planter tout...

    Merci pour ton intérêt

    Citation Envoyé par matafan Voir le message
    Il faut que X reste un double * dans main. Par contre tu passes &x en argument à function(), donc dans function() c'est un double **.
    Ok très bien j'essaie ça demain et je te tiens au courant Merci pour vos aides très rapides!

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par matafan Voir le message
    Il faut que X reste un double * dans main. Par contre tu passes &x en argument à function(), donc dans function() c'est un double **.
    J'ai essayé ce que tu m'as dit mais j'ai toujours le même problème, je te montre mon code :
    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
     
    void addFirstFeatures([...], double **X, [..]);
     
    void main(void)
    {
     
    double *X;
    X	= (double*)calloc(13,sizeof(double));
     
    addFirstFeatures([...], &X, [..]);
    }
     
    void addFirstFeatures([...], double **X, [...]) 
    {
    int count = 3;
    *X = realloc(*X, (13+6*count)*sizeof(double));
    }

  8. #8
    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
    Personnellement sur ce (pratiquement ton) code, je n'ai pas de problèmes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void addFirstFeatures( double **X)
    {
      int count = 3;
      *X = realloc(*X, (13+6*count)*sizeof(double));
    }
    int main(void)
    {
      int i;
      double *X;
      X = calloc(13,sizeof(double));
      addFirstFeatures(&X);
      for(i=0; i<13+3*6;i++) X[i] = i;
      return 0;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    Personnellement sur ce (pratiquement ton) code, je n'ai pas de problèmes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void addFirstFeatures( double **X)
    {
      int count = 3;
      *X = realloc(*X, (13+6*count)*sizeof(double));
    }
    int main(void)
    {
      int i;
      double *X;
      X = calloc(13,sizeof(double));
      addFirstFeatures(&X);
      for(i=0; i<13+3*6;i++) X[i] = i;
      return 0;
    }
    Je te remercie pour ta réponse. J'ai testé ton code dans un source à part et effectivement il fonctionne sans problème avec gcc.

    J'ai ensuite intégré ta fonction dans mon programme et là, même erreur... J'ai donc enlevé toutes les autres fonctions et déclarations (elles ont toutes aucun rapport avec X) , et là ça fonctionne... Je continue mes recherches, je te tiens au courant, merci


    ----


    Ok j'ai trouvé l'erreur... c'était pendant l'initialisation de mon vecteur X, j'avais initialisé un élément en trop... (soit 14...-_-' )

    Un GRAND MERCI pour vos aides


    Autre petite question,

    Est ce que qu'il est possible de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(i=0; i<13+3*6;i++) X[i] = i;
    dans la fonction addFirstFeatures juste après le realloc ? J'ai essayé de remplacer X[i] par *X[i] mais ça ne fonctionne pas. Cela fonctionne uniquement pour mes 13 premiers éléments, après j'ai une erreur de segmentation.

  10. #10
    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
    J'ai essayé de remplacer X[i] par *X[i]
    Non par (*X)[i]

    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
    void addFirstFeatures( double **X)
    {
      int i;
      int count = 3;
      *X = realloc(*X, (13+6*count)*sizeof(double));
       for(i=0; i<13+6*count;i++) (*X)[i] = i;
    }
    int main(void)
    {
      int i;
      double *X;
      X = calloc(13,sizeof(double));
      addFirstFeatures(&X);
      for(i=0; i<13+3*6;i++) printf("%f\n",X[i]);
      return 0;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      *X = realloc(*X, (13+6*count)*sizeof(double));
    Mauvais usage de realloc() : Le pointeur est perdu en cas d'échec de la réallocation.

    Code C : 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
    int realloc_double(double **pp, size_t cElems)
    {
    	size_t cb = cElems * sizeof **pp;
    	double * tmp = realloc(*pp, cb);
    	if(tmp == NULL)
    		return -1;
     
    	*pp = tmp;
    	return 0;
    }
     
    void addFirstFeatures( double **X)
    {
    	int i;
    	int count = 3;
    	if(realloc_double(X, 13+6*count) < 0)
    		return;
     
    	for(i=0 ; i<13+6*count ; i++)
    		(*X)[i] = i;
    }
    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.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      *X = realloc(*X, (13+6*count)*sizeof(double));
    Mauvais usage de realloc() : Le pointeur est perdu en cas d'échec de la réallocation.

    Code C : 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
    int realloc_double(double **pp, size_t cElems)
    {
    	size_t cb = cElems * sizeof **pp;
    	double * tmp = realloc(*pp, cb);
    	if(tmp == NULL)
    		return -1;
     
    	*pp = tmp;
    	return 0;
    }
     
    void addFirstFeatures( double **X)
    {
    	int i;
    	int count = 3;
    	if(realloc_double(X, 13+6*count) < 0)
    		return;
     
    	for(i=0 ; i<13+6*count ; i++)
    		(*X)[i] = i;
    }
    La realloc s'est bien passé mais en fait c'est mon pointeur qui était mal écrit... au lieu d'écrire *(X)[j] , j'avais écrit *X[j]... voilà je vous remercie tous encore. A +

  13. #13
    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
    La realloc s'est bien passé mais en fait c'est mon pointeur qui était mal écrit... au lieu d'écrire *(X)[j] , j'avais écrit *X[j]...
    Il n'empèche que Médinoc a parfaitement raison : le realloc DOIT être employé de la manière qu'il explique. De la même façon que malloc (ou calloc) doit être suivi d'un test sur la valeur obtenue, realloc, bien utilisé, doit tester la valeur de retour pour savoir si la réallocation s'est bien passée et, si ce n'est pas le cas, garder l'ancien pointeur pour accéder (ne serait-ce que pour libérer la mémoire) à ce qui avait été alloué précédemment.

    Ce n'est pas *(X)[j] mais (*X)[j]
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    Il n'empèche que Médinoc a parfaitement raison : le realloc DOIT être employé de la manière qu'il explique. De la même façon que malloc (ou calloc) doit être suivi d'un test sur la valeur obtenue, realloc, bien utilisé, doit tester la valeur de retour pour savoir si la réallocation s'est bien passée et, si ce n'est pas le cas, garder l'ancien pointeur pour accéder (ne serait-ce que pour libérer la mémoire) à ce qui avait été alloué précédemment.

    Ce n'est pas *(X)[j] mais (*X)[j]
    Oui oui j'ai bien inclu le test dans mon code final ;-) Merci pour vos conseils et bien entendu *(X) était une faute de frappe... :-)

    @+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/09/2011, 08h27
  2. Réponses: 4
    Dernier message: 19/10/2009, 12h41
  3. Allocation dynamique (pointeur passé en paramètre)
    Par sperca dans le forum Débuter
    Réponses: 6
    Dernier message: 03/02/2009, 14h50
  4. Nom d'une variable passée en paramètre à une fonction
    Par cata2 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 07/09/2007, 09h17
  5. Pointeur d'un paramètre de fonction perdu
    Par solid360 dans le forum C
    Réponses: 3
    Dernier message: 07/12/2006, 01h00

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