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 éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    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 Expert
    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
    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 éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    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
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

+ 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