Dans ce code ci-dessous:
#include int main(void) { printf("%d",sizeof(int)); return 0; }
Une fois compilé sur gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3), le compilateur 4.8.4 donne l’avertissement suivant:
le format ‘% d’ attend un argument de type ‘int’, mais l’argument 2 a le type ‘long unsigned int’ [-Wformat =] printf (“% d”, sizeof (int));
Pourquoi je reçois cet avertissement? Est-ce que ce type de retour de sizeof est ‘long unsigned int’?
Lorsque j’ai remplacé ‘% d’ par ‘% ld’, l’avertissement est passé.
L’ opérateur sizeof
est traité lors de la compilation (et peut être appliqué à la fois aux types et aux expressions). Cela donne une constante * de type size_t
. Sur votre système (et le mien Debian / Linux / x86-64 également), sizeof(int)
est (size_t)4
. Ce type size_t
est souvent typedef
dans un type tel que unsigned long
(mais le type intégral dont il s’agit dépend de l’implémentation). Vous pourriez coder
printf("%d", (int)sizeof(int));
ou (puisque printf comprend la chaîne de format de contrôle %zd
ou %zu
pour size_t
)
printf("%zu", sizeof(int));
Pour une portabilité maximale, utilisez %zu
(et non %ld
) pour imprimer size_t
(car vous pourriez trouver des systèmes ou des configurations sur lesquels size_t
est unsigned int
etc.).
Note *: sizeof
est toujours constant, sauf pour VLA