Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/01/2013, 14h12   #1
ikuzar
Membre actif
 
Étudiant
Inscription : décembre 2007
Messages : 614
Détails du profil
Informations personnelles :
Âge : 27

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2007
Messages : 614
Points : 189
Points : 189
Envoyer un message via MSN à ikuzar
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
ikuzar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 14h32   #2
Dut
Responsable MATLAB & Hardware/PC

 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 15 078
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 15 078
Points : 31 134
Points : 31 134
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
__________________
Identification de processeur sous MATLAB (3/3) Identification de processeur sous MATLAB (2/3) Mes contributions MATLAB (R2009a - Windows & Linux)

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)
Dut est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 16/01/2013, 14h33   #3
liberforce
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2009
Messages : 1 039
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 039
Points : 1 525
Points : 1 525
À 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

Citation:
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
liberforce est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/01/2013, 14h33   #4
Jean-Marc.Bourguet
Expert Confirmé Sénior

 
Inscription : novembre 2005
Messages : 4 970
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 4 970
Points : 5 607
Points : 5 607
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.
Jean-Marc.Bourguet est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 16/01/2013, 14h47   #5
liberforce
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2009
Messages : 1 039
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 039
Points : 1 525
Points : 1 525
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.
liberforce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 14h51   #6
liberforce
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2009
Messages : 1 039
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 039
Points : 1 525
Points : 1 525
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.
liberforce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 14h55   #7
Jean-Marc.Bourguet
Expert Confirmé Sénior

 
Inscription : novembre 2005
Messages : 4 970
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 4 970
Points : 5 607
Points : 5 607
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.
Jean-Marc.Bourguet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/01/2013, 14h19   #8
liberforce
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2009
Messages : 1 039
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 039
Points : 1 525
Points : 1 525
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.
liberforce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2013, 17h54   #9
Jean-Marc.Bourguet
Expert Confirmé Sénior

 
Inscription : novembre 2005
Messages : 4 970
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 4 970
Points : 5 607
Points : 5 607
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.

Citation:
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.
Jean-Marc.Bourguet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h28.


 
 
 
 
Partenaires

Hébergement Web