Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre actif
    Étudiant
    Inscrit en
    décembre 2007
    Messages
    626
    Détails du profil
    Informations personnelles :
    Âge : 28

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2007
    Messages : 626
    Points : 197
    Points
    197

    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 :
     char *c = (char *)malloc(2 * sizeof(char));
    et non pas:
    Code :
     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 Jerome Briot
    Ingénieur Hospitalier
    Inscrit en
    novembre 2006
    Messages
    17 102
    Détails du profil
    Informations personnelles :
    Nom : Homme Jerome Briot
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2006
    Messages : 17 102
    Points : 43 999
    Points
    43 999

    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 : Sortie de Scilab 5.5.0 !

    Ma page personnelle avec mes contributions MATLAB (R2011b/R2014a - 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 129
    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 129
    Points : 1 646
    Points
    1 646

    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 :
    char *c = (char *)malloc(2 * sizeof(char));
    On voit directement dans le malloc qu'on alloue 2 éléments de taille caractère.

    Code :
    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 094
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 5 094
    Points : 5 956
    Points
    5 956

    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 :
    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 129
    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 129
    Points : 1 646
    Points
    1 646

    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 129
    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 129
    Points : 1 646
    Points
    1 646

    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 094
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 5 094
    Points : 5 956
    Points
    5 956

    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 129
    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 129
    Points : 1 646
    Points
    1 646

    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 :
    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 094
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 5 094
    Points : 5 956
    Points
    5 956

    Par défaut

    Citation Envoyé par liberforce Voir le message
    Si la méthode que tu préconises c'est:
    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •