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 :

Typage lors de l'allocation dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut Typage lors de l'allocation dynamique
    Bonjour

    Pour faire l'allocation dynamique de la mémoire on fait dans le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int * p;
     
    p=malloc(sizeof(int))
    mais on peut aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=(int*)malloc(sizeof(int))

    toute ces deux instructions marchent bien

    Pour la seconde forme d'après ce que j'ai compris, on fait le typage du pointeur c'est à dire il prend le type int,
    mais ce qui me rend confus c'est que lors de la déclaration on aussi défini int *p
    donc qu'elle est l'utilité de cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=(int*)malloc(sizeof(int))
    par rapport à la première?

    merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    Lorsque tu transtypes « void * » vers un pointeur de n'importe quel type et vice-versa, la norme spécifie que cette conversion est implicite. Tu n'es donc pas tenu de le faire.

    Par contre, d'une manière générale, lorsque tu affectes une valeur d'un certain type à une variable d'un autre type, le compilateur doit procéder à une conversion. Soit est est implicite (cas des entiers, spécialement quand tu passes d'un entier à un entier plus grand : la conversion réussit toujours), soit elle est impossible et le compilo s'interrompt avec une erreur, soit elle est possible mais aboutira vraisemblablement à quelque chose de différent de ce que tu as au départ, auquel cas il faut préciser au compilateur que c'est bien ce que tu veux faire.

    C'est typiquement le cas des pointeurs car ceux-ci contiennent toujours une adresse mémoire, laquelle mémoire peut contenir n'importe quoi. Le contenu du pointeur lui-même et sa représentation ne sont jamais modifiés mais il en reste que ce qu'ils pointent est complètement différent :

    Par exemple, si j'ai un pointeur « int * », je ne peux pas dire qu'il pointe une structure stat avec « struct stat * ptr » car ce n'est tout simplement pas le cas. Par contre, si je sais ce que fais, il n'y a aucune contrainte technique qui m'empêche de le faire.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par africanwinners Voir le message
    Bonjour
    Salut

    Citation Envoyé par africanwinners Voir le message
    Pour faire l'allocation dynamique de la mémoire on fait dans le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int * p;
     
    p=malloc(sizeof(int))
    mais on peut aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=(int*)malloc(sizeof(int))

    toute ces deux instructions marchent bien

    Pour la seconde forme d'après ce que j'ai compris, on fait le typage du pointeur c'est à dire il prend le type int,
    Non
    Déjà ce pointeur n'est pas de type "int" mais "int étoile". C'est l'élément pointé qui est alors sensé être de type int.
    Ensuite ce n'est pas le pointeur qui "prend le type" mais l'adresse renvoyée par malloc. Le pointeur, lui, est d'un type précis et n'en changera pas.

    Citation Envoyé par africanwinners Voir le message
    donc qu'elle est l'utilité de cette instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=(int*)malloc(sizeof(int))
    par rapport à la première?
    A une époque lointaine, dans les débuts du C, le type "void *" n'existait pas. malloc() renvoyant une simple adresse était de type "char *malloc()". Donc au retour de malloc(), on se retrouvait avec une adresse sur un char. Et pour pouvoir la manipuler correctement, il fallait alors la transformer (la "caster" du verbe anglais "to cast" = "jouer un rôle" qui a donné le mot "casting" dans le cinéma) dans le type qui va bien.

    Il faut bien comprendre qu'à la base, une adresse n'est rien d'autre qu'un bête nombre entier. A la limite, rien n'interdirait d'écrire float var; int pt=&var.
    Le pb vient quand on va voir ce qu'il y a au pointé => dans "*pt". Là, le compilo ne sait pas si à cette adresse il faut récupérer un char (1 octet), un int (2 octets), un float (4 octets). Parce qu'il ne connait pas le type de "*pt".

    C'est pour cela qu'on écrit float *pt=&var. Ainsi, quand on tape dans "*pt", le compilo sait qu'à cet endroit il y a un float et il récupère alors le contenu de l'adresse en question et des 3 suivantes qu'il compile en un float.

    Et donc, à cette époque, quand on récupérait une adresse provenant de malloc, adresse sur un char, il fallait alors spécifier "non, ici cette adresse est l'adresse d'un int" d'où le p=(int*)malloc(...)Aujourd'hui ce n'est plus utile car le type "void*" étant universel, le compilo le transforme automatiquement en type correspondant au pointeur de destination. Et il y a même certaines raisons qui font que cela devient maintenant dangereux de caster le retour de malloc(). Il y a d'ailleurs une très bonne discussion sur ce forum à ce propos...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Il y a d'ailleurs une très bonne discussion sur ce forum à ce propos...
    J'arriverais surement a trouver ce sujet mais si tu l'as encore sous la main, je suis preneur.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Al_th Voir le message
    J'arriverais surement a trouver ce sujet mais si tu l'as encore sous la main, je suis preneur.
    http://www.developpez.net/forums/d50...retour-malloc/
    http://www.developpez.net/forums/d85...tion-malloc-c/
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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