ProgrammationDéveloppeur Backend C

Comment fonctionne l'opérateur sizeof en langage C, et quels pièges existent lors de son utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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.
  • Pour les tableaux, sizeof(array) renvoie la taille de l'ensemble du tableau, et non la taille d'un pointeur.
  • Lorsque vous transmettez un tableau à une fonction, vous perdez l'information sur sa taille.

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)

Question piégée

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

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Dans le projet, on allouait de la mémoire pour copier une chaîne comme suit : 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

Un des modules utilisait 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.