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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    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 Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    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 émérite 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
    Par défaut
    Peux-tu isoler le bout de code qui pose problème et nous le montrer ?

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    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!

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    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 **.

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    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 confirmé
    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
    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;
    }

+ 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