2010-10-15 8 views
4

Quelle est la bonne façon de calculer combien d'octets un int est? et comment écrire un int dans un descripteur de fichier?Quelle est la taille d'un entier?

Voici un exemple de code fictif qui pourrait clairement ce que je suis en train de réaliser:

char *message = "test message"; 
int length = strlen(message); 
int fd = open(file, O_CREAT|O_RDWR); 
write(fd, length??, ??); // <--- what goes here 
write(fd, message, length); 

Je ne se soucient de l'indépendance de la plate-forme et l'ordre des octets, juste qu'il peut compiler sur autant de plateformes que possible .

+5

'sizeof' ????????? – leppie

+1

@ leppie Pourquoi avez-vous fait ce commentaire et non une réponse? C'est exactement ça. – Swiss

+1

@Swiss: incrédulité chez quelqu'un programmant C et ne sachant pas sizeof? Heck, j'ai écrit moins de 500 lignes de code C dans ma vie et je le sais. –

Répondre

9

sizeof(length) va sur le terrain.

Il est préférable d'utiliser sizeof(int) dans le cas où vous changez le type de length dans le futur.

sizeof exprime le bien, la taille d'un type de données en multiples de sizeof(char), qui est toujours 1.

+0

J'ai entendu dire que sizeof renvoie la taille d'un type de données en octets, et j'ai entendu dire que sizeof renvoie la taille d'un type de données en unités de sizeof (char). Mais le char n'est pas défini comme étant 1 octet dans la norme C. Qui est correct? – Swiss

+0

L'utilisation de sizeof (variable) est préférable à l'utilisation de sizeof (type). De cette façon, si vous changez le type de la variable, il n'y a aucun danger que l'appel à sizeof tombe en désynchronisation. –

+0

@Swiss: C'est l'inverse: un octet est défini comme la taille d'un caractère en C. – schot

2

sizeof est votre ami.

write(fd, &length, sizeof(int)); 
2

sizeof (int) = 4 (sous Linux, 32 & 64 Bit 86-Architecture)
sizeof (long) est de 4 à 32 bits, 8 sur 64 bits (sur Linux, x86-32/64 -Architecture)
Vous ne connaissez pas Windows.

+0

'sizeof (long)' reste 4 sur Windows 64 bits (testé sous XP x64, Vista x64 et Windows 7 x64). – birryree

+0

@birryree: Pourquoi ne suis-je pas surpris ... –

+1

@birryree: avez-vous compilé _for_ x64, ou simplement sur x64, et couru sur x64? – wnoise

0
write(fd, &length, sizeof(length)); 

Vous pouvez utiliser sizeof avec des noms de variables ou de type. Dans ce cas, vous auriez pu faire sizeof(int).

La fonction write prend l'adresse de la zone de mémoire que vous voulez écrire, vous utilisez donc l'opérateur & (adresse de). Vous n'êtes pas obligé de le faire pour la chaîne car vous avez déjà un pointeur (char*).

Questions connexes