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 :

allocation dynamique d'une matrice


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut allocation dynamique d'une matrice
    Bonjour,


    pour allouer de la mémoire pour coef, je trouve sur le net le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    coef=(double**)malloc(lignes*sizeof(double*));
    Quelle est l'utilité de (double**) devant malloc?

    Merci

  2. #2
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    Quelle est l'utilité de (double**) devant malloc?
    Esthétique

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 639
    Par défaut
    malloc retourne un void*. Si on écrit :

    coef=malloc(lignes*sizeof(double*));
    et si on utilise un compilateur un peu râleur, on peut racevoir un joli warning :

    "vous déclarez que coef est un double**, et vous essayez d'affecter à coef un void*. Etes-vous sûr(e) que c'est vraiment ce que vous voulez faire ?"


    Alors, pour dire au compilateur que, oui, c'est vraiment ce qu'on veut faire, on lui signale que l'adresse retournée par malloc doit être convertie en double**

    coef=(double**)malloc(lignes*sizeof(double*));
    Ainsi le compilateur nous fait confiance et cela fait toujours un warning en moins.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    C'est inutile (parfois nuisible sur un compilo mal configuré, car ça peut cacher une erreur) et un compilo C respectueux du standard n'est pas censé gueuler:
    En C, un pointeur void* peut être converti implicitement en tout autre pointeur (sauf pointeur de fonction)
    L'errata de la dernière version du K&R ne recommande plus de le mettre.

    Note: Il en est différemment en C++, où un cast explicite est nécessaire. Mais même là, le cast le moins permissif (static_cast) suffit.
    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
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par kochfet Voir le message
    Quelle est l'utilité de (double**) devant malloc?
    Ceci permet d'éviter des erreurs.

    Déjà c'est un moyen de se souvenir comment utiliser malloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coef=(TYPE *)malloc( lignes*sizeof(TYPE) );
    Ainsi tu vois bien que tu vas stocker des éléments de type TYPE et que le pointeur doit être de type TYPE *.
    Il ne te reste alors plus qu'à remplacer TYPE par le type que tu veux stocker (ici double *).

    Ensuite, cela permet de bien vérifier que coef est du bon type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int * coef = malloc(lignes*sizeof(double *) );
    Compilera.

    Il vaut mieux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int * coef = (double **)malloc(lignes*sizeof(double *) );
    Ainsi si jamais dans ton code tu modifies le type de coef, tu auras une erreur à chaque endroit où tu as fait un malloc et tu pourras corriger en fonction.
    Cette syntaxe peut aussi être utilisée dans du code C++ (mais cela reste très exceptionnel et on préférera toujours, en C++, utiliser new ou des containers).

    Une autre syntaxe est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coef = malloc(lignes*sizeof( *coef) );
    Ainsi tu es sûr que tu vas toujours stocker le bon type d'éléments même si tu modifies le type de coef et tu n'auras pas d'erreurs lors du changement de type.
    Les deux solutions se valent mais il ne faut surtout pas faire un mix des deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coef = malloc(lignes*sizeof(double *) ); // pas bien !
    Dans la première solution, on pourra utiliser un typedef pour changer le type de coef sans changer le reste du code. Après dans certains cas, il peut être intéressant d'avoir des erreurs pour bien vérifier que le changement du type ne "fausse" pas certains bouts du code (exemple passage de int (valeurs possibles - beaucoup à + (beaucoup-1) cf FAQ C) à unsigned char (valeurs possibles : 0 à 255) ) ainsi avoir des erreurs peut aider à bien revérifier l'ensemble du code.

    N.B. Quand je dit "stocker le bon type d'élément", c'est un abus de langage, il faudrait dire allouer l'espace mémoire nécessaire pour stocker lignes TYPE.

  6. #6
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    Merci pour toutes les réponses.

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

Discussions similaires

  1. Allocation dynamique d'une matrice
    Par cedrix57 dans le forum Fortran
    Réponses: 2
    Dernier message: 24/05/2010, 10h24
  2. allocation dynamique d'une structure static
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 01/04/2009, 11h22
  3. Allocation dynamique dans une fonction
    Par n0mad dans le forum Débuter
    Réponses: 5
    Dernier message: 05/02/2009, 22h42
  4. Allocation dynamique d'une matrice
    Par magicstar dans le forum MATLAB
    Réponses: 7
    Dernier message: 27/04/2007, 09h51
  5. [D7] - Allocation dynamique dans une DLL
    Par david_chardonnet dans le forum Delphi
    Réponses: 6
    Dernier message: 05/07/2006, 15h28

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