Comment opère sizeof en C?

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