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 :

comment utiliser sizeof( )


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    Par défaut comment utiliser sizeof( )
    Bonjour,
    mon programme fait un segmentation fault quand il execute l'instruction suivante :
    memset(policy, 0, sizeof(srtp_policy_t));

    Voici le message de seg fault :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Program received signal SIGSEGV, Segmentation fault.
    memset () at ../sysdeps/x86_64/memset.S:331
    331	../sysdeps/x86_64/memset.S: Aucun fichier ou dossier de ce type.
    	in ../sysdeps/x86_64/memset.S
    Voici le contexte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    srtp_policy_t  *policy;
      policy = si->u.rtp.info->policy;
     
      memset(policy, 0, sizeof(srtp_policy_t));
      if(computeSessKey(si, policy, key_len) == -1)
        return -1;
    et voici srtp_policy_t :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct srtp_policy_t {
      ssrc_t        ssrc;        /**< The SSRC value of stream, or the 
                                  *   flags SSRC_ANY_INBOUND or 
                                  *   SSRC_ANY_OUTBOUND if key sharing
                                  *   is used for this policy element.
                                  */
      crypto_policy_t rtp;         /**< SRTP crypto policy.                  */
      crypto_policy_t rtcp;        /**< SRTCP crypto policy.                 */
      unsigned char *key;          /**< Pointer to the SRTP master key for
                                    *    this stream.                        */
      struct srtp_policy_t *next;  /**< Pointer to next stream policy.       */
    } srtp_policy_t;
    Apparemment c'est sizeof(srtp_policy_t qu'il n'aime pas ...

    Comment je devrais indiquer à memset qu'il faut prendre la taille de srtp_policy_t ?

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    policy = si->u.rtp.info->policy;
      
      memset(policy, 0, sizeof(srtp_policy_t));
    Si memset plante, c'est que tu écris dans une zone interdite en mémoire : policy pointe probablement n'importe où. Un printf lèvera le voile.

    Par contre, je ne comprends pas ce que tu essayes de faire exactement... Si tu veux mettre à 0 tous les champs d'une structure, je pense qu'il est préférable de le faire champs par champs. D'autant qu'il y a des pointeurs parmi les membres de la structure et NULL ne vaut pas forcément 0 (même si c'est le cas la plupart du temps).

  3. #3
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    Par défaut
    Effectivement, policy pointerais vers une zone mémoire qui a été desallouée ...
    Pour memset(policy, 0, sizeof(srtp_policy_t));
    Je me suis inspiré de l'exemple de la doc ... c'est comme cela qu'il initialise policy ...
    Je verrai plus tard si ca pourrait etre la source d'un quelconque problème

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Une bonne pratique pour trouver rapidement ce type d'erreur est d'affecter la NULL à tout pointeur pointant sur une zone mémoire qu'on vient de désallouer. NULL a en effet l'avantage d'être un adresse invalide testable.

    Thierry

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. Comment utiliser un cache ?
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 14/03/2003, 09h55
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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