L'opérateur sizeof est utilisé pour déterminer la taille d'un type ou d'un objet en octets à la compilation. Il est souvent nécessaire pour allouer de la mémoire, calculer les tailles de structures et de tableaux.
Exemple :
int a; printf("%zu ", sizeof(a)); // taille de la variable a de type int printf("%zu ", sizeof(int)); // taille du type int
Particularités :
sizeof renvoie size_t, toujours >= 0.sizeof(array) renvoie la taille de l'ensemble du tableau, et non la taille d'un pointeur.Exemple de piège :
void foo(int arr[]) { printf("%zu ", sizeof(arr)); // renverra la taille d'un pointeur, et non celle du tableau ! } int arr[10]; foo(arr); // sizeof(arr) == 40 (en général), sizeof(arr au niveau de foo) == 8 (en général)
Que renverra l'expression sizeof('a') en langage C ?
Réponse : Bien que 'a' ressemble à un char, dans l'expression sizeof('a'), le résultat est égal à la taille du type int, car la constante de caractère en C est un int.
Exemple :
sizeof('a') // généralement 4, et non 1
Histoire
malloc(strlen(str) * sizeof(char)), en oubliant le caractère nul. Cela a conduit à la perte du dernier octet et à l'apparition de bogues lors de l'utilisation des fonctions de la bibliothèque standard de traitement des chaînes.Histoire
sizeof(arr) dans une fonction, s'attendant à la taille de l'ensemble de la structure, mais n'obtint que la taille d'un pointeur. En conséquence, la mémoire recevait trop peu de données, ce qui entraînait une corruption de tas.Histoire
Un développeur a décidé d'utiliser sizeof('a') pour allouer de la mémoire pour une seule lettre, s'attendant à 1 octet, mais a obtenu 4 (ou 8) – cela a conduit à un gaspillage inefficace de mémoire et à des problèmes dans le code, dépendant de la taille attendue.