1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    décembre 2007
    Messages
    629
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2007
    Messages : 629
    Points : 204
    Points
    204

    Par défaut un octet ne fait pas forcément 8 bits ?

    Bonjour,

    J'aimerais savoir pourquoi:

    1) un octet ne ferait pas forcément 8 bits (j'ai trouvé cela dans un forum quelque part sur le net), et dans quel cas on peut rencontrer ce genre de chose

    2) (conséquence du 1)? ) pourquoi il y a des développeurs qui écrivent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char *c = (char *)malloc(2 * sizeof(char));
    et non pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char *c = (char *)malloc(2);
    Merci d'avance pour votre aide

  2. #2
    Dut
    Dut est déconnecté
    Rédacteur/Modérateur

    Avatar de Dut
    Homme Profil pro
    Ingénieur R&D - Consultant MATLAB freelance
    Inscrit en
    novembre 2006
    Messages
    18 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D - Consultant MATLAB freelance
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2006
    Messages : 18 176
    Points : 50 673
    Points
    50 673

    Par défaut

    Si, un octet contient toujours 8 bits, d'où la racine "oct"

    C'est le byte qui ne fait parfois pas 8 bits.

    D'où le fait que octet et byte sont souvent synonymes, mais pas toujours.

    Pour le reste, je te renvoi vers la FAQ
    Sur mon blog : Quand MATLAB et fprintf ne regardent pas dans la même direction…

    Ma page personnelle avec mes contributions MATLAB (R2011b/R2014b - Windows, Linux et Mac) et Hardware

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 133
    Points : 1 649
    Points
    1 649

    Par défaut

    À ma connaissance, sizeof(char) vaut toujours 1.
    EDIT: c'est effectivement toujours 1, voir le point 6.5.3.4, paragraphe 3 de la norme C99.
    Cf: http://www.open-std.org/JTC1/SC22/WG14/www/standards

    When sizeof is applied to an operand that has type char, unsigned char, or
    signed char, (or a qualified version thereof) the result is 1.
    Pour tes exemples, les deux font la même chose, la différence est sémantique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = (char *)malloc(2 * sizeof(char));
    On voit directement dans le malloc qu'on alloue 2 éléments de taille caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = (char *)malloc(2);
    On voit qu'on alloue 2 octets, mais est-ce 2 éléments d'un octet chacun, ou un élément de 2 octets ?

    Jette un coup d'oeil ici:
    http://ymettier.free.fr/articles_lma...70/lmag70.html

  4. #4
    Expert Confirmé Sénior

    Inscrit en
    novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 5 145
    Points : 6 829
    Points
    6 829

    Par défaut

    Un octet fait forcement huit bits.

    Un byte ne fait pas forcement huit bits.

    char a pour taille 1 byte.

    sizeof retourne un nombre de bytes.

    Utiliser * sizeof(char) permet d'etre un peut plus explicite mais n'a aucun effet pratique.

    Un malloc idiomatique en C, c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *c = malloc(2 * sizeof *c);
    Sans cast et sans repetition du type. (Meme si personnellement je prefere le cast, ce n'est pas idiomatique).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 133
    Points : 1 649
    Points
    1 649

    Par défaut

    Perso, je ne caste pas non plus la valeur renvoyée par malloc. C'est du void *, et ça se caste implicitement sur n'importe quel type de pointeur.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 133
    Points : 1 649
    Points
    1 649

    Par défaut

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Utiliser * sizeof(char) permet d'etre un peut plus explicite mais n'a aucun effet pratique.
    C'est sémantique, cela isole le type du nombre d'élément. Du coup tu as moins de risque d'erreur si tu veux changer l'un ou l'autre. De même, pour les chaînes de caractères, on a tendance à mettre + 1 dans le nombre de caractères à allouer, pour montrer qu'on a pensé à allouer de la place pour le caractère de fin de chaîne.

  7. #7
    Expert Confirmé Sénior

    Inscrit en
    novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 5 145
    Points : 6 829
    Points
    6 829

    Par défaut

    Citation Envoyé par liberforce Voir le message
    C'est sémantique, cela isole le type du nombre d'élément. Du coup tu as moins de risque d'erreur si tu veux changer l'un ou l'autre.
    Moins de risque par rapport a la methode que je preconise? Ca demande des arguments.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2009
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2009
    Messages : 1 133
    Points : 1 649
    Points
    1 649

    Par défaut

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Moins de risque par rapport a la méthode que je preconise? Ca demande des arguments.
    Moins de risque que malloc(2);

    Si la méthode que tu préconises c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = malloc(2 * sizeof *c);
    alors non, ce n'est pas plus sûr (vu que ton exemple s'adapte au changement de type de la variable), mais je trouve malloc(2 * sizeof (char)) un peu plus lisible. Question de goûts.

  9. #9
    Expert Confirmé Sénior

    Inscrit en
    novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 5 145
    Points : 6 829
    Points
    6 829

    Par défaut

    Citation Envoyé par liberforce Voir le message
    Si la méthode que tu préconises c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *c = malloc(2 * sizeof *c);
    C'est celle que je qualifie d'idiomatique, autrement dit qui me semble la courante en C.

    alors non, ce n'est pas plus sûr (vu que ton exemple s'adapte au changement de type de la variable), mais je trouve malloc(2 * sizeof (char)) un peu plus lisible
    Un moins sur
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

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