[gull] Subtilité de C n° 3 : l'opérateur sizeof

Leopoldo Ghielmetti leopoldo.ghielmetti at a3.epfl.ch
Fri Apr 4 09:14:23 CEST 2008


Il giorno gio, 03/04/2008 alle 23.34 +0200, Marc Mongenet ha scritto:
> Bonjour,
> 
> Pour rendre les choses plus concrêtes et permettre
> les expérimentations, je présente cette subtilité sous
> forme de quizz sur de petites sources.

salut,

Je relève le défi. :-)

> Introduction f1 :
> Malgré son apparence, sizeof n'est pas une fonction
> mais un opérateur, et aussi un mot clé de C. La valeur
> de sizeof est donc calculée à la compilation.
> L'opérande de sizeof peut être un type entre parenthèses
> ou une expression.
> 
> Fichier f1.c :
> ------
> #include <stdlib.h>
> int i = sizeof(int);
> int j = sizeof i;
> int k = sizeof 22;
> char *pc = malloc(1);
> ------
> marc> gcc -c f1.c
> 
> Que me dit le compilateur et pourquoi ?

f1.c:5: error: initializer element is not constant

Simplement parce-que la fonction malloc n'est pas une expression
constante. Ça marcherait si elle était dans un body.

> Introduction f2 :
> L'opérateur sizeof n'évalue pas son opérande.
> 
> Fichier f2.c :
> ------
> #include <stdio.h>
> int main() {
>     char *p = 0;
>     printf("%u\n", (unsigned)sizeof(*p='a'));
>     return 0;
> }
> ------
> marc> gcc f2.c
> marc> ./a.out
> 
> Que me dit a.out ?

1

Ce qui est bien la taille d'un char.

J'ai substitué char avec int et j'ai obtenu 4.

Ce qui est aussi correct.

> Introduction f3 :
> L'opérateur sizeof travaille sur le type de son opérande,
> et ne peut donc pas être utilisé par le pré-processeur
> car ce dernier ne parse pas les types.
> 
> Fichier f3.c
> ------
> #if sizeof(int) == 4
> 	#define SIZEINT 4
> #else
> 	#define SIZEINT (-1)
> #endif
> const int i = SIZEINT;
> ------
> marc> gcc -c f3.c
> 
> Que me dit le compilateur ?

f3.c:1:11: error: missing binary operator before token "("

Le préprocesseur ne connaît pas d'opérateur sizeof! Ce qui me semble
tout à fait normal car c'est un opérateur C.

ciao, Leo




More information about the gull mailing list