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 :

Tableaux - Malloc - Passages de pointeurs, etc.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut Tableaux - Malloc - Passages de pointeurs, etc.
    Bonjour,

    J'ai une méthode qui doit lire un fichier et en placer le contenu dans un tableau 2D. La taille de ce tableau n'est pas connue a-priori (elle se trouve dans le fichier).
    Je ne veux pas utiliser de "return". Donc, je passe un pointeur en paramètre à cette méthode. Après avoir lu la taille que doit avoir ce tableau, elle réserve la mémoire avec "Malloc".

    Le problème, c'est qu'apparemment, cette mémoire n'est allouée qu'au sein de cette méthode. Une fois que l'on en sort, cela ne fonctionne plus.

    Après beaucoup de chipotages, j'ai résolu le problème en passant l'adresse de mon pointeur. Mais ceci alourdi sensiblement le code au niveau de l'utilisation intensive des * et &.

    Pour illustrer, voici un bout de code simplifié, avec un tableau 1D.

    Tout d'abord, un code qui ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void modif2(char * p){
    	p = malloc(sizeof(int)*10);
    	p[5]=55;
            printf("%d\n",p[5]);
    }
    int main(void) {
    	int * T2;
    	modif2(T2);
    	printf("%d\n",T2[5]);
    }
    Puis ci-dessous, un code qui fonctionne :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void modif1(int ** p){
    	*p = malloc(sizeof(int)*10);
    	(*p)[3]=44;
            printf("%d\n",(*p)[3]);
    }
     
    int main(void) {
    	int * T1D;
    	modif1(&T1D);
    	printf("%d\n",T1D[3]);
    }
    A l'exécution, on voit que le tableau reste correctement accessible hors de la fonction "modif1".

    Ma question est de savoir si c'est bien cela que je devais faire, ou s'il y a une façon plus "propre" qui m'échappe.
    J'aimerais aussi comprendre pourquoi il faut procéder de la sorte. Qu'est-ce qu'un pointeur au juste? Que possède-t-il d'autre comme informations qu'une adresse mémoire? Je sens que le pointeur est intimement lié à malloc et free, mais j'aimerais mieux comprendre ce qui ce trame derrière tout cela. Généralement, les tutoriels apprennent à programmer, mais n'entrent pas dans ce genre de détails...

    D'avance, un grand merci pour votre aide!

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    La premier méthode de fonctionne pas car en C tous les paramètres de fonction sont passés par valeur et non pas par adresse.

    Donc, quant tu fais :

    C'est une copie du pointeur qui est localement utilisée au sein de la fonction.

    C'est pour cela, une fois la fonction terminée que T2 ne pointe pas sur la mémoire allouée dans la fonction.

    En passant l'adresse du pointeur, tu as alors accès au pointeur par déréférencement et tu peux donc le faire pointer sur ton block de mémoire allouée.

    Notes que dans ce cas, le pointeur sur pointeur utilisé dans la fonction est aussi une copie, mais son contenu est modifiable.

    Je te conseilles donc de te procurer un bon bouquin sur le C et de le potasser !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    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 gnulix Voir le message
    J'aimerais aussi comprendre pourquoi il faut procéder de la sorte. Qu'est-ce qu'un pointeur au juste? Que possède-t-il d'autre comme informations qu'une adresse mémoire? Je sens que le pointeur est intimement lié à malloc et free, mais j'aimerais mieux comprendre ce qui ce trame derrière tout cela. Généralement, les tutoriels apprennent à programmer, mais n'entrent pas dans ce genre de détails...
    http://emmanuel-delahaye.developpez....difie_variable

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Ok, je pense avoir compris.
    Lorsqu'on passe un pointeur, on peut modifier ce qu'il pointe, mais pas lui-même. Or, c'est précisément ceci qu'il faut faire lors d'un malloc : cette fonction retourne une adresse mémoire, qu'il faut pouvoir attribuer au pointeur.

    Merci.

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

Discussions similaires

  1. passage de pointeurs entre appli delphi et DLL c++
    Par e-teo dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 21h46
  2. Passage de pointeur en session
    Par goondi dans le forum Langage
    Réponses: 6
    Dernier message: 21/09/2005, 11h54
  3. Réponses: 6
    Dernier message: 01/02/2005, 20h02
  4. Problème passage de pointeur
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 21/04/2004, 18h34
  5. [allegro]passage de pointeur sur image
    Par Gonath dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 13/12/2003, 18h47

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