97 votes

Taille platform indépendante des spécificateurs de format size_t en c ?

Je veux imprimer une variable de type size_t en C mais il semble que size_t soit aliasé à différents types de variables sur différentes architectures. Par exemple, sur une machine (64 bits), le code suivant ne lance aucune alerte :

size_t size = 1;
printf("la taille est %ld", size);

mais sur mon autre machine (32 bits), le code ci-dessus produit le message d'alerte suivant :

attention: le format '%ld' attend un type 'long int *', mais l'argument 3 a le type 'size_t *'

Je soupçonne que cela est dû à la différence de taille des pointeurs, de sorte que sur ma machine 64 bits size_t est aliasé à un long int ("%ld"), tandis que sur ma machine 32 bits size_t est aliasé à un autre type.

Y a-t-il un spécificateur de format spécifique pour size_t ?

1 votes

Votre message d'avertissement ne correspond pas au code. L'avertissement mentionne les pointeurs, votre code n'en contient pas. Avez-vous supprimé des & quelque part?

0 votes

Pointeurs? Non, je ne reçois aucune alerte concernant les pointeurs, en fait selon la machine sur laquelle j'exécute ce code, il m'arrive parfois de ne recevoir aucune alerte. Essayez le code de test suivant : #include int main(){ size_t size = 1; printf("la taille est %ld", size); return 0; }

2 votes

132voto

Adam Rosenfield Points 176408

Oui : utilisez le modificateur de longueur z :

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // taille décimale de size_t ("u" pour non signé)
printf("the size is %zx\n", size);  // taille hexadécimale

Les autres modificateurs de longueur disponibles sont hh (pour char), h (pour short), l (pour long), ll (pour long long), j (pour intmax_t), t (pour ptrdiff_t), et L (pour long double). Voir §7.19.6.1 (7) du standard C99.

0 votes

Quelle est la différence entre zd et zu? Je comprends que zd est décimal, mais est-il signé? Si oui, comment le fait que zd soit signé affecte-t-il les choses.

1 votes

C'est la différence entre un size_t et un ssize_t; ce dernier est rarement utilisé.

26 votes

Correct, donc dans ce cas, vous devriez utiliser %zu, car l'argument est non signé.

48voto

maxschlepzig Points 3578

Oui, c'est le cas. C'est %zu (comme spécifié dans ANSI C99).

size_t size = 1;
printf("la taille est %zu", size);

Notez que size_t est non signé, donc %ld est doublement faux : mauvais modificateur de longueur et mauvais spécificateur de conversion de format. Au cas où vous vous poseriez la question, %zd est pour ssize_t (qui est signé).

1voto

Arkantos Points 79

MSDN, dit que Visual Studio prend en charge le préfixe "I" pour le code portable sur les plateformes 32 et 64 bits.

size_t size = 10;
printf("size is %Iu", size);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X