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 :

Structure et pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut Structure et pointeur
    Bonjour,

    Je souhaite comprendre à quoi peut servir cette syntaxe:

    ou encore plus généralement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (struct nom*) &variable
    (struct nom*) pointeur
    le code que j'ai récupéré et que j'essaye de comprendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main (void)
    {
      int s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
      char header[4096]={'\0'};
     
      struct ip *ipheader = (struct ip*) header;
    Donc si vous pouvez me dire ce que cela signifie, merci .

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Cela s'appelle du "cast", ça sert à faire du transtypage.

    Dans ton cas, cela sert à allouer de l'espace pour 4096 caractères, et permettre à y placer le contenu de la structure "ip" (qui doit probablement être un paquet ip...).

    Cela permettra d'afficher plus "facilement" son contenu (un envoi à printf sans cast du coup).
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    D'accord merci je pense avoir compris, en faite je ne peux pas passer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char header[4096]={'\0'};
    struct ip *ipheader = char header;
    car il est de type char et qu'on me demande le type struct ip*

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Il est de type char[] (assimilable à char*), et non char tout-court.

    Mais la logique c'est bien ça : char != struct ip
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    Oui ^ ^ merci. Par contre j'ai un peu de mal avec ce qui a été écrit plus haut:

    En l'occurrence, avec « char header[4096] », tu alloues dans les faits un buffer de 4096 octets.
    Comme tu vas t'en servir pour stocker non pas des caractères mais une structure bien
    définie, tu convertis ton « pointeur vers un (ou des) caractères » en un « pointeur vers une structure ip ».



    Serait-il possible d'avoir un dessin (je sais j'en demande beaucoup trop ) ou plus simplement un lien vers un cours qui traite de ce sujet pour avoir un complément s.v.p ?

    Merci

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    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 480
    Par défaut
    Citation Envoyé par dashed Voir le message
    Serait-il possible d'avoir un dessin (je sais j'en demande beaucoup trop ) ou plus simplement un lien vers un cours qui traite de ce sujet pour avoir un complément s.v.p ? Merci
    Pas besoin, tu as résumé cela toi-même : « car il est de type char et qu'on me demande le type struct ip* ».

    Tu as alloué la place, l'expression « header » est donc un pointeur de type « char * » vers le début de ton tableau. Tu le convertis en « struct ip * » pour dire que c'est en fait une « structure ip » que tu vas stocker à cet endroit mais le principe reste le même.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    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 480
    Par défaut
    Bonjour,

    Un nom de type (y compris avec pointeur) entre parenthèses et précédant immédiatement une variable ou une quelconque expression évaluable est un « transtypage » (ou cast en version originale). Ça signifie que la valeur en question doit d'abord être convertie vers ce type avant d'être affectée ou examinée.

    Lorsqu'il s'agit d'un pointeur vers un autre pointeur, il ne se produit, en pratique, aucune conversion au niveau numérique (une adresse mémoire reste une adresse mémoire) mais sur le plan sémantique, le compilateur « sait » ce qui doit se trouver derrière.

    En l'occurrence, avec « char header[4096] », tu alloues dans les faits un buffer de 4096 octets. Comme tu vas t'en servir pour stocker non pas des caractères mais une structure bien définie, tu convertis ton « pointeur vers un (ou des) caractères » en un « pointeur vers une structure ip ».

    Évidemment, le plus propre dans le cas présent aurait été de déclarer directement un tableau de « structures ip » plutôt que des caractères, mais cela reste utile si le même buffer doit servir à recevoir des données de natures différentes, ou lorsque le type est incomplet.

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

Discussions similaires

  1. Structures et pointeurs
    Par Tchetch dans le forum C
    Réponses: 14
    Dernier message: 19/10/2006, 13h30
  2. Structure et pointeur
    Par Nalido dans le forum C
    Réponses: 5
    Dernier message: 08/08/2006, 15h08
  3. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  4. Structures et pointeurs
    Par mastochard dans le forum C
    Réponses: 17
    Dernier message: 25/05/2006, 11h55
  5. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20

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